elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: ¿Eres nuevo? ¿Tienes dudas acerca del funcionamiento de la comunidad? Lee las Reglas Generales


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  Ejercicios
| | | |-+  duda sobre programa en c.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: duda sobre programa en c.  (Leído 2,669 veces)
rami.robot

Desconectado Desconectado

Mensajes: 1


Ver Perfil
duda sobre programa en c.
« en: 4 Enero 2018, 19:51 pm »

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.

Código
  1. [
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4.  
  5. int main(){
  6. int i,j,a,b,fallo,cont,jugador;
  7. char numero,ficha,tablero[3][3];
  8. char nombre1[30],nombre2[30];
  9. printf("NOMBRE DE JUGADOR 1: ");
  10. scanf("%s",nombre1);
  11. printf("NOMBRE DE JUGADOR 2: ");
  12. scanf("%s",nombre2);
  13. numero='1';
  14. for(i=0;i<3;i++){
  15. for(j=0;j<3;j++){
  16. tablero[i][j]=numero++;
  17. }
  18. }
  19.  
  20. printf("\n---------------\n");
  21. for(i=0;i<3;i++){
  22. for(j=0;j<3;j++){
  23. printf("| %c |",tablero[i][j]);
  24. }
  25. printf("\n---------------\n");
  26.  
  27. }
  28. cont=0;
  29.  
  30. do{
  31. do{
  32. if(cont==0||cont==1||cont==4||cont==5||cont==8||cont==9){jugador=1;}
  33. else{jugador=2;}
  34.  
  35. if(jugador==1){
  36. printf("%s seleccione posicion:  ",nombre1);
  37. scanf("%c",&ficha);
  38. }
  39. else{
  40. printf("%s seleccione posicion:  ",nombre2);
  41. scanf("%c",&ficha);
  42. }
  43. fallo=0;
  44. switch(ficha){
  45. case '1':{
  46. if(tablero[0][0]=='X'||tablero[0][0]=='O')
  47. fallo=1;
  48. printf("casilla esta ocupada\n");
  49. if(jugador==1){tablero[0][0]='X';}
  50. else{tablero[0][0]='O';}
  51.  
  52. break;
  53. }
  54. case '2':{
  55. if(jugador==1){tablero[0][1]='X';}
  56. else{tablero[0][1]='O';}
  57. break;
  58. }
  59. case '3':{
  60. if(jugador==1){tablero[0][2]='X';}
  61. else{tablero[0][2]='O';}
  62. break;
  63. }
  64. case '4':{
  65. if(jugador==1){tablero[1][0]='X';}
  66. else{tablero[1][0]='O';}
  67. break;
  68. }
  69. case '5':{
  70. if(jugador==1){tablero[1][1]='X';}
  71. else{tablero[1][1]='O';}
  72. break;
  73. }
  74. case '6':{
  75. if(jugador==1){tablero[1][2]='X';}
  76. else{tablero[1][2]='O';}
  77. break;
  78. }
  79. case '7':{
  80. if(jugador==1){tablero[2][0]='X';}
  81. else{tablero[2][0]='O';}
  82. break;
  83. }
  84. case '8':{
  85. if(jugador==1){tablero[2][1]='X';}
  86. else{tablero[2][1]='O';}
  87. break;
  88. }
  89. case '9':{
  90. if(jugador==1){tablero[2][2]='X';}
  91. else{tablero[2][2]='O';}
  92. break;
  93. }
  94.  
  95.  
  96. }
  97. }while(fallo==1);
  98. cont++;
  99.  
  100. system("cls");
  101. printf("\n---------------\n");
  102. for(i=0;i<3;i++){
  103. for(j=0;j<3;j++){
  104. printf("| %c |",tablero[i][j]);
  105. }
  106. printf("\n---------------\n");
  107.  
  108. }
  109.  
  110. }while(cont<=16);
  111.  
  112.  
  113.  
  114.  
  115. system("pause");
  116. return 0;
  117. }
  118. ]


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


« Última modificación: 5 Enero 2018, 00:00 am por engel lex » En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 3.348


Ver Perfil
Re: duda sobre programa en c.
« Respuesta #1 en: 5 Enero 2018, 19:43 pm »

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.
Código:
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...
Código:
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:
Código:
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. 


« Última modificación: 5 Enero 2018, 19:49 pm por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Una duda sobre un programa.
Ingeniería Inversa
Azazel 4 2,751 Último mensaje 13 Diciembre 2003, 13:09 pm
por harq
duda sobre programa .exe
Programación Visual Basic
gabyecc 1 1,826 Último mensaje 4 Junio 2009, 18:47 pm
por gabyecc
[?]duda sobre mi programa en c++
Programación C/C++
rocker25 6 3,749 Último mensaje 13 Junio 2010, 18:44 pm
por rocker25
Duda sobre programa en c++
Programación C/C++
asdavid 2 2,214 Último mensaje 1 Noviembre 2012, 16:06 pm
por BatchianoISpyxolo
Duda sobre mi programa en C
Programación C/C++
juan310 2 2,023 Último mensaje 18 Septiembre 2018, 04:56 am
por jca1
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines