Error extraño en programa de C

Iniciado por huchoko, 6 Noviembre 2018, 23:06 PM

0 Miembros y 1 Visitante están viendo este tema.

huchoko

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);

system("pause");
return 0;
}

void mainloop(char c[3][3])
{
int j;
int i = 0;
inum(c);
tablero(c);

do
{
system("cls");
tablero(c);
if(i % 2 == 0)
{
inusr(c);
}
else
{
seudoai(c);
}
j = win(c);
++i;
}while(i <= 9 && j == 2);


if(j == 0)
{
printf("Ganaste!\n\n");
}
else if(j == 1)
{
printf("Perdiste!\n\n");
}
else
{
printf("Empate!\n\n");
}

}

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
{
printf("Introduce ficha: ");
fflush(stdin);
scanf("%c", &aux);
}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;
srand(time(NULL));

do
{
i = rand() % 3; // n rand entre 0 y 2
j = rand() % 3;
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)
{
printf(" %c |", c[i][j]);
}
else
{
printf(" %c ", c[i][j]);
}
}
if(i < 2)
{
printf("\n-----------\n");
}
}
printf("\n\n");
}

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;
}

AlbertoBSD

#1
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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

huchoko

Gracias! Me funciono, tomaré las consideraciones que me diste.
Saludos