Dev - C++ - LeerSecuencia de numeros random

 
Vista:

LeerSecuencia de numeros random

Publicado por Francesc (1 intervención) el 25/05/2021 11:25:14
Buenos días.

Estoy tratando de programar el juego de memoria Simon Says, para ello en primer lugar creo una función que me genera numeros random entre 0 y 4, seguidamente otra función que me vaya generando secuencias con los diferentes numeros random que cree de la primera función, y por último necesito otra función que lea la secuencia.

Mi problema llega al ejecutar el codigo, pues si que se me crea la secuencia random y cada nivel aumenta en uno esa secuencia pero se supone que cuando me muestra la secuencia yo debo de repetirla y no me deja repetirla, simplemente el código se limita a poner secuencia tras secuencia y no me deja introducirla.

Aquí les dejo el código. SI alguien me puede ayudar...

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <stdio.h>
#include <unistd.h>
#include <string>
#include <fstream>
#include <iostream>
#include <sstream>
#include "util.h"
#include "GPIOuniv.h"
#include "PWMuniv.h"
#include <pthread.h>
 
using namespace std;
using namespace BBB;
 
//Se definen salidas digitales:
GPIO ledazul(GPIO::P8_12);
GPIO ledverde(GPIO::P8_14);
GPIO ledamarillo(GPIO::P8_16);
GPIO ledrojo(GPIO::P8_18);
GPIO IN(GPIO::P9_12);
 
//Se definen entradas digitales:
GPIO pulsadorazul(GPIO::P9_15);
GPIO pulsadorverde(GPIO::P9_23);
GPIO pulsadoramarillo(GPIO::P9_30);
GPIO pulsadorrojo(GPIO::P9_27);
GPIO pulsadorinicio(GPIO::P8_7);  //Pulsador blanco en el montaje
GPIO pulsadorpausa(GPIO::P8_8);   //Pulsador negro en el montaje
 
//Se definen salidas analógicas:
PWM buzzer(PWM::P8_13);
PWM servotiempo(PWM::P9_22);
PWM servodificultad(PWM::P9_21);
 
//Se definen variables:
#define MAXNIVEL 100
int nivel=0, sequencia[MAXNIVEL], nivelMax= 20;
string bazul, bverde, bamarillo, brojo, reset;
 
//Función delay: Va a permitir establecer tiempo entre instrucciones
void delay (double t){
	clock_t ini= clock();
	while((clock()-ini)*1.0/CLOCKS_PER_SEC < t){}
}
 
//Función generaSecuencia: Va a crear una secuencia de nums entre 1 y 4 --> según num se encendera un led u otro
void generaSecuencia(){
   	for(int i=0; i<MAXNIVEL; i++)
   		sequencia[i]= rand()%4+1;
}
 
//Función obtenerValores: Va a obtener el valor de los pulsadores
void obtenerValores(){
	bazul= pulsadorazul.getValue();
	bverde= pulsadorverde.getValue();
	bamarillo= pulsadoramarillo.getValue();
	brojo= pulsadorrojo.getValue();
	reset= pulsadorinicio.getValue();
}
 
//Función apagados: Apaga los leds
void apagados(){
	ledazul.setValue(GPIO::LOW);
	ledverde.setValue(GPIO::LOW);
	ledamarillo.setValue(GPIO::LOW);
	ledrojo.setValue(GPIO::LOW);
}
 
//Función muestraSecuencia: El juego genera una secuencia de leds que el jugador va a tener que repitir en el mismo orden
void muestraSecuencia(){
	apagados();
	for(int i=0; i<nivel; i++){
		if(sequencia[i]==1) ledazul.setValue(GPIO::HIGH);
		else if(sequencia[i]==2) ledverde.setValue(GPIO::HIGH);
		else if(sequencia[i]==3) ledamarillo.setValue(GPIO::HIGH);
		else if(sequencia[i]==4) ledrojo.setValue(GPIO::HIGH);
		delay(0.5);
		apagados();
		delay(0.2);
	}
}
 
//Funcion recibeSecuencia: Una vez mostrada la secuencia, se obtiene la secuencia que introduce el jugador
bool recibeSecuencia(){
	bool ok=true;
	for(int i=0; i< nivel && ok; i++){
		do{
			cout << nivel << endl;
			obtenerValores();
		}while(bazul=="0" && bverde=="0" && bamarillo=="0" && brojo=="0");
		if(sequencia[i]!=1 && bazul=="1") ok= false;
		if(sequencia[i]!=2 && bverde=="1") ok= false;
		if(sequencia[i]!=3 && bamarillo=="1") ok= false;
		if(sequencia[i]!=4 && brojo=="1") ok= false;
		if(reset=="1") ok=false;
 
		while(bazul=="1" || bverde=="1" || bamarillo=="1" || brojo=="1"){
			obtenerValores();
			if(bazul=="1") ledazul.setValue(GPIO::HIGH);
			if(bverde=="1") ledverde.setValue(GPIO::HIGH);
			if(bamarillo=="1") ledamarillo.setValue(GPIO::HIGH);
			if(brojo=="1") ledrojo.setValue(GPIO::HIGH);
		}
		apagados();
	}
	return ok;
}
 
//Función victoria: Crea una secuencia de flasheo de leds repetitiva que indica que el jugador ha conseguido
//llegar al nivelMax y, por tanto, ha ganado.
void victoria(){
	int pos=0;
	do{
		obtenerValores();
		if(pos==0) ledazul.setValue(GPIO::HIGH);
		if(pos==1) ledverde.setValue(GPIO::HIGH);
		if(pos==2) ledamarillo.setValue(GPIO::HIGH);
		if(pos==3) ledrojo.setValue(GPIO::HIGH);
		if(pos==4) ledazul.setValue(GPIO::LOW);
		if(pos==5) ledverde.setValue(GPIO::LOW);
		if(pos==6) ledamarillo.setValue(GPIO::LOW);
		if(pos==7) ledrojo.setValue(GPIO::LOW);
		pos= (pos+1)%8;
		delay(0.1);
	}while(reset=="0");
	apagados();
}
 
//Función derrota: Crea un flasheo de leds que, en caso de introducirse una secuencia erronea, indicará que el jugador ha perdido
void derrota(){
	do{
		obtenerValores();
		ledazul.setValue(GPIO::HIGH);
		ledverde.setValue(GPIO::HIGH);
		ledamarillo.setValue(GPIO::HIGH);
		ledrojo.setValue(GPIO::HIGH);
		delay(0.2);
		apagados();
		delay(0.2);
	}while(reset=="0");
}
 
int main(){
	srand(time(NULL));
 
	//Inicio
	do{
		obtenerValores();
	}while(reset=="0");
 
	while(true){
		generaSecuencia();
		nivel= 0;
		while(nivel <= nivelMax){
			delay(2);
			muestraSecuencia();
		        if(recibeSecuencia()){
		        	nivel++;
		        }
		        else{
				break;
			}
		}
		if(nivel>nivelMax)
			victoria();
		else
			derrota();
    }
    return 0;
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder