扫雷游戏C语言编程实现
程序实现扫雷游戏
一、游戏规则
在一个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语言编程实现相关推荐
- 扫雷游戏 C语言实现
扫雷游戏 C语言实现 实现了如下功能: 鼠标控制 左键点开 右键标记 中键自动翻开(效果同windows扫雷) 首次点击不会中雷 下面是几张效果图: 这是初始界面,3种难度级别,难度同经典版windo ...
- c语言程序设计 猜数字,猜数字游戏c语言编程,c语言编程 编一个猜数字游戏
c语言编程 编一个猜数字游戏 #include #include #include #include void main()/*主函数*/ { int a,b,times=0,i,j,guess=0, ...
- 简易扫雷游戏c语言程序,C++实现简单的扫雷游戏(控制台版)
C++新手的代码,请各位多包涵. 用C++写的一个简单的控制台版扫雷游戏.玩家通过输入方块的坐标来翻开方块. 只是一个雏形,能够让玩家执行翻开方块的操作并且判断输赢,还未添加标记方块.游戏菜单.记录游 ...
- java三子棋人机游戏_C语言编程入门游戏《三子棋》
经过C语言初级阶段的系统学习,对基本C语言的知识有了一定的了解和认识,能够通过C语言编程解决一些简单的问题.本次完成一个简单的游戏<三子棋>. 游戏简介:常见的3x3棋盘,有两名游戏玩家, ...
- c 语言掷骰子游戏,C 语言编程学习: 制作掷骰子小游戏
C 语言编程学习: 制作掷骰子小游戏 问题描述 骰子是一个有六个面的正方体, 每个面分别印有 16 之间的小圆点代表点数. 假设这个游戏的规则是: 两个人轮流掷骰子 6 次, 并将每次投掷的点数累加起 ...
- 拉马车 的游戏 c语言编程,蓝桥杯-拉马车(C语言)
标题:拉马车 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的随机 ...
- 拉马车 的游戏 c语言编程,蓝桥杯 拉马车(模拟)
标题:拉马车 小的时候,你玩过纸牌游戏吗? 有一种叫做"拉马车"的游戏,规则很简单,却很吸引小朋友. 其规则简述如下: 假设参加游戏的小朋友是A和B,游戏开始的时候,他们得到的随机 ...
- 猜数游戏c语言编程_做游戏,学编程(C语言) 10 僵尸危机
这个案例,分享14级同学大一时实现的打僵尸小游戏,电脑点击下图可以看到动图效果: 这个案例的代码不复杂,但是结合了游戏角色的动画效果.射击声音特效,实现后还是挺酷的.对应的游戏素材.分步骤代码,可从百 ...
- 猜数游戏c语言编程while,【游戏编程】猜数字游戏(C语言)
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 //此游戏规则为:系统随机生成一个整数,然后要你去猜它.系统会提示你是大了还是小了.游戏结束后会生成排行榜,有记录时间 #include #include ...
- 打豆豆游戏c语言编程,C语言程序打豆豆(函数版)分享!
[项目] 设计一个程序,能重复地在显示下面的信息: 根据用户输入的选项,输出一句提示性的话语(将来会对应实现某个功能).输入0,则退出. 要求将各功能定义专门的函数. 参考解答: #include # ...
最新文章
- 分享Kali Linux 2017.1镜像
- Android --- Retrofit 上传/下载文件扩展实现进度的监听
- [Leetcode]@python 68. Text Justification
- 如何避免偶然的锁存器和%0h
- 汇编 --- 从磁盘(扇区2到18)上读取数据到内存中
- mybatis-plus 查询,删除
- 训练日志 2019.7.23
- jquery操作表格
- 20130418代码
- 关于男生追女生的数学模型【转王博】
- win10系统中如何把自带的IE11降级回IE8?
- 使用POI创建PPT
- 第一章第4节-GIS平台
- iOS打包静态库的姿势
- 8个PNG素材网站,每一个都让你觉得人生发亮
- vml时序表_VML代码分析是怎么分析的
- [codeforces 760B]Frodo and pillows
- 杭州市一医院李勇挂号指南
- shiro注册登录流程(如何加密加盐)+配置多个Ream+密码加密验证底层分析+Remember使用+不同密码比对器原理(二)
- nrf52840烧录提示错误原因和解决办法