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

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Ayuda juego Mastermind en C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Ayuda juego Mastermind en C++  (Leído 3,130 veces)
TheXiiscoZ

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Ayuda juego Mastermind en C++
« en: 10 Diciembre 2017, 17:13 pm »

Buenas, mi compañero y yo hemos empezado este año en TIC y nuestro primer trabajo es programar un juego sencillo, nada del otro mundo y que tenemos que entregar. Sí, somos muy novatos en la programación y apenas hace 1 mes que empezamos y necesitamos acabar el juego.

Nuestra idea es crear un mastermind, con diferentes dificultades desde el modo clásico (4 digitos) hasta añadirles mas niveles pero no damos con la tecla a la hora de introducir el código y el programa revise si en los números hay heridos, muertos etc.


#include <iostream>
#include <windows.h>
#include <sstream>
#include <string>
using namespace std;
int a,b,c,d,N;
int q,w,e,r;

void clasicresp(){
   N=N-1;
   cout<<"Intenta adivinar el codigo. Quedan" <<N<<"intentos" <<endl;
   cin>>q;
   cin>>w;
   cin>>e;
   cin>>r;
   
   if(a=q){
      cout<<"Excelente, todos los números son correctos";
         }
         else{
         clasicresp();   
         }
}

void cla(){
   N=12;
   cout<<"Introduce el codigo"<<endl;
   cin>>a;
   cin>>b;
   cin>>c;
   cin>>d;
   system("cls");
   clasicresp();
}


   
   
   



void jugar(){
        int d;
        system("cls");
      cout<<"****SELECCIONA EL NIVEL DE DIFICULTAD*****"<<endl;
      cout<<""<<endl;
      cout<<"[1] NOOB"<<endl;
      cout<<"[2] CLASICO"<<endl;
       cout<<"[3] DIFICIL"<<endl;
      cout<<"[4] HARDCORE"<<endl;
      cin>> d;
      
      switch(d){
      case 1:
      break;
      case 2: cla();
      break;
      case 3:
      break;
      case 4:
      break;
      default:
      cout<<"Valor no valido"<<endl;
      Sleep(1500);
      system("cls");
      jugar();
   }
      
      
}


void menu(){
   int n;
   cout<<"=============================="<<endl;
   cout<<"Bienvenido a Inspector Numbers"<<endl;
   cout<<"=============================="<<endl;
   cout<<""<<endl;
   cout<<"[1] Jugar"<<endl;
   cout<<"[2] Ayuda"<<endl;
   cin>> n;
   switch(n){
      case 1: jugar();
      break;
      case 2: system("cls");
               cout<<"NO PIERDAS ;)"<<endl;
      break;
      default:
      cout<<"Valor no valido"<<endl;
      Sleep(1500);
      system("cls");
      menu();
   }
   

}

int main(){
menu();
return 0;
}




En línea

_TTFH_3500

Desconectado Desconectado

Mensajes: 119



Ver Perfil
Re: Ayuda juego Mastermind en C++
« Respuesta #1 en: 10 Diciembre 2017, 17:58 pm »

Este es un codigo que hice hace varios años en Pascal, se puede pasar a C muy fácil.

"Regulares" es a lo que tu llamas heridos y "buenos" es muertos.
ObtenerNota haya dichos valores en el codigo, en este caso tiene un largo de seis letras que pueden ir de la A a la H

Código
  1. PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR);

Código
  1. void ObtenerNota(TipoCodigo propuesta, TipoCodigo codigo, RangoBR &buenos, RangoBR &regulares) {

Código
  1. PROGRAM MasterMind (input, output);
  2. CONST
  3. MAXIMO_INTENTOS = 20;
  4. LARGO_CODIGO = 6;
  5. PRIMERA_LETRA = 'A';
  6. ULTIMA_LETRA = 'H';
  7. TYPE
  8. RangoCodigo = 1..LARGO_CODIGO;
  9. TipoCodigo = ARRAY [RangoCodigo] OF Char;
  10.  
  11. RangoBR = 0..LARGO_CODIGO;
  12. TRegistroNota = RECORD
  13. codigo: TipoCodigo;
  14. buenos,
  15. regulares: RangoBR
  16. END;
  17.  
  18.    THistoria = RECORD
  19. info: ARRAY [1..MAXIMO_INTENTOS] OF TRegistroNota;
  20. tope: 0..MAXIMO_INTENTOS
  21. END;
  22.  
  23. ListaNotas = ^CeldaNota;
  24. CeldaNota = RECORD
  25. codigo: TipoCodigo;
  26. buenos,
  27. regulares: RangoBR;
  28. turno: 1..MAXIMO_INTENTOS;
  29. siguiente: ListaNotas
  30. END;
  31. VAR
  32. secreto, codigo: TipoCodigo;
  33. historia: THistoria;
  34. buenos, regulares: RangoBR;
  35. i, intentos: Integer;
  36. exito, fracaso: Boolean;
  37. lista: ListaNotas;
  38.  
  39. FUNCTION EsValido(codigo: TipoCodigo): Boolean;
  40. VAR
  41. i: Integer;
  42. BEGIN
  43. i := 1;
  44. WHILE (i <= LARGO_CODIGO) AND (codigo[i] >= PRIMERA_LETRA) AND (codigo[i] <= ULTIMA_LETRA) DO
  45. i := i + 1;
  46. EsValido :=  i > LARGO_CODIGO
  47. END;
  48.  
  49. PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR);
  50. VAR
  51. i, j, max: Integer;
  52. propuestacopia: TipoCodigo;
  53. BEGIN
  54. buenos := 0;
  55. FOR i := 1 TO LARGO_CODIGO DO
  56. BEGIN
  57. IF propuesta[i] = codigo[i] THEN
  58. buenos := buenos + 1;
  59. propuestacopia[i] := propuesta[i]
  60. END;
  61. max := 0;
  62. FOR i := 1 TO LARGO_CODIGO DO
  63. BEGIN
  64. j := 1;
  65. WHILE (j <= LARGO_CODIGO) AND (codigo[i] <> propuestacopia[j]) DO
  66. j := j + 1;
  67. IF j <= LARGO_CODIGO THEN
  68. BEGIN
  69. max := max + 1;
  70. propuestacopia[j] := ' '
  71. END
  72. END;
  73. regulares := max - buenos
  74. END;
  75.  
  76. PROCEDURE IniciarHistoria(VAR historia: THistoria);
  77. BEGIN
  78. WITH historia DO
  79. tope := 0
  80. END;
  81.  
  82. PROCEDURE GuardarNota(VAR historia: THistoria;
  83. codigo: TipoCodigo;
  84. buenos, regulares: RangoBR);
  85. VAR
  86. i: Integer;
  87. BEGIN
  88. WITH historia DO
  89. BEGIN
  90. tope := tope + 1;
  91. FOR i := 1 TO LARGO_CODIGO DO
  92. info[tope].codigo[i] := codigo[i];
  93. info[tope].buenos := buenos;
  94. info[tope].regulares := regulares
  95. END
  96. END;
  97.  
  98. FUNCTION ListaOrdenada(historia: THistoria): ListaNotas;
  99. VAR
  100. i, j: Integer;
  101. p, actual, anterior, lista: ListaNotas;
  102. BEGIN
  103. lista := NIL;
  104. FOR i := 1 TO historia.tope DO
  105. BEGIN
  106. new(p);
  107. FOR j := 1 TO LARGO_CODIGO DO
  108. p^.codigo[j] := historia.info[i].codigo[j];
  109. p^.buenos := historia.info[i].buenos;
  110. p^.regulares := historia.info[i].regulares;
  111. p^.turno := i;
  112.  
  113. actual := lista;
  114. anterior := lista;
  115. WHILE (actual <> NIL) AND (10 * actual^.buenos + actual^.regulares <= 10 * p^.buenos + p^.regulares) DO
  116. BEGIN
  117. anterior := actual;
  118. actual := actual^.siguiente
  119. END;
  120. IF (anterior = NIL) OR (anterior = actual) THEN
  121. BEGIN
  122. p^.siguiente := anterior;
  123. lista := p
  124. END
  125. ELSE
  126. BEGIN
  127. p^.siguiente := actual;
  128. anterior^.siguiente := p
  129. END
  130. END;
  131. ListaOrdenada := lista
  132. END;
  133.  
  134. PROCEDURE GenerarCodigo(VAR codigo: TipoCodigo);
  135. VAR
  136. i: Integer;
  137. ordprim, ordult: Integer;
  138. BEGIN
  139. ordprim := ord(PRIMERA_LETRA);
  140. ordult  := ord(ULTIMA_LETRA);
  141. FOR i := 1 TO LARGO_CODIGO DO
  142. codigo[i] := chr(ordprim + random(ordult - ordprim + 1))
  143. END;
  144.  
  145. PROCEDURE LeerCodigo(VAR codigo: TipoCodigo);
  146. VAR
  147. i: Integer;
  148. BEGIN
  149. FOR i := 1 TO LARGO_CODIGO DO
  150. Read(codigo[i]);
  151. ReadLn
  152. END;
  153.  
  154. (* ------ Programa Principal ------ *)
  155. BEGIN
  156. Randomize;
  157. IniciarHistoria(historia);
  158. GenerarCodigo(secreto);
  159. intentos := 0;
  160. exito := false;
  161. fracaso := false;
  162. WriteLn('He pensado un codigo, intenta adivinarlo.');
  163. WriteLn('*Pista: tiene ', LARGO_CODIGO, ' letras y estas estan entre la ', PRIMERA_LETRA, ' y la ', ULTIMA_LETRA);
  164. WriteLn('Las letras pueden repetirse o no aparecer en mi codigo, y solo tienes ', MAXIMO_INTENTOS, ' intentos.');
  165. WriteLn;
  166. REPEAT
  167. LeerCodigo(codigo);
  168. WHILE NOT EsValido(codigo) DO
  169. BEGIN
  170. WriteLn('El codigo no es valido, intentalo de nuevo.');
  171. LeerCodigo(codigo)
  172. END;
  173. intentos := intentos + 1;
  174. ObtenerNota(codigo, secreto, buenos, regulares);
  175. IF buenos = LARGO_CODIGO THEN
  176. exito := true
  177. ELSE IF intentos = MAXIMO_INTENTOS THEN
  178. fracaso := true
  179. ELSE
  180. BEGIN
  181. Write('B: ', buenos, '   R: ', regulares);
  182. WriteLn('                      Te quedan ', MAXIMO_INTENTOS - intentos, ' intentos')
  183. END;
  184. GuardarNota(historia, codigo, buenos, regulares)
  185. UNTIL exito OR fracaso;
  186. WriteLn;
  187. WriteLn;
  188. IF exito THEN
  189. WriteLn('***** FELICIDADES, has ganado. *****')
  190. ELSE
  191. BEGIN
  192. WriteLn('--- Demasiados intentos, perdiste. ---');
  193. Write  ('    El codigo secreto era: ');
  194. FOR i := 1 TO LARGO_CODIGO DO
  195. Write(secreto[i])
  196. END;
  197. WriteLn;
  198. WriteLn;
  199. lista := ListaOrdenada(historia);
  200. WHILE lista <> NIL DO
  201. BEGIN
  202. FOR i := 1 TO LARGO_CODIGO DO
  203. Write(lista^.codigo[i]);
  204. Write(' -->  Bs = ', lista^.buenos, ',  Rs = ', lista^.regulares, ' (Turno: ', lista^.turno, ')');
  205. WriteLn;
  206. lista := lista^.siguiente
  207. END;
  208. ReadLn
  209. END.


« Última modificación: 10 Diciembre 2017, 18:02 pm por _TTFH_3500 » En línea

TheXiiscoZ

Desconectado Desconectado

Mensajes: 2


Ver Perfil
Re: Ayuda juego Mastermind en C++
« Respuesta #2 en: 10 Diciembre 2017, 19:24 pm »

Este es un codigo que hice hace varios años en Pascal, se puede pasar a C muy fácil.

"Regulares" es a lo que tu llamas heridos y "buenos" es muertos.
ObtenerNota haya dichos valores en el codigo, en este caso tiene un largo de seis letras que pueden ir de la A a la H

Código
  1. PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR);

Código
  1. void ObtenerNota(TipoCodigo propuesta, TipoCodigo codigo, RangoBR &buenos, RangoBR &regulares) {

Código
  1. PROGRAM MasterMind (input, output);
  2. CONST
  3. MAXIMO_INTENTOS = 20;
  4. LARGO_CODIGO = 6;
  5. PRIMERA_LETRA = 'A';
  6. ULTIMA_LETRA = 'H';
  7. TYPE
  8. RangoCodigo = 1..LARGO_CODIGO;
  9. TipoCodigo = ARRAY [RangoCodigo] OF Char;
  10.  
  11. RangoBR = 0..LARGO_CODIGO;
  12. TRegistroNota = RECORD
  13. codigo: TipoCodigo;
  14. buenos,
  15. regulares: RangoBR
  16. END;
  17.  
  18.    THistoria = RECORD
  19. info: ARRAY [1..MAXIMO_INTENTOS] OF TRegistroNota;
  20. tope: 0..MAXIMO_INTENTOS
  21. END;
  22.  
  23. ListaNotas = ^CeldaNota;
  24. CeldaNota = RECORD
  25. codigo: TipoCodigo;
  26. buenos,
  27. regulares: RangoBR;
  28. turno: 1..MAXIMO_INTENTOS;
  29. siguiente: ListaNotas
  30. END;
  31. VAR
  32. secreto, codigo: TipoCodigo;
  33. historia: THistoria;
  34. buenos, regulares: RangoBR;
  35. i, intentos: Integer;
  36. exito, fracaso: Boolean;
  37. lista: ListaNotas;
  38.  
  39. FUNCTION EsValido(codigo: TipoCodigo): Boolean;
  40. VAR
  41. i: Integer;
  42. BEGIN
  43. i := 1;
  44. WHILE (i <= LARGO_CODIGO) AND (codigo[i] >= PRIMERA_LETRA) AND (codigo[i] <= ULTIMA_LETRA) DO
  45. i := i + 1;
  46. EsValido :=  i > LARGO_CODIGO
  47. END;
  48.  
  49. PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR);
  50. VAR
  51. i, j, max: Integer;
  52. propuestacopia: TipoCodigo;
  53. BEGIN
  54. buenos := 0;
  55. FOR i := 1 TO LARGO_CODIGO DO
  56. BEGIN
  57. IF propuesta[i] = codigo[i] THEN
  58. buenos := buenos + 1;
  59. propuestacopia[i] := propuesta[i]
  60. END;
  61. max := 0;
  62. FOR i := 1 TO LARGO_CODIGO DO
  63. BEGIN
  64. j := 1;
  65. WHILE (j <= LARGO_CODIGO) AND (codigo[i] <> propuestacopia[j]) DO
  66. j := j + 1;
  67. IF j <= LARGO_CODIGO THEN
  68. BEGIN
  69. max := max + 1;
  70. propuestacopia[j] := ' '
  71. END
  72. END;
  73. regulares := max - buenos
  74. END;
  75.  
  76. PROCEDURE IniciarHistoria(VAR historia: THistoria);
  77. BEGIN
  78. WITH historia DO
  79. tope := 0
  80. END;
  81.  
  82. PROCEDURE GuardarNota(VAR historia: THistoria;
  83. codigo: TipoCodigo;
  84. buenos, regulares: RangoBR);
  85. VAR
  86. i: Integer;
  87. BEGIN
  88. WITH historia DO
  89. BEGIN
  90. tope := tope + 1;
  91. FOR i := 1 TO LARGO_CODIGO DO
  92. info[tope].codigo[i] := codigo[i];
  93. info[tope].buenos := buenos;
  94. info[tope].regulares := regulares
  95. END
  96. END;
  97.  
  98. FUNCTION ListaOrdenada(historia: THistoria): ListaNotas;
  99. VAR
  100. i, j: Integer;
  101. p, actual, anterior, lista: ListaNotas;
  102. BEGIN
  103. lista := NIL;
  104. FOR i := 1 TO historia.tope DO
  105. BEGIN
  106. new(p);
  107. FOR j := 1 TO LARGO_CODIGO DO
  108. p^.codigo[j] := historia.info[i].codigo[j];
  109. p^.buenos := historia.info[i].buenos;
  110. p^.regulares := historia.info[i].regulares;
  111. p^.turno := i;
  112.  
  113. actual := lista;
  114. anterior := lista;
  115. WHILE (actual <> NIL) AND (10 * actual^.buenos + actual^.regulares <= 10 * p^.buenos + p^.regulares) DO
  116. BEGIN
  117. anterior := actual;
  118. actual := actual^.siguiente
  119. END;
  120. IF (anterior = NIL) OR (anterior = actual) THEN
  121. BEGIN
  122. p^.siguiente := anterior;
  123. lista := p
  124. END
  125. ELSE
  126. BEGIN
  127. p^.siguiente := actual;
  128. anterior^.siguiente := p
  129. END
  130. END;
  131. ListaOrdenada := lista
  132. END;
  133.  
  134. PROCEDURE GenerarCodigo(VAR codigo: TipoCodigo);
  135. VAR
  136. i: Integer;
  137. ordprim, ordult: Integer;
  138. BEGIN
  139. ordprim := ord(PRIMERA_LETRA);
  140. ordult  := ord(ULTIMA_LETRA);
  141. FOR i := 1 TO LARGO_CODIGO DO
  142. codigo[i] := chr(ordprim + random(ordult - ordprim + 1))
  143. END;
  144.  
  145. PROCEDURE LeerCodigo(VAR codigo: TipoCodigo);
  146. VAR
  147. i: Integer;
  148. BEGIN
  149. FOR i := 1 TO LARGO_CODIGO DO
  150. Read(codigo[i]);
  151. ReadLn
  152. END;
  153.  
  154. (* ------ Programa Principal ------ *)
  155. BEGIN
  156. Randomize;
  157. IniciarHistoria(historia);
  158. GenerarCodigo(secreto);
  159. intentos := 0;
  160. exito := false;
  161. fracaso := false;
  162. WriteLn('He pensado un codigo, intenta adivinarlo.');
  163. WriteLn('*Pista: tiene ', LARGO_CODIGO, ' letras y estas estan entre la ', PRIMERA_LETRA, ' y la ', ULTIMA_LETRA);
  164. WriteLn('Las letras pueden repetirse o no aparecer en mi codigo, y solo tienes ', MAXIMO_INTENTOS, ' intentos.');
  165. WriteLn;
  166. REPEAT
  167. LeerCodigo(codigo);
  168. WHILE NOT EsValido(codigo) DO
  169. BEGIN
  170. WriteLn('El codigo no es valido, intentalo de nuevo.');
  171. LeerCodigo(codigo)
  172. END;
  173. intentos := intentos + 1;
  174. ObtenerNota(codigo, secreto, buenos, regulares);
  175. IF buenos = LARGO_CODIGO THEN
  176. exito := true
  177. ELSE IF intentos = MAXIMO_INTENTOS THEN
  178. fracaso := true
  179. ELSE
  180. BEGIN
  181. Write('B: ', buenos, '   R: ', regulares);
  182. WriteLn('                      Te quedan ', MAXIMO_INTENTOS - intentos, ' intentos')
  183. END;
  184. GuardarNota(historia, codigo, buenos, regulares)
  185. UNTIL exito OR fracaso;
  186. WriteLn;
  187. WriteLn;
  188. IF exito THEN
  189. WriteLn('***** FELICIDADES, has ganado. *****')
  190. ELSE
  191. BEGIN
  192. WriteLn('--- Demasiados intentos, perdiste. ---');
  193. Write  ('    El codigo secreto era: ');
  194. FOR i := 1 TO LARGO_CODIGO DO
  195. Write(secreto[i])
  196. END;
  197. WriteLn;
  198. WriteLn;
  199. lista := ListaOrdenada(historia);
  200. WHILE lista <> NIL DO
  201. BEGIN
  202. FOR i := 1 TO LARGO_CODIGO DO
  203. Write(lista^.codigo[i]);
  204. Write(' -->  Bs = ', lista^.buenos, ',  Rs = ', lista^.regulares, ' (Turno: ', lista^.turno, ')');
  205. WriteLn;
  206. lista := lista^.siguiente
  207. END;
  208. ReadLn
  209. END.

Me da error al compilar; me da el error de too many decimals on point en la linea 8
En línea

_TTFH_3500

Desconectado Desconectado

Mensajes: 119



Ver Perfil
Re: Ayuda juego Mastermind en C++
« Respuesta #3 en: 10 Diciembre 2017, 20:02 pm »

Aquí lo tienes en C++ más reducido, este no muestra el historial de intentos.

También tengo una IA que busca las mejores combinaciones en base a los intentos anteriores.

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <ctype.h>
  4. #include <time.h>
  5.  
  6. const int MAXIMO_INTENTOS = 20;
  7. const int LARGO_CODIGO = 6;
  8. const char PRIMERA_LETRA = 'A';
  9. const char ULTIMA_LETRA = 'H';
  10.  
  11. typedef char TipoCodigo[LARGO_CODIGO + 1];
  12.  
  13. bool EsValido(TipoCodigo codigo) {
  14. // Devuelve true si el codigo es valido.
  15. int i = 1;
  16. while (i <= LARGO_CODIGO && codigo[i] >= PRIMERA_LETRA && codigo[i] <= ULTIMA_LETRA)
  17. i++;
  18. // Es valido si todos los elementos del codigo estan en el rango.
  19. return i > LARGO_CODIGO;
  20. }
  21.  
  22. void ObtenerNota(TipoCodigo propuesta, TipoCodigo codigo, unsigned int &buenos, unsigned int &regulares) {
  23. // Obtener cantidad de buenos y regulares entre dos codigos.
  24. TipoCodigo propuestacopia;
  25. buenos = 0;
  26. for (int i = 1; i <= LARGO_CODIGO; i++) {
  27. if (propuesta[i] == codigo[i]) buenos++;
  28. propuestacopia[i] = propuesta[i];
  29. }
  30. int max = 0;
  31. // Hallar la "maxima" cantidad de buenos.
  32. for (int i = 1; i <= LARGO_CODIGO; i++) {
  33. int j = 1;
  34. while (j <= LARGO_CODIGO && codigo[i] != propuestacopia[j]) j++;
  35. if (j <= LARGO_CODIGO) {
  36. // Borrar la letra para no volver a usar la misma.
  37. propuestacopia[j] = ' ';
  38. max++;
  39. }
  40. }
  41. regulares = max - buenos;
  42. }
  43.  
  44. void GenerarCodigo(TipoCodigo &codigo) {
  45. // Generar codigo aleatorio
  46. int ord_prim = (int)PRIMERA_LETRA;
  47. int ord_ult = (int)ULTIMA_LETRA;
  48. for (int i = 1; i <= LARGO_CODIGO; i++)
  49. codigo[i] = ord_prim + rand() % (ord_ult - ord_prim + 1);
  50. }
  51.  
  52. void LeerCodigo(TipoCodigo &codigo) {
  53. char c;
  54. for (int i = 1; i <= LARGO_CODIGO; i++) {
  55. scanf("%c", &c);
  56. codigo[i] = toupper(c);
  57. }
  58. do {
  59. c = getchar();
  60. } while (c != '\n');
  61. }
  62.  
  63. int main() {
  64. srand(time(NULL));
  65. TipoCodigo secreto;
  66. GenerarCodigo(secreto);
  67. int intentos = 0;
  68. bool exito = false;
  69. bool fracaso = false;
  70. printf("He pensado un codigo, intenta adivinarlo.\n");
  71. printf("*Pista: tiene %d letras y estas estan entre la %c y la %c\n", LARGO_CODIGO, PRIMERA_LETRA, ULTIMA_LETRA);
  72. printf("Las letras pueden repetirse o no aparecer en el codigo, y solo tienes %d intentos.\n\n", MAXIMO_INTENTOS);
  73. do {
  74. TipoCodigo codigo;
  75. LeerCodigo(codigo);
  76. while (!EsValido(codigo)) {
  77. printf("El codigo no es valido, intentalo de nuevo.\n");
  78. LeerCodigo(codigo);
  79. }
  80. intentos++;
  81. unsigned int buenos, regulares;
  82. ObtenerNota(codigo, secreto, buenos, regulares);
  83. if (buenos == LARGO_CODIGO) exito = true;
  84. else if (intentos == MAXIMO_INTENTOS) fracaso = true;
  85. else {
  86. printf("B: %d   R: %d", buenos, regulares);
  87. printf("                      Te quedan %d intentos\n", MAXIMO_INTENTOS - intentos);
  88. }
  89. } while (!(exito || fracaso));
  90.  
  91. printf("\n\n");
  92. if (exito) printf("***** FELICIDADES, has ganado. *****\n");
  93. else {
  94. printf("--- Demasiados intentos, perdiste. ---\n");
  95. printf("El codigo secreto era: ");
  96. for (int i = 1; i <= LARGO_CODIGO; i++) printf("%c", secreto[i]);
  97. }
  98. printf("\n");
  99. }
En línea

Serapis
Colaborador
***
Desconectado Desconectado

Mensajes: 2.773


Ver Perfil
Re: Ayuda juego Mastermind en C++
« Respuesta #4 en: 11 Diciembre 2017, 03:56 am »

Darte un código, no me parece lo más adecuado.
Con copiar y pegar, no se aprende. Debes pensar por ti mismo, aunque tengas orientación.

Supongamos que las líneas contienen 4 bolas que el usuario debe resolver, elegibles sobre un total de 8 bolas

Quiere el jugador seguir jugando?
Código:
buleano = Funcion PedirPartida
    dato= PedirDatoAlUsuario("¿ DeseaJugar otra partida (S/N)? ")
    Si (dato="S") ó (dato="s") luego
        devolver TRUE
    Sino
        devolver FALSE
    Fin si
Fin funcion

Crear el array de bolas de la 'banca' y barajarlo...
Código:
Array de bytes =Funcion BarajarBolas(entero cantidad) //8 bolas
     Array bytes Bolas()
    entero i, j, k

    RedimensionarArray Bolas(0 a cantidad-1)

    // Meter en el "saco" todas las bolas que participan
    bucle para k desde 0 a cantidad-1
        Bolas(k) = k    
    Repetir

    //Barajar el array.
    // aunque se barajan todas, el usuario solo debe resolver las 4 primeras.
    bucle para k desde cantidad-1 a 1 regresivamente
        j= Random(entre 0 y k)
        i=bolas(k)
        bolas(k)= bolas(j)
        bolas(j)=i
    repetir
    
    devolver bolas //devuelve el array barajado.
Fin funcion

Cuando el jugador completa su apuesta (todas las bolas d euna línea), se verifica si es la 'respuesta' coincidente con la que almacena la banca.
cantidad es el tamaño del array bolas (8), y cantidadUser son 4, las que debe resolver el jugador.
Devuelve FALSE si la partida terminó.
Código:
buleano = funcion VerificarLinea(entero cantidad, entero cantidadUser, arraybytes bolasUser())
    entero h, i, j, k

    bucle para k desde 0 a cantidadUser-1
        j= EstaBolaUserEnBanca(bolasUser(k), cantidad)
        Si (j>=0) luego  //la bola que eligió el jugador está en la línea...
            i +=1
            si (j= bolas(k)) luego //además coincide en el sitio
                h +=1
            fin si
         fin si
    Fin bucle
    Pintar h bolas, de blanco //indicador de bolas correctas y en su sitio.
    Si (h=cantidadUser) luego
        mensaje "enhorabuena, juego resuelto"
        devolver FALSE
    Sino
        pintar i-h bolas, de gris // indicador de bolas correctas pero fuera de sitio.
        pintar cantidaduser - i bolas, de negro //indicador de bolas erróneas
        tiradas +=1  //intentos del jugador
        Si (tiradas = Maxtiradas) luego // por ejemplo 10, ó 12 tintentos
           mensaje "Lo sentimos, perdiste todas tus oportunidades de acertar. GAME OVER"
            devolver FALSE
        sino
            devolver TRUE //el jugador puede seguir jugando...
        Fin si
    Fin si
    // puede resumirse en (pintar) solo dos informaciones en vez de en 3... al gusto (omitiendo el 1º de los 3 puntosm, pintar h bolas de blanco), y/o cambiar colores para expresar una u otra cosa.
Fin funcion

Verifica si la bola apostada, consta en la línea de la banca...
Si está devuelve su posición, si no está devuelve -1
Código:
entero = Funcion EstaBolaUserEnBanca(entero Bola, entero cantidad) // esta cantidad es la de bolas totales que hay
     entero k

    bucle para k desde 0 a cantidad-1
        si bola = Bolas(k) luego
            devolver k
        fin si
    fin bucle

    devolver -1    
Fin funcion

Verifica si la bola y la posición donde el jugador la quiere depositar es válida.
Devuelve FALSE mientras al jugador le falte colocar alguna bola
No se verifica 'posición', se supone que si el jugador solo puede posicionarla en 4 posiciones no va a poder elegir un valor fuera del rango 0-3 (tampoco se verifica que la bola esté en el rango esperado (0-7)
Código:
buleano = Funcion BolaValida(entero bola, entero posicion, entero cantidadUser)
    entero j, k

    Si (bola=-1) luego  // equivale a eliminar una bola, ...para ubicarla en otra posición
        bolasUser(posicion) = -1 // -1 equivale a un hueco libre en el array de apuesta del jugador
        devolver FALSE  
    fin si
    
    // Comprobar que esa bola no haya sido ya elegida
    bucle para k desde 0 a cantidadUser-1
        Si (bola = bolasUser(k)) luego
            mensaje "Ya tienes esa bola elegida"
            devolver FALSE  //solo puede elegirse una vez una bola del mismo color.
        sino
            Si (bolasUser(k) >-1) luego
                Si (k=posicion) luego // pretende ubicarse la bola  en una posición ya ocupada...
                                                        // podria hacerse diferentes cosas, pero lo mejor es impedirlo e indicarlo.
                    mensaje "Ya hay una bola en esa posición, solo puede colocar bolas en huecos libres. si lo precisa retire una bola de la posición deseada antes de colocar otra.                                    
                fin si
            sino
                Si (k=posicion) luego
                    bolasUser(k)= bola //el jugador mete su bola en un hueco
                sino
                    j +=1  // queda un hueco más en el array para alojar una bola...
                fin si
            fin si
        fin si
    fin bucle

    Si (j=0)
        devolver TRUE //Si no hay huecos, si ya tiene todas las bolas devuelve TRUE
    sino
        devolver FALSE
    fin si
fin funcion


Función principal...
Código:
Funcion IniciarPartida
    array bytes bolas(), bolasUser()
    entero bola, posicion, tiradas, maxTiradas

    maxTiradas=10
    Hacer mientras PedirPartida = TRUE
        bolas = llamada a BarajarBolas(8)
        tiradas =0

        Hacer // nueva tirada del jugador
            bolasUser = llamada a BorrarBolasUser(4)
            Hacer // pedir bolas de una línea al jugador
                bola = PedirDatoBola al jugador (0-7) // volver a pedir mientras esté fuera del rango 0-7
                posicion = pedirDatoPosicion al jugador (0-3) // volver a pedir mientras quede fuera del rango 0-3
            Repetir mientras BolaValida(bola, posicion, 4) = FALSE    
            // al salir del bucle el jugador completo su apuesta y consta en el array bolasUser  

        Repetir mientras VerificarLinea(8, 4, bolasUser) = TRUE
    Repetir
fin funcion

Se resetea la apuesta del jugador (todo el array a valor -1)
Código:
arrayBytes = funcion BorrarBolasUser(entero cantidadUser)
    array bytes arr()
    entero k
  
    bucle para k desde 0 a cantidadUser-1
        arr(k) = -1
    fin bucle    
    
    devolver arr
fin funcion

Quizás me deje alguna pequeña funcionalidad en el tintero, pero ya tienes suficientes detalles para entenderlo y modificarlo a tu antojo... eso sí, pensando... que es de lo que trata la programación (para copiar y pegar están las impresoras, los escáneras, las cámaras de fotos... pero ellas no cran programas, se requiere pensar).

p.d.: Los niveles de dificultad, pueden crearse modificando el número de intentos que tiene el jugador así como el número de bolas que debe acertar y las bolas elegibles...
- Cuantos menos intentos, más difícil.
- Cuantas más bolas deba acertar (tenga la línea d ela banca a acertar), más difícil.
- Cuantas más bolas elegibles entre las que apostar, más difícil...
« Última modificación: 11 Diciembre 2017, 04:13 am por NEBIRE » En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Mastermind
Programación C/C++
N0body 1 3,660 Último mensaje 1 Mayo 2010, 04:01 am
por N0body
Juego Mastermind
Programación C/C++
adeur 3 3,569 Último mensaje 5 Julio 2012, 15:08 pm
por maxim_o
Juego MasterMind Java necesito ayuda
Java
Rasgaroth 2 4,674 Último mensaje 1 Febrero 2015, 18:59 pm
por Usuario Invitado
Juego mastermind
Programación C/C++
Raskera 1 932 Último mensaje 26 Abril 2019, 20:05 pm
por Tachikomaia
IA para Mastermind. « 1 2 »
Programación General
Tachikomaia 13 3,195 Último mensaje 2 Marzo 2021, 18:32 pm
por assw1208
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines