duda sobre programa en c.

Iniciado por rami.robot, 4 Enero 2018, 19:51 PM

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

rami.robot

buenas puede ayudarme con este programa de tres en raya con matrices en el cual no soy capaz de hacer que cuando un jugador marque 'x' en por ejemplo la casilla 2, el otro jugador no pueda marcar 'o' en la misma casilla. aun asi no se si he cometido algun error.

[
#include <stdio.h>
#include <stdlib.h>

int main(){
int i,j,a,b,fallo,cont,jugador;
char numero,ficha,tablero[3][3];
char nombre1[30],nombre2[30];
printf("NOMBRE DE JUGADOR 1: ");
scanf("%s",nombre1);
printf("NOMBRE DE JUGADOR 2: ");
scanf("%s",nombre2);
numero='1';
for(i=0;i<3;i++){
for(j=0;j<3;j++){
tablero[i][j]=numero++;
}
}

printf("\n---------------\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("| %c |",tablero[i][j]);
}
printf("\n---------------\n");

}
cont=0;

do{
do{
if(cont==0||cont==1||cont==4||cont==5||cont==8||cont==9){jugador=1;}
else{jugador=2;}

if(jugador==1){
printf("%s seleccione posicion:  ",nombre1);
scanf("%c",&ficha);
}
else{
printf("%s seleccione posicion:  ",nombre2);
scanf("%c",&ficha);
}
fallo=0;
switch(ficha){
case '1':{
if(tablero[0][0]=='X'||tablero[0][0]=='O')
fallo=1;
printf("casilla esta ocupada\n");
if(jugador==1){tablero[0][0]='X';}
else{tablero[0][0]='O';}

break;
}
case '2':{
if(jugador==1){tablero[0][1]='X';}
else{tablero[0][1]='O';}
break;
}
case '3':{
if(jugador==1){tablero[0][2]='X';}
else{tablero[0][2]='O';}
break;
}
case '4':{
if(jugador==1){tablero[1][0]='X';}
else{tablero[1][0]='O';}
break;
}
case '5':{
if(jugador==1){tablero[1][1]='X';}
else{tablero[1][1]='O';}
break;
}
case '6':{
if(jugador==1){tablero[1][2]='X';}
else{tablero[1][2]='O';}
break;
}
case '7':{
if(jugador==1){tablero[2][0]='X';}
else{tablero[2][0]='O';}
break;
}
case '8':{
if(jugador==1){tablero[2][1]='X';}
else{tablero[2][1]='O';}
break;
}
case '9':{
if(jugador==1){tablero[2][2]='X';}
else{tablero[2][2]='O';}
break;
}


}
}while(fallo==1);
cont++;

system("cls");
printf("\n---------------\n");
for(i=0;i<3;i++){
for(j=0;j<3;j++){
printf("| %c |",tablero[i][j]);
}
printf("\n---------------\n");

}

}while(cont<=16);




system("pause");
return 0;
}
]



· No se debe escribir en mayúsculas
>aquí las reglas del foro
-Engel Lex

Serapis

#1
Debes comprobar antes del "switch(ficha){" que la casilla esté libre...

Para el tablero deben usarse 3 valores, con estos 2 significados:
- Casilla vacía: por ejemplo un espacio en blanco. Es lo que debe haber al comienzo del juego.
- Casilla ocupada: casilla ocupada. Y para ello se usan dos valores '0' y 'x', cada una identifica un jugador distinto.

Por tanto cuando el jugador elija una casila, antes de intentar asignar el valor de casilla ocupada, debe consultarse si está libre. Sólo si está libre se consigna el valor ocupado, correspondiente al jufador que tiene el turno.


Un pseudocódigo del juego... estúdialo a fondo, es simple y trata de implementarlo.

enumeracion FinalesPosibles
   FINAL_JUGAR = 0     // quedan casillas or jugar.
   FINAL_GANADO =1   // ganó el jugador actual
   FINAL_TABLAS=2    // resultado en tablas.
fin enumeracion
arraychars Tablero(3,3)


funcion JugarPartida
   caracter jugador, espacio
   entero casilla, fila, columna
   buleano vacia
   finalesposibles finpartida
   
   espacio = " "
   // jugador ="X"  // empieza el jugador 0, ya que nada más empezar cambia el turno al otro jugador.
   finpartida = FINAL_JUGAR

   // Dibujar el tablero vacio y vaciar el contenido del tablero actual
   bucle para x desde 0 a 2
       bucle para Y desde 0 a 2
           tablero(x,y) = espacio
           dibujar(x,y, espacio)
       fin bucle
   fin bucle

   Hacer  // jugar por trnos hasta final de partida.
       // cambiar el turno del jugador
       si jugador = "0" luego
           jugador = "X"
       Sino
           jugador ="0"
       fin si

       Hacer  // pedir casilla libre al jugador actual
           casilla = PedirCasillaAlJugador(entre 0 y 8) //OJO: 0-8, no 1-9
           columna = (casilla modulo 3)
           fila = (casilla \3) //división entera
           vacia = ( Tablero(columna, fila) = espacio)
       Repetir mientras vacia = FALSE  // casilla = ocupada
   
       Tablero(columna, fila) = jugador  // jugador y el valor que se coloca, es lo mismo.
        dibujar(columna, fila, jugador)  // dibuja en el tablero la apuesta del jugador.
        finpartida= TresEnRaya(jugador)   // descubrir si hay 3 en raya en alguna posicion (horizontal vertical, diagonal).          
   Repetir mientras (finpartida = FINAL_JUGAR)

   // si alguien se alzó con la victoria se proclama.
   Si (finpartida = FINAL_GANADO) luego
       mensaje "La partida acabó con victoria del jugador que jugaba con la ficha: " + jugador
   Sino
       mensaje "La partida acabó en tablas."
   Fin si
fin funcion


Dibujar (x, y, valor) es una función que dibuja el valor consuignado en la casilla que se indica.
Pero si te resulta complicado, dibujar una sola casilla, puedes optar por redibujar el tablero entero, no requiriendo al caso ningún parámetro.

finalesposibles = TresEnRaya(valor), es una función que escruta sobre el array si hay tres en raya del valor recibido ("X", ó "0"), si lo hay devuelve un valor 1 (ganado), si no lo hay todavía escruta si queda alguna casilla libre donde jugar, si no lo hay devuelve un valor 2 (tablas), si quedan casillas libres para jugar, devuelve un valor 0 (jugar)... es decir devuelve un valor de la enumeración: finalesPosibles...
Como sabes, 3 en raya puede ser en horizonbtal, vertical o diagonal... comprueba cada línea, horizontal, cada línea vertical y las 2 diagonales, cada una son 3 pares de cordenadas, que puede derivarse a una segunda función...

finalesposibles = Funcion TresEnRaya(valor)
  si Correcto3(0,0,1,0,2,0, valor) = TRUE luego
     Devolver FINAL_GANADO
  fin si
  ... el resto queda a tu esfuerzo...

fin funcion


Buleano = Correcto3(x1, y1, x2, y2, x3, y3, valor) es una función que recibe 3 pares de cordenadas y devuelve TRUE, si las 3 tienen el mismo valor que el recibido.
dándote la primera de las llamadas, ya te faltan solo completar, 2 líneas horizontales, las 3 verticales y las 2 diagonales... la primera te sirve de guía.

Y aquí lo que sería el pseudocódigo de dicha función:

buleano = Funcion Correcto3(x1, y1, x2, y2, x3, y3, valor)
   Si Tablero(x1, y1) = valor
       Si Tablero(x2, y2) = valor
           Si Tablero(x3, y3) = valor
               Devolver TRUE
           fin si
       fin si
   fin si
   Devolver FALSE
fin funcion


PedirCasillaAlJugador, es una función que reclama un valor entre 0 y 8, no debe admitir ningún otro.