Recentemente tive que começar a fazer um trabalho da faculdade em C++, e escolhi fazer um jogo de campo minado. Até agora, montei em código apenas o tabuleiro, mas há um problema com ele que não consigo resolver. Utilizei apenas a lógica bruta para fazê-lo, sem nenhuma técnica sofisticada de programação, dada a minha limitação em C++; procurarei melhorar isso, se der tempo. Mas o problema é o seguinte: o código funciona perfeitamente se não for orientado a objetos, ou seja, sem o uso de classes. O tabuleiro é impresso direitinho. Quando utilizo o mesmo código com classes, fazendo, é claro, as adaptações necessárias, ele simplesmente não funciona. Um monte de símbolos esquisitos aparecem no lugar dos 1s, 2s, Bs... Preciso urgentemente de ajuda! O trabalho é para semana que vem. Estou perdidoooo!
Seguem os códigos abaixo. Um está orientado a objetos, e o outro não. Podem testar se quiserem. Apesar de serem iguais, coloquei os dois para não dar trabalho de transformar um em outro. Aguardo notícias de alguém, se puderem me ajudar...
OO:
#include <iostream>
using namespace std;
class tabuleiro
{
void analisar_proximo(int proximo, int m, int n, int b );
void analisar_adjacentes(int j, int k);
int num[10][2], bomba;
char tab[6][6];
public:
void escolher (int b = 0);
void imprime_tabuleiro();
};
void tabuleiro::escolher(int b )
//escolhe as células que terão bomba
{
b = bomba;
int m, n;
while (bomba<10)
{
m = rand()%6;
n = rand()%6;
if (m == num[0][0] and n == num[0][1])
escolher(bomba);
//escolhe uma outra célula caso a célula sorteada já houver sido escolhida
else
analisar_proximo(1, m, n, bomba);
}
void tabuleiro::analisar_proximo(int proximo, int m, int n, int b )
/* Verifica por completo se não existe nenhuma repetição de
* escolha de células para alocar bomba e só então as aloca
*/
{
int pos = 0;
if (m==num[proximo][0] and n==num[proximo][1])
[indent]escolher(bomba);
else
{
if (proximo == 9)
{
num[pos][0] = m;
num[pos][1] = n;
tab[m][n] = 66;
pos += 1;
bomba++;
}
else
analisar_proximo(proximo+1, m, n, b );
}
if (bomba==10)
{
for (int l = 0; l<=5; l++)
for (int c = 0; c<=5; c++)
{
if (tab[l][c] == 66)
continue;
else
analisar_adjacentes(l,c);
}
};
}
// Aqui termina a rotina responsável por colocar as bombas no tabuleiro
void tabuleiro::analisar_adjacentes(int j, int k)
// Analisa quantas células vizinhas possuem bomba
{
int r,s, adj[8][2], numbomb = 48, position = 0;
for (r=j-1; r<=j+1; r++)
for (s=k-1; s<=k+1; s++)
if (r >=0 and r <= 5 and s >= 0 and s <= 5)
{
adj[position][0]= r;
adj[position][1]= s;
if (r==j and s==k)
continue;
else
{
if (tab[r][s]==66)
numbomb++;
position++;
//cout << r <<" " << s << endl;
}
}
tab[j][k] = char(numbomb );
};
void tabuleiro::imprime_tabuleiro()
{
int line,q;
for (line = 0; line <= 12; line++)
{
if (line%2 != 0)
{for (q=0; q<=5; q++)
cout << "|" << " " << tab[line/2][q] << " ";
cout << "|" << endl;}
else
cout << "-------------------------" << endl;
}
}
int main()
{
tabuleiro a;
a.escolher();
a.imprime_tabuleiro();
return 0;
}
Não OO:
#include <iostream>
using namespace std;
void escolher(int b = 0);
void analisar_proximo(int proximo, int m, int n, int b );
void analisar_adjacentes(int m, int n);
int num[10][2];
int bomba;
char tab[6][6];
void escolher(int b )
//escolhe as células que terão bomba
{
b = bomba;
int m, n;
while (bomba<10)
{
m = rand()%6;
n = rand()%6;
if (m == num[0][0] and n == num[0][1])
escolher(bomba);
//escolhe uma outra célula caso a célula sorteada já houver sido escolhida
else
analisar_proximo(1, m, n, bomba);
}
}
void analisar_proximo(int proximo, int m, int n, int b )
/* Verifica por completo se não existe nenhuma repetição de
* escolha de células com bomba e só então aloca as bombas
*/
{
int pos = 0;
if (m==num[proximo][0] and n==num[proximo][1])
escolher(bomba);
else
{
if (proximo == 9)
{
num[pos][0] = m;
num[pos][1] = n;
tab[m][n] = 66;
pos += 1;
bomba++;
}
else
analisar_proximo(proximo+1, m, n, b );
}
if (bomba==10)
{
for (int j = 0; j<=5; j++)
for (int k = 0; k<=5; k++)
{
if (tab[j][k] == 66)
continue;
else
analisar_adjacentes(j,k);
}
}
}
void imprime_tabuleiro()
{
int line,k;
for (line = 0; line <= 12; line++)
{
if (line%2 != 0)
{for (k=0; k<=5; k++)
cout << "|" << " " << tab[line/2][k] << " ";
cout << "|" << endl;}
else
cout << "-------------------------" << endl;
}
}
void analisar_adjacentes(int m, int n)
// Analisa quantas células vizinhas possuem bomba
{
int r,s, adj[8][2], numbomb = 48, position = 0;
for (r=m-1; r<=m+1; r++)
for (s=n-1; s<=n+1; s++)
if (r >=0 and r <= 5 and s >= 0 and s <= 5)
{
adj[position][0]= r;
adj[position][1]= s;
if (r==m and s==n)
continue;
else
{
if (tab[r][s]==66)
numbomb++;
position++;
//cout << r <<" " << s << endl;
}
}
tab[m][n] = char(numbomb );
}
int main()
{
escolher();
imprime_tabuleiro();
return 0;
}
Pergunta
navarroc
Olá!
Recentemente tive que começar a fazer um trabalho da faculdade em C++, e escolhi fazer um jogo de campo minado. Até agora, montei em código apenas o tabuleiro, mas há um problema com ele que não consigo resolver. Utilizei apenas a lógica bruta para fazê-lo, sem nenhuma técnica sofisticada de programação, dada a minha limitação em C++; procurarei melhorar isso, se der tempo. Mas o problema é o seguinte: o código funciona perfeitamente se não for orientado a objetos, ou seja, sem o uso de classes. O tabuleiro é impresso direitinho. Quando utilizo o mesmo código com classes, fazendo, é claro, as adaptações necessárias, ele simplesmente não funciona. Um monte de símbolos esquisitos aparecem no lugar dos 1s, 2s, Bs... Preciso urgentemente de ajuda! O trabalho é para semana que vem. Estou perdidoooo!
Seguem os códigos abaixo. Um está orientado a objetos, e o outro não. Podem testar se quiserem. Apesar de serem iguais, coloquei os dois para não dar trabalho de transformar um em outro. Aguardo notícias de alguém, se puderem me ajudar...
OO:
Não OO: Editado por navarrocLink para o comentário
Compartilhar em outros sites
0 respostass a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.