Tengo un juego, escrito en C, el cúal se trata del tres en raya.
Tu compites contra la computadora (el juego tiene una seudo IA)
Todo funciona bien, pero si el jugador o la seudo IA pone una ficha en el casillero 5, (el de almedio), se vuelve invisible y se bugea el juego.
Espero que logren leer mi código espagueti. :)
Saludos.
#include <stdio.h>
#include <time.h>
void mainloop(char c[3][3]);
void inum(char c[3][3]);
void tablero(char c[3][3]);
void inusr(char c[3][3]);
void seudoai(char c[3][3]);
int win(char c[3][3]);
int main()
{
char c[3][3];
mainloop(c);
return 0;
}
void mainloop(char c[3][3])
{
int j;
int i = 0;
inum(c);
tablero(c);
do
{
tablero(c);
if(i % 2 == 0)
{
inusr(c);
}
else
{
seudoai(c);
}
j = win(c);
++i;
}while(i <= 9 && j == 2);
if(j == 0)
{
}
else if(j == 1)
{
}
else
{
}
}
void inum(char c[3][3])
{
int i, j;
char aux = '0';
for(i = 0; i < 3; ++i)
{
for(j = 0; j < 3; ++j)
{
c[i][j] = ++aux;
}
}
}
void inusr(char c[3][3])
{
char aux;
int i, j, k;
do
{
do
{
}while(aux < '1' || aux > '9');
k = 0;
switch(aux)
{
case '1':{
i = 0;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '2':{
i = 0;
j = 1;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '3':{
i = 0;
j = 2;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '4':{
i = 1;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '5':{
i = 1;
j = 1;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '6':{
i = 1;
j = 2;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '7':{
i = 2;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '8':{
i = 2;
j = 1;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
case '9':{
i = 2;
j = 2;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n"); }
break;
}
}
}while(k == 1);
c[i][j] = 'X';
}
void seudoai(char c[3][3])
{
int i, j, k;
//char aux;
do
{
i
= rand() % 3; // n rand entre 0 y 2 k = 0;
if(c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
}
}while(k == 1);
c[i][j] = 'O';
}
void tablero(char c[3][3])
{
int i, j;
for(i = 0; i < 3; ++i)
{
for(j = 0; j < 3; ++j) //replace ++j with ++i, and have fun!
{
if(j < 2)
{
}
else
{
}
}
if(i < 2)
{
}
}
}
int win(char c[3][3])
{
if(c[0][0] == 'X' || c[0][0] == 'O')
{
if(c[0][0] == c[0][1] && c[0][0] == c[0][2])
{
if(c[0][0] == 'X')
{
return 0;
}
else
{
return 1;
}
}
else if(c[0][0] == c[1][0] && c[0][0] == c[2][0])
{
if(c[0][0] == 'X')
{
return 0;
}
else
{
return 1;
}
}
}
if(c[1][1] == 'X' || c[1][1] == 'O')
{
if(c[1][1] = c[0][0] && c[1][1] == c[2][2])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[1][1] == c[1][0] && c[1][1] == c[1][2])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[1][1] == c[2][0] && c[1][1] == c[0][2])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[1][1] == c[0][1] && c[1][1] == c[2][1])
{
if(c[1][1] == 'X')
{
return 0;
}
else
{
return 1;
}
}
}
if(c[2][2] == 'X' || c[2][2] == 'O')
{
if(c[2][2] == c[2][0] && c[2][1] == c[2][1])
{
if(c[2][2] == 'X')
{
return 0;
}
else
{
return 1;
}
}
if(c[2][2] == c[0][2] && c[2][2] == c[1][2])
{
if(c[2][2] == 'X')
{
return 0;
}
else
{
return 1;
}
}
}
return 2;
}
Buen programa. Encontre el error, pero antes algunas observaciones, todo para bien y para mejorar :D
Agregar Biblioteca de Funcion stdlib para la funcion rand.
#include<stdlib.h> //para Rand
Aunque no se trate de un programa que deba de ser ultra eficiente
Te porias ahorrar una comparación en el case del usuario mediante la modificaciones al if
Por ejemplo esta sección de codigo
case '1':
i = 0;
j = 0;
if (c[i][j] == 'X' || c[i][j] == 'O')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
Podria pasar a ser
case '1':
i = 0;
j = 0;
if (c[i][j] != '1')
{
k = 1;
printf("Casilla ocupada!\n\n");
}
Ahorrandote un OR
La funcion tablero en la linea 25 Esta de mas, ya que inmediatamente despues utilizas un cls, aun realmente deberias de evitar las funciones system, en este caso didactico esta justificado, aun asi, el codigo no es compatible en sistemas Linux.
Una cosa mas, las sentencias case: no necesita de llavez {}, no se de donde sacaste eso.
Y el error que indicas esta en la linea
261
if(c[1][1] = c[0][0] && c[1][1] == c[2][2])
Tienes un solo igual, con lo cual estas igualando al valor de la Operacion
c[0][0] && c[1][1] == c[2][2]
Saludos
Gracias! Me funciono, tomaré las consideraciones que me diste.
Saludos