• C语言实现扫雷小游戏


    游戏规则

    在9x9的雷盘上进行扫雷,若是雷,被炸死,游戏结束;若不是雷,继续进行排雷,直到把所有的雷都排除,获得胜利。

    基本流程

    • 首先在菜单界面选择1 或 0,即,开始或退出游戏
    • 若选择开始游戏,创建并初始化两个二维数组(一个用于存放布置雷点的情况,一个用于显示游戏进程)
    • 玩家输入雷盘上的相应坐标进行排雷,若该坐标点是雷点,则游戏结束;若该坐标点不是雷点,则该点会显示出来其周围有几个雷点,便于玩家继续扫雷,然后玩家继续输入坐标,进行排雷,直到所有的雷点都被找出,玩家获胜。

    代码实现

    1)菜单显示

    void menu(){
    	printf("#######扫雷#######\n");
    	printf("######1.play######\n");
    	printf("######0.exit######\n");
    	printf("##################\n");
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    2)初始化雷盘

    • 把布雷的盘,初始时各坐标值都设为0;
    • 把用户进行扫雷的盘,初始时各坐标用‘*’号显示。
    void InitBoard(char board[ROWS][COLS], int row, int col, char set){
    	for (int i = 0; i < row; i++){
    		for (int j = 0; j < col; j++){
    			board[i][j] = set;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    3)显示两个雷盘

    • 初始化后,两个雷盘的效果如下:
      在这里插入图片描述

    4)设置雷点

    • 在mine雷盘上,采用随机生成坐标点的方式,进行设置雷点,假设设置10个雷点。
    #define MINENUM 10
    void SetMine(char board[ROWS][COLS], int row, int col){
    	int x = 0;
    	int y = 0;
    	int num = MINENUM;
    	while (num){
    		x = rand() % row + 1;
    		y = rand() % col + 1;
    		if (board[x][y] == '0'){
    			board[x][y] = '1';
    			num--;
    		}
    	}
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14

    5)记录周围雷点个数

    • 某一点坐标周围雷点的个数,为其周围8个坐标点的雷点个数之和
      注意:字符型减去’0’为该字符所表示的int型数值
    int mine_nums(char board[ROWS][COLS], int x, int y){
    	return board[x - 1][y - 1] + board[x - 1][y] + board[x - 1][y + 1]
    		+ board[x][y - 1] + board[x][y + 1]
    		+ board[x + 1][y - 1] + board[x + 1][y] + board[x + 1][y + 1]
    		- 8 * '0';
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    6)玩家扫雷

    • 玩家输入雷盘上的相应坐标进行排雷,若该坐标点是雷点,则游戏结束,并显示相关雷点分布的雷盘;
    • 若该坐标点不是雷点,则该点会显示出来其周围有几个雷点,便于玩家继续扫雷,然后玩家继续输入坐标,进行排雷,直到所有的雷点都被找出,玩家获胜。
    void FindMine(char board1[ROWS][COLS], char board2[ROWS][COLS], int row, int col){
    	int x = 0;
    	int y = 0;
    	int win = 0; //记录排查成功的坐标个数
    	while (win < row*col-MINENUM){
    		printf("请输入坐标-> ");
    		scanf("%d %d", &x, &y);
    		if (x >= 1 && x <= row && y >= 1 && y <= col){
    			if (board1[x][y] == '1'){
    				printf("排雷失败,你被炸死了!\n");
    				ShowBoard(board1, ROWS, COLS);
    				break;
    			}
    			else{
    				int num = mine_nums(board1, x, y);
    				board2[x][y] = num + '0';
    				win++;
    				ShowBoard(board2, ROWS, COLS);
    			}
    		}
    		else{
    			printf("输入坐标不合法,请重新输入...\n");
    		}
    	}
    	if (win == row*col - MINENUM){
    		printf("扫雷成功!!!\n");
    	}
    }
    
    • 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

    游戏效果显示

    假设在该9x9的雷盘上有80个雷点,然后我们使用该例子进行测试,结果如下:
    在这里插入图片描述

  • 相关阅读:
    如何打印 springboot 框架中 接收请求的日志
    校园网络工程规划与设计
    什么是系统集成项目管理工程师,证书难考吗?
    双软认证需要材料,怎么办理
    LeetCode 2342. 数位和相等数对的最大和:哈希表
    多维表格平台盘点 Notion、FlowUs、Airtable、SeaTable、Vika
    哪种网站适合物理服务器
    U-net详解
    50个常用的Java代码示例
    SpringBoot实现支付宝沙箱
  • 原文地址:https://blog.csdn.net/Darling_sheeps/article/details/126074864