目录
4.可展示玩家棋盘(棋盘revealed),和布雷棋盘(棋盘board)
学完数组和函数就可以实现的小游戏,一起来看看吧!
一.扫雷游戏概述
1.游戏概述
扫雷游戏是一款大众类的益智小游戏,目标是在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩到地雷。
游戏有初级、中级、高级和自定义等模式,难度逐渐增加。玩家需要运用逻辑推理和判断来找出所有非雷方块,挑战自己的智慧和反应速度。
欢迎大家去尝试哦,玩两把游戏有助于更好的理解呢!!!
2.游戏规则
玩家在一个由方块组成的雷区中,需要尽快找出所有不是地雷的方块,但不能踩到地雷。每个方块在点击后,会显示出周围有多少个地雷,数字是几,就代表周围有几个地雷。
而可以确定是雷的可以按右键做标记
二.代码实现的过程
1.创建一个菜单界面函数,用于选择退出游戏或者是进入游戏
void menu()
{
printf("***********************\n");
printf("***********************\n");
printf("****** 1.play *******\n");
printf("****** 0.exit *******\n");
printf("***********************\n");
printf("***********************\n");
}
.......
.......
do{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)//switch语句,判断执行内容
{
case 1:
printf("\n请开始扫雷\n");
game();
break;
case 0:
printf("\n已退出游戏!\n");
break;
default:
printf("\n选择错误,请重新输入!\n");
break;
}
}while(input);
游戏开始!!
下图是主要函数
void game()
{
//打印棋盘
DisplayBoard(revealed);//打印9×9显示给用户看的棋盘
//布置雷
placeMines();
//布置好雷之后可以打印雷,查看是否布置成功
//DisplayBoard(board);
//开始排查雷
FindMine();
}
2.创建两个棋盘,并初始化
棋盘board为放雷的棋盘
棋盘revealed为展示给别人看的
#define N 9 //棋盘显示的长宽
#define NS N+2 //存储的棋盘的长宽
char board[NS][NS];//放雷的棋盘
char revealed[NS][NS];//显示给用户看的棋盘
//初始化棋盘
void initializeBoard(){
int i, j;
for (i = 0; i < NS; i++) {
for (j = 0; j < NS; j++) {
board[i][j] = '0';
revealed[i][j] = '.';
}
}
}
3.在棋盘board放雷
//安置雷 雷的数量为N
void PlaceMines() {
int count = 0;
while (count < N) {
int x = rand() % N+1;
int y = rand() % N+1;
if (board[x][y] == '0') {
board[x][y] = '*';
count++;
}
}
}
其中rand()可产生随机数,以保证每次游戏雷的位置不同
下图是产生随机数的函数
srand((unsigned int)time(NULL));//随机数
下图是该函数的头文件
#include <stdlib.h>
#include <time.h>
4.可展示玩家棋盘(棋盘revealed),和布雷棋盘(棋盘board)
//打印显示的棋盘
void DisplayBoard(char arr[][NS])
{
int i = 0; //控制行
for (i = 0; i <= N; i++)//打印列号
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= N; i++)
{
int j = 0;
printf("%d ",i);//打印行号
for (j = 1; j <= N; j++)//控制列
{
printf("%c ", arr[i][j]);//循环打印数组里的所有内容
}printf("\n");//每一行打印完之后换行
}
printf("\n");
}
效果如下图所示
5.排雷
①玩家输入坐标
printf("请输入要排查的坐标(例如:3 2):");
scanf("%d %d", &x, &y);//输入排查坐标
②检验坐标
if (x >= 1 && x <= N && y >= 1 && y <= N)//排查坐标需要在1-9之间
{
...
}
else
{
printf("输入坐标错误,请重新输入\n");
}
③正式排雷
if (board[x][y] == '*')//如果输入的坐标位置是‘*’,则被炸死
{
printf("啊哦,你被炸飞啦!!!!\n");
printf("\n");
DisplayBoard(board);//被炸死了将布置雷的棋盘打印出来
break;//跳出
}
else//输入位置不是雷,则显示当前位置的周围有几个雷
{
int num = countMines(x, y);//九宫格雷的数量函数
//将雷的数量放入show数组中, + ‘0’是将num由int类型转换为字符char类型
revealed[x][y] = num + '0';
DisplayBoard(revealed);//显示排查过后的用户棋盘
cnt++;
}
④展示完整代码
//排查雷
void FindMine()
{
int x, y;//排查的坐标
int cnt = 0;//可排查的次数
while(cnt <=N*N - N)
{
printf("请输入要排查的坐标(例如:3 2):");
scanf("%d %d", &x, &y);//输入排查坐标
if (x >= 1 && x <= N && y >= 1 && y <= N)//排查坐标需要在1-9之间
{
if (board[x][y] == '*')//如果输入的坐标位置是‘*’,则被炸死
{
printf("啊哦,你被炸飞啦!!!!\n");
printf("\n");
DisplayBoard(board);//被炸死了将布置雷的棋盘打印出来
break;//跳出
}
else//输入位置不是雷,则显示当前位置的周围有几个雷
{
int num = countMines(x, y);//九宫格雷的数量函数
//将雷的数量放入show数组中, + ‘0’是将num由int类型转换为字符char类型
revealed[x][y] = num + '0';
DisplayBoard(revealed);//显示排查过后的用户棋盘
cnt++;
}
}
else
{
printf("输入坐标错误,请重新输入\n");
}
}
}
三.完整的扫雷游戏的源码
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#define N 9 //棋盘显示的长宽
#define NS N+2 //存储的棋盘的长宽
char board[NS][NS];//放雷的棋盘
char revealed[NS][NS];//显示给用户看的棋盘
void menu()
{
printf("***********************\n");
printf("***********************\n");
printf("****** 1.play *******\n");
printf("****** 0.exit *******\n");
printf("***********************\n");
printf("***********************\n");
}
//初始化棋盘
void initializeBoard(){
int i, j;
for (i = 0; i < NS; i++) {
for (j = 0; j < NS; j++) {
board[i][j] = '0';
revealed[i][j] = '.';
}
}
}
//打印显示的棋盘
void DisplayBoard(char arr[][NS])
{
int i = 0; //控制行
for (i = 0; i <= N; i++)//打印列号
{
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= N; i++)
{
int j = 0;
printf("%d ",i);//打印行号
for (j = 1; j <= N; j++)//控制列
{
printf("%c ", arr[i][j]);//循环打印数组里的所有内容
}printf("\n");//每一行打印完之后换行
}
printf("\n");
}
//安置雷 雷的数量为N
void PlaceMines() {
int count = 0;
while (count < N) {
int x = rand() % N+1;
int y = rand() % N+1;
if (board[x][y] == '0') {
board[x][y] = '*';
count++;
}
}
}
//数安全区雷数
int countMines(int x, int y) {
int count = 0;
int i, j;
for (i = -1; i <= 1; i++) {
for (j = -1; j <= 1; j++) {
if (board[x + i][y + j] =='*') {
count++;
}
}
}
return count;
}
//排查雷
void FindMine()
{
int x, y;//排查的坐标
int cnt = 0;//可排查的次数
while(cnt < =N*N - N)
{
printf("请输入要排查的坐标(例如:3 2):");
scanf("%d %d", &x, &y);//输入排查坐标
if (x >= 1 && x <= N && y >= 1 && y <= N)//排查坐标需要在1-9之间
{
if (board[x][y] == '*')//如果输入的坐标位置是‘*’,则被炸死
{
printf("啊哦,你被炸飞啦!!!!\n");
printf("\n");
DisplayBoard(board);//被炸死了将布置雷的棋盘打印出来
break;//跳出
}
else//输入位置不是雷,则显示当前位置的周围有几个雷
{
int num = countMines(x, y);//九宫格雷的数量函数
//将雷的数量放入show数组中, + ‘0’是将num由int类型转换为字符char类型
revealed[x][y] = num + '0';
DisplayBoard(revealed);//显示排查过后的用户棋盘
cnt++;
}
}
else
{
printf("输入坐标错误,请重新输入\n");
}
}
}
void game()
{
//打印棋盘
DisplayBoard(revealed);//打印9×9显示给用户看的棋盘
//布置雷
PlaceMines();
//布置好雷之后可以打印雷,查看是否布置成功
//DisplayBoard(board);
//开始排查雷
FindMine();
}
int main() {
srand((unsigned int)time(NULL));//随机数
initializeBoard();
int x, y;
int input=0;
do{
menu();
printf("请输入你的选择:");
scanf("%d", &input);
switch (input)//switch语句,判断执行内容
{
case 1:
printf("\n请开始扫雷\n");
game();
break;
case 0:
printf("\n已退出游戏!\n");
break;
default:
printf("\n选择错误,请重新输入!\n");
break;
}
}while(input);
return 0;
}