Ver Mensaje Individual
  #2 (permalink)  
Antiguo 26/05/2013, 10:42
vosk
 
Fecha de Ingreso: agosto-2012
Mensajes: 601
Antigüedad: 11 años, 8 meses
Puntos: 83
Respuesta: No me corre juego tres rayas

Antes de nada tienes varias cosas a corregir: en la linea de declaracion de enteros tiene un ; enmedio que provoca que las siguientes declaraciones se interpreten como tipos no definidos. Otro error son todos los If con mayusculas (en C van en minuscula). Despues tienes la declaracion del main que aunque el compilador lo rellene por defecto tienes que declararlo tal como es: una funcion de tipo entero que retorna un entero (0 por defecto). Aparte de eso deberia indentar un poco el codigo, mas que nada porque te será util a la hora de diferenciar cada parte del codigo (por eso de la claridad y no se que mas) y ademas será amigable para toda la gente que pueda ayudarte con los problemas que te surjan. Con esto tambien me refiero a usar todas las llaves { } que sean necesarias y a separar las instrucciones por lineas (tu funcion 'casillas()' es un ejemplo de como no se debe codificar).

Ademas de todo eso tienes algunos errores de copiar/pegar: en la funcion 'jug2()' cuando se cumple la condicion 'repe1' (es decir, cuando el jugador 2 selecciona una casilla ocupada) haces un llamada a 'jug1()' cuando deberias instar al jugador 2 a corregir ok?

Mas cosas: la cadena de formato para enteros en el scanf es %d o %i, no &d; el & se usa para referenciar una posicion de memoria pero no para indicar formato:

Código C:
Ver original
  1. //esto es lo que tienes
  2. scanf("\n&d","&d",&coordx, &coordy);
  3.  
  4. //y esto es lo correcto
  5. scanf("\n%d %d", &coordx, &coordy);
  6.  
  7. //o si quieres entrar con coma
  8. scanf("\n%d,%d", &coordx, &coordy);

Aun otra cosa, en la funcion 'opcion ()' echa otro vistazo a las tres primeras lineas:

Código C:
Ver original
  1. int op = 0;
  2. if (coordx == 0 && coordy == 0)
  3.     op = 0 + 1;

No ves nada raro por ahi?

Echa tambien un vistazo a los casos de la funcion 'casillas()': sabes que 'op' solo puede ser un valor en cada llamada por lo que para cada caso obligatoriamente sales del switch, entonces no hace falta que pongas dos breaks dentro de los casos

Código C:
Ver original
  1. switch (op) {
  2.     case 1 :
  3.         if (matriz[0][0] != ' ') {
  4.             repe1=1;
  5.         }
  6.         else {
  7.             matriz[0][0] = oc;
  8.             emp++;
  9.         }
  10.     break;
  11.         ...

Y aun otra observacion: si la matriz tiene 3 filas de 7 columnas, la coordenada x puede llagar a 7 ok? Revisa las condiciones que tienes despues del scanf:

Código C:
Ver original
  1. while ( coordx > 3 || coordy > 7) {

Y ahora lo que seguramente mas te interesa: porque el valor 'op' siempre es 0? Ese valor se determina dentro de la funcion 'opcion()', pero cuando se ejecuta la llamada a esa funcion? Y en caso de que llames a 'opcion()' antes de llamar a 'casillas()' en jug1() y jug2(), que pasa si la coordenada x es mayor que 2?

Supongo que en 'opcion()' no vas a mapear todas las posibles posiciones ok? Has echo una funcion de 20 lineas y solo permite trabajar sobre coordx igual a 0, o coordx = 1 en caso que coordy = 0; como ya te puedes imaginar esta no es la solucion. Y lo mismo te sucede en la funcion 'casillas()', no puedes mapear los 21 casos entre matriz[0][0] y matriz[3][7].

Una solucion: las coordenadas que entra el usuario deben ser las posiciones dentro de la matriz pero adaptadas para basarlas en 0

Código:
//el usuario selecciona 1,2
coordx = 1
coordy = 2

//adaptas
posicionx = coordx - 1;
posiciony = coordy - 1;

//y escribes dentro de la matriz
matriz[posicionx][posiciony] = 'X';
De esta forma evitas tener que mapear todas las opciones. Lo unico que deberas tener en cuenta (que es lo que tienes despues de escanear la entrada de usuario) es que las posiciones seleccionadas existan (lo que tienes, que esten entre 1 y 7 para las horz, y entre 1 y 3 para las vert).

La otra solucion es la mas clasica en videojuegos de tiles: consiste en usar una matriz simple de 21 elementos, de forma que las coordenadas del usuario indicaran una fila/columna imaginaria:

Código:
#define ROWS 3
#define COLS 7
#define WORLDSIZE (ROWS * COLS)

char matriz[WORLDSIZE];
Para determinar la posicion dentro de la matriz imaginaria debes usar un minialgoritmo que para convertir la coordenada columna/fila a indice; el algoritmo basico para videojuegos de tiles dice que el indice es (columnas * y) + x, readaptado para trabajar con valores de usuario entre 1 y 7 queda que debes restar 1 a la fila y la columna entrada por el usuario; lo clavas en una funcion independiente y ya tienes la forma de determinar la posicion:

Código:
int getpos(int x, int y) {
	return (COLS * (y - 1)) + (x - 1);
}
Ahora reescribes la funcion 'casillas()' para que trabaje con la matriz simple:

Código:
void casillas() {
	char oc, pos;
	
	oc = (pjug == 1)? 'X':'O';
	pos = getpos(coordx, coordy);
	matriz[pos] = oc;
}
Y finalmente reescribes la funcion que pinta el tablero; ya que estas programando que menos que hacerlo de forma programana ok?

Código:
void cuadro() {
	int v, h, pos;
	
	for(v = 0; v <= ROWS; v++) {
		for(h = 0; h <= COLS; h++) {
			if(v) {
				if(h) {
					pos = getpos(h, v);
					printf("%c | ", matriz[pos]);
				}
				else {
					printf("%d | ", v);
				}
			}
			else {
				if(!h) {
					printf("0 | ");
				}
				else if(h >= COLS) {
					continue;
				}
				printf("%d | ", h+1);
			}
		}
		
		printf("\n");
		for(h = 0; h < (COLS*strlen("0 | ")) + strlen(" | "); h++) {
			printf("-");
		}
		printf("\n");
	}
}
Saludos
vosk

Última edición por vosk; 26/05/2013 a las 10:50