Ir para conteúdo
Fórum Script Brasil
  • 0

Campo minado e classes


navarroc

Pergunta

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:

#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;
}

Editado por navarroc
Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,3k
×
×
  • Criar Novo...