Implementación simple del juego buscaminas en lenguaje C

1. Ideas de implementación
1. Organizar
minas Defina una mina de matriz de caracteres bidimensional para almacenar minas, use '1' para representar minas y '0' para representar que no hay minas, defina
una matriz de caracteres bidimensional show para almacenar la información requerida para remoción de minas;
2, Desminado Desminado
en forma de coordenadas de entrada, puede haber cuatro resultados:

Las coordenadas son ilegales;
si pisas minas, el juego termina; si pisas minas, hay minas alrededor, y se muestra
la cantidad de minas a tu alrededor ; de lo contrario, el juego continúa.


2. Implementación del código de función
1. Inicialización de la matriz "trueno" e impresión
de la inicialización del "campo minado":
inicializa todos los elementos de la matriz para establecer
//inicializa la matriz
void Initarr(char arr[ROWS][COLS], int row, int col, char set)
{     for (int i = 0; i < fila; i++)     {         for (int j = 0; j < col; j++)         {             arr[i][j] = set;         }     } } print thunder Area : Utilice la línea divisoria para separar cada desminado e imprima las etiquetas de fila y columna para seleccionar la ubicación. // Imprime "campo minado", porque la primera línea, la última línea, la primera columna y la última columna se utilizan como funciones auxiliares, // por lo que no se imprimirá, y solo se imprimirán las 9 líneas del medio. void Display(char arr[ROWS][COLS], int row, int col) {     printf("------- Buscaminas-------\n");     printf("0 1 2 3 4 5 6 7 8 9\n");//imprime la etiqueta de la columna     para (int i = 1; i <fila + 1; i++)

















    {         printf("%d ", i);//imprime la etiqueta de línea         para (int j = 1; j < col + 1; j++)         {             printf("%c ", arr[i][j]);         }         printf ("\n");     }     printf("------- Buscaminas------\n"); } 2. Arreglar minas y barrer minas Arreglar minas usa contar para indicar la dificultad del juego, que es, el número de minas organizadas, pasando parámetros para asegurar que la función aún esté disponible después de dejar la variable global; //Disposición aleatoria de minas void Setmine(char mine[ROWS][COLS], int row, int col, int count) {     int x = 0;     int y = 0;     while (count)     {         //el mío tiene un tamaño de 11×11, los míos no están dispuestos en la primera y última fila ni en la primera y última columna         x = rand() % fila + 1;         y = rand() % col + 1;         if (mío[x][y] == '0')
























        {             mine[x][y] = '1';             count--;         }     } } 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Buscaminas , clasificar según la situación. Al juzgar si la mina está marcada o no, la eficiencia es baja ;, coordenadas legales -> A, pisar minas -> fin del juego // B, no pisar minas - > a, minas circundantes -> muestra el número de minas // b, no hay minas alrededor -> expansión de área grande // C, la posición ha sido barrida -> las coordenadas son ilegales void Sweep(char mine[ROWS][COLS ], char show[ROWS][COLS], int fila, int col, int cuenta)































{     int x = 0, y = 0;     while (1)     {         printf("Ingrese las coordenadas:\n");         scanf("%d %d", &x, &y);         if (x < 1 || x > fila || y < 1 || y > col)         {             printf("La coordenada no es válida, vuelva a ingresarla:\n");         }         else if (mine[x][y] == '1')         {             printf("Esta mina en todas partes, fin del juego\n");             Display(mina, fila, columna);             break;         }         else if (show[x][y] != '*')         {             printf("Esta ubicación ha sido escaneada, vuelva a ingresar:\n");         }         else         {             //No hay truenos alrededor






















            if (get_mine(mine, x, y) == 0)
            {                 unfold(mine, show, x, y);                 Mostrar (mostrar, fila, columna);             }             //周边有雷             else             {                 show[x][y] = get_mine(mine, x, y) + '0';                 Mostrar (mostrar, fila, columna);             }         }         //判断是否完成         int win = 0;         for (int i = 1; i < fila + 1; i++)         {             for (int j = 1; j < col + 1; j++)             {                 if (show[i][j] == '*')                     win++;             }



















        }
        if (ganar == FÁCIL)
        {             printf("¡Exitoso barrido de minas!\n");             Display(mina, fila, columna);             romper;         }     } } 1. 2. 3. 4. 5. 6. 7. 8 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33 34. 35 .





        




































36.
37.
38.
39.
40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56.
57. 58. 59. 60 . 61. Despliegue recursivo sin truenos Use la recursividad para juzgar las ocho posiciones circundantes a su vez para lograr el efecto de despliegue; void unfold(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y) {     if (x == 0 || x == FILA + 1 || y == 0 || y == COL + 1)         return;     if (mostrar[x][y] == '*')     {         int ret = get_mine(mío, x, y);         if (ret == 0)






























        {             mostrar[x][y] = ' ';             desplegar(mío, mostrar, x -1, y -1);             desplegar(mío, mostrar, x - 1, y);             desplegar(mío, mostrar, x - 1, y + 1);             desplegar(mío, mostrar, x, y - 1);             desplegar(mío, mostrar, x, y + 1);             desplegar(mío, mostrar, x + 1, y - 1);             desplegar(mío, show, x + 1, y);             unfold(mine, show, x + 1, y + 1);         }         else         {             show[x][y] = ret + '0';         }     } } Verifica el número de minas alrededor La cantidad de minas en las 8 ubicaciones circundantes se verifica mediante dos capas de bucles anidados; //Obtenga la cantidad de minas en el área circundante int get_mine(char mine[ROWS][COLS], int x, int y)





















{     int cuenta = 0;     for (int i = -1; i < 2; i++)     {         for(int j = -1; j < 2; j++)             if (mío[x + i][y + j] == '1')             {                 count++;             }     }     return count; } Tercero, pequeños consejos Cuando defina una matriz bidimensional para almacenar minas, defina la matriz dos veces más grande y use una matriz de 11×11 para un tablero de 9×9. De esta manera, incluso si es para juzgar el borde, también puede usar la misma función para la cuadrícula, por lo que no tiene que preocuparse por cruzar el límite; al definir la dificultad del juego, puede poner el contenido relevante en el archivo de encabezado, y use #define definición para facilitar la modificación futura; al definir la función, solo puede usarla en este Agregar estática antes de las funciones utilizadas en los archivos .c para evitar que se llame a otros archivos, y al mismo tiempo hacer que sea más conveniente definir funciones en otros archivos .c; al escribir código, primero debe pensar rigurosamente y considerar varios resultados. Será más eficiente pensar y escribir código. 4. Archivo de encabezado de resumen de código game.h


















#pragma once

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

#define ROW 9
#define COL 9

#define ROWS 11
#define COLS 11

//游戏难度
#define EASY 10


//初始化数组,初始arr数组中的值为set
void Initarr(char arr[ROWS][COLS], int row, int col, char set);

//打印“雷区”
void Display(char arr[ROWS][COLS], int row, int col);

//随机布置雷
void Setmine(char mine[ROWS][COLS], int row, int col, int count);

//扫雷
void Sweep(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int count);


函数文件game.c

#define _CRT_SECURE_NO_WARNINGS 1

#include"game.h"
//具体函数的实现

//选择菜单
void menu()
{
    printf("******************\n");
    printf("***** 1、开始 ****\n");
    printf("***** 0、退出 ****\n");
    printf("******************\n");
}

//初始化数组
void Initarr(char arr[ROWS][COLS], int row, int col, char set)
{
    for (int i = 0; i < row; i++)
    {
        for (int j = 0; j < col; j++)
        {
            arr[i][j] = set;
        }
    }
}

//打印“雷区”,由于第一行、最后一行、第一列与最后一列作为辅助作用,因此不予打印,只打印中间9行
void Display(char arr[ROWS][COLS], int row, int col)
{
    printf("------- 扫雷 ------\n");
    printf("0 1 2 3 4 5 6 7 8 9\n");//打印列标
    for (int i = 1; i < row + 1; i++)
    {
        printf("%d ", i);//打印行标
        for (int j = 1; j < col + 1; j++)
        {
            printf("%c ", arr[i][j]);
        }
        printf("\n");
    }
    printf("------- 扫雷 ------\n");
}

//随机布置雷
void Setmine(char mine[ROWS][COLS], int row, int col, int count)
{
    int x = 0;
    int y = 0;
    while (count)
    {
        //mine为11×11大小,首行末行与首列末列均不布置雷
        x = rand() % row + 1;
        y = rand() % col + 1;
        if (mine[x][y] == '0')
        {
            mine[x][y] = '1';
            count--;
        }
    }
}

//获取周边的雷的个数
static int get_mine(char mine[ROWS][COLS], int x, int y)
{
    int count = 0;
    for (int i = -1; i < 2; i++)
    {
        for(int j = -1; j < 2; j++)
            if (mine[x + i][y + j] == '1')
            {
                count++;
            }
    }
    return count;
}

//展开函数
static void unfold(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
    if (x == 0 || x == ROW + 1 || y == 0 || y == COL + 1)
        return;
    if (show[x][y] == '*')
    {
        int ret = get_mine(mine, x, y);
        if (ret == 0)
        {
            show[x][y] = ' ';
            unfold(mine, show, x -1, y -1);
            unfold(mine, show, x - 1, y);
            unfold(mine, show, x - 1, y + 1);
            unfold(mine, show, x, y - 1);
            unfold(mine, show, x, y + 1);
            unfold(mine, show, x + 1, y - 1);
            unfold(mine, show, x + 1, y);
            unfold(mine, show, x + 1, y + 1);

            
        }
        else
        {
            show[x][y] = ret + '0';
        }
    }
}
//扫雷可能出现的情况:
// 1、坐标非法->重新输入
// 2、坐标合法->A、踩雷->游戏结束
//              B、未踩雷->a、周边有雷->显示雷的数量
//                         b、周边无雷->大面积展开
//              C、该位置已经被扫过->坐标非法
void Sweep(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col, int count)
{
    int x = 0, y = 0;
    while (1)
    {
        printf("请输入坐标:\n");
        scanf("%d %d", &x, &y);
        if (x < 1 || x > row || y < 1 || y > col)
        {
            printf("坐标非法,请重新输入:\n");
        }
        else if (mine[x][y] == '1')
        {
            printf("此处有雷,游戏结束\n");
            Display(mine, row, col);
            break;
        }
        else if (show[x][y] != '*')
        {
            printf("该位置已被扫过,请重新输入:\n");
        }
        else
        {
            //周边无雷
            if (get_mine(mine, x, y) == 0)
            {
                unfold(mine, show, x, y);
                Display(show, row, col);
            }
            //周边有雷
            else
            {
                show[x][y] = get_mine(mine, x, y) + '0';
                Display(show, row, col);
            }
        }
        //判断是否完成
        int win = 0;
        for (int i = 1; i < row + 1; i++)
        {
            for (int j = 1; j < col + 1; j++)
            {
                if (show[i][j] == '*')
                    win++;
            }
        }
        if (win == EASY)
        {
            printf("扫雷成功!\n");
            Display(mine, row, col);
            break;
        }
    }    
}

void game()
{
    // mine数组用以存放雷
    char mine[ROWS][COLS] = { 0 };
    // show数组用以存放扫出的信息
    char show[ROWS][COLS] = { 0 };
    //初始化mine数组为字符0,show数组为字符'*'
    Initarr(mine, ROWS, COLS, '0');
    //Display(mine, ROW, COL);//检测初始化效果
    Initarr(show, ROWS, COLS, '*');
    //Display(show, ROW, COL);//检测初始化效果
    Setmine(mine, ROW, COL, EASY);
    //Display(mine, ROW, COL);//查看雷的布置位置
    Display(show, ROW, COL);
    Sweep(mine, show, ROW, COL, EASY);
}


Archivo de prueba test.h
#define _CRT_SECURE_NO_WARNINGS 1

#include"juego.h"

int main()
{     int x = 0;     srand((int sin signo)tiempo(NULL));     do     {         menu();         scanf("%d", &x);         switch (x)         {         caso 1:             printf("Juego start\n");             juego();             break;         case 0:             printf("El juego sale\n");             break;         default:             printf("Error de entrada, vuelva a ingresar\n");             break;         }     } while (x); }




















Finalmente, si quieres saber más, sígueme, gracias.

Supongo que te gusta

Origin blog.csdn.net/m0_69824302/article/details/131504401
Recomendado
Clasificación