Autor
		 | 
		
			Tema: Ayuda juego Mastermind en C++  (Leído 5,771 veces)
		 | 
	 
 
	
		
			
				
					
						
							TheXiiscoZ
							
								
								  Desconectado
								Mensajes: 2
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
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
								Mensajes: 123
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
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 halla dichos valores en el codigo, en este caso tiene un largo de seis letras que pueden ir de la A a la H PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR); 
 
 void ObtenerNota(TipoCodigo propuesta, TipoCodigo codigo, RangoBR &buenos, RangoBR ®ulares) { 
 
 PROGRAM MasterMind (input, output); CONST 	MAXIMO_INTENTOS = 20; 	LARGO_CODIGO = 6; 	PRIMERA_LETRA = 'A'; 	ULTIMA_LETRA = 'H'; TYPE 	RangoCodigo = 1..LARGO_CODIGO; 	TipoCodigo = ARRAY [RangoCodigo] OF Char;   	RangoBR = 0..LARGO_CODIGO; 	TRegistroNota = RECORD 						codigo: TipoCodigo; 						buenos, 						regulares: RangoBR 					END;       THistoria = RECORD 					info: ARRAY [1..MAXIMO_INTENTOS] OF TRegistroNota; 					tope: 0..MAXIMO_INTENTOS 				END;   	ListaNotas = ^CeldaNota; 	CeldaNota = RECORD 					codigo: TipoCodigo; 					buenos, 					regulares: RangoBR; 					turno: 1..MAXIMO_INTENTOS; 					siguiente: ListaNotas 				END; VAR 	secreto, codigo: TipoCodigo; 	historia: THistoria; 	buenos, regulares: RangoBR; 	i, intentos: Integer; 	exito, fracaso: Boolean;	 	lista: ListaNotas;   FUNCTION EsValido(codigo: TipoCodigo): Boolean; VAR 	i: Integer; BEGIN 	i := 1; 	WHILE (i <= LARGO_CODIGO) AND (codigo[i] >= PRIMERA_LETRA) AND (codigo[i] <= ULTIMA_LETRA) DO 		i := i + 1; 	EsValido :=  i > LARGO_CODIGO	 END;   PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR); VAR 	i, j, max: Integer; 	propuestacopia: TipoCodigo; BEGIN 	buenos := 0; 	FOR i := 1 TO LARGO_CODIGO DO 	BEGIN 		IF propuesta[i] = codigo[i] THEN 			buenos := buenos + 1; 		propuestacopia[i] := propuesta[i] 	END; 	max := 0; 	FOR i := 1 TO LARGO_CODIGO DO 	BEGIN 		j := 1; 		WHILE (j <= LARGO_CODIGO) AND (codigo[i] <> propuestacopia[j]) DO 			j := j + 1; 		IF j <= LARGO_CODIGO THEN 		BEGIN 			max := max + 1; 			propuestacopia[j] := ' ' 		END 	END; 	regulares := max - buenos END;   PROCEDURE IniciarHistoria(VAR historia: THistoria); BEGIN 	WITH historia DO 		tope := 0 END;   PROCEDURE GuardarNota(VAR historia: THistoria; 						codigo: TipoCodigo; 						buenos, regulares: RangoBR); VAR 	i: Integer; BEGIN 	WITH historia DO 	BEGIN 		tope := tope + 1; 		FOR i := 1 TO LARGO_CODIGO DO 			info[tope].codigo[i] := codigo[i]; 		info[tope].buenos := buenos; 		info[tope].regulares := regulares 	END END;   FUNCTION ListaOrdenada(historia: THistoria): ListaNotas; VAR 	i, j: Integer; 	p, actual, anterior, lista: ListaNotas; BEGIN 	lista := NIL; 	FOR i := 1 TO historia.tope DO 	BEGIN 		new(p); 		FOR j := 1 TO LARGO_CODIGO DO 			p^.codigo[j] := historia.info[i].codigo[j]; 		p^.buenos := historia.info[i].buenos; 		p^.regulares := historia.info[i].regulares; 		p^.turno := i;   		actual := lista; 		anterior := lista; 		WHILE (actual <> NIL) AND (10 * actual^.buenos + actual^.regulares <= 10 * p^.buenos + p^.regulares) DO 		BEGIN 			anterior := actual; 			actual := actual^.siguiente 		END; 		IF (anterior = NIL) OR (anterior = actual) THEN 		BEGIN 			p^.siguiente := anterior; 			lista := p 		END 		ELSE 		BEGIN 			p^.siguiente := actual; 			anterior^.siguiente := p 		END 	END; 	ListaOrdenada := lista END;   PROCEDURE GenerarCodigo(VAR codigo: TipoCodigo); VAR 	i: Integer; 	ordprim, ordult: Integer; BEGIN 	ordprim := ord(PRIMERA_LETRA); 	ordult  := ord(ULTIMA_LETRA); 	FOR i := 1 TO LARGO_CODIGO DO 		codigo[i] := chr(ordprim + random(ordult - ordprim + 1)) END;   PROCEDURE LeerCodigo(VAR codigo: TipoCodigo); VAR 	i: Integer; BEGIN 	FOR i := 1 TO LARGO_CODIGO DO 		Read(codigo[i]); 	ReadLn END;   	(* ------ Programa Principal ------ *) BEGIN 	Randomize; 	IniciarHistoria(historia); 	GenerarCodigo(secreto); 	intentos := 0; 	exito := false; 	fracaso := false; 	WriteLn('He pensado un codigo, intenta adivinarlo.'); 	WriteLn('*Pista: tiene ', LARGO_CODIGO, ' letras y estas estan entre la ', PRIMERA_LETRA, ' y la ', ULTIMA_LETRA); 	WriteLn('Las letras pueden repetirse o no aparecer en mi codigo, y solo tienes ', MAXIMO_INTENTOS, ' intentos.'); 	WriteLn; 	REPEAT 		LeerCodigo(codigo); 		WHILE NOT EsValido(codigo) DO 		BEGIN 			WriteLn('El codigo no es valido, intentalo de nuevo.'); 			LeerCodigo(codigo) 		END; 		intentos := intentos + 1; 		ObtenerNota(codigo, secreto, buenos, regulares); 		IF buenos = LARGO_CODIGO THEN 			exito := true 		ELSE IF intentos = MAXIMO_INTENTOS THEN 				fracaso := true 			ELSE 			BEGIN 				Write('B: ', buenos, '   R: ', regulares); 				WriteLn('                      Te quedan ', MAXIMO_INTENTOS - intentos, ' intentos') 			END; 		GuardarNota(historia, codigo, buenos, regulares) 	UNTIL exito OR fracaso; 	WriteLn; 	WriteLn; 	IF exito THEN 		WriteLn('***** FELICIDADES, has ganado. *****') 	ELSE 	BEGIN 		WriteLn('--- Demasiados intentos, perdiste. ---'); 		Write  ('    El codigo secreto era: '); 		FOR i := 1 TO LARGO_CODIGO DO 			Write(secreto[i]) 	END; 	WriteLn; 	WriteLn; 	lista := ListaOrdenada(historia); 	WHILE lista <> NIL DO 	BEGIN 		FOR i := 1 TO LARGO_CODIGO DO 			Write(lista^.codigo[i]); 		Write(' -->  Bs = ', lista^.buenos, ',  Rs = ', lista^.regulares, ' (Turno: ', lista^.turno, ')'); 		WriteLn; 		lista := lista^.siguiente 	END; 	ReadLn END. 
 
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
									« Última modificación: 10 Diciembre 2017, 18:02 pm por _TTFH_3500 »
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						
							TheXiiscoZ
							
								
								  Desconectado
								Mensajes: 2
								
								
								
								
								
								  
							 
						 | 
						
							
							 
							
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 PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR); 
 
 void ObtenerNota(TipoCodigo propuesta, TipoCodigo codigo, RangoBR &buenos, RangoBR ®ulares) { 
 
 PROGRAM MasterMind (input, output); CONST 	MAXIMO_INTENTOS = 20; 	LARGO_CODIGO = 6; 	PRIMERA_LETRA = 'A'; 	ULTIMA_LETRA = 'H'; TYPE 	RangoCodigo = 1..LARGO_CODIGO; 	TipoCodigo = ARRAY [RangoCodigo] OF Char;   	RangoBR = 0..LARGO_CODIGO; 	TRegistroNota = RECORD 						codigo: TipoCodigo; 						buenos, 						regulares: RangoBR 					END;       THistoria = RECORD 					info: ARRAY [1..MAXIMO_INTENTOS] OF TRegistroNota; 					tope: 0..MAXIMO_INTENTOS 				END;   	ListaNotas = ^CeldaNota; 	CeldaNota = RECORD 					codigo: TipoCodigo; 					buenos, 					regulares: RangoBR; 					turno: 1..MAXIMO_INTENTOS; 					siguiente: ListaNotas 				END; VAR 	secreto, codigo: TipoCodigo; 	historia: THistoria; 	buenos, regulares: RangoBR; 	i, intentos: Integer; 	exito, fracaso: Boolean;	 	lista: ListaNotas;   FUNCTION EsValido(codigo: TipoCodigo): Boolean; VAR 	i: Integer; BEGIN 	i := 1; 	WHILE (i <= LARGO_CODIGO) AND (codigo[i] >= PRIMERA_LETRA) AND (codigo[i] <= ULTIMA_LETRA) DO 		i := i + 1; 	EsValido :=  i > LARGO_CODIGO	 END;   PROCEDURE ObtenerNota(propuesta, codigo: TipoCodigo; VAR buenos, regulares: RangoBR); VAR 	i, j, max: Integer; 	propuestacopia: TipoCodigo; BEGIN 	buenos := 0; 	FOR i := 1 TO LARGO_CODIGO DO 	BEGIN 		IF propuesta[i] = codigo[i] THEN 			buenos := buenos + 1; 		propuestacopia[i] := propuesta[i] 	END; 	max := 0; 	FOR i := 1 TO LARGO_CODIGO DO 	BEGIN 		j := 1; 		WHILE (j <= LARGO_CODIGO) AND (codigo[i] <> propuestacopia[j]) DO 			j := j + 1; 		IF j <= LARGO_CODIGO THEN 		BEGIN 			max := max + 1; 			propuestacopia[j] := ' ' 		END 	END; 	regulares := max - buenos END;   PROCEDURE IniciarHistoria(VAR historia: THistoria); BEGIN 	WITH historia DO 		tope := 0 END;   PROCEDURE GuardarNota(VAR historia: THistoria; 						codigo: TipoCodigo; 						buenos, regulares: RangoBR); VAR 	i: Integer; BEGIN 	WITH historia DO 	BEGIN 		tope := tope + 1; 		FOR i := 1 TO LARGO_CODIGO DO 			info[tope].codigo[i] := codigo[i]; 		info[tope].buenos := buenos; 		info[tope].regulares := regulares 	END END;   FUNCTION ListaOrdenada(historia: THistoria): ListaNotas; VAR 	i, j: Integer; 	p, actual, anterior, lista: ListaNotas; BEGIN 	lista := NIL; 	FOR i := 1 TO historia.tope DO 	BEGIN 		new(p); 		FOR j := 1 TO LARGO_CODIGO DO 			p^.codigo[j] := historia.info[i].codigo[j]; 		p^.buenos := historia.info[i].buenos; 		p^.regulares := historia.info[i].regulares; 		p^.turno := i;   		actual := lista; 		anterior := lista; 		WHILE (actual <> NIL) AND (10 * actual^.buenos + actual^.regulares <= 10 * p^.buenos + p^.regulares) DO 		BEGIN 			anterior := actual; 			actual := actual^.siguiente 		END; 		IF (anterior = NIL) OR (anterior = actual) THEN 		BEGIN 			p^.siguiente := anterior; 			lista := p 		END 		ELSE 		BEGIN 			p^.siguiente := actual; 			anterior^.siguiente := p 		END 	END; 	ListaOrdenada := lista END;   PROCEDURE GenerarCodigo(VAR codigo: TipoCodigo); VAR 	i: Integer; 	ordprim, ordult: Integer; BEGIN 	ordprim := ord(PRIMERA_LETRA); 	ordult  := ord(ULTIMA_LETRA); 	FOR i := 1 TO LARGO_CODIGO DO 		codigo[i] := chr(ordprim + random(ordult - ordprim + 1)) END;   PROCEDURE LeerCodigo(VAR codigo: TipoCodigo); VAR 	i: Integer; BEGIN 	FOR i := 1 TO LARGO_CODIGO DO 		Read(codigo[i]); 	ReadLn END;   	(* ------ Programa Principal ------ *) BEGIN 	Randomize; 	IniciarHistoria(historia); 	GenerarCodigo(secreto); 	intentos := 0; 	exito := false; 	fracaso := false; 	WriteLn('He pensado un codigo, intenta adivinarlo.'); 	WriteLn('*Pista: tiene ', LARGO_CODIGO, ' letras y estas estan entre la ', PRIMERA_LETRA, ' y la ', ULTIMA_LETRA); 	WriteLn('Las letras pueden repetirse o no aparecer en mi codigo, y solo tienes ', MAXIMO_INTENTOS, ' intentos.'); 	WriteLn; 	REPEAT 		LeerCodigo(codigo); 		WHILE NOT EsValido(codigo) DO 		BEGIN 			WriteLn('El codigo no es valido, intentalo de nuevo.'); 			LeerCodigo(codigo) 		END; 		intentos := intentos + 1; 		ObtenerNota(codigo, secreto, buenos, regulares); 		IF buenos = LARGO_CODIGO THEN 			exito := true 		ELSE IF intentos = MAXIMO_INTENTOS THEN 				fracaso := true 			ELSE 			BEGIN 				Write('B: ', buenos, '   R: ', regulares); 				WriteLn('                      Te quedan ', MAXIMO_INTENTOS - intentos, ' intentos') 			END; 		GuardarNota(historia, codigo, buenos, regulares) 	UNTIL exito OR fracaso; 	WriteLn; 	WriteLn; 	IF exito THEN 		WriteLn('***** FELICIDADES, has ganado. *****') 	ELSE 	BEGIN 		WriteLn('--- Demasiados intentos, perdiste. ---'); 		Write  ('    El codigo secreto era: '); 		FOR i := 1 TO LARGO_CODIGO DO 			Write(secreto[i]) 	END; 	WriteLn; 	WriteLn; 	lista := ListaOrdenada(historia); 	WHILE lista <> NIL DO 	BEGIN 		FOR i := 1 TO LARGO_CODIGO DO 			Write(lista^.codigo[i]); 		Write(' -->  Bs = ', lista^.buenos, ',  Rs = ', lista^.regulares, ' (Turno: ', lista^.turno, ')'); 		WriteLn; 		lista := lista^.siguiente 	END; 	ReadLn 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
								Mensajes: 123
								
								 
								
								
								
								
								 
							 
						 | 
						
							
							 
							
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. #include <stdio.h> #include <stdlib.h> #include <ctype.h> #include <time.h>   const int MAXIMO_INTENTOS = 20; const int LARGO_CODIGO = 6; const char PRIMERA_LETRA = 'A'; const char ULTIMA_LETRA = 'H';   typedef char TipoCodigo[LARGO_CODIGO + 1];   bool EsValido(TipoCodigo codigo) { 	// Devuelve true si el codigo es valido. 	int i = 1; 	while (i <= LARGO_CODIGO && codigo[i] >= PRIMERA_LETRA && codigo[i] <= ULTIMA_LETRA) 		i++; 	// Es valido si todos los elementos del codigo estan en el rango. 	return i > LARGO_CODIGO; }   void ObtenerNota(TipoCodigo propuesta, TipoCodigo codigo, unsigned int &buenos, unsigned int ®ulares) { 	// Obtener cantidad de buenos y regulares entre dos codigos. 	TipoCodigo propuestacopia; 	buenos = 0; 	for (int i = 1; i <= LARGO_CODIGO; i++) { 		if (propuesta[i] == codigo[i]) buenos++; 		propuestacopia[i] = propuesta[i]; 	} 	int max = 0; 	// Hallar la "maxima" cantidad de buenos. 	for (int i = 1; i <= LARGO_CODIGO; i++) { 		int j = 1; 		while (j <= LARGO_CODIGO && codigo[i] != propuestacopia[j]) j++; 		if (j <= LARGO_CODIGO) { 			// Borrar la letra para no volver a usar la misma. 			propuestacopia[j] = ' '; 			max++; 		} 	} 	regulares = max - buenos; }   void GenerarCodigo(TipoCodigo &codigo) { 	// Generar codigo aleatorio 	int ord_prim = (int)PRIMERA_LETRA; 	int ord_ult = (int)ULTIMA_LETRA; 	for (int i = 1; i <= LARGO_CODIGO; i++) 		codigo[i] = ord_prim + rand() % (ord_ult - ord_prim + 1); }   void LeerCodigo(TipoCodigo &codigo) { 	char c; 	for (int i = 1; i <= LARGO_CODIGO; i++) { 		scanf("%c", &c); 		codigo[i] = toupper(c); 	} 	do { 		c = getchar(); 	} while (c != '\n'); }   int main() { 	srand(time(NULL)); 	TipoCodigo secreto; 	GenerarCodigo(secreto); 	int intentos = 0; 	bool exito = false; 	bool fracaso = false; 	printf("He pensado un codigo, intenta adivinarlo.\n"); 	printf("*Pista: tiene %d letras y estas estan entre la %c y la %c\n", LARGO_CODIGO, PRIMERA_LETRA, ULTIMA_LETRA); 	printf("Las letras pueden repetirse o no aparecer en el codigo, y solo tienes %d intentos.\n\n", MAXIMO_INTENTOS); 	do { 		TipoCodigo codigo; 		LeerCodigo(codigo); 		while (!EsValido(codigo)) { 			printf("El codigo no es valido, intentalo de nuevo.\n"); 			LeerCodigo(codigo); 		} 		intentos++; 		unsigned int buenos, regulares; 		ObtenerNota(codigo, secreto, buenos, regulares); 		if (buenos == LARGO_CODIGO) exito = true; 		else if (intentos == MAXIMO_INTENTOS) fracaso = true; 		else { 			printf("B: %d   R: %d", buenos, regulares); 			printf("                      Te quedan %d intentos\n", MAXIMO_INTENTOS - intentos); 		} 	} while (!(exito || fracaso));   	printf("\n\n"); 	if (exito) printf("***** FELICIDADES, has ganado. *****\n"); 	else { 		printf("--- Demasiados intentos, perdiste. ---\n"); 		printf("El codigo secreto era: "); 		for (int i = 1; i <= LARGO_CODIGO; i++) printf("%c", secreto[i]); 	} 	printf("\n"); } 
 
  
						 | 
					 
					
						
							
								| 
								 | 
							 
								| 
								 | 
								
									 
									En línea
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	
		
		
			
				
					
						| 
							Serapis
							
						 | 
						
							
							 
							
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? 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... 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ó. 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 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) 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...  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) 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
								 | 
							  
							 
							
						 | 
					 
				 
			 |  
		 
	 |  
	 |  
 
	 
	
 
			 
			
				
					
						| Mensajes similares | 
					 
					
						 | 
						Asunto | 
						Iniciado por | 
						Respuestas | 
						Vistas | 
						Último mensaje | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Mastermind
							 
							Programación C/C++
						 | 
						
							N0body
						 | 
						
							1
						 | 
						
							6,035
						 | 
						
							 
							
								 1 Mayo 2010, 04:01 am 
								por N0body
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Juego Mastermind
							 
							Programación C/C++
						 | 
						
							adeur
						 | 
						
							3
						 | 
						
							5,563
						 | 
						
							 
							
								 5 Julio 2012, 15:08 pm 
								por maxim_o
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Juego MasterMind Java necesito ayuda
							 
							Java
						 | 
						
							Rasgaroth
						 | 
						
							2
						 | 
						
							6,609
						 | 
						
							 
							
								 1 Febrero 2015, 18:59 pm 
								por Usuario Invitado
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							Juego mastermind
							 
							Programación C/C++
						 | 
						
							Raskera
						 | 
						
							1
						 | 
						
							2,451
						 | 
						
							 
							
								26 Abril 2019, 20:05 pm 
								por Tachikomaia
							
						 | 
					 
					
						
							 
						 | 
						
							 
						 | 
						
							IA para Mastermind.
							« 1 2 » 
							Programación General
						 | 
						
							Tachikomaia
						 | 
						
							13
						 | 
						
							9,793
						 | 
						
							 
							
								 2 Marzo 2021, 18:32 pm 
								por assw1208
							
						 | 
					 
				 
			    |