欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

用C语言实现简单的扫雷游戏

程序员文章站 2022-04-07 13:56:55
...

思路


>
1.通过观察游戏,我们可以想到需要用两个二维数组来实现扫雷的功能。
2.游戏刚开始,需要需要显示棋盘,用“*”遮盖雷的坐标,所以要有一个填充棋盘的函数。
3.通过rand()函数,随机生成雷的坐标,埋雷的函数。
4.每次扫过后,都要显示新的棋盘,显示棋盘的函数,同时显示该坐标周围雷的个数,并在该坐标上显示出来。

5.如果棋盘太大,我们一个一个的点过于麻烦,我们应该思考在坐标周围没雷的时候可以实现扩展。
6.判断是否踩雷,是否扫雷成功。

代码实现


game.h

    #define _CRT_SECURE_NO_WARNINGS 1  
    #ifndef GAME_H__
    #define GAME_H__
    #include <stdio.h>  
    #include <stdlib.h>  
    #include <time.h>  
    #include <string.h>

    #define ROW 11  
    #define COL 11  
    #define COUNT 10 

    void display(char show[ROW][COL]);  
    void init_game(char mine[ROW][COL],char show[ROW][COL],int row ,int col);//初始化雷阵 
    void set_mine(char mine[ROW][COL]);//设置雷的位置  
    void sweep(char mine[ROW][COL], char show[ROW][COL]);//开始扫雷  
    int get_num(char mine[ROW][COL], int x, int y);//计算雷的个数
    void expand(char mine[ROW][COL],char show[ROW][COL], int x, int y);//没有雷的地方扩展开
    #endif

game.c

include “game.h”

    void init_game(char mine[ROW][COL],char show[ROW][COL],int row,int col)//初始化雷阵
    {
        memset(mine,'0',row * col * sizeof(char));
        memset(show,'*',row * col * sizeof(char));
    }
    void display(char show[ROW][COL])  //打印界面
    {
        int i = 0;
        int j = 0;
        printf("    ");
        for(i=1; i<(COL-1); i++)
        {
            printf("%d   ",i);
        }
        printf("\n");
        printf("\n");
        for(i=1; i<(ROW-1); i++)
        {
            printf("%d   ",i);
            for(j=1; j<(COL-1);j++)
            {
                printf("%c   ",show[i][j]);
            }
            printf("\n");
            printf("\n");
        }
        printf("\n");
    }
    void set_mine(char mine[ROW][COL])  //设置雷的位置
    {  
        int count = COUNT;  
        int x = 0;  
        int y = 0;  
        srand((unsigned)time(NULL));  
        while (count)  
        {  
            x = rand() % 9 + 1;  
            y = rand() % 9 + 1;  
            if (mine[x][y] == '0')  
            {  
                mine[x][y] = '#';  
                count--;  
            }  
        }  
    } 
    void sweep(char mine[ROW][COL], char show[ROW][COL])//开始扫雷  
    {
        int count = 0;
        int x = 0;
        int y = 0;
        while(count < ((ROW-2)*(COL-2)-COUNT))
        {
            printf("开始扫雷,请输入坐标:\n");
            scanf("%d%d",&x,&y);
            if(((x>=1)&&(x<=ROW-2))&&((y>=1)&&(y<=COL-2)))
            {
                if('#'==mine[x][y])
                {
                    printf("很遗憾,你被炸死了!!!\n");
                    display(mine);
                    return;
                }
                else
                {
                    int ret = get_num(mine, x, y);
                    show[x][y] = ret + '0';
                    expand(mine,show,x,y);
                    display(show);
                }
            }
            else
            {
                printf("\n");
                printf("不合法的坐标\n");
            }
        }
        printf("恭喜你扫雷成功!\n");
        display(mine);
    }
    void expand(char mine[ROW][COL],char show[ROW][COL],int x,int y)
    {    
        if((x>=1)&&(y>=1)&&(x<=ROW-2)&&(y<=COL-2))
        {    
            if(get_num(mine,x,y) == 0)
            {    
                show[x][y] = ' ';     
              if(show[x-1][y-1] == '*')
              {    
                  expand(mine,show,x-1,y-1);    
              }    
              if(show[x-1][y] == '*')
              {    
                  expand(mine,show,x-1,y);    
              }    
              if(show[x-1][y+1] == '*')
              {    
                  expand(mine,show,x-1,y+1);    
              }    
              if(show[x][y+1] == '*')
              {    
                  expand(mine,show,x,y+1);    
              }    
              if(show[x+1][y+1] == '*')
              {    
                  expand(mine,show,x+1,y+1);    
              }    
              if(show[x+1][y] == '*')
              {    
                  expand(mine,show,x+1,y);    
              }    
              if(show[x+1][y-1] == '*')
              {    
                  expand(mine,show,x+1,y-1);    
              }    
              if(show[x][y-1] == '*') 
              {    
                  expand(mine,show,x,y-1);    
              }    
            }    
        }    
    }    
    int get_num(char mine[ROW][COL], int x, int y)//计算附近雷的个数 
    {
        int count = 0;
        if('#'==mine[x-1][y-1])
        {
            count++;
        }
        if('#'==mine[x-1][y])
        {
            count++;
        }
        if('#'==mine[x-1][y+1])
        {
            count++;
        }
        if('#'==mine[x][y-1])
        {
            count++;
        }
        if('#'==mine[x][y+1])
        {
            count++;
        }
        if('#'==mine[x+1][y-1])
        {
            count++;
        }
        if('#'==mine[x+1][y])
        {
            count++;
        }
        if('#'==mine[x+1][y+1])
        {
            count++;
        }
        return count;
    }   

test.c

    #include "game.h"

    void menu()
    {
        printf("******************************************\n");
        printf("******************************************\n");
        printf("*********** welcome to saolei! ***********\n");
        printf("**************    1.play  ****************\n");
        printf("**************    0.exit  ****************\n");
        printf("******************************************\n");
        printf("******************************************\n");
    }
    void game()
    {
        char mine[ROW][COL];
        char show[ROW][COL];
        init_game(mine, show, ROW, COL);
        set_mine(mine);
        display(show);
        sweep(mine, show);
    }
    int main()
    {
        int input = 0;
        do
        {
            menu();
            printf("请选择:\n");
            scanf("%d",&input);
            switch(input)
            {
            case 1:
                game();
                break;
            case 0:
                printf("退出游戏\n");
                break;
            default:
                printf("输入错误,请重新输入\n");
                break;
            }
        }while(input);
        return 0;
    }

用C语言实现简单的扫雷游戏

用C语言实现简单的扫雷游戏
用C语言实现简单的扫雷游戏