/
Inicio :: Foros

 F.A.Q.F.A.Q.                  Conéctese para revisar sus mensajesConéctese para revisar sus mensajes   

Ayuda con algoritmo para verificar ganador en Tic Tac Toe

 
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Ver tema anterior :: Ver siguiente tema  
AutorMensaje
dualdark



Registrado: 24 Abr 2014
Mensajes: 2

MensajePublicado: 24/04/2014 2:15 pm
Título: Ayuda con algoritmo para verificar ganador en Tic Tac Toe

Hola, soy nuevo por aqui. Tengo una duda con este codigo.

Código:
matriz[i][j]='X';
for(y=0; y<3; y++){
   if(matriz[0][y]=='X'&&matriz[1][y]=='X'&&matriz[2][y]=='X' ||
      matriz[y][0]=='X'&&matriz[y][1]=='X'&&matriz[y][2]=='X'){
         p1=1;
      }
}
if(matriz[0][0]=='X'&&matriz[1][1]=='X'&&matriz[2][2]=='X' ||
   matriz[2][0]=='X'&&matriz[1][1]=='X'&&matriz[0][2]=='X'){
      p1=1;


El codigo funciona, pero necesito un algoritmo que verifique el ganador sin indicar la posicion exacta de la ficha.

Alguna ayuda?
Volver arriba
rir3760



Registrado: 01 Oct 2004
Mensajes: 7516
Ubicación: Mexico

MensajePublicado: 25/04/2014 6:05 pm
Título:

En ese fragmento no indicas la posición de la ficha, en su lugar verificas si el jugador 'X' gano al completar una fila, columna o diagonal.

Otra opción es almacenar las posiciones a verificar en un array para utilizar dos bucles anidados. Por ejemplo:
Código:
#include <stdio.h>
#include <stdlib.h>

struct coord {
   int f;
   int c;
};
typedef struct coord coord;

int hay_ganador(char tab[][3]);

int main(void)
{
   char tab[][3] = {
      {'X', ' ', 'O'},
      {'X', 'O', ' '},
      {'X', 'O', 'X'}
   };
   int estado;
   
   if ((estado = hay_ganador(tab)) >= 0)
      printf("Ganador en solucion %d\n", estado);
   else
      puts("No hay ganador");
   
   return EXIT_SUCCESS;
}

int hay_ganador(char tab[][3])
{
   static coord const sol[][3] = {
      {{0, 0}, {0, 1}, {0, 2}},
      {{1, 0}, {1, 1}, {1, 2}},
      {{2, 0}, {2, 1}, {2, 2}},
         
      {{0, 0}, {1, 0}, {2, 0}},
      {{0, 1}, {1, 1}, {2, 1}},
      {{0, 2}, {1, 2}, {2, 2}},
         
      {{0, 0}, {1, 1}, {2, 2}},
      {{0, 2}, {1, 1}, {2, 0}}
   };
   static size_t const num_sols = sizeof sol / sizeof sol[0];
   size_t i;
   size_t j;
   char prev;
   
   for (i = 0; i < num_sols; i++)
      if ((prev = tab[sol[i][0].f][sol[i][0].c]) != ' '){
         for (j = 1; j < 3 && tab[sol[i][j].f][sol[i][j].c] == prev; j++)
            ;
         
         if (j == 3)
            return i;
      }
   
   return -1;
}

En el programa la función "hay_ganador" retorna un valor 0 .. 7 si alguien gano y -1 en caso contrario.

Un saludo
_________________
C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Volver arriba
dualdark



Registrado: 24 Abr 2014
Mensajes: 2

MensajePublicado: 26/04/2014 6:54 am
Título:

Gracias =)

la verdad no me queda muy claro, pero tratare de adaptarlo a mi codigo. El fragmento que puse al principio, solo verifica las X, porque en otra parte del codigo, verifico las O.

Este es para X

Código:
if(emp%2==1){
            cout <<endl << "Turno de "<<jug1ran<< " (X): ";
            cin >> q;
            q--;
            q2=q;
            j=q%3;
            q=q-j;
            i=q/3;
            if(matriz[i][j]!=' '){
                cout<<"Posicion ocupada. Intenta nuevamente."<<endl;
                emp--;
            }
            else{
                matriz[i][j]='X';
                for(y=0; y<3; y++){
                        if(matriz[0][y]=='X'&&matriz[1][y]=='X'&&matriz[2][y]=='X' ||
                           matriz[y][0]=='X'&&matriz[y][1]=='X'&&matriz[y][2]=='X'){
                            p1=1;
                        }
                    }
                    if(matriz[0][0]=='X'&&matriz[1][1]=='X'&&matriz[2][2]=='X' ||
                       matriz[2][0]=='X'&&matriz[1][1]=='X'&&matriz[0][2]=='X'){
                        p1=1;
                }
            }
        }


y otra parte del codigo es igual, pero con el jugador O...
Volver arriba
      Índice del Foro elrincondelc.com -> Principiantes C/C++
Página 1 de 1Todas las horas están en GMT - 8 Horas

 
No puede crear mensajes
No puede responder temas
No puede editar sus mensajes
No puede borrar sus mensajes
No puede votar en encuestas

(c) ElRincondelC.com

Un proyecto de UrlanHeat.com