C语言简易实现扫雷小游戏
本文为大家分享了C语言实现扫雷小游戏的具体代码,供大家参考,具体内容如下
经典扫雷游戏规则:
当玩家点击游戏区域,该处周围的八个位置有几个雷(如果是角落则是周边三个位置雷的个数,边缘位置同理),就展示数字几.如果该处是雷则直接结束游戏.
用C语言实现基本思路:
假设我们要实现一个9*9棋盘的扫雷,为了计算边缘或者角落雷的个数我们可以将雷区变成12*12的棋盘,将最外围的棋盘全部变为0,这样不论是哪个位置的雷,我们都可以计算其周边8个位置雷个数的和,
1、设置游戏菜单,让用户输入数据选择是否进行游戏.
2、首先创建两个二维数组,一个用来存放雷区信息,另一个则是给用户展示的棋盘.(此处可直接创建两个12*12的数组,最后只给用户展示9*9部分即可)
3、将两个棋盘分别初始化
4、开始在存放雷区信息的棋盘上随机产生雷.
5、.给用户展示棋盘.
6、让用户输入坐标,并进行判断,如果是雷,直接游戏结束,如果不是,则计算周边雷的个数,并将数据展示在棋盘上.
#define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <time.h> #include <stdlib.h> #include <windows.h> #define row 9 //宏定义数据方便不局限于玩9*9扫雷 #define col 9 #define rows row + 2 #define cols col+ 2 //创建游戏菜单. void menu() { printf("***********************************\n"); printf("*********** 1.开始游戏 ************\n"); printf("*********** 2.退出游戏 ************\n"); printf("***********************************\n"); } //初始化界面 void Init(char arr[][cols], int a, int b,char c) { for (int i = 0; i < a;i++) { for (int j = 0; j < b; j++) { arr[i][j] = c; } } } //打印棋盘(雷区展示) void print(char arr[rows][cols]) { for (int i = 0; i < rows; i++) { for (int j = 0; j < cols; j++) { printf("%c ", arr[i][j]); } printf("\n"); } } //设置雷区 void leiqu(char arr[rows][cols]) { srand((unsigned int)time(0)); int count = 10; while (count) { int x = rand() % 9 + 1; int y = rand() % 9 + 1; if (arr[x][y] == '0') { arr[x][y] = '1'; count--; } } } //打印棋盘(用户展示) void showboard(char arr[rows][cols]) { for (int a = 0; a <= row; a++) { printf("%d ", a); } printf("\n"); for (int i = 1; i <=row; i++) { printf("%d ", i); for (int j = 1; j <= col; j++) { printf("%c ", arr[i][j]); } printf("\n"); } } //计算输入坐标周围有多少个雷 int getlei(char arr[rows][cols], int x, int y) { return arr[x - 1][y - 1] + arr[x - 1][y] + arr[x - 1][y + 1] + arr[x][y - 1] + arr[x][y + 1] + arr[x + 1][y - 1] + arr[x + 1][y] + arr[x + 1][y + 1] - 8 * '0'; } void start(char arr[rows][cols],char lei[rows][cols]) { int x = 0; int y = 0; int step = 0; while (step <= (rows * cols - 1)) { printf("请输入坐标(x,y):"); scanf("%d,%d",&x,&y); //判断输入坐标是否合法. if (x <= row && x >= 1 && y <= row && y >= 1) { if (lei[x][y] == '1') { printf("你踩雷啦,游戏结束!\n"); print(lei);//展示雷区信息,便于玩家查询. break; } else { arr[x][y] = getlei(lei, x, y)+'0'; system("cls");//清屏操作 showboard(arr);//再次展现棋盘,更新棋盘信息 printf("(%d,%d)周边有%d个雷\n",x,y, getlei(lei, x, y));//获取周边雷的数量并反馈给玩家 step++; } } else { printf("输入坐标有误,请重新输入!!!\n"); } } } void game() { //创建两个二维数组,一个给用户展示,一个存放雷区信息. srand((unsigned int)time(0)); char user[rows][cols]; char lei[rows][cols]; //初始化两个棋盘 Init(user,rows, cols, '*');//初始化棋盘为全* Init(lei, rows, cols, '0');//初始化雷区棋盘全部为0 //设置雷 leiqu(lei); //print(lei); 调试时可以放开注释查看结果 //给用户展示棋盘 showboard(user); //用户输入坐标开始游戏 start(user,lei); } int main() { int input = 123; do { menu(); printf("请输入你的选择:"); scanf("%d", &input); switch (input) { case 1: game(); break; case 2: printf("退出游戏!"); input = 0; break; default: printf("输入数据有误,请重新输入!\n"); input = 555; //防止用户输入0,跳出循环. } break; } while (input); return 0; }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持编程宝库。
跟着B站老师 做的,链接[C/C++]180行代码,推箱子就是这么简单~抄详细,学不会我还不信了,关卡切换和回退都实现了哦_哔哩哔哩_bilibili编码环境:VS2019利用 链栈实现的回撤功能。Link ...