程序实现扫雷游戏


一、游戏规则

在一个9*9(初级)大小的方块矩阵中随机布置一定量的地雷(初级为10个)。由玩家逐个翻开方块,以找出所有地雷为最终游戏目标。如果玩家翻开的方块有地雷,则游戏结束。

游戏主区域由很多个方格组成。在程序中通过二维数组坐标选择一个方格,方格即被打开并显示出方格中的数字;方格中数字则表示其周围的8个方格隐藏了几颗雷。

拓展:如果方块上出现数字,则该数字表示其周围3×3区域中的地雷数,一般为8个格子,对于边块为5个格子,对于角块为3个格子。所以扫雷中最大的数字为8;如果方块上为空(相当于0),则可以递归地打开与空相邻的方块;如果不幸触雷,则游戏结束。

二、思路规划

1.文件模块:

test.c

扫雷游戏的测试逻辑

game.h

游戏函数的声明

game.c

游戏函数的实现

2.编程设计:

1.扫雷数组的设置

1.设置两个数组的分工

一个数组(mine)用来存放布置好的雷的信息

一个数组(show)用来存放排查出类雷的信息(用于和玩家交互)

2.两个数组的初始化

mine数组初始化为'0',布置雷的时候,改成'1'

show数组初始化为‘*’,排除雷后,具体位置改成数字字符

2.功能函数设置

1.建立9*9(初级)大小的数组

2.方块上出现数字,则该数字表示其周围3×3区域中的地雷数,一般为8个格子,对于边块为5个格子,对于角块为3个格子,为解决计算边块和角块地雷数时出现越界的问题,即边界以外没有雷,无法参与到计算中,就设置11*11大小的数组。

3.game函数

4.初始化和打印

5.布置雷

1.这里用到的随机数产生:rand()%row+1和rand()%col+1

rand() % m + 1的范围是[1,m-1]

在这里相当于产生的随机数换算过来得到的值在1到9之间。

2.随机数可能生成一样的,所以要进行一次非法性判断,当棋盘这个位置没有雷的情况下才能往里面放雷。

6.统计周围雷的个数

数组中存放的是字符’0’,周围是8个数字,所以-8*'0’才能返回雷数的int值。

7.排雷

三、算法加工

本算法一次只排查一个坐标,真正的扫雷游戏,一次可以排查一片

基于递归的方法去看周围的8个坐标

1.该坐标不是雷

2.该坐标没有被排查过

3.该坐标周围没有雷

四、源代码

game.h

#include <stdio.h>
#include <stdlib.h>
#include <time.h>#define ROW 9
#define COL 9#define ROWS ROW+2
#define COLS COL+2#define EASY_COUNT 10//初始化棋盘
void init_board(char board[ROWS][COLS], int rows, int cols, char set);//打印棋盘
void display_board(char board[ROWS][COLS], int row, int col);//布置雷
void set_mine(char mine[ROWS][COLS], int row, int col);//排查雷
void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);

game.c


#include "game.h"void init_board(char board[ROWS][COLS], int rows, int cols, char set)
{int i = 0;int j = 0;for (i = 0; i < rows; i++){for (j = 0; j < cols; j++){board[i][j] = set;}}
}void display_board(char board[ROWS][COLS], int row, int col)
{int i = 0;int j = 0;//列号for (j = 0; j <= col; j++){printf("%d ", j);}printf("\n");for (i = 1; i <= row; i++){printf("%d ", i);for (j = 1; j <= col; j++){printf("%c ", board[i][j]);}printf("\n");}
}void set_mine(char mine[ROWS][COLS], int row, int col)
{//布置10个雷int count = EASY_COUNT;while (count){int x = rand() % row + 1;int y = rand() % col + 1;if (mine[x][y] == '0'){mine[x][y] = '1';count--;}}
}int get_mine_count(char mine[ROWS][COLS], int x, int y)
{return (mine[x - 1][y] +mine[x - 1][y - 1] +mine[x][y - 1] +mine[x + 1][y - 1] +mine[x + 1][y] +mine[x + 1][y + 1] +mine[x][y + 1] +mine[x - 1][y + 1] - 8 * '0');
}void find_mine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{int x = 0;int y = 0;int win = 0;while (win < row * col - EASY_COUNT){printf("请输入要排查雷的坐标:>");scanf_s("%d %d", &x, &y);if (x >= 1 && x <= row && y >= 1 && y <= col){//坐标被排查过if (show[x][y] == '*'){if (mine[x][y] == '1'){printf("很遗憾,你被炸死了\n");display_board(mine, ROW, COL);break;}else{int count = get_mine_count(mine, x, y);show[x][y] = count + '0';display_board(show, ROW, COL);win++;}}else{printf("该坐标已经被排查过了\n");}}else{printf("坐标非法,请重新输入\n");}}if (win == row * col - EASY_COUNT){printf("恭喜你,排雷成功\n");display_board(mine, ROW, COL);}
}

test.c

#define _CRT_SECURE_NO_WARNINGS 1#include "game.h"void menu()
{printf("*********1. play*********\n");printf("*********0. exit********* \n");
}void game()
{//设计2个数组存放信息char mine[ROWS][COLS] = { 0 };char show[ROWS][COLS] = { 0 };//初始化棋盘//mine初始化为全‘0’//show初始化为全‘*’init_board(mine, ROWS, COLS, '0');init_board(show, ROWS, COLS, '*');//打印棋盘//display_board(mine, ROW, COL);//display_board(show, ROW, COL);//布置雷set_mine(mine, ROW, COL);//排雷//display_board(mine, ROW, COL);display_board(show, ROW, COL);find_mine(mine, show, ROW, COL);
}int main()
{int input = 0;srand((unsigned int)time(NULL));do{menu();printf("请选择:>");scanf_s("%d", &input);switch (input){case 1:game();break;case 0:printf("退出游戏\n");break;default:printf("选择错误,重新选择\n");break;}} while (input);return 0;
}

五、运行结果

   

扫雷游戏C语言编程实现相关推荐

  1. 扫雷游戏 C语言实现

    扫雷游戏 C语言实现 实现了如下功能: 鼠标控制 左键点开 右键标记 中键自动翻开(效果同windows扫雷) 首次点击不会中雷 下面是几张效果图: 这是初始界面,3种难度级别,难度同经典版windo ...

  2. c语言程序设计 猜数字,猜数字游戏c语言编程,c语言编程 编一个猜数字游戏

    c语言编程 编一个猜数字游戏 #include #include #include #include void main()/*主函数*/ { int a,b,times=0,i,j,guess=0, ...

  3. 简易扫雷游戏c语言程序,C++实现简单的扫雷游戏(控制台版)

    C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游 ...

  4. java三子棋人机游戏_C语言编程入门游戏《三子棋》

    经过C语言初级阶段的系统学习,对基本C语言的知识有了一定的了解和认识,能够通过C语言编程解决一些简单的问题.本次完成一个简单的游戏<三子棋>. 游戏简介:常见的3x3棋盘,有两名游戏玩家, ...

  5. c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏

    C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...

  6. 拉马车 的游戏 c语言编程,蓝桥杯-拉马车(C语言)

    标题:拉马车 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的随机 ...

  7. 拉马车 的游戏 c语言编程,蓝桥杯 拉马车(模拟)

    标题:拉马车 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的随机 ...

  8. 猜数游戏c语言编程_做游戏,学编程(C语言) 10 僵尸危机

    这个案例,分享14级同学大一时实现的打僵尸小游戏,电脑点击下图可以看到动图效果: 这个案例的代码不复杂,但是结合了游戏角色的动画效果.射击声音特效,实现后还是挺酷的.对应的游戏素材.分步骤代码,可从百 ...

  9. 猜数游戏c语言编程while,【游戏编程】猜数字游戏(C语言)

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //此游戏规则为:系统随机生成一个整数,然后要你去猜它.系统会提示你是大了还是小了.游戏结束后会生成排行榜,有记录时间 #include #include ...

  10. 打豆豆游戏c语言编程,C语言程序打豆豆(函数版)分享!

    [项目] 设计一个程序,能重复地在显示下面的信息: 根据用户输入的选项,输出一句提示性的话语(将来会对应实现某个功能).输入0,则退出. 要求将各功能定义专门的函数. 参考解答: #include # ...

最新文章

  1. 分享Kali Linux 2017.1镜像
  2. Android --- Retrofit 上传/下载文件扩展实现进度的监听
  3. [Leetcode]@python 68. Text Justification
  4. 如何避免偶然的锁存器和%0h
  5. 汇编 --- 从磁盘(扇区2到18)上读取数据到内存中
  6. mybatis-plus 查询,删除
  7. 训练日志 2019.7.23
  8. jquery操作表格
  9. 20130418代码
  10. 关于男生追女生的数学模型【转王博】
  11. win10系统中如何把自带的IE11降级回IE8?
  12. 使用POI创建PPT
  13. 第一章第4节-GIS平台
  14. iOS打包静态库的姿势
  15. 8个PNG素材网站,每一个都让你觉得人生发亮
  16. vml时序表_VML代码分析是怎么分析的
  17. [codeforces 760B]Frodo and pillows
  18. 杭州市一医院李勇挂号指南
  19. shiro注册登录流程(如何加密加盐)+配置多个Ream+密码加密验证底层分析+Remember使用+不同密码比对器原理(二)
  20. nrf52840烧录提示错误原因和解决办法

热门文章

  1. Java中的偏向锁,轻量级锁, 重量级锁解析
  2. 程序员培训班出来之后,有可能向更高的层次爬升么?
  3. Android 根据逗号分隔String
  4. 软件工程作业——《人件》读书笔记
  5. 六面体单元的体积计算方法
  6. ABAQUS软件实训(四):Mesh模块之六面体网格划分技巧
  7. java实现正六面体染色
  8. python入门教学反思_python函数--教学反思
  9. JAVA判断直线与线段相交,判断两个线段是否相交
  10. 虚拟机安装专用游戏多开win7系统教程简单易懂