Comunidad Underground Hispana  

Retroceder   Comunidad Underground Hispana > Programacion > Carbide C/C#/C++


Like Tree1Me Gusta
  • 1 Post By K0rl3oN

Respuesta Crear Nuevo Tema
 
Compartir en twitter LinkBack Herramientas Desplegado
Antiguo 18-ago-2006, 17:07   #1
K0rl3oN
Guest
 
Amigos
Mensajes: n/a
Predeterminado 3 en raya

Hola a todos!

Hice un 3 en raya en C++.

El c骴igo es este:

C贸digo:
/*UN SENCILLO JUEGO DE TRES EN RAYA by:K0rl3oN*/

#include "stdio.h"
#include "stdlib.h"

char matriz[3] [3]; /*La matriz de tres en raya*/

char comprobar(void);
void inic_matriz(void);
void obt_mov_jugador(void);
void obt_mov_computadora(void);
void mostrar_matriz(void);

void main(void)
{
	char hecho;

	printf("Este es el juego de tres en raya.\n\n");
	printf("Vd. jugara contra la computadora.\n\n");
	printf("Vd. es \"X\"\n");

	hecho = ' ';

	inic_matriz();

	do {
		mostrar_matriz();
		obt_mov_jugador();
		hecho=comprobar(); /*Ver si gana*/
		if(hecho!=' ') break; /*Ganador*/
		obt_mov_computadora();
		hecho=comprobar(); /*Ganador*/
	} while(hecho==' ');

	if(hecho=='X') printf("Ha ganado Vd.!!\n\n");
	else printf("Ha ganado la maquina!! You lose!\n");

	mostrar_matriz(); /*mostrar las posiciones finales*/
}

/*Inicializar la matriz*/
void inic_matriz(void)
{
	int i, j;

	for(i=0; i<3; i++)
		for(j=0; j<3; j++) matriz[i] [j] = ' ';
}

/*Obtener un movimiento del jugador*/
void obt_mov_jugador(void)
{
	int x, y; /*---> Aqui error*/

	printf("Introduzca sus coordenadas de su X Y (ej. 2 3): ");
	scanf("%d%d", &x, &y);

	x--; y--;

	if(matriz[x] [y] != ' ') {
		printf("Movimiento invalido, pruebe de nuevo.\n\n");
		obt_mov_jugador();
	}
	else matriz[x] [y] = 'X';
}

/*Obtener un movimiento de la computadora*/
void obt_mov_computadora(void)
{
	int i, j;

	for(i=0; i<3; i++) {
		for(j=0; j<3; j++)
			if(matriz[i] [j]==' ') break;
		if(matriz[i] [j]==' ') break;
	}

	if(i*j==9) {
		printf ("Tablas.\n");
		exit(0);
	}
	else
		matriz[i] [j] = 'O';
}

/*Mostrar la matriz en la pantalla*/

void mostrar_matriz(void)
{
	int t;

	for(t=0; t<3; t++) {
		printf(" %c | %c | %c ", matriz[t] [0],
			matriz[t] [1], matriz[t] [2]);
		if(t!=2) printf("\n---|---|---\n");
	}
	printf("\n");
}

/*Ver si hay un ganador*/

char comprobar(void)
{
	int i;

	for(i=0; i<3; i++) /*Comprobar filas*/
		if(matriz[i] [0]==matriz[i] [1] &&
			matriz[i] [0] ==matriz[i] [2]) return matriz[i] [0];

		for(i=0; i<3; i++) /*Comprobar columnas*/

			if(matriz[0] [i]==matriz[1] [i] &&
			matriz[0] [i] ==matriz[2] [i]) return matriz[0] [i];

			/*Comprobar diagonales*/

			if(matriz[0] [0]==matriz[1] [1] &&
				matriz[1] [1]==matriz[2][2])
				return matriz[0] [0];

			if(matriz[0] [2]==matriz[1] [1] &&
				matriz[1] [1]==matriz[2] [0])
				return matriz[0] [2];

			return ' ';
}
  
Quiero que opinen del codigo en la encuesta que he creado, por favor.

Tambi閚 que me avisen de en que puedo mejorarlo.

Gracias de antemano.

Salu2...
silvanita linda le gusta esto.
  Responder Citando
Antiguo 18-ago-2006, 17:19   #2
Sados
Guest
 
Amigos
Mensajes: n/a
Predeterminado Re: 3 en raya

bueno sobre komo mejorarlo, ejekutalo y ponle por ejemplo 2 4 o 2 5 o 2 6 o 0 5 y muestra un x en el juego, el sistema de refrencia por ejemplo por donde empieza el x y el y Y algo k a algunas personas les gusta el dar a escoger k simbolo kieres sy es el X O

felicidades por el jueguito


  Responder Citando
Antiguo 18-ago-2006, 18:38   #3
K0rl3oN
Guest
 
Amigos
Mensajes: n/a
Predeterminado Re: 3 en raya

Gracias por tu resputa, 哠ados, lo tendr en cuenta.

Votastes en el tema "Encuesta 3 en raya otad!"?? me gustar韆 que votaras amigo. Muchas gracias.

 todos los que lean este post! otad por favor, y exponed vuestros comentarios! racias!

Salu2...
  Responder Citando
Antiguo 18-ago-2006, 22:42   #4
Micki Qwerty
Guest
 
Amigos
Mensajes: n/a
Predeterminado Re: 3 en raya

Bueno, la verdad es que es un programa bonito pero te falta algo de metodologia. Yo suelo usar punteros hasta para ir al ba駉 y siempre se pueden aplicar para el tablero 3x3 que tienes que crear.
Por ponerte un ejemplo, el algoritmo de comprobacion de si el juego ha terminado lo podrias hacer mas generico aunque tal y como lo tienes no esta mal.
La solucion mas chula es crearte un array en vez de bidimensional, unidimensional. Se optimizan asi MUCHISIMO las funciones de pintar y de comprobar aunque este algoritmo es un pelin mas complicado (pero para nada dificil)

Recomiendo que la insercion de una ficha se haga metiendo el numero (1-9) en vez de la coordenada.

Creo que no ocntemplas el caso de tablas.

Tambien hay una cosilla que yo personalemnte cambiaria y es la variable hecho. Yo la declararia como un entero y para el programa principal te ahorras en el do while el tener que comprobar si el caracter ascii que representa es ' ' (espacio). C entiende que si un entero vale cero tiene valor booleano falso y si es distinto de cero valor booleano verdadero (normalmente y para no liar se le asigna el uno)
Tambien es cierto que en memoria ocupa menos un char que un entero pero relamente me parece mas elegante de esta manera:

while (!Tablas())
{
mostrar_matriz();
obt_mov_jugador();
if (comprobar())
{
printf("Gano el jugador\n");
return(0);
}
mostrar_matriz();
obt_mov_computadora();
if (comprobar())
{
printf("Gano su oponente\n");
return(0);
}
printf("Tablas\n");
return(0);
}

La condicion de salida del bucle la haces para comprobar si hay tablas.

La verdad es que tengo c muy en desuso... pero bueno para que te hagas una idea.
El procedimiento main ya no devuelve void sino int.
Comprobar tb devolveria un entero, simplemnete 1 si hay ganador y cero si no lo hay.
Este esquema mejora la secuencia:
muevo, compruebo, comparo si la variable es espacio, salgo del bucle, miro la variable otra vez para ver quien gana y muestro mensaje.

ya que la reduce a:
muevo, compruebo y si hay ganador muestro mensaje.


La funcion que mira si hay tablas es comprobar si el numero de casiilas libres es cero. Para ello llevas una variable entera q se inicializa a 9 y se decrementa con cada movimiento. De lo contrario (seria una cagada) tendrias que recorrer el tablero cada vez que quisieras hacer la comprobacion en busca de algun ' '. De hecho no haria falta un procedimiento Tablas() sino tan solo un (libres!=0). No se si me entiendes.
Y bueno, no se que mas contarte, la verdad es q no esta del todo mal. Atrevete con algo mas bestia tipo un hundir la flota.
Un saludo y piensa el algoritmo que te propongo, aunque parecen mas lineas de codigo, es mas potente. Si lo tomas como reto, trata de hacerlo con un array unidimensional.
  Responder Citando
Antiguo 19-ago-2006, 07:19   #5
K0rl3oN
Guest
 
Amigos
Mensajes: n/a
Predeterminado Re: 3 en raya

mmm... Creo que llevas raz髇, voy a probar, a ver que tal me va. Gracias por la recomendaci髇.

Salu2...
  Responder Citando
Antiguo 06-nov-2006, 02:37   #6
Sol!d
Guest
 
Amigos
Mensajes: n/a
Predeterminado Re: 3 en raya

lo probe pero la computadora contra la q juegas es muy tonta le ganas siempre
  Responder Citando
Respuesta

Herramientas
Desplegado

Normas de Publicaci贸n
No puedes crear nuevos temas
No puedes responder mensajes
No puedes subir archivos adjuntos
No puedes editar tus mensajes

Los C贸digos BB est谩n Activado
Las Caritas est谩n Activado
[IMG] est谩 Activado
El C贸digo HTML est谩 Desactivado
Trackbacks est谩n Activado
Pingbacks est谩n Activado
Refbacks est谩n Activado





Portal Hacker
Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
SEO by vBSEO 3.6.0