用C语言完成的小游戏——“扫雷”,这是一个有年代感的游戏,经久不衰也恰恰证明了这款游戏的趣味性,接下来,就用我们的所学来实现这个游戏。
游戏例图:
首先,我们应该先思考如何去一步步完成它,开始我们建立3个主要文件。mine
mine_sweeps.c 用于存放函数体的文件。
mine_sweeps.h 用于存放全局变量和头文件还有mine_sweeps.h中的函数声明
test.c是用来测试游戏的可行性
void menu()
{
printf(" *******************\n");
printf(" | 1.play |\n");
printf(" | 0.exit |\n");
printf(" ******************\n");
}
int main()
{
srand((unsigned int)time(NULL));//随机数生成函数
int input = 0;
do
{
menu();
printf("plase input number:>");
scanf("%d", &input);//分支选择
switch (input)
{
case 1://开始游戏
mine_sweep();
break;
case 0://退出游戏
printf("game over!\n");
break;
default://重新输入
printf("input wrong,plase input again!\n");
break;
}
} while (input);
return 0;
}
输入不同的数字会有不同的提示,这一点的设计会让玩家清楚现在正处于什么形势。
mine_sweep.h设计函数的实现和理清游戏步骤
#pragma once
//实现游戏需要包含的头文件
#include
#include
#include
//含雷棋盘
#define ROW 9
#define COL 9
//实际棋盘
#define ROWS ROW+2
#define COLS COL+2
//雷数量
#define MINE 10//控制游戏体验
//初始化数组
void init_board(char board[ROWS][COLS], int row, int col,char set);
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_board(char board[ROWS][COLS], int row, int col);
//排查雷
void find_board(char board[ROWS][COLS],char show[ROWS][COLS],int row,int col);
此文件主要是函数声明和宏,改变其中数字可以把难度提升!!!
里面包含了游戏实现需要的主要函数
初始化棋盘函数,其中传递的字符决定了打印的效果。
//初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col, char set)//set是将函数初始化
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
打印棋盘函数,要注意打印的效果,特别是行号和列好的控制,虽然两个数组是11x11,但是我们实际打印的只有9x9。
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
//打印列号
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");
}
}
布置雷函数,要使用我们设定好的数量然后放置相同数量的雷,可以设定count等于雷的数量,千万不可以用于++或者–,因为宏不可赋值。
//布置雷
void set_board(char board[ROWS][COLS], int row, int col)
{
int count = MINE;
while (count)
{
int x = rand() % row + 1;//随机数库函数
int y = rand() % col + 1;//随机数库函数
if ('0' == board[x][y])
{
board[x][y] = '1';//含雷先设定为字符1
count--;
}
}
}
生成随机数的函数:rand,是跟随srand一起使用的库函数。使用时必须引用 stdilb.h 头文件。srand生成的随机数会被rand接收,不过这个函数生成随机数是需要一个随机数来转换成随机数,这时候就要使用到我们的时间戳——time库函数,使用时必须引用 time.h头文件。这时候在main函数中将一个空指针传递给我们的time(NULL)就可以产生随机数了!!在使用rand时需要产生你需要的数字需要使用算数操作符,比如你需要0~9的数字,只需要rand%10。
排查雷函数主要是用于最后玩家输入的游戏体验,需要合适的提示和界面打印。
//排查雷
void find_board(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;;
while (win<row*col-MINE)
{
printf("please input x y:>");
scanf("%d %d", &x, &y);
if (x > 0 && x < row && y>0 && y < col)
{
if ('1' == board[x][y])
{
printf("很遗憾,你被炸死了*_*\n");
print_board(board, ROW, COL);
}
else
{
//统计雷的个数
int count=count_board(board, x, y);//返回的值就是该位置九宫格里的含雷数
show[x][y] = count+'0';
print_board(show, ROW, COL);
win++;
}
}
else
{
printf("x,y wrong,please input again!\n");
}
}
if (win==col*row-MINE)
printf("YOU WINING!!!\n");
}
统计雷函数不用在mine_sweep.h中声明的函数,因为他是用于排查雷需要的函数,具体如下:
//统计雷
int count_board(char board[ROWS][COLS],int x, int y)
{
int count = 0;
count += '0';
count=board[x-1][y-1]
+board[x-1][y]
+board[x-1][y+1]
+board[x][y-1]
+board[x][y]
+board[x][y+1]
+board[x+1][y-1]
+board[x+1][y]
+board[x+1][y+1]-
9 * '0';
return count;
}
以上是每个函数的实现。
mine_sweep.h
#pragma once
#include
#include
#include
//含雷棋盘
#define ROW 9
#define COL 9
//实际棋盘
#define ROWS ROW+2
#define COLS COL+2
//雷数量
#define MINE 80
//初始化数组
void init_board(char board[ROWS][COLS], int row, int col,char set);
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col);
//布置雷
void set_board(char board[ROWS][COLS], int row, int col);
//排查雷
void find_board(char board[ROWS][COLS],char show[ROWS][COLS],int row,int col);
mine_sweep.c
#define _CRT_SECURE_NO_WARNINGS 1
#include"mine_sweep.h"
//初始化棋盘
void init_board(char board[ROWS][COLS], int row, int col, char set)
{
int i = 0;
for (i = 0; i < row; i++)
{
int j = 0;
for (j = 0; j < col; j++)
{
board[i][j] = set;
}
}
}
//打印棋盘
void print_board(char board[ROWS][COLS], int row, int col)
{
int i = 0;
//打印列号
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");
}
}
//布置雷
void set_board(char board[ROWS][COLS], int row, int col)
{
int count = MINE;
while (count)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if ('0' == board[x][y])
{
board[x][y] = '1';
count--;
}
}
}
//统计雷
int count_board(char board[ROWS][COLS],int x, int y)
{
int count = 0;
count += '0';
count=board[x-1][y-1]
+board[x-1][y]
+board[x-1][y+1]
+board[x][y-1]
+board[x][y]
+board[x][y+1]
+board[x+1][y-1]
+board[x+1][y]
+board[x+1][y+1]-
9 * '0';
/*count=mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y - 1] +
mine[x - 1][y] +
mine[x + 1][y] +
mine[x - 1][y + 1] +
mine[x][y + 1] +
mine[x + 1][y + 1] - 8 * '0';*/
return count;
}
//排查雷
void find_board(char board[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int win = 0;;
while (win<row*col-MINE)
{
printf("please input x y:>");
scanf("%d %d", &x, &y);
if (x > 0 && x < row && y>0 && y < col)
{
if ('1' == board[x][y])
{
printf("很遗憾,你被炸死了*_*\n");
print_board(board, ROW, COL);
}
else
{
//统计雷的个数
int count=count_board(board, x, y);
show[x][y] = count+'0';
print_board(show, ROW, COL);
win++;
}
}
else
{
printf("x,y wrong,please input again!\n");
}
}
if (win==col*row-MINE)
printf("YOU WINING!!!\n");
}
test.c
```#define _CRT_SECURE_NO_WARNINGS 1
#include"mine_sweep.h"
void menu()
{
printf(" * ————————*\n");
printf(" | 1.play |\n");
printf(" | 0.exit |\n");
printf(" * ————————*\n");
}
void mine_sweep()
{
char board[ROWS][COLS] = { 0 };//带雷
char show[ROWS][COLS] = { 0 };//不带雷
//初始化棋盘
init_board(board, ROWS, COLS,'0');
init_board(show, ROWS, COLS,'*');
//打印棋盘
//print_board(board, ROW, COL);
print_board(show, ROW, COL);
//布置雷
set_board(board, ROW, COL);
print_board(board, ROW, COL);
//排查雷
find_board(board, show, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;
do
{
menu();
printf("plase input number:>");
scanf("%d", &input);
switch (input)
{
case 1:
mine_sweep();
break;
case 0:
printf("game over!\n");
break;
default:
printf("input wrong,plase input again!\n");
break;
}
} while (input);
return 0;
}
以上就是该小游戏的全部函数,因为技术有限,并不能完全实现与电脑游戏一模一样的体验。不过我还是会继续深造,努力将他实现成原有的功能,谢谢观看。