1.游戏实现的大概思路
先打印一个菜单,让玩家选择输入是进行游戏还是要退出游戏,菜单打印完后通过创建数组来制作扫雷时候所要用到的棋盘并对棋盘进行初始化,然后开始布置雷,雷埋好以后最后进行排雷。 具体实现请往下看 ???
2.具体实现代码
1、打印菜单
void menu() {
printf("***********************\n");
printf("********1.play*********\n");
printf("********0.exit*********\n");
printf("***********************\n");
}
int main() {
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("请重新选择:\n");
break;
}
} while (input);
return 0;
}
效果图展示: 
2、创建数组
为方便后面功能的实现,因此我创建了两个二维数组,一个数组用来存放布置雷的信息,而另一个数组则用来显示排查出雷的个数。 由于是初级扫雷小游戏,所以棋盘上只有九格可供玩家来玩,而为何第二个数组的行和列都要加二呢,是为了保证排雷遍历时不越界,所以将99的棋盘变成了1111的棋盘。(就是将9*9的棋盘上下左右都往外扩了一格)
#define row 9
#define col 9
#define row1 row+2
#define col1 col+2
char save[row1][col1] = {0};
char find[row1][col1] = {0};
3、初始化棋盘
在初始化数组时,将第一个数组初始化为0,将第二个数组初始化为*。为方便,所以我只用了一个函数进行初始化,直接用ret接收数组传过来的0和 *即可对两个数组进行初始化。
void initboard(char board[row1][col1], int rows, int cols, char ret) {
int i = 0;
for (i = 0; i < rows; i++) {
int j = 0;
for (j = 0; j < cols; j++) {
board[i][j] =ret;
}
}
}
然后利用一个函数打印棋盘看两个数组是否进行了有效的初始化。(全0代表我们将要埋雷的数组,而全*代表的是玩家所看到的。一般来说,只需要显示玩家所看到的那个数组就好,但为了测验两个数组都完成了初始化,所以先都打印一下。)
void printboard(char board[row1][col1], int ROW, int COL) {
int i = 0;
printf("------------------------------------\n");
for (i = 0; i <= COL; i++) {
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= ROW; i++) {
printf("%d ", i);
int j = 0;
for (j = 1; j <= COL; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------------------------------------\n");
}
效果图如下: 
4、布置雷
使用随机函数来生成随机下标埋雷。 由于是初级扫雷,所以棋盘只有9*9格,因此生成的随机下标范围只能是1-9。因为随机函数对棋盘的行和列取余后的范围是0-8,所以加一即可实现所需要的下标范围。 在生成随机下标时,要判断该下标之前是否被生成过。
void setboard(char board[row1][col1], int rows, int cols) {
int count = lei;
while(count){
int x = rand() % rows + 1;
int y = rand() % cols + 1;
if (board[x][y] != '1') {
board[x][y] = '1';
count --;
}
}
}
效果图如下: 
5、排查雷
由于是用0初始化,用1来代替雷,所以在排雷时,包括输入坐标在内的九个格子里有几个1就说明有几个雷。 由于数组里面放的是字符1,而我们需要得到得是一个整型数字,所以让每个格子里的字符数字减去字符0在全部相加即可得到一共有几个雷。
int getsavecount(char save[row1][col1], int x, int y) {
int count = 0;
for (int i =x -1; i <= x+1; i++) {
for (int j = y-1; j <= y+1; j++) {
count += (save[i][j] - '0');
}
}
return count;
}
void solve(char save[row1][col1], char find[row1][col1], int rows, int cols) {
int x = 0;
int y = 0;
int win = 0;
while (win<rows*cols-lei) {
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if ((x >= 1 && x <= rows) && (y >= 1 && y <= cols)) {
if (save[x][y] == '1') {
printf("你已经被炸死了\n");
printboard(save, row, col);
break;
}
else {
int count = getsavecount(save, x, y);
find[x][y] = count + '0';
printboard(find, row, col);
win++;
}
}
else
printf("坐标不合法,请重新输入\n");
}
if (win == rows * cols - lei) {
printf("恭喜你,排雷成功!\n");
}
}
得到周围一共有几个雷后显示在全是*的那个棋盘上,因为我们现在得到的雷的个数是一个整形数字,而在棋盘上显示雷的个数是字符型,因此把数字加上字符0就可以得到一个字符数字以显示周围雷的个数。 
效果图如下:  测试排雷成功效果图: 
3、完整代码
game.h----游戏函数的声明
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define row 9
#define col 9
#define row1 row+2
#define col1 col+2
#define lei 10
void initboard(char board[row1][col1], int rows, int cols, int ret);
void printboard(char board[row1][col1], int ROW, int COL);
void setboard(char board[row1][col1],int rows,int cols);
void solve(char save[row1][col1],char find[row1][col1], int rows,int cols);
game.c----游戏函数的实现
#include "game.h"
void initboard(char board[row1][col1], int rows, int cols, char ret) {
int i = 0;
for (i = 0; i < rows; i++) {
int j = 0;
for (j = 0; j < cols; j++) {
board[i][j] =ret;
}
}
}
void printboard(char board[row1][col1], int ROW, int COL) {
int i = 0;
printf("------------------------------------\n");
for (i = 0; i <= COL; i++) {
printf("%d ", i);
}
printf("\n");
for (i = 1; i <= ROW; i++) {
printf("%d ", i);
int j = 0;
for (j = 1; j <= COL; j++) {
printf("%c ", board[i][j]);
}
printf("\n");
}
printf("-------------------------------------\n");
}
void setboard(char board[row1][col1], int rows, int cols) {
int count = lei;
while(count){
int x = rand() % rows + 1;
int y = rand() % cols + 1;
if (board[x][y] != '1') {
board[x][y] = '1';
count --;
}
}
}
int getsavecount(char save[row1][col1], int x, int y) {
int count = 0;
for (int i =x -1; i <= x+1; i++) {
for (int j = y-1; j <= y+1; j++) {
count += (save[i][j] - '0');
}
}
return count;
}
void solve(char save[row1][col1], char find[row1][col1], int rows, int cols) {
int x = 0;
int y = 0;
int win = 0;
while (win<rows*cols-lei) {
printf("请输入坐标:");
scanf("%d %d", &x, &y);
if ((x >= 1 && x <= rows) && (y >= 1 && y <= cols)) {
if (save[x][y] == '1') {
printf("你已经被炸死了\n");
printboard(save, row, col);
break;
}
else {
int count = getsavecount(save, x, y);
find[x][y] = count + '0';
printboard(find, row, col);
win++;
}
}
else
printf("坐标不合法,请重新输入\n");
}
if (win == rows * cols - lei) {
printf("恭喜你,排雷成功!\n");
}
}
源.c----测试
#include "game.h"
void menu() {
printf("***********************\n");
printf("********1.play*********\n");
printf("********0.exit*********\n");
printf("***********************\n");
}
void game() {
char save[row1][col1] = {0};
char find[row1][col1] = {0};
initboard(save, row1, col1, '0');
initboard(find, row1, col1, '*');
setboard(save,row,col);
printboard(save, row, col);
solve(save,find, row, col);
}
int main() {
int input = 0;
srand((unsigned int)time(NULL));
do {
menu();
printf("请选择:");
scanf("%d", &input);
switch (input) {
case 1:
game();
break;
case 0:
printf("退出游戏\n");
break;
default:
printf("请重新选择:\n");
break;
}
} while (input);
return 0;
}
|