Noticias

¡RECUERDA QUE SI ERES UN NUEVO USUARIO, DEBES PRESENTARTE PARA PODER PUBLICAR MENSAJES! | TENEMOS CANAL OFICIAL DE TELEGRAM: t.me/unity3dspain

Consulta script de cuatro en raya o connect four

Iniciado por sab, Enero 19, 2017, 04:52:32 AM

Tema anterior - Siguiente tema
El otro día me descargue este proyecto del conocido "Connect 4" (Conecta cuatro, cuatro en raya, etc.): https://github.com/mattmanj17/Connect4AI
 
Mas que todo para entretenerme jugando en la pc porque me gusta bastante este juego. Después de un tiempo me di cuenta que tiene un error y algunas veces continua poniendo fichas fuera del tablero, entonces empece a tratar de reparar el script, pero no le llego al asunto, que se ha vuelto un reto, así que lo dejo aquí a ver si alguien "que le interese el tema" me guía en que me debo fijar mejor, como parte del aprendizaje de c#
 
Saludos y gracias
 

Hola, mira creo que nadie, (ojala me equivoque) ni siquiera va a intentar resolverte el problema por que lo unico que planteas es "alguien hizo esto, lo hizo mal, y encima no se donde está el/los errores" , se entiende? Podrias explicar primero como es la escena, cuales son los scripts, osea que gameObjects tienen uno, de donde lo descargaste, de que trata el juego?... no intentaste realizar uno vos? me parece que ahí esta lo divertido y didactico, no descargarlo de algun lugar ya que reparar el código ajeno puede llevar mucho tiempo.
 
Saludos

Enero 19, 2017, 08:11:54 PM #2 Ultima modificación: Enero 19, 2017, 08:24:31 PM por sab
Claro lightbug, ahí esta el link de donde lo descargue, ademas si lo estoy intentando por esto lo puse aquí...evidentemente se que no a muchos nos gusta hacer esto (de hecho no me gusta pero picó como un reto), pero lo pongo por si alguien que esté como yo aprendiendo c# encuentra algo y me guía antes de que yo lo haga, pero entiendo lo que decís y es muy probable, saludos

Bueno, podriamos hacer uno no? las reglas son estas? "Tenes que introducir fichas que caen a la ultima fila disponible del tablero y tratar de conectar 4 fichas del mismo color en horizontal ,vertical o diagonal?"

jajaja, lightbug, ahora me dejaste peor de como estaba, por que ya me retataste a hacer uno propio.... "lo voy a hacer", y ademés tengo que encontrar el defecto de este que no puedo sacármelo hasta que lo encuentre, a ver que hago con tan poco tiempo jajajaja.....

Cita de: sab date=1484866800jajaja, lightbug, ahora me dejaste peor de como estaba, por que ya me retataste a hacer uno propio.... "lo voy a hacer", y ademés tengo que encontrar el defecto de este que no puedo sacármelo hasta que lo encuentre, a ver que hago con tan poco tiempo jajajaja.....
   


Jajaj asi se habla! yo voy a intentar uno tambien

Cita de: lightbug date=1484862648Bueno, podriamos hacer uno no? las reglas son estas? "Tenes que introducir fichas que caen a la ultima fila disponible del tablero y tratar de conectar 4 fichas del mismo color en horizontal ,vertical o diagonal?"
   


lightbug apuesto que naciste en la decada de los '80 en adelante ... vamos, que creciste en la era digital jajajaja
 
lo digo por no tener 100% claras las reglas del juego "4 en raya", es un juego mitico (junto a otros como el parchis, la oca, y cia) de los domingos por la tarde en familia antes de que se extendiera el uso de las videoconsolas y ordenadores en el ambito domestico xDDD

Cita de: Arthure date=1484936488lightbug apuesto que naciste en la decada de los '80 en adelante ... vamos, que creciste en la era digital jajajaja
   
   
      lo digo por no tener 100% claras las reglas del juego "4 en raya", es un juego mitico (junto a otros como el parchis, la oca, y cia) de los domingos por la tarde en familia antes de que se extendiera el uso de las videoconsolas y ordenadores en el ambito domestico xDDD
   


En el 90, igual me lo podes explicar hoy, que para pasado mañana me lo olvide seguramente, estoy como el de la pelicula memento

Enero 21, 2017, 05:04:13 PM #8 Ultima modificación: Enero 21, 2017, 05:27:46 PM por lightbug
Aca esta mi intento de connect-four:
 
//www.unityspain.com/applications/core/interface/file/attachment.php?id=10113" rel="">Connect4.7z
 
y el codigo:
 

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Game : MonoBehaviour {
bool gameOver = false;
enum Player {player1 = 1, player2}
Player player;
enum Slot{vacio, azul , roja}
Slot[,] slots = new Slot[8, 6];
Plane tableroPlane;
GameObject fichaAzul;
GameObject fichaRoja;
int[] FilasHabilitadas = new int[8];
GUIStyle styleWinner;
GUIStyle styleText;
public Texture blackTex;
void Start () {
   styleWinner = new GUIStyle ();
   styleWinner.font = (Font)Resources.Load ("dejaVu");
   styleWinner.fontSize = 80;
   styleWinner.alignment = TextAnchor.MiddleCenter;
   styleText = new GUIStyle ();
   styleText.font = (Font)Resources.Load ("dejaVu");
   styleText.fontSize = 50;
   styleText.alignment = TextAnchor.MiddleCenter;
   styleText.normal.textColor = Color.white;
   tableroPlane = new Plane (Vector3.zero, Vector3.right, Vector3.up);
   fichaAzul = (GameObject)Resources.Load ("Ficha_Azul");   
   fichaRoja = (GameObject)Resources.Load ("Ficha_Roja");
   for (int a = 0; a < FilasHabilitadas.Length; a++)
      FilasHabilitadas [a] = 0;
      
   for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 6; j++) {
         slots [i, j] = Slot.vacio;
      }
   }
   player = Player.player1;
}

void AgregarPieza (int columna)
{
   if (FilasHabilitadas [columna] > 5)
      return;
   GameObject nuevaFicha;
   if (player == Player.player1) {
      nuevaFicha = GameObject.Instantiate (
         fichaAzul,
         new Vector3 (columna + 0.5f, FilasHabilitadas [columna] + 0.5f, 0),
         Quaternion.identity);
      nuevaFicha.transform.parent = transform;
      slots[columna , FilasHabilitadas[columna]] = Slot.azul;
   } else {
      nuevaFicha = GameObject.Instantiate (
         fichaRoja,
         new Vector3 (columna + 0.5f, FilasHabilitadas [columna] + 0.5f, 0),
         Quaternion.identity);
      nuevaFicha.transform.parent = transform;
      slots[columna , FilasHabilitadas[columna]] = Slot.roja;
   }
 
   FilasHabilitadas [columna]++;
 
}
 
bool ChequearGanador ()
{
   for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 6; j++) {
         if (slots [i, j] == Slot.vacio)
            continue;
         //Player1
         if (player == Player.player1) {
            
            if (slots [i, j] != Slot.azul)
               continue;
            //Horizontales
            if (slots [i + 1, j] == Slot.azul &&
                slots [i + 2, j] == Slot.azul &&
                slots [i + 3, j] == Slot.azul)
               return true;
            //Verticales
            if (slots [i, j + 1] == Slot.azul &&
               slots [i, j + 2] == Slot.azul &&
               slots [i, j + 3] == Slot.azul)
               return true;
            
            //Diagonales (solo las 2 superiores porque recorro desde abajo)
            //a derecha
            if(i < 4 && j < 2)
            if (slots [i + 1, j + 1] == Slot.azul &&
               slots [i + 2, j + 2] == Slot.azul &&
               slots [i + 3, j + 3] == Slot.azul)
               return true;
            if(i > 2 && j < 2)
            if (slots [i - 1, j + 1] == Slot.azul &&
               slots [i - 2, j + 2] == Slot.azul &&
               slots [i - 3, j + 3] == Slot.azul)
               return true;
            
         } else {   //Player2
         
            if (slots [i, j] != Slot.roja)
               continue;
         
            //Horizontales
            if(i < 5)
            if (slots [i + 1, j] == Slot.roja &&
               slots [i + 2, j] == Slot.roja &&
               slots [i + 3, j] == Slot.roja)
               return true;
            //Verticales
            if(j < 3)
            if (slots [i, j + 1] == Slot.roja &&
               slots [i, j + 2] == Slot.roja &&
               slots [i, j + 3] == Slot.roja)
               return true;
         
            //Diagonales (solo las 2 superiores porque recorro desde abajo)
            //a derecha
            if(i < 4 && j < 2)
            if (slots [i + 1, j + 1] == Slot.roja &&
               slots [i + 2, j + 2] == Slot.roja &&
               slots [i + 3, j + 3] == Slot.roja)
               return true;
            if(i > 2 && j < 2)
            if (slots [i - 1, j + 1] == Slot.roja &&
               slots [i - 2, j + 2] == Slot.roja &&
               slots [i - 3, j + 3] == Slot.roja)
               return true;
         
         }
      }
   }
   return false;
}
void Reiniciar ()
{
   player = Player.player1;
   for (int i = transform.childCount - 1 ; i >= 0; i--)
      Destroy(transform.GetChild (i).gameObject);
 
   for (int a = 0; a < FilasHabilitadas.Length; a++)
      FilasHabilitadas [a] = 0;
   for (int i = 0; i < 8; i++) {
      for (int j = 0; j < 6; j++) {
         slots [i, j] = Slot.vacio;
      }
   }
   gameOver = false;
}
void Update()
{
   if (gameOver) {
      if (Input.GetKeyDown (KeyCode.Return))
         Reiniciar ();
      return;
   }
   if (Input.GetMouseButtonDown (0)) {
      Ray ray = Camera.main.ScreenPointToRay (Input.mousePosition);
      Debug.DrawRay ( ray.origin , ray.direction);
      float distance;
      if (!tableroPlane.Raycast (ray, out distance))
         return;
      if (ray.GetPoint (distance).x < 0)
         return;
      
      int columna = (int)ray.GetPoint (distance).x;
      if (columna < 0 || columna > 7)
         return;
 
      AgregarPieza (columna);
      if (ChequearGanador ()) {
         Debug.Log ("Ha Ganado el " + player.ToString ());
         gameOver = true;
         return;
      }
      if (player == Player.player1)
         player = Player.player2;
      else
         player = Player.player1;
   }
}
void OnGUI()
{
   if (!gameOver)
      return;
   if (blackTex) {
      GUI.color = new Vector4 (0, 0, 0, 0.8f);
      GUI.DrawTexture (new Rect (0, 0, Screen.width, Screen.height), blackTex);
      GUI.color = Color.white;
   }
 
   if (player == Player.player1)
      styleWinner.normal.textColor = Color.blue;
   else
      styleWinner.normal.textColor = Color.red;
   
   GUI.Label (new Rect(Screen.width/2 - 250, Screen.height/2 - 100 , 500 , 200) , "Ha Ganado el Jugador " + ((int)player).ToString () + "!!" , styleWinner);
   GUI.Label (new Rect(Screen.width/2 - 250, Screen.height - 200 , 500 , 200) , "Presionar Enter para jugar de nuevo" , styleText);
}
}

 
Hay cosas que se pueden hacer publicas, como ya las tenia dando vueltas use los Resources.Load, pero bueno eso va en cada uno.
 
Tambien me base en que cada celda es de 1x1, por eso algunos numeros exactos, pero se puede adaptar al tamaño que uno quiera.
 
 
 
EDIT:
 
Lo hice en una hora asi que olvidate de la IA jajaj, es para jugar con un amigo y compartir el Mouse xD

Etiquetas: