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

Campo minado em C


leonildo carvalho

Pergunta

Boa noite a todos, sou estudante e o professor me passou um projeto em C de campo minado, nunca fiz jogos e na verdade estou com dificuldades, quero deixar bem claro que sou iniciante em programação, mais não estou aqui para pedir para me fazerem o dever de casa e sim para que os amigos programadores me ajudem, já iniciei o meu código, agora queria pedir para verem se está no caminho certo, caso não venha a tar me digam o que está errado para corrigir, e ao mesmo tempo pedir que deem dicas no que está faltando.

Desde já agradeço.

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <string.h>
#include <ctype.h>
#include <string.h>

//Definindo as minahas constantes para verificar acoes
#define vazio 0 //posicoes vazias/casas vazias
#define bombas 1 //posicao com bombas
#define bombasProximas 2 //quantidade de bombas proximas



/* Jogo em c campo minado:
Desenvolvido por Leonildo Carvalho
Criação dia: 05/09/2012
Ultima Atualização: 21/09/2012
Correção das matrizes que gera os numeros aleatorios
30-09-2012 atualizacao */

//variáveis globais
int TAMBombas;
int TAMCampo;

//variaveis que calculam o contador de tmepo
clock_t tInicio, Tfim;//declarando as variaveis da contagem do tempo
double tDecorrido; //variavel do tipo double para armazenar todo o tempo decorrido


//prototipo das funções
void fMenu1();
void fMenu2();
void fConfigurar();
void fJogar();
void tempoInicio ();
void tempoFim();


int main()
{
    fMenu1();

    return 0;
}
//inicio do jogo
void fMenu1(){

    //limpando buffer do teclado
    fflush(stdin);
    //variaveis
    char escolha;

    printf(":::::CAMPO MINADO:::::\n\nMENU INICIAL\n\n");
    printf("(C) Configurar\n(S)Sair\n");
    scanf("%c",&escolha);

    //usando a biblioteac ctype.h para tratar a letra e transformando em maiuscula a letra digitada ex: se recebe c transforma em C
    escolha=toupper(escolha);

    switch(escolha){

        case 'C': fConfigurar();
        break;

        case'S': exit(1);
        break;

        default: printf("Opcao invalida!!!\nC - Configurar e S - Sair\n");
        system("PAUSE");
        system("cls");
        fMenu1();
        break;

        return;
    }
}


//funcao opcao configurar
void fConfigurar(){

    //variaveis
    char nomeJogador[30];
    int quantBombas, tamanhoCampo;

    system("cls");
    printf("CAMPO MINADO\n");
    printf("Nome do jogador: \n");
    fflush(stdin);
    gets(nomeJogador);
    printf("Tamanho do campo minado (6/8/10):  \n");
    scanf("%d",&tamanhoCampo);
    printf("Quantidade de bombas (10/12/14): \n");
    scanf("%d",&quantBombas);

    //testando as opcoes
    if ((tamanhoCampo==6 || tamanhoCampo==8 || tamanhoCampo==10) && (quantBombas==10 || quantBombas==12 || quantBombas==14)){
        system("cls");

        TAMBombas=quantBombas;
        TAMCampo=tamanhoCampo;
        fMenu2();

    }else{
        printf("\n\nERRO: escolha as opcoes de acordo com o menu...\nPressione qualquer tecla voltar as configuracoes...\n\n\n\n");
        printf("\a\a"); // a serve para emitir um beep
        system("PAUSE");
        fConfigurar();
    }


    return;
}

//Funcao jogar
void fMenu2(){

    //limpando buffer do teclado
    fflush(stdin);
    //variaveis
    char escolha;

    printf(":::::CAMPO MINADO:::::\n\nMENU INICIAL\n\n");
    printf("(C) Configurar\n(J)Jogar\n(S)Sair\n");
    scanf("%c",&escolha);

    //usando a biblioteac ctype.h para tratar a letra e transformando em maiuscula a letra digitada ex: se recebe c transforma em C
    escolha=toupper(escolha);

    switch (escolha){

        case 'C': fConfigurar();
        break;

        case 'J': fJogar();

        case'S': exit(1);
        break;

        default: printf("Opcao invalida!!!\nC - Configurar e S - Sair\n");
        system("PAUSE");
        system("cls");
        fMenu1();
        break;

    }

    return;

}

void fJogar(){

    //iniciando o contador de tempo (chamando a funcao que criei)
    void tempoInicio();

//inicializado minha matriz

    //matriz que gera os numeros aleatorios, (entrada)

    int matrizCampo [TAMCampo][TAMCampo];
        int i,j;
        srand(time(NULL));

        for (i=0; i<TAMCampo; i++){
            for (j=0; j<TAMCampo; j++){
             matrizCampo [i][j]=0; //iniciando a matriz com zero
                matrizCampo[i][j]=rand()%TAMBombas;


            }

        }

        //matriz que imprime os numeros aleatorios (saida)

        for (i=0; i<TAMCampo; i++){
            for (j=0; j<TAMCampo;j++){
                printf("%d ", matrizCampo[i][j]); //o %d é usado para dar espaço entre as colunas
            }

            printf("\n");
       }





    //chamado a funcao que finaliza e exibe o contador do tempo
    void tempoFim();
}

void tempoInicio (){

    //iniciando a contagem do tempo
    tInicio=clock();
}

 void tempoFim(){

    //terminando a contagem do tempo
    Tfim=clock();

    //calcuulando o tempo decorrido
    tDecorrido=((double)(tInicio-Tfim)/CLOCKS_PER_SEC); //aqui simplesmente estamos calculando o tempo que inicio e o tempo que terminou e subtraindo o valor

    printf("Tempo gasto: %lf s\n", tDecorrido);
}

Link para o comentário
Compartilhar em outros sites

6 respostass a esta questão

Posts Recomendados

  • 0

Olá!

Está ficando bem interessante. O caminho é por aí mesmo! :)

Uma coisa que você deveria mudar é a forma de sorteio de bombas. No código abaixo:

for (i=0; i<TAMCampo; i++){
            for (j=0; j<TAMCampo; j++){
             matrizCampo [i][j]=0; //iniciando a matriz com zero
                matrizCampo[i][j]=rand()%TAMBombas;


            }

        }
Você escolhe para cada campo o numero de bombas que tem adjacentes, não é? Mas isso deve ser calculado e você deveria apenas marcar onde existe uma bomba em coordenadas aleatórias. Vamos considerar que se determinada posicao tiver -1 indica que há uma bomba nessa posição. Depois, o número de bombas adjacentes devem ser calculadas pelo código. Por exemplo:
// Primeiro inicializa a matriz
for (i=0; i<TAMCampo; i++){
    for (j=0; j<TAMCampo; j++){
        matrizCampo [i][j]=0; //iniciando a matriz com zero
    }
}

// Agora carrega as bombas
bombas=0;
while(bombas < TAMBombas) {
    // Escolhe uma posicao aleatoriamente
    i = rand()%TAMCampo;
    j = rand()%TAMCampo;

    // Se não existir uma bomba nessa posicao, marca e incrementa bombas
    if(matrizCampo [i][j] == 0) {
        matrizCampo [i][j] = -1;
        bombas++;
    }
}

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Desculpe a demora na resposta, estive meio ocupado com estudos e trabalho, obrigado vou tentar usar o que falou seguindo as dicas e vou postando aqui para analizarem e verem os erros, sou iniciante e sei que tem muita gente bem experiente.

Muito obrigado novamente.

Ficou dois erros:

Linha 202 - Ivaleu required as incremet operating

Linhas 192 - Ivalue required as left operating of assignment

/*

============================================================================

Name : campoMinado.c

Author : Leonildo Carvalho

Version : 1.0

Copyright : Leonildo Carvalho

Description : Projeto Campo minado em C, Ansi-style

Tabalho Final: Sistema de Informação - UAST-UFPE 2012.1

============================================================================

*/

#include <stdio.h>

#include <stdlib.h>

#include <time.h>

#include <string.h>

#include <ctype.h>

#include <string.h>

//Definindo as minahas constantes para verificar acoes

#define vazio 0 //posicoes vazias/casas vazias

#define bombas 1 //posicao com bombas

#define bombasProximas 2 //quantidade de bombas proximas

/* Jogo em c campo minado:

Desenvolvido por Leonildo Carvalho

Criação dia: 05/09/2012

Ultima Atualização: 21/09/2012

Correção das matrizes que gera os numeros aleatorios

30-09-2012 atualizacao */

//variáveis globais

int TAMBombas;

int TAMCampo;

//variaveis que calculam o contador de tmepo

clock_t tInicio, Tfim;//declarando as variaveis da contagem do tempo

double tDecorrido; //variavel do tipo double para armazenar todo o tempo decorrido

//prototipo das funções

void fMenu1();

void fMenu2();

void fConfigurar();

void fJogar();

void tempoInicio ();

void tempoFim();

int main()

{

fMenu1();

return 0;

}

//inicio do jogo

void fMenu1(){

//limpando buffer do teclado

fflush(stdin);

//variaveis

char escolha;

printf(":::::CAMPO MINADO:::::\n\nMENU INICIAL\n\n");

printf("© Configurar\n(S)Sair\n");

scanf("%c",&escolha);

//usando a biblioteac ctype.h para tratar a letra e transformando em maiuscula a letra digitada ex: se recebe c transforma em C

escolha=toupper(escolha);

switch(escolha){

case 'C': fConfigurar();

break;

case'S': exit(1);

break;

default: printf("Opcao invalida!!!\nC - Configurar e S - Sair\n");

system("PAUSE");

system("cls");

fMenu1();

break;

return;

}

}

//funcao opcao configurar

void fConfigurar(){

//variaveis

char nomeJogador[30];

int quantBombas, tamanhoCampo;

system("cls");

printf("CAMPO MINADO\n");

printf("Nome do jogador: \n");

fflush(stdin);

gets(nomeJogador);

printf("Tamanho do campo minado (6/8/10): \n");

scanf("%d",&tamanhoCampo);

printf("Quantidade de bombas (10/12/14): \n");

scanf("%d",&quantBombas);

//testando as opcoes

if ((tamanhoCampo==6 || tamanhoCampo==8 || tamanhoCampo==10) && (quantBombas==10 || quantBombas==12 || quantBombas==14)){

system("cls");

TAMBombas=quantBombas;

TAMCampo=tamanhoCampo;

fMenu2();

}else{

printf("\n\nERRO: escolha as opcoes de acordo com o menu...\nPressione qualquer tecla voltar as configuracoes...\n\n\n\n");

printf("\a\a"); // a serve para emitir um beep

system("PAUSE");

fConfigurar();

}

return;

}

//Funcao jogar

void fMenu2(){

//limpando buffer do teclado

fflush(stdin);

//variaveis

char escolha;

printf(":::::CAMPO MINADO:::::\n\nMENU INICIAL\n\n");

printf("© Configurar\n(J)Jogar\n(S)Sair\n");

scanf("%c",&escolha);

//usando a biblioteac ctype.h para tratar a letra e transformando em maiuscula a letra digitada ex: se recebe c transforma em C

escolha=toupper(escolha);

switch (escolha){

case 'C': fConfigurar();

break;

case 'J': fJogar();

break;

case'S': exit(1);

break;

default: printf("Opcao invalida!!!\nC - Configurar e S - Sair\n");

system("PAUSE");

system("cls");

fMenu1();

break;

}

return;

}

void fJogar(){

//iniciando o contador de tempo (chamando a funcao que criei)

void tempoInicio();

//inicializado minha matriz

int matrizCampo [TAMCampo][TAMCampo];

int i,j;

srand(time(NULL));

for (i=0; i<TAMCampo; i++){

for (j=0; j<TAMCampo; j++){

matrizCampo [j]=0; //iniciando a matriz com zero

matrizCampo[j]=rand()%TAMBombas;

}

}

//agora carrega as bombas

bombas=0;

while (bombas<TAMBombas) {

//escolha uma posicao aleatoriamente

i=rand() % TAMCampo;

j=rand() % TAMCampo;

// Se não existir uma bomba nessa posicao, marca e incrementa bombas

if(matrizCampo [j] == 0) {

matrizCampo [j] = -1;

bombas++;

}

}

/*

//matriz que imprime os numeros aleatorios (saida)

for (i=0; i<TAMCampo; i++){

for (j=0; j<TAMCampo;j++){

printf("%d ", matrizCampo[j]); //o %d é usado para dar espaço entre as colunas

}

printf("\n");

}

*/

//chamado a funcao que finaliza e exibe o contador do tempo

void tempoFim();

}

void tempoInicio (){

//iniciando a contagem do tempo

tInicio=clock();

}

void tempoFim(){

//terminando a contagem do tempo

Tfim=clock();

//calcuulando o tempo decorrido

tDecorrido=((double)(tInicio-Tfim)/CLOCKS_PER_SEC); //aqui simplesmente estamos calculando o tempo que inicio e o tempo que terminou e subtraindo o valor

printf("Tempo gasto: %lf s\n", tDecorrido);

}

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

  • 0

Boa tarde!

O problema é que você precisa declarar a variável antes de usá-la. Você apenas copiou o código e não declarou a variável bombas.

Outro problema é que, mesmo que tivesse declarado a variável, já existe uma definição que define bombas para 1. Esse é o motivo de, por convenção, sempre criar os defines em letras maiúsculas. Além disso é útil colocar no nome da variável algo que indique seu tipo para que, ao utilizá-la, não se confunda.

Assim o que você precisa mudar no seu código é trocar, no trecho de código que passei, a variável chamada "bombas" por "iBombas", por exemplo.

Lembre-se de declarar a variável também:

int iBombas;
Outra coisa: no código que eu tinha passado, a inicialização do vetor é o carregamento com zero. Na sua lógica você colocou também uma atribuição de um valor lido com a função rand(). Essa linha é incorreta pois assim o vetor conterá qualquer valor, o que não é o que se espera após a inicialização. Assim apenas remova a linha que atribui o valor recebido de rand como abaixo:
for (i=0; i<TAMCampo; i++){
for (j=0; j<TAMCampo; j++){
matrizCampo [i][j]=0; //iniciando a matriz com zero
}
}

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Boa noite Marcelo, realmente estava tendo conflitos lógicos, já corrigi, eu havia pensado que já tinha declarado a variável mais creio que por o sono que me econtrava passei despercebido, eu digitei o código que passou acho melhor que copiar e colar, pois como estou aprendendo ajuda a entender melhor o que fez, pode ser besteira minha mais prefiro assim, rsrsrsrs.

Quero agradecer pela força que está me dando, pois está sendo de muita ajuda os seus conhecimentos.

Desculpe te explorar ou explorar as informações dos amigos aqui do fórum, mais como seria a melhor forma de mostrar no tabuleiro os valores que irei estourando da casa que o usuario escolher?

Link para o comentário
Compartilhar em outros sites

  • 0

Bom dia!

Não é besteira sua não! É muito bom isso, realmente ajuda a entende melhor...

E não é exploração, fique tranquilo!

Quem responde está disposto a ajudar, ninguém faz nada obrigado... :)

Sobre a sua dúvida: eu não entendi exatamente o que você quis dizer. Você diz sobre como exibir o tabuleiro em só ou como calcular o número de bombas em inq determinada posição?

Eu pensei um pouco agora e imaginei o seguinte:

Para desenhar o tabuleiro é necessário saber duas coisas:

1- Se o usuário já escolheu o campo ou não (para saber se o campo está oculto)

2- Número de bombas adjacentes

Assim precisaríamos de duas matrizes em um primeiro momento. Mas podemos fazer da seguinte forma: iniciar toda a matriz com -2. Esse é o valor que indica que está posição não foi escolhida ainda e não deve ser exibida. As bombas serão os campos que estiverem com -1 e as posições com valores a partir de zero são as que o usuário já abriu.

Desta forma você exibe o tabuleiro conforme o valor em cada posição. E quando o usuário escolher uma posição, calcula-se o número de bombas adjacentes e carrega na matriz.

Abraços,

Marcelo Utikawa da Fonseca

Link para o comentário
Compartilhar em outros sites

  • 0

Para esclarecer melhor minha dúvida, o sistema tem uma matriz rodando internamente, por Rodando internamente está assim:

Supondo que -1 vazia, -2 bomba, e os demais quantidades de bombas próximas:

exemplo1: o que roda interno:

-1 -2 -1

-2 -3 -1

-1 -1 -4

-2 -4 -5

Mais para o usuário deve aparecer assim:

Exemplo2: o que mostra externo.

Supondo que o jogo iniciou, e ele mandou estourar a linha 1 coluna 1. Então o restante fica “camuflado”, rsrsrs.

Meu tabuleiro exibido para o usario:

. # #

# # #

# # #

# # #

Minha dúvida é como esconder a matriz do usuário e gerar o tabuleiro, e atualizar quando o usuário mandar imprimir a casa, é uma dúvida bem simples mais para quem não está conseguindo é difícil.

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

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,4k
×
×
  • Criar Novo...