Hack x Crack - Comunidad de Seguridad informática

Programación => C / C++ => Mensaje iniciado por: G4ntZ en Agosto 15, 2013, 06:08:45 am

Título: Juego el Gato
Publicado por: G4ntZ en Agosto 15, 2013, 06:08:45 am
Hola a todos un pequeño aporte, hoy programe este jueguito, es un clásico para practicar un poco matrices
si alguien tiene alguna critica constructiva que ayude a mejorar el código[para hacerlo menos extenso por ejemplo o funciones librerías cosas que dan la experiencia no los libros] es bienvenida.
Código: [Seleccionar]
#include <conio.h>
#include <stdio.h>
char jugador1(char n1,char n2,char n3,char n4,char n5,char n6,char n7,char n8,char n9) //funcion verificadora para saber si el jugador gana
{
int r1=0;
if((n1=='x')&&(n2=='x')&&(n3=='x'))r1=1;
if((n4=='x')&&(n5=='x')&&(n6=='x'))r1=1;
if((n7=='x')&&(n8=='x')&&(n9=='x'))r1=1;
if((n1=='x')&&(n5=='x')&&(n9=='x'))r1=1;
if((n3=='x')&&(n5=='x')&&(n7=='x'))r1=1;
if((n1=='x')&&(n4=='x')&&(n7=='x'))r1=1;
if((n2=='x')&&(n5=='x')&&(n8=='x'))r1=1;
if((n3=='x')&&(n6=='x')&&(n9=='x'))r1=1;
return r1;   //se devuelve a r1
}
char jugador2(char n1,char n2,char n3,char n4,char n5,char n6,char n7,char n8,char n9) //funcion verificadora para saber si el jugador gana
{
int r2=0;
if((n1=='o')&&(n2=='o')&&(n3=='o'))r2=2;
if((n4=='o')&&(n5=='o')&&(n6=='o'))r2=2;
if((n7=='o')&&(n8=='o')&&(n9=='o'))r2=2;
if((n1=='o')&&(n5=='o')&&(n9=='o'))r2=2;
if((n3=='o')&&(n5=='o')&&(n7=='o'))r2=2;
if((n1=='o')&&(n4=='o')&&(n7=='o'))r2=2;
if((n2=='o')&&(n5=='o')&&(n8=='o'))r2=2;
if((n3=='o')&&(n6=='o')&&(n9=='o'))r2=2;
return r2;
}
void error(int e)
{
if(e==1)printf("Numero ingresado es menor o igual a cero\n");
if(e==2)printf("Numero ingresado es mayor o igual a diez\n");
if(e==3)printf("Numero ya ha sido ingresado\n");
}
main()
{
char gato[3][3];
int n, m, num, num2,r1=0,r2=0,j;
for(n=0;n<3;n++)    //damos valores "-" tambien se puede hacer gato[3][3]={{'-','-','-'},{'-','-','-'},{'-','-','-'}}
{
for(m=0;m<3;m++)
{
gato[n][m]='-';
}
}
j=0;
while(j<9)
{
for(n=0;n<3;n++)//ciclo para imprimir las jugadas, eso comienza desde la seguda jugada
{
for(m=0;m<3;m++)
{
if((n==0)&&(m==0))
{
clrscr(); //limpia pantalla (libreria conio)
printf("\n",gato[n][m]);
}
if((n==1)&&(m==0))printf("\n",gato[n][m]);
if((n==2)&&(m==0))printf("\n",gato[n][m]);
printf("| %c |",gato[n][m]);
if((n==2)&&(m==2))printf("\n",gato[n][m]);
if(r1==1)
{
printf("Felicedades, el jugador uno ha ganado!!");
n=10;
}
if(r2==2)
{
printf("Felicedades, el jugador dos ha ganado!!");
n=10;
}
}
}
if((j==1)||(j==3)||(j==5)||(j==7)||(r1!=0)||(r2!=0))
{
printf("Jugador 2:");
scanf("%i",&num2);
if(num2<=0)
{
num2=1;
error(num2);
}
if(num2>=10)
{
num2=2;
error(num2);
}
if(num2==1)gato[0][0]='o';//asignamos valores a la matriz
if(num2==2)gato[0][1]='o';
if(num2==3)gato[0][2]='o';
if(num2==4)gato[1][0]='o';
if(num2==5)gato[1][1]='o';
if(num2==6)gato[1][2]='o';
if(num2==7)gato[2][0]='o';
if(num2==8)gato[2][1]='o';
if(num2==9)gato[2][2]='o';
r2=jugador2(gato[0][0],gato[0][1],gato[0][2],gato[1][0],gato[1][1],gato[1][2],gato[2][0],gato[2][1],gato[2][2]);//llamamos a la funcion para el retorno de la misma
printf("%i",r1);
}
else
if((j==0)||(j==2)||(j==4)||(j==6)||(j==8)||(r1!=0)||(r2!=0))
{
printf("Jugador 1:");
scanf("%i",&num);
if(num<=0)
{
num=1;
error(num);
}
if(num>=10)
{
num=2;
error(num);
}
if(num==1)gato[0][0]='x';
if(num==2)gato[0][1]='x';
if(num==3)gato[0][2]='x';
if(num==4)gato[1][0]='x';
if(num==5)gato[1][1]='x';
if(num==6)gato[1][2]='x';
if(num==7)gato[2][0]='x';
if(num==8)gato[2][1]='x';
if(num==9)gato[2][2]='x';
r1=jugador1(gato[0][0],gato[0][1],gato[0][2],gato[1][0],gato[1][1],gato[1][2],gato[2][0],gato[2][1],gato[2][2]);
printf("%i",r1);
}
j++;
}
return 0;
}
Caracteristicas
Spoiler
  • Ingreso por jugador1 y jugador2, con números del 1 al 9 correspondientemente
  • Muestra el tablero con cada jugada
  • Actualiza por cada jugada el tablero
  • Verifica si el numero ingresado es mayor o igual que 1 y menor o igual que 9
Título: Re:Juego el Gato
Publicado por: User170294 en Agosto 15, 2013, 04:11:19 pm
G4ntZ
Ahi van unos cuantos consejos:

En primer lugar y lo que primero me ha llamado la atención es que utilices la librería conio.h, cuando esta no es una librería estándar. En mi opinión sería más elegante hacer un system("cls") o un system("clear") dependiendo en que sistema operativo compiles.

Lo segundo que me ha llamado la atención es que utilices dos funciones idénticas para comprobar si cada jugador ha ganado, cuando podrías pedir un parámetro en la función que obtubiese el caracter que debe comprobar. Además, le pasas a la función la tira de parámetros cuando podrías hacerlo más simple y legible con punteros.

Luego me he fijado en como declaras la función main... Simplemente declarala con un int delante, aunque no pongas nada el compilador tomará la función como que devuelbe int de todos modos.

Posteriormente, a medida que voi lellendo el código me voi dando cuenta de que los nombres de las variables que utilizas podrían ser más descriptivos.

También me da la impresión de que no has utilizado los bucles for de la manera más eficiente posible... te dejo que pienses esto.

Por último, el estándar de carácteres de ancho para los programas/scripts es de 80 carácteres. Por cuestiones de uniformidad.

Bueno. Esto es lo más destacables que he visto. Estaría bien que como ejercicio produgeras un nuevo código mejorando el que ya tienes.

Saludos G4antZ
Título: Re:Juego el Gato
Publicado por: G4ntZ en Agosto 16, 2013, 09:25:29 am
G4ntZ
Ahi van unos cuantos consejos:

En primer lugar y lo que primero me ha llamado la atención es que utilices la librería conio.h, cuando esta no es una librería estándar. En mi opinión sería más elegante hacer un system("cls") o un system("clear") dependiendo en que sistema operativo compiles.

Lo segundo que me ha llamado la atención es que utilices dos funciones idénticas para comprobar si cada jugador ha ganado, cuando podrías pedir un parámetro en la función que obtubiese el caracter que debe comprobar. Además, le pasas a la función la tira de parámetros cuando podrías hacerlo más simple y legible con punteros.

Luego me he fijado en como declaras la función main... Simplemente declarala con un int delante, aunque no pongas nada el compilador tomará la función como que devuelbe int de todos modos.

Posteriormente, a medida que voi lellendo el código me voi dando cuenta de que los nombres de las variables que utilizas podrían ser más descriptivos.

También me da la impresión de que no has utilizado los bucles for de la manera más eficiente posible... te dejo que pienses esto.

Por último, el estándar de carácteres de ancho para los programas/scripts es de 80 carácteres. Por cuestiones de uniformidad.

Bueno. Esto es lo más destacables que he visto. Estaría bien que como ejercicio produgeras un nuevo código mejorando el que ya tienes.

Saludos G4antZ
Gracias men por darte el tiempo y la corrección, tomare los consejos que mediste, subiré el code cuando lo haga y corrija...
salu2s
Título: Re:Juego el Gato
Publicado por: User170294 en Agosto 16, 2013, 12:27:00 pm
Me alegro.
Con lo de los bucles for me refiero a que si quieres (por ejemplo) vaciar un tablero podrías hacer:
Código: [Seleccionar]
for (i = 0; i < 3; i++)
{
    for (j = 0; j < 3; j++)
    {
        tablero[i][j] = " ";
    }
}

salu2
Título: Re:Juego el Gato
Publicado por: G4ntZ en Agosto 18, 2013, 08:18:22 pm
Me alegro.
Con lo de los bucles for me refiero a que si quieres (por ejemplo) vaciar un tablero podrías hacer:
Código: [Seleccionar]
for (i = 0; i < 3; i++)
{
    for (j = 0; j < 3; j++)
    {
        tablero[i][j] = " ";
    }
}

salu2
jaja vale men, habia preferido el "-" para expresar mientras se juega que no hay nada, xD nose cosa de gustos
Saludos
PD: pero entendi lo que dices
Título: Re:Juego el Gato
Publicado por: G4ntZ en Agosto 22, 2013, 08:45:54 pm
Yo no veo ningun gato, mas bien se parece al juego de tateti, de esos que jugamos en la escuela  :'(
jajaj en mi país se le dice el gato por el signo # creo que es por eso jaja saludos