今天来用c语言做一个扫雷功能的简单实现,首先创建一个test.c来用于在写代码的途中测试扫雷代码,game.h来存放实现扫雷函数需要用到的头文件,game.c来存放最终的成品。
首先用函数打印一个菜单,让玩家选择进行游玩扫雷游戏或者退出,考虑到玩家会输入1和2以外的数字,我们加上一个fefault,将菜单放入do-while循环中,while的结束条件为choose为0,玩家在结束一场游戏后可以重新走一边循环,保证用户在结束一把扫雷之后可以选择继续进行下一局或是退出游戏。
void menu()
{
printf("**********\n");
printf("**1.play**\n");
printf("**0.quit**\n");
printf("**********\n");
}
void test()
{
int choose;
do
{
menu();
printf("请进行你的选择");
scanf("%d", &choose);
switch (choose)
{
case 1:
printf("游戏开始\n");
break;
case 2:
printf("游戏退出\n");
default:
printf("选择错误,请重新选择\n");
}
} while (choose);
}
在case1中加入game()函数来进行扫雷游戏的实现。扫雷有雷的布置和雷的扫,首先来实现雷的布置,用二维数组实现一个9x9的棋盘,通过建立两个棋盘来实现信息的交互,一个棋盘hid放雷的布置情况,还有一个棋盘show来将信息呈现给玩家。因为show棋盘需要将用户扫过区域周围八个格子雷的数量写出来,如果定义一个【9】【9】的数组就会发生越界,因此两个数组都定位为11x11,为了方便写,宏定义col=9 row=9 COL=col+2 ROW=row+2。初始化show数组全为*,hid数组全为0
void SetBoard(char board[ROW][COL], int r, int c, char set)
{
for (int i = 0; i < r; i++)
{
for (int j = 0; j < c; j++)
{
board[i][j] = set;
}
}
}
void ShowBoard(char board[ROW][COL],int r,int c)
{
for (int a = 0; a <= r; a++)
{
printf("%d ", a);
}
printf("\n");
for (int i = 1; i <= r; i++)
{
printf("%d ", i);
for (int j = 1; j <= c; j++)
{
printf("%c ", board[i][j]);
}
printf("\n");
}
}
接下来实现雷的随机插入,随机生成两个一到九的整数下x,y,添加一个count计数器,如果当前hid[x][y]为字符0 则hid[x][y]为字符0,count计数器加一
srand((unsigned int)time(NULL));
void SetBoob(char hid[ROW][COL],int rw,int c)
{
int count = 0;
for (int i = 0; count <= 9; i++)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (hid[x][y] == '0')
{
hid[x][y] = '1';
count = count + 1;
}
}
}
这样雷就布置好了,接下来是玩家排雷的过程。
用while(1)做一个一直重复的循环,玩家输入行和列x,y,程序将hid[x][y]与字符‘1’对比,若踩雷则跳出循环显示游戏结束并打印hid棋盘让玩家看到雷的位置,若没踩雷show[x][y]变成周围八个格子的地雷个数并打印show棋盘。因为玩家可能输入1~9之外的数,因此要用if函数限制x,y的大小。
统计hid【x】【y】周围的雷的个数可以通过将周围的字符全部相加再减去八个字符0来实现
void CountBoob(char hid[ROW][COL], int x, int y)
{
int count;
count = hid[x - 1][y - 1] + hid[x][y - 1] + hid[x + 1][y - 1] + hid[x - 1][y] + hid[x + 1][y] + hid[x - 1][y + 1] + hid[x][y + 1] + hid[x + 1][y + 1] - 8 * '0';
return count;
}
void FindBoob(char hid[ROW][COL], char show[ROW][COL], int r, int c)
{
int x, y;
while (1)
{
printf("请输入行和列");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)
{
if (hid[x][y] == '1')
{
printf("游戏结束\n");
ShowBoard(hid, row, col);
break;
}
else
{
int n = CountBoob(hid, x, y);
show[x][y] = n+'0';
ShowBoard(show, row, col);
}
}
else
{
printf("输入错误坐标请重新输入");
}
}
}
后期我在扫雷过程中加入了一个计数器count,每扫一个无雷区域则count加一当count等于71时打印游戏胜利并展示hid棋盘跳出循环。
将所有的函数放入头文件,.c程序如下
#define _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include "game.h"
int main()
{
int choose;
srand((unsigned int)time(NULL));
do
{
menu();
printf("请进行你的选择");
scanf("%d", &choose);
switch (choose)
{
case 1:
printf("游戏开始\n");
game();
break;
case 0:
printf("游戏退出\n");
break;
default:
printf("选择错误,请重新选择\n");
}
} while (choose);
}
扫雷是如若周围没有雷,可以实现棋盘的展开,这个因为时间问题只能进行后期补充