C语言实现扫雷游戏

时间:2023-01-20 21:00:06

前言

如何利用代码实现一个扫雷游戏呢?在我们玩过的扫雷游戏里,打开游戏后看到的是一个nxn的棋盘,我们需要点击棋盘的某一位置,在最短的时间内根据点击格子出现的数字找出所有非雷格子,同时避免踩雷,踩到一个雷即全盘皆输。

在实际创建扫雷游戏时,我们需要构造两个棋盘,一个棋盘是隐形的,它储存的是雷的信息,另一个棋盘是面向玩家的,它显示的是最新的棋盘信息

我们点击棋盘的某一位置时,该位置会显示以它为中心的九宫格的类的数目,考虑到边缘的格子没有九宫格,我们在设置好的棋盘应在加上2行2列,但这2行2列是隐形的

一、游戏界面实现

1.游戏选择界面


void meau()

{

printf(" 扫雷游戏 \n");

printf(" 1.开始游戏 \n");

printf(" 0.退出游戏 \n");

}

2.游戏控制开关

int main()

{

srand((unsigned int)time(NULL));

int input = 0;

do{

meau();

printf("请选择\n");

scanf("%d", &input);

switch (input)

{

case 1:game();

break;

case 0:printf("游戏结束\n");

break;

default:printf("输入错误,请重新选择\n");

break;


}

} while (input);


return 0;

}

二、游戏功能实现

1.初始化棋盘

void Initboard(char board[ROWS][COLS], int rows, int cols, char set)
//扫雷游戏存在两个棋盘,因此加入参数ret对不同棋盘进行不同初始化
{

int i = 0;

int j = 0;

for (i = 0; i < rows; i++)

{

for (j = 0; j < cols; j++)

{

board[i][j] = set;

}

}

}

2.显示棋盘内容

void Display(char board[ROWS][COLS], int row, int col)

{

int i = 0;

int j = 0;

for (i = 0; i <= row; i++)

{

printf(" %d", i);

}

printf("\n");

for (i = 1; i <= row; i++)

{

printf(" %d", i);

for (j = 1; j <= col; j++)

{

printf(" %c", board[i][j]);

}

printf("\n");


}

}

3.在隐形的棋盘里布置雷

void Setthunder(char mineboard[ROWS][COLS], int row, int col)

{

int x = 0;

int y = 0;

int count = COUNTOFTHUNDER;//宏定义雷的个数赋值给count
while (count)//雷全部布置完成跳出循环

{

x = rand() % ROW + 1;

y = rand() % COL + 1;

if (mineboard[x][y] == '0')

{

mineboard[x][y] = '1';

count--;

}

}

}

4.在棋盘寻找雷

void Findthunder(char mineboard[ROWS][COLS], char thunderboard[ROWS][COLS], int row, int col)
//mineboard棋盘为隐藏棋盘,thunderboard为玩家看见的棋盘
{

int x = 0;

int y = 0;

int win = 0; //已被排查出来的不是雷的位置数目

int count = 0;

while (win <ROW*COL - COUNTOFTHUNDER)
//除雷外其余位置全被排除完后跳出循环
{

printf("请输入排雷坐标\n");

scanf("%d %d", &x, &y);

if (x >= 1 && x <= ROW && y >= 1 && y <= COL)
//使得雷的坐标合法化
{

if (mineboard[x][y] == '1')

{

printf("gameover\n");

break;

}

else

{



count=Showthunder(mineboard, x, y);

thunderboard[x][y] = count + '0';

printf("%d\n", count);

Display(thunderboard, ROW, COL);

win++;

}

}

else

{

printf("范围非法,请重新输入\n");

}


}

if (win == ROW*COL - COUNTOFTHUNDER)

{

printf("you win!\n");

}

}

5.显示雷的信息

int  Showthunder(char mineboard[ROWS][COLS], int x, int y)
//棋盘内容为字符,函数返回类型为int
//'3'-'0'=3
//mineboard为隐藏棋盘,如果是雷,该位置的隐藏信息为1
{

return mineboard[x - 1][y] +

mineboard[x - 1][y - 1] +

mineboard[x - 1][y + 1] +

mineboard[x][y - 1] +

mineboard[x][y + 1] +

mineboard[x + 1][y - 1] +

mineboard[x + 1][y] +

mineboard[x + 1][y + 1] - 8 * '0';


}

三、代码实现

1.game.h

​#define  _CRT_SECURE_NO_WARNINGS  
#include<stdio.h>

#include<stdlib.h>

#include<time.h>

#define COUNTOFTHUNDER 10

#define ROW 9

#define COL 9

#define ROWS ROW+2

#define COLS COL+2

void Initboard(char board[ROWS][COLS], int rows, int cols, char set);

void Display(char board[ROWS][COLS], int row, int col);

void Setthunder(char mineboard[ROWS][COLS], int row, int col);

void Findthunder(char mineboard[ROWS][COLS], char thunderboard[ROWS][COLS], int row, int col);

int Showthunder(char Showthunder[ROWS][COLS], int row, int col);

2.game.c

#include"game.h"

void Initboard(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(char board[ROWS][COLS], int row, int col)

{

int i = 0;

int j = 0;

for (i = 0; i <= row; i++)

{

printf(" %d", i);

}

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 Setthunder(char mineboard[ROWS][COLS], int row, int col)

{

int x = 0;

int y = 0;

int count = COUNTOFTHUNDER;

while (count)

{

x = rand() % ROW + 1;

y = rand() % COL + 1;

if (mineboard[x][y] == '0')

{

mineboard[x][y] = '1';

count--;

}

}

}

void Findthunder(char mineboard[ROWS][COLS], char thunderboard[ROWS][COLS], int row, int col)

{

int x = 0;

int y = 0;

int win = 0;

int count = 0;

while (win <ROW*COL - COUNTOFTHUNDER)

{

printf("请输入排雷坐标\n");

scanf("%d %d", &x, &y);

if (x >= 1 && x <= ROW && y >= 1 && y <= COL)

{

if (mineboard[x][y] == '1')

{

printf("gameover\n");

break;

}

else

{



count=Showthunder(mineboard, x, y);

thunderboard[x][y] = count + '0';

printf("%d\n", count);

Display(thunderboard, ROW, COL);

win++;

}

}

else

{

printf("范围非法,请重新输入\n");

}


}

if (win == ROW*COL - COUNTOFTHUNDER)

{

printf("you win!\n");

}

}

int Showthunder(char mineboard[ROWS][COLS], int x, int y)

{

return mineboard[x - 1][y] +

mineboard[x - 1][y - 1] +

mineboard[x - 1][y + 1] +

mineboard[x][y - 1] +

mineboard[x][y + 1] +

mineboard[x + 1][y - 1] +

mineboard[x + 1][y] +

mineboard[x + 1][y + 1] - 8 * '0';


}

3.test.c

#include"game.h"

void meau()

{

printf(" 扫雷游戏 \n");

printf(" 1.开始游戏 \n");

printf(" 0.退出游戏 \n");

}

void game()

{

char mineboard[ROWS][COLS] = { 0 };

char thunderboard[ROWS][COLS] = { 0 };

Initboard(mineboard, ROWS, COLS, '0');

Initboard(thunderboard, ROWS, COLS, '*');

Display(mineboard, ROW, COL);

Display(thunderboard, ROW, COL);

Setthunder(mineboard, ROW, COL);

Findthunder(mineboard, thunderboard, ROW, COL);

Showthunder(thunderboard, ROWS, COLS);




}

int main()

{

srand((unsigned int)time(NULL));

int input = 0;

do{

meau();

printf("请选择\n");

scanf("%d", &input);

switch (input)

{

case 1:game();

break;

case 0:printf("游戏结束\n");

break;

default:printf("输入错误,请重新选择\n");

break;


}

} while (input);


return 0;

}