C语言实现扫雷游戏,代码包括头文件声明定义,头文件实现,能够实现随机生成20个位置作为地雷位置,用户输入[1~10]区间,显示该位置周围雷的数量,当用户输入位置已有地雷或者当只剩20个位置时判定程序结束。
代码思路,创建两个二维数组,一个作为雷区,一个作为显示区,雷区只在程序结束时显示。每次用户操作后刷新显示区的数组成员。创建雷区二维数组12*12,显示区二维数组10*10,用‘0’代表安全区,‘1’代表雷区。
雷区的数组长度设定比显示区的数组长度多2,方便边框区域计算周围地雷数量。
头文件声明
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <windows.h>
#define ROW 12 //10 + 2
#define COL 12
#define TOTAL 10*10
#define MINE_NUM 20
#pragma warning(disable:4996)
void SetMine(char mine[][COL], int row, int col);
void ShowBoard(char board[][COL], int row, int col);
char GetMines(char mine[][COL], int row, int col);
void Game();
void expand(char mine[][COL], int row, int col, char show);
#endif
头文件实现
#include "mine.h"
int GetRandIndex(int start, int end)//1-10
{
return rand() % (end - start + 1) + start;
}
void SetMine(char mine[][COL], int row, int col)
{
srand((unsigned long)time(NULL));
int count = 0;
while (count < MINE_NUM){
int x = GetRandIndex(1, 10);
int y = GetRandIndex(1, 10);
if (mine[x][y] == '0'){
mine[x][y] = '1';
count++;
}
}
}
void ShowBoard(char board[][COL], int row, int col)
{
printf(" ");
int i = 1;
for (; i <= 10; i++){
printf(" %d ", i);
}
printf("\n----");
for (i = 1; i <= 10; i++){
printf("---");
}
printf("\n");
for (i = 1; i <= 10; i++){
printf("%3d|", i);
int j = 1;
for (; j <= 10; j++){
printf("%2c|", board[i][j]);
}
printf("\n");
int k = 1;
for (k = 1; k <= 11; k++){
printf("---");
}
printf("\n");
}
}
//'0'-'8'
char GetMines(char mine[][COL], int row, int col)//char->'0'-'8'
{
return mine[row - 1][col - 1] + mine[row - 1][col] + \
mine[row - 1][col + 1] + mine[row][col - 1] + mine[row][col + 1] + \
mine[row + 1][col - 1] + mine[row + 1][col] + \
mine[row + 1][col + 1] - 7 * '0';
}
void Game()
{
char mine[ROW][COL]; //set/judge mine
char board[ROW][COL]; //show
memset(mine, '0', sizeof(mine));
memset(board, '*', sizeof(board));
SetMine(mine, ROW, COL);
int count = TOTAL;
int x = 0;
int y = 0;
while (1){
ShowBoard(board, ROW, COL);
printf("请选择坐标: ");
scanf("%d %d", &x, &y);
if (x >= 1 && x <= ROW - 2 && y >= 1 && y <= COL - 2){
if (mine[x][y] == '0'){
char num = GetMines(mine, x, y);
//board[x][y] = num;
expand(board,mine, x, y, num);
count--;
if (count <= 20){
printf("你赢了,游戏结束\n");
break;
}
}
else{
printf("不好意思,你被炸死了!\n");
ShowBoard(mine, ROW, COL);
break;
}
}
else{
printf("你输入的坐标有误,请重新输入!\n");
}
}
}
void expand(char board[][COL],char mine[][COL], int row, int col,char show){
if (show == '0'){
board[row][col] = show;
expand(board, mine, row - 1, col - 1, GetMines(mine, row - 1, col - 1));
expand(board, mine, row - 1, col, GetMines(mine, row - 1, col));
expand(board, mine, row - 1, col + 1, GetMines(mine, row - 1, col + 1));
expand(board, mine, row, col - 1, GetMines(mine, row, col - 1));
expand(board, mine, row, col + 1, GetMines(mine, row, col + 1));
expand(board, mine, row + 1, col - 1, GetMines(mine, row + 1, col - 1));
expand(board, mine, row + 1, col, GetMines(mine, row + 1, col));
expand(board, mine, row + 1, col + 1, GetMines(mine, row + 1, col + 1));
}
else{
board[row][col] = show;
}
}
主函数
#include "mine.h"
void Menu()
{
printf("###################################\n");
printf("## 1. Play 2. Exit ##\n");
printf("###################################\n");
printf("Please Select: ");
}
int main()
{
int quit = 0;
int select = 0;
while (!quit){
Menu();
scanf("%d", &select);
switch (select)
{
case 1:
Game();
break;
case 2:
printf("拜拜!\n");
quit = 1;
break;
default:
printf("选择错误,请重新选择!\n");
break;
}
}
system("pause");
return 0;
}
这里用递归调用函数的方式来实现周围无地雷时向外展开
void expand(char board[][COL],char mine[][COL], int row, int col,char show){
if (show == '0'){
board[row][col] = show;
expand(board, mine, row - 1, col - 1, GetMines(mine, row - 1, col - 1));
expand(board, mine, row - 1, col, GetMines(mine, row - 1, col));
expand(board, mine, row - 1, col + 1, GetMines(mine, row - 1, col + 1));
expand(board, mine, row, col - 1, GetMines(mine, row, col - 1));
expand(board, mine, row, col + 1, GetMines(mine, row, col + 1));
expand(board, mine, row + 1, col - 1, GetMines(mine, row + 1, col - 1));
expand(board, mine, row + 1, col, GetMines(mine, row + 1, col));
expand(board, mine, row + 1, col + 1, GetMines(mine, row + 1, col + 1));
}
else{
board[row][col] = show;
}
}
该博客介绍了用C语言实现扫雷游戏的方法。通过创建两个二维数组,一个作为雷区,一个作为显示区,随机生成20个地雷位置。用户输入[1~10]区间位置,程序显示该位置周围雷数。当输入位置有雷或只剩20个位置时程序结束,还采用递归调用展开无雷区域。
328

被折叠的 条评论
为什么被折叠?



