View Full Version : menu de jogo do tetris C++


Queiros
14-12-2007, 23:15
boas pessoal... eu tenho o seguinte menu para o jogo do tetris e na parte da escolha do nivel eu meto o nivel e aquilo continua a pedir o nivel. o que eu queria era escolher o nivel e voltar ao menu principal, se o nivel for invalido gostaria que continuasse a pedir até ser um correcto.. desde ja agradeço qualquer ajuda

#include<iostream>
usingnamespace std;
void menu();
int opcaomenu( char op );
int niveldificuldade(int nivel);

int main() {
char op;
int x = 0;

do {
menu();

cin >> op;
op = toupper(op);
x = opcaomenu( op );
} while( x == 0 );
}
void menu( void ) {
cout << "**************************************************" << endl;
cout << "*********TETRIS*******TETRIS*******TETRIS*********" << endl;
cout << "**************************************************" << endl << endl <<endl;
cout << "Menu:" << endl;
cout << "J - Jogar." << endl;
cout << "N - Nível de dificuldade do jogo." << endl;
cout << "P - Pontuacao." << endl << endl;
cout << "S - Sair do jogo." << endl;
}
int opcaomenu( char op ) {
char sair;
int nd = 1, retorno = 0;
switch(op) {
case'J': {
break;
}
case'N': {
nd = niveldificuldade( nd );
system("cls");
cout << "Opcão selecionada: " << nd << endl;
break;
}
case'P': {
break;
}
case'S': {
do {
cout << "Deseja sair do jogo? (s/n)" << endl;
cin >> sair;
sair=toupper(sair);
if( sair == 'S' ) {
retorno = 1;
}
elseif( sair == 'N' ) {
retorno = 0;
}
else {
cout << "Opção não reconhecida." << endl;
}
} while(sair!='S' && sair !='N');
break;
}
default: {
cout << "Opção invalida." << endl;
}
}
return retorno;
}
int niveldificuldade(int nivel) {

system ( "cls" );

do{
cout << "Escolha um nível de dificuldade:" << endl;
cout << " 1" << endl;
cout << " 2" << endl;
cout << " 3" << endl;
cout << " 4" << endl;

cin >> nivel;
if ((nivel < 1) || (nivel > 4)) {
cout << "Nível inválido!" << endl;
}
}while ((nivel !='1') && (nivel !='2') && (nivel!='3') && (nivel!='4')) ;
return nivel;
}

sei que o problema esta no ciclo de repetição mas nao consigo ver onde..

Tyran
14-12-2007, 23:29
Boas,
}while ((nivel !='1') && (nivel !='2') && (nivel!='3') && (nivel!='4')) ;
Estás a dizer que ele deve fazer enquanto for diferente de 1 e diferente de 2 e de 3 e de 4, ora como só metes uma opção será sempre diferente de 3 das outras... pensa lá noutra maneira, olha bem para o teu if ;)
cumpzz

Baderous
14-12-2007, 23:30
Basta isto:

do{
cout << "Escolha um nível de dificuldade:" << endl;
cout << " 1" << endl;
cout << " 2" << endl;
cout << " 3" << endl;
cout << " 4" << endl;

cin >> nivel;
if ((nivel < 1) || (nivel > 4)) {
cout << "Nível inválido!" << endl;
}
}while (nivel<1 || nivel>4) ;

Não precisas daquilo tudo. Basta entrar no ciclo pelo menos uma vez (através de "do...while") e pedes o nível e depois o user insere. Se for menor que 1 ou maior que 4, ele volta de novo a entrar no ciclo.

Tyran
14-12-2007, 23:38
Não precisas daquilo tudo. Basta entrar no ciclo pelo menos uma vez (através de "do...while") e pedes o nível e depois o user insere. Se for menor que 1 ou maior que 4, ele volta de novo a entrar no ciclo.


Mas assim não dá o "nível inválido", podia era deixar o if e meter um else tipo end=1, e no while fazia while (!end), em termos de eficiência não sei se será mau...
cumpzz

Baderous
14-12-2007, 23:49
Mas assim não dá o "nível inválido", podia era deixar o if e meter um else tipo end=1, e no while fazia while (!end), em termos de eficiência não sei se será mau...
cumpzz

Claro que dá. Ora testa lá...

Tyran
14-12-2007, 23:55
mas então,
sem isto:

if ((nivel < 1) || (nivel > 4)) {
cout << "Nível inválido!" << endl;
}

ele não dá o erro, e se não tiver o if vai estar a dar nível inválido mesmo se for válido...
cumpzz

Baderous
14-12-2007, 23:58
mas então,
sem isto:

if ((nivel < 1) || (nivel > 4)) {
cout << "Nível inválido!" << endl;
}

ele não dá o erro, e se não tiver o if vai estar a dar nível inválido mesmo se for válido...
cumpzz

Mas eu não tirei isso...:zzz:

Tyran
15-12-2007, 00:04
isto de estudar PIC's, filme e fazer posts ao mesmo tempo tem que se lhe diga :D :P
Mas então será melhor da maneira com o a será mais eficiente penso eu...
cumpzz

metRo_
15-12-2007, 00:25
quando conseguíres isso põe aqui o código se ano te importares..

samouco
15-12-2007, 01:36
pq não fazes assim a função: o último return não está lá a fazer nada :D é só para o compilador não melgar ;)

nesse return tb podes user o break; penso q ele sai para fora do while . Não compilei por isso não sei se há erros, mas penso q não

int niveldificuldade(int nivel) {

system ( "cls" );

while(1)
{
cout << "Escolha um nível de dificuldade:" << endl;
cout << " 1" << endl;
cout << " 2" << endl;
cout << " 3" << endl;
cout << " 4" << endl;

cin >> nivel;
if ((nivel < 1) || (nivel > 4))
cout << "Nível inválido!" << endl;
else
return nivel;
}
return nivel;
}

Queiros
15-12-2007, 13:58
pq não fazes assim a função: o último return não está lá a fazer nada :D é só para o compilador não melgar ;)

nesse return tb podes user o break; penso q ele sai para fora do while . Não compilei por isso não sei se há erros, mas penso q não

int niveldificuldade(int nivel) {

system ( "cls" );

while(1)
{
cout << "Escolha um nível de dificuldade:" << endl;
cout << " 1" << endl;
cout << " 2" << endl;
cout << " 3" << endl;
cout << " 4" << endl;

cin >> nivel;
if ((nivel < 1) || (nivel > 4))
cout << "Nível inválido!" << endl;
else
return nivel;
}
return nivel;
}
perfeito, ja esta a funcionar. eu comecei com c++ este ano entao ainda tenho falhas nalgumas coisas.. agora vou tentar fazer o tabuleiro do jogo.. uma matriz estou para ver o que vai sair..

Tyran
15-12-2007, 16:27
Epah samouco não me leves a mal, mas assim eles ficam mal habituados... se não consegue trabalhar com ciclos e condições o que fará depois quando a matéria avançar? já para não falar que nunca terá o treino mental de resolução de problemas complicados por ele mesmo... mas é só uma opinião ;)
cumpzz

Queiros
16-12-2007, 15:29
Epah samouco não me leves a mal, mas assim eles ficam mal habituados... se não consegue trabalhar com ciclos e condições o que fará depois quando a matéria avançar? já para não falar que nunca terá o treino mental de resolução de problemas complicados por ele mesmo... mas é só uma opinião ;)
cumpzz
eu ja tinha conseguido quando disseste para olhar para o if, percebi logo que era igual no while.. so coloquei a quote dele para mostrar que era assim que tinha feito... ja agora podiam so ajudar-me a inserir a matriz na parte do "jogar" no menu principal? aqui esta o codigo que fiz ate agora:


#include<iostream>
usingnamespace std;
void menu();
int opcaomenu( char op );
int niveldificuldade(int nivel);
void matriz();
int main() {
char op;
int x = 0;

do {
menu();

cin >> op;
op = toupper(op);
x = opcaomenu( op );
} while( x == 0 );
}
void menu( void ) {
cout << "**************************************************" << endl;
cout << "*********TETRIS*******TETRIS*******TETRIS*********" << endl;
cout << "**************************************************" << endl << endl <<endl;
cout << "Menu:" << endl;
cout << "J - Jogar." << endl;
cout << "N - Nível de dificuldade do jogo." << endl;
cout << "P - Pontuacao." << endl << endl;
cout << "S - Sair do jogo." << endl;
}
int opcaomenu( char op ) {
char sair;
int nd = 1, retorno = 0;
switch(op) {
case'J': {
void matriz ( void );
break;
}
case'N': {
nd = niveldificuldade( nd );
system("cls");
cout << "Opcão selecionada: " << nd << endl;
break;
}
case'P': {
break;
}
case'S': {
do {
cout << "Deseja sair do jogo? (s/n)" << endl;
cin >> sair;
sair=toupper(sair);
if( sair == 'S' ) {
retorno = 1;
}
elseif( sair == 'N' ) {
retorno = 0;
}
else {
cout << "opcao invalida" << endl;
}
} while(sair!='S' && sair !='N');
break;
}
default: {
cout << "Opção invalida." << endl;
}
}
return retorno;
}
int niveldificuldade(int nivel) {
system ( "cls" );

while(1)
{
cout << "Escolha um nível de dificuldade:" << endl;
cout << " 1" << endl;
cout << " 2" << endl;
cout << " 3" << endl;
cout << " 4" << endl;
cin >> nivel;
if ((nivel < 1) || (nivel > 4))
cout << "Nível inválido!" << endl;
else
return nivel;
}
return nivel;
}
void matriz(int colunas, int linhas) {
int i,j;
int jogo [30][15];
for (i=0; (i < linhas) ;i++){
for(j=0; (j < colunas) ;j++) {
jogo [i][j]=0;
cout << jogo[i][j] << endl;
}
}
}

mj2p
16-12-2007, 16:06
eu ja tinha conseguido quando disseste para olhar para o if, percebi logo que era igual no while.. so coloquei a quote dele para mostrar que era assim que tinha feito... ja agora podiam so ajudar-me a inserir a matriz na parte do "jogar" no menu principal? aqui esta o codigo que fiz ate agora:


#include<iostream>
usingnamespace std;
void menu();
int opcaomenu( char op );
int niveldificuldade(int nivel);
void matriz();
int main() {
char op;
int x = 0;

do {
menu();

cin >> op;
op = toupper(op);
x = opcaomenu( op );
} while( x == 0 );
}
void menu( void ) {
cout << "**************************************************" << endl;
cout << "*********TETRIS*******TETRIS*******TETRIS*********" << endl;
cout << "**************************************************" << endl << endl <<endl;
cout << "Menu:" << endl;
cout << "J - Jogar." << endl;
cout << "N - Nível de dificuldade do jogo." << endl;
cout << "P - Pontuacao." << endl << endl;
cout << "S - Sair do jogo." << endl;
}
int opcaomenu( char op ) {
char sair;
int nd = 1, retorno = 0;
switch(op) {
case'J': {
void matriz ( void );
break;
}
case'N': {
nd = niveldificuldade( nd );
system("cls");
cout << "Opcão selecionada: " << nd << endl;
break;
}
case'P': {
break;
}
case'S': {
do {
cout << "Deseja sair do jogo? (s/n)" << endl;
cin >> sair;
sair=toupper(sair);
if( sair == 'S' ) {
retorno = 1;
}
elseif( sair == 'N' ) {
retorno = 0;
}
else {
cout << "opcao invalida" << endl;
}
} while(sair!='S' && sair !='N');
break;
}
default: {
cout << "Opção invalida." << endl;
}
}
return retorno;
}
int niveldificuldade(int nivel) {
system ( "cls" );

while(1)
{
cout << "Escolha um nível de dificuldade:" << endl;
cout << " 1" << endl;
cout << " 2" << endl;
cout << " 3" << endl;
cout << " 4" << endl;
cin >> nivel;
if ((nivel < 1) || (nivel > 4))
cout << "Nível inválido!" << endl;
else
return nivel;
}
return nivel;
}
void matriz(int colunas, int linhas) {
int i,j;
int jogo [30][15];
for (i=0; (i < linhas) ;i++){
for(j=0; (j < colunas) ;j++) {
jogo [i][j]=0;
cout << jogo[i][j] << endl;
}
}
}


Inserir a matriz como? Podias ser mais específico?

Já agora, podias por uns espaços no teu código, uns comentários, torna-se mais fácil para quem te quer ajudar.

Vá, cumps

Baderous
16-12-2007, 16:11
#include<iostream>
usingnamespace std;
void menu();
int opcaomenu( char op );
int niveldificuldade(int nivel);
void matriz();
int main() {
char op;
int x = 0;

do {
menu();

cin >> op;
op = toupper(op);
x = opcaomenu( op );
} while( x == 0 );
}
void menu( void ) {
cout << "**************************************************" << endl;
cout << "*********TETRIS*******TETRIS*******TETRIS*********" << endl;
cout << "**************************************************" << endl << endl <<endl;
cout << "Menu:" << endl;
cout << "J - Jogar." << endl;
cout << "N - Nível de dificuldade do jogo." << endl;
cout << "P - Pontuacao." << endl << endl;
cout << "S - Sair do jogo." << endl;
}
int opcaomenu( char op ) {
char sair;
int nd = 1, retorno = 0;
switch(op) {
case'J': {
void matriz ( void ); matriz tem 2 argumentos: int colunas, int linhas!! não é void!
break;
}
case'N': {
nd = niveldificuldade( nd );
system("cls");
cout << "Opcão selecionada: " << nd << endl;
break;
}
case'P': {
break;
}
case'S': {
do {
cout << "Deseja sair do jogo? (s/n)" << endl;
cin >> sair;
sair=toupper(sair);
if( sair == 'S' ) {
retorno = 1;
}
elseif( sair == 'N' ) {
retorno = 0;
}
else {
cout << "opcao invalida" << endl;
}
} while(sair!='S' && sair !='N');
break;
}
default: {
cout << "Opção invalida." << endl;
}
}
return retorno;
}
int niveldificuldade(int nivel) {
system ( "cls" );

while(1)
{
cout << "Escolha um nível de dificuldade:" << endl;
cout << " 1" << endl;
cout << " 2" << endl;
cout << " 3" << endl;
cout << " 4" << endl;
cin >> nivel;
if ((nivel < 1) || (nivel > 4))
cout << "Nível inválido!" << endl;
else
return nivel;
}
return nivel;
}
void matriz(int colunas, int linhas) {
int i,j;
int jogo [30][15];
for (i=0; (i < linhas) ;i++){
for(j=0; (j < colunas) ;j++) {
jogo [i][j]=0;
cout << jogo[i][j] << endl;
}
}
}


Estás a passar mal os parâmetros da matriz quando invocas a função matriz. Vê o comentário que deixei no código.

Queiros
16-12-2007, 18:18
Estás a passar mal os parâmetros da matriz quando invocas a função matriz. Vê o comentário que deixei no código.
podias dar-me so uma ajudinha do que fazer? a matriz da maneira que esta aparece no ecrã?

*o que eu queria era chamar a função da matriz para a opção "Jogar" do menu principal para que aparecesse o tabuleiro de jogo quando se escolhe a opção "Jogar"

obrigado a todos

cumpz

Baderous
16-12-2007, 18:24
a matriz da maneira que esta aparece no ecrã?

Sei lá, nem sequer testei o código, mas detectei logo o erro nos parâmetros quando invocas a função matriz:


switch(op) {
case 'J': void matriz(void);
break;O erro está nos parâmetros da função matriz. Vai à tua definição da função para ver se coincidem. Vais ver que não...