Ir ao conteúdo
  • Cadastre-se
ComputaçãoEng

C Desenvolvido no Dev-C++ para(windows) - CampoMinado v1.01

Recommended Posts

O menu parece estar com erro, pode me ajudar? qualquer opção que seleciono, faz o jogo para.

 

Dev-C++ (windows)

Campo Minado - v1.01

 

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
/* Desenvolvido por @ComputaçãoEng*/
/* Protótipos: */
int Menu();               /* Menu do jogo */
int gerar_campo_minado(); /* Gera e mostra campo minado com valores ocultos, caso sua ativação seja status = "falsa": */
int verificar_ativacao(); /* Se ativação for status = "verdadeira", atualiza campo_2: */
int mostra_campo_minado();/* Imprime o campo atualizado... */ 
void Inicio();            /* Abertura do jogo*/
int Campo_1[10][10];      /* Gera valores a serem verificados de 0 a 5... */
int Campo_2[10][10];      /* Armazena os STATUS (ativado (1), desativado (0))... */
int marca_pontos = 0;     /* Marca a pontução feita*/
int para=0;               /* Usado para parar a geração de valores aleatorios*/
/* Desenvolvido por @ComputaçãoEng*/
  
int main(){
	Inicio();
	gerar_campo_minado();
	mostra_campo_minado();
	verificar_ativacao();
	Menu();
system("exit");
}
  
/* Menu de seleção*/
int Menu(){
	printf(" \n Pontuacao MAXIMA : %d ", marca_pontos);
	printf("\n\n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n");
	printf("   IIIIIIII    -MENU-   IIIIIIII\n");
	printf("   IIIIIIII             IIIIIIII\n");
	printf("   IIIIIII  1. RESTART   IIIIIII\n"); /*Reinicia campo minado... */
	printf("   IIIIIII  2. CONTINUE  IIIIIII\n"); /*Continua o campo minado antes da utima ação... */
	printf("   IIIIIII  3. SAIR      IIIIIII\n"); /*Para o joga... */
	printf("   IIIIIIII             IIIIIIII\n");
	printf("   IIIIIIII    -MENU-   IIIIIIII\n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n");
	printf("     IIIIIIIIIIIIIIIIIIIIIIIII  \n\n");
	int a;
	printf("  Menu: ");
	scanf("%d", &a);
	if( a == 3){
	 system("exit");
	}else if( a == 2){
		system("cls");
		main();
	}else if( a == 1){
		for(int x=0; x<10 ; x++){
			for(int y=0; y<10 ; y++){
				Campo_2[x][y] = 0;
			}
		}
		marca_pontos = 0;
		para = 0;
		system("cls");
		main();
	}
}
  
/* Se o status for ATIVADO (1), atualiza Campo minado mostrando valor...  */
/* Se o valor da coordenada for ZERO (0), então você encontrou uma mina...*/
int verificar_ativacao(){
	int x, y;
	do{
		printf("\n Coordenada: ");
		scanf("%d %d", &x, &y);
		if(x > 8 || x < 0){
			printf("\n VALOR INVALIDO! ");
			system("cls");
			mostra_campo_minado();
		}else if(Campo_1[x][y] > 0 && Campo_1[x][y] < 5){
			Campo_2[x][y] = 1;
			marca_pontos += Campo_1[x][y]; 
			system("cls");
			mostra_campo_minado();
		}else if(Campo_1[x][y] == 0){
			x = y = 0;
			system("cls");
			break;
		}
	}while(1);
	printf("\n-----------------------------------------------------------------------------------------\n");
	printf("  IIIIIIIIIIII     IIIIIIII      IIIIIIII    IIIIII          IIIIII    IIII  IIII  IIII\n");
	printf("  IIIII   IIIII  IIIIIIIIIIII  IIIIIIIIIIII   IIIIII        IIIIII     IIII  IIII  IIII\n");
	printf("  IIII     IIII  IIII    IIII  IIII    IIII   IIIIIII      IIIIIII     IIII  IIII  IIII\n");
	printf("  IIIII   IIIII  III      III  III      III   IIIIIIII    IIIIIIII     IIII  IIII  IIII\n");
	printf("  IIIIIIIIIII    III      III  III      III   IIII IIII  IIII IIII     IIII  IIII  IIII\n");
	printf("  IIIII   IIIII  III      III  III      III   IIII  IIIIIIII  IIII     IIII  IIII  IIII\n");
	printf("  IIII     IIII  IIII    IIII  IIII    IIII   IIII   IIIIII   IIII                     \n");
	printf("  IIIII   IIIII  IIIIIIIIIIII  IIIIIIIIIIII   IIII    IIII    IIII     IIII  IIII  IIII\n");
	printf("  IIIIIIIIIIII     IIIIIIII      IIIIIIII    IIIIII          IIIIII    IIII  IIII  IIII\n");	
	printf("-------------------------------------------------------------------------------------------\n\n\n");
	Sleep(2000);
	system("cls");
}
                                                         
/* Imprime Campo minado na tela... */
int mostra_campo_minado(){
	printf("\n           Pontos: %d", marca_pontos);
	printf("\n\n");
	printf("        1  2  3  4  5  6  7  8 \n");
	for(int x=0 ; x<10 ; x++){
		if( x > 0 && x <9){
			printf("  %d ", x);
		}else{
			printf("    ");
		}
		for(int y=0 ; y<10 ; y++){
			if(Campo_1[x][y] == 8){
				putchar(219);
				putchar(219);
				putchar(219);		
			}else if(Campo_2[x][y] == 1){
				putchar(32);
				printf("%d", Campo_1[x][y]);
				putchar(32);
			}else{
				putchar(32);
				putchar('*');
				putchar(32);
			}
		}
		printf("\n");
	}
}
  
/* Gera Valores aleatórios para o campo minado... */
int gerar_campo_minado(){
	if(para == 0){
		for(int x=0 ; x <10 ; x++){
			for(int y=0 ; y <10 ; y++){
				Campo_1[x][y] = rand()%5;
				if( x == 0 || x == 9 || y == 0 || y == 9){
					Campo_1[x][y] = 8;
				}
			}
		}
		para++;
	}
	
}
  
 /* Abertura */
void Inicio(){
	if(para == 0){	
		printf("\n");
		printf("\n");
		printf("	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n");
		printf("	IIII              IIII              IIII\n");
		printf("	IIII     IIIIII   IIII   IIIIII     IIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIIIII    IIII            IIII    IIIIII\n");
		printf("	IIIIII    IIIIIIIIIIIIIIIIIIII    IIIIII\n");
		printf("	IIIIII    IIII            IIII    IIIIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIII      IIII    IIII    IIII      IIII\n");
		printf("	IIII     IIIIII   IIII   IIIIII     IIII\n");
		printf("	IIII              IIII              IIII\n");
		printf("	IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII\n");
		printf("\n");
		for(int load=0; load<100 ; load = load + 1 + rand()%40 ){
			printf("Loading %d%% : ", load);
			for(int pt=0; pt<40 ; pt++){
				putchar(219);
				for(int timer=0; timer < 4000000 ; timer++);
			}
			printf("\r");
			for(int limpa=0; limpa<100 ; limpa++ ){
				putchar(32);
			}
			printf("\r");
		}
		system("cls");
	}
/* Desenvolvido por @ComputaçãoEng*/
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@ComputaçãoEng para o jogo continuar você precisa colocar um laço de repetição que pode ser o do / while  que vai repetir a parte do código que você precisa, e se quiser parar o jogo então digite ESC , ou quando ganhar o jogo . esse loop seria assim :

int main(){
    int op;
    do{
        Inicio();
        gerar_campo_minado();
        mostra_campo_minado();
        verificar_ativacao();
        Menu();
        printf("Tecle ESC Para Parar\n");
        if(kbhit())op = getch();
    }while(op != 27);/* 27 é o código ASCII de ESC */
    system("exit");
    return 0;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Também fiz um campo minado, vai meu código abaixo:

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

//Tamanho do Campo Minado
#define TAM 9

//Número de Minas
#define N_MINAS 10

/*Define cada área do campo
Valores:
  -1     ->  Área contém Mina (*)
  0 a 8  ->  Quantidade de Minas ao redor da área
Estados:
  0      ->  Não revelado
  1      ->  Revelado
*/
typedef struct {char valor, estado;} area;


//Arma minas no campo e coloca valores nas casas sem minas
void armarminas(area campominado[TAM][TAM]) {
    int v[TAM*TAM], i, j, n, m, x, y, c;

    //Preenche vetor com números de 0 a TAM*TAM:
    for (i=0; i < TAM*TAM; i++){
        v[i] = i;
    }

    //Embaralha números no vetor usando o algoritmo Knuth Fisher-Yates:
    for (i = TAM*TAM-1; i>0; i--){
        n = rand() % (i+1);
        m = v[i];
        v[i] = v[n];
        v[n] = m;
    }

    //Usa os primeros N números do vetor para determinar as posições onde
    //as minas vão:
    for(i=0; i<N_MINAS; i++){
        campominado[v[i]/TAM][v[i]%TAM].valor = -1; //-1 = Posição contém mina
    }

    //Define o número de cada área do campo minado que não contém uma mina,
    //ou seja quantas minas existem ao redor de cada área:
    for (i = 0; i<TAM; i++){
        for (j = 0; j<TAM; j++){
            //se a área não tem mina:
            if (campominado[i][j].valor != -1){
                //Conta quantas minas tem ao redor da área e atribui ao valor
                //da área:
                c = 0;
                for (x = i-1; x < i+2; x++){
                    for (y = j-1; y < j+2; y++){
                        if (x>=0 && x<TAM && y>=0 && y<TAM && campominado[x][y].valor < 0)
                            c++;
                    }
                }
                campominado[i][j].valor = c;
            }
        }
    }
}

//Imprime na tela o campo minado
void imprimircampo(area campominado[TAM][TAM]){
    int i, j;

    //Limpa a tela:
    for (i = 0; i<4; i++){
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

    printf("Colunas  ");
    for (i = 0; i<TAM; i++){
        printf(" %c", 'A'+i);
    }
    printf("\n----------");
    for (i = 0; i<TAM; i++){
        printf("--");
    }
    printf("\nLinhas|\n");

    for (i = 0; i<TAM; i++){
        printf("  %2d  |  ", i+1);
        for (j = 0; j<TAM; j++){
            if(campominado[i][j].estado == 0) printf(" %c", 254); //Não revelado
            else if(campominado[i][j].valor < 0) printf(" *"); //Mina
            else if(campominado[i][j].valor) printf(" %hhd", campominado[i][j].valor); //Número Minas ao redor
            else printf(" ."); //Área sem minas ao redor
        }
        printf("\n");
    }
}

//Se não há minas ao redor da área automaticamente limpa as áreas ao redor
void limpaareasvazias(area campominado[TAM][TAM], int l, int c){
    int i, j;
    for (i = l-1; i<l+2; i++){
        for (j = c-1; j<c+2; j++){
            //Se a posição existe e a área não foi revelada:
            if (i>=0 && i<TAM && j>=0 && j<TAM && campominado[i][j].estado == 0){
                campominado[i][j].estado = 1; //Revela área
                //Se a nova área também não tem minas ao redor:
                if(campominado[i][j].valor == 0){
                    limpaareasvazias(campominado, i, j);
                }
            }
        }
    }
}

int main()
{
    srand(time(NULL));

    int i, j, k, l, c, parar = 0, venceu;
    area campominado[TAM][TAM] = {0};


    armarminas(campominado);

    while(!parar){
        imprimircampo(campominado);

        printf("\nDigite a coluna e linha (ex: A1): ");
        scanf("%c%d", &c, &l);
        getchar();
        c = toupper(c)-'A';
        l--;
        //Se não for uma posição válida:
        if(c<0 || c>=TAM || l<0 || l>=TAM)
            continue;

        //Se não tiver mina:
        if(campominado[l][c].valor > 0){
            campominado[l][c].estado = 1;
        }
        else if(campominado[l][c].valor == 0){
            campominado[l][c].estado = 1;
            limpaareasvazias(campominado, l, c);
        }
        //Se tem mina:
        else {
            parar = 1; //Parar
            venceu = 0; //Perdeu
            //Revela todas as minas:
            for (i = 0; i<TAM; i++){
                for (j = 0; j<TAM; j++){
                    if(campominado[i][j].valor < 0)
                        campominado[i][j].estado = 1;
                }
            }
        }

        //Conta o número de casas não reveladas:
        k = 0;
        for(i=0; i<TAM; i++){
            for(j=0; j<TAM; j++){
                if(campominado[i][j].estado == 0)
                    k++;
            }
        }
        //Se a quantidade de casas não reveladas é igual ao número de minas:
        if(k == N_MINAS && !parar){
            parar = 1; //Parar
            venceu = 1; //Venceu
        }
    }

    imprimircampo(campominado);
    if(venceu)
        printf("\n *** PARABENS voce VENCEU *** \n");
    else
        printf("\n !!! BOOM !!! \n");

    return 0;
}

É possível mudar o tamanho e o número de minas modificando as constantes definidas no começo do código. Está configurado para o nível fácil do campo minado do Windows, com campo 9x9 e 10 minas, mas poderia por exemplo modificar para o nível médio do campo minado do Windows que tem dimensão 16x16 e 40 minas.

  • Curtir 1
  • Obrigado 1
  • Amei 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Segunda versão do meu campo minado, agora com 4 modos de jogo (fácil, médio, difícil e personalizado):

 

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

//Tamanho Máximo do Campo Minado
#define TAM 30

int tl = 9, tc = 9, nm = 10;

/*Define cada área do campo
Valores:
  -1     ->  Área contém Mina (*)
  0 a 8  ->  Quantidade de Minas ao redor da área
Estados:
  0      ->  Não revelado
  1      ->  Revelado
*/
typedef struct {char valor, estado;} area;

//Arma minas no campo e coloca valores nas casas sem minas
void armarminas(area campominado[TAM][TAM]) {
    int v[tl*tc], i, j, n, m, x, y, c;

    //Preenche vetor com números de 0 a tl*tc:
    for (i=0; i < tl*tc; i++){
        v[i] = i;
    }

    //Embaralha números no vetor usando o algoritmo Knuth Fisher-Yates:
    for (i = tl*tc-1; i>0; i--){
        n = rand() % (i+1);
        m = v[i];
        v[i] = v[n];
        v[n] = m;
    }
    
    //Zera todas as areas do campo minado
    for (i = 0; i<tl; i++){
        for (j = 0; j<tc; j++){
            campominado[i][j].estado = 0;
            campominado[i][j].valor = 0;
        }
    }
    
    
    //Usa os primeros N números do vetor para determinar as posições onde
    //as minas vão:
    for(i=0; i<nm; i++){
        printf(" %d", v[i]);
        campominado[v[i]/tc][v[i]%tc].valor = -1; //-1 = Posição contém mina
    }
    printf("\n");

    //Define o número de cada área do campo minado que não contém uma mina,
    //ou seja quantas minas existem ao redor de cada área:
    for (i = 0; i<tl; i++){
        for (j = 0; j<tc; j++){
            //se a área não tem mina:
            if (campominado[i][j].valor != -1){
                //Conta quantas minas tem ao redor da área e atribui ao valor
                //da área:
                c = 0;
                for (x = i-1; x < i+2; x++){
                    for (y = j-1; y < j+2; y++){
                        if (x>=0 && x<tl && y>=0 && y<tc && campominado[x][y].valor < 0)
                            c++;
                    }
                }
                campominado[i][j].valor = c;
            }
        }
    }
}

//Imprime na tela o campo minado
void imprimircampo(area campominado[TAM][TAM]){
    int i, j;

    //Limpa a tela:
    for (i = 0; i<4; i++){
        printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
    }

    printf("Colunas  ");
    for (i = 0; i<tc; i++){
        printf(" %c", 'A'+i);
    }
    printf("\n----------");
    for (i = 0; i<tc; i++){
        printf("--");
    }
    printf("\nLinhas|\n");

    for (i = 0; i<tl; i++){
        printf("  %2d  |  ", i+1);
        for (j = 0; j<tc; j++){
            if(campominado[i][j].estado == 0) printf(" %c", 254); //Não revelado
            else if(campominado[i][j].valor < 0) printf(" %c", 15); //(" *"); //Mina
            else if(campominado[i][j].valor) printf(" %hhd", campominado[i][j].valor); //Número Minas ao redor
            else printf(" ."); //Área sem minas ao redor
        }
        printf("\n");
    }
}

//Se não há minas ao redor da área automaticamente limpa as áreas ao redor
void limpaareasvazias(area campominado[TAM][TAM], int l, int c){
    int i, j;
    for (i = l-1; i<l+2; i++){
        for (j = c-1; j<c+2; j++){
            //Se a posição existe e a área não foi revelada:
            if (i>=0 && i<tl && j>=0 && j<tc && campominado[i][j].estado == 0){
                campominado[i][j].estado = 1; //Revela área
                //Se a nova área também não tem minas ao redor:
                if(campominado[i][j].valor == 0){
                    limpaareasvazias(campominado, i, j);
                }
            }
        }
    }
}

int main()
{
    srand(time(NULL));

    int i, j, k, op, l;
    char c, ch, parar = 0, venceu;
    area campominado[TAM][TAM] = {0};


    do {
        printf("\n ======== CAMPO MINADO ========\n\n");

        printf(" 1 - fácil   ->  9 x  9 : 10 minas\n");
        printf(" 2 - Medio   -> 16 x 16 : 40 minas\n");
        printf(" 3 - difícil -> 16 x 30 : 99 minas\n");
        printf(" 4 - Personalizado\n");
        printf(" 0 - Sair\n\n");

        printf(" Opcao: ");
        scanf("%d", &op);
        while ((ch = getchar()) != '\n' && ch != EOF);

        switch(op){
            case 1:
                tl = 9;
                tc = 9;
                nm = 10;
                break;
            case 2:
                tl = 16;
                tc = 16;
                nm = 40;
                break;
            case 3:
                tl = 16;
                tc = 30;
                nm = 99;
                break;
            case 4:
                printf("\n  - Numero de linhas [9 a 30]: ");
                scanf("%d", &tl);
                if(tl < 9)
                    tl = 9;
                if(tl > 30)
                    tl = 30;
                printf("  - Numero de colunas [9 a 30]: ");
                scanf("%d", &tc);
                if(tc < 9)
                    tc = 9;
                if(tc > 30)
                    tc = 30;
                printf("  - Numero de minas [1 a %d]: ", (tl*tc - tl - tc + 1));
                scanf("%d", &nm);
                if(nm < 1)
                    nm = 1;
                if(nm > (tl*tc - tl - tc + 1))
                    nm = tl*tc - tl - tc + 1;
                while ((ch = getchar()) != '\n' && ch != EOF);
                printf("\n Campo minado personalizado -> %2d x %2d : %d minas\n ", tl, tc, nm);
                while ((ch = getchar()) != '\n' && ch != EOF);
                break;
            case 0:
                continue;
            default:
                continue;

        }

        armarminas(campominado);

        parar = 0;
        while(!parar){
            imprimircampo(campominado);

            printf("\nDigite a coluna e linha (ex: A1): ");
            scanf("%c%d", &c, &l);
            while ((ch = getchar()) != '\n' && ch != EOF);
            c = toupper(c)-'A';
            l--;
            //Se não for uma posição válida:
            if(c<0 || c>=tc || l<0 || l>=tl)
                continue;

            //Se não tiver mina:
            if(campominado[l][c].valor > 0){
                campominado[l][c].estado = 1;
            }
            else if(campominado[l][c].valor == 0){
                campominado[l][c].estado = 1;
                limpaareasvazias(campominado, l, c);
            }
            //Se tem mina:
            else {
                parar = 1; //Parar
                venceu = 0; //Perdeu
                //Revela todas as minas:
                for (i = 0; i<tl; i++){
                    for (j = 0; j<tc; j++){
                        if(campominado[i][j].valor < 0)
                            campominado[i][j].estado = 1;
                    }
                }
            }

            //Conta o número de casas não reveladas:
            k = 0;
            for(i=0; i<tl; i++){
                for(j=0; j<tc; j++){
                    if(campominado[i][j].estado == 0)
                        k++;
                }
            }
            //Se a quantidade de casas não reveladas é igual ao número de minas:
            if(k == nm && !parar){
                parar = 1; //Parar
                venceu = 1; //Venceu
            }
        }

        imprimircampo(campominado);
        if(venceu)
            printf("\n *** PARABENS voce VENCEU *** \n");
        else
            printf("\n !!! BOOM !!! \n");
        while ((ch = getchar()) != '\n' && ch != EOF);

        //Limpa a tela:
        for (i = 0; i<4; i++){
            printf("\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n");
        }
    }while(op != 0);

    return 0;
}

 

  • Obrigado 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×