扫雷小游戏
用C来实现扫雷
前言
扫雷小游戏一个挺有趣味的小游戏,现在来用C语言来实现它吧
一、构思
一个扫雷游戏需要用到二维数组来定义它的行列,
游戏运行需要用到的代码量较大,分开让每个文件中的代码各自运行在将它互相串联起来,即可方便阅读,还可以构清思路。需要用到三个文件,一个头文件,两个源文件。
游戏需要布置雷,判断雷,统计雷,排除雷,先确定这些点来开始慢慢的展开吧。
头文件中放置需要声明的条件;game.c文件中放置游戏运行代码,test.c文件中放置创建的函数。
二、步骤
1.菜单
玩游戏进入的第一个交互界面就是选择菜单,可供玩家选择;先打印个菜单吧
代码如下(示例):
int main()
{
int input = 0;//创建一个变量
do//反复循环,让玩家可以多次玩游戏
{
menu();//菜单
printf("请选择:");
scanf("%d",&input);
switch (input)//选择语句来实现玩家和游戏交互界面
{
case 1:
game();//游戏实现的函数
break;
case 0:
printf("退出游戏\n");
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}
void menu()//打印菜单
{
printf("*******************\n");
printf("***** 1.play ******\n");
printf("***** 0.exit ******\n");
printf("*******************\n");
}
2.棋盘
想要创建一个9*9大小的游戏棋盘
在tset.c文件中创建函数
代码如下(示例):
void game()
{
char mine[ROWS][COLS] = { 0 };//存放布置的雷的信息
char show[ROWS][COLS] = { 0 };//存放排查出雷的信息
//初始化棋盘的参数
Initboard(mine, ROWS, COLS, '0');//想要初始化什么样的就由传过去的参数
Initboard(show, ROWS, COLS, '*');//为了初始化棋盘样子多传递个字符就可以解决冲突
}
在到头文件中定义
#define ROW 9//棋盘内部的是9*9的格子
#define COL 9//玩家下的棋和雷的布置都在这里
#define ROWS ROW+2//要打印的是11*11
#define COLS COL+2//不是11*11的话会出现越界的情况
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols,char set);//set设置接收传过来的字符,所以用char
在game.c文件中将棋盘打印出来
void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{
int a = 0;//横坐标
int b = 0;//纵坐标
for (a = 0; a < rows; a++)
{
for (b = 0; b < cols; b++)
{
board[a][b] = set;//使棋盘初始化成传递过去的参数得到想要的函数
}
}
}
为了让玩家好在游戏中找到坐标接下来要打印这个
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int x = 0;//打印棋盘的每一行
int y = 0;//列
for (x = 0; x <= col; x++) //方便让玩家好判断坐标,打印列第一个数1-9
{
printf("%d ", x);
}
printf("\n");
for (x = 1; x <= row; x++)
{
printf("%d ", x);//打印每行开头的数1-9
for (y = 1; y <= col; y++)
{
printf("%c ", board[x][y]);
}
printf("\n");//打印完一行就换行
}
}
有了横竖的数字可以容易的打出想要的坐标
布置雷
void Inment(char mine[ROWS][COLS], int row, int col)
{
int count = 10;//布置10个雷
while (count)//循环到0结束
{//随机放置
int a = rand() % row + 1;//放置雷的位置在1 —9之间
int b = rand() % col + 1;//不超出棋盘
if (mine[a][b] == '0')
{
mine[a][b] = '1';//放置一个减去一个
count--;
}
}
}
虽然先打印的棋盘是1111的但是雷只在99内
实现玩家输赢的条件
玩家输入坐标要先判断输入的坐标是否合法,输入的坐标上是否有雷如果没有雷则提示周围有多少雷
void Fundmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int z = 0;//记录排查出的雷的个数
while (z<row*col-10)//获胜的条件
{
printf("请输入检查的坐标: ");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标的合法性
{
if (mine[x][y] == '1')//碰到雷
{
printf("over\n");
Displayboard(mine, row,col);
break;
}
else //mine[x][y]=='0'则坐标不是雷统计周围雷的数目
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';//周围有雷统计雷的数
Displayboard(show, row,col);
z++;//排查出的雷++
}
}
else {
printf("输入坐标错误,重新输入\n");
}
}
if (z == row * col - 10)//当排除的雷等于时则雷排完游戏胜利
{
printf("恭喜你,游戏成功\n");
Displayboard(mine, row, col);
}
}
``
判断统计坐标周围8个坐标是否又累
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//把附近八个坐标都判断下统计有多雷
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x + 1][y - 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0';
}//在11*11的中间实现9*9的棋盘,判断边缘上的棋子是否有炸弹而不会越界
结尾
在源文件中都要引用头文件,才能实现之间的串联
源文件中的#define都可以在头文件中引用
有了这些就能基本的实现扫雷游戏了
代码
头文件的:
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#define ROW 9//棋盘内部的是9*9的格子
#define COL 9//玩家下的棋和雷的布置都在这里
#define ROWS ROW+2//要打印的是11*11
#define COLS COL+2//不是11*11的话会出现越界的情况
//初始化棋盘
void Initboard(char board[ROWS][COLS], int rows, int cols,char set);//set设置接收传过来的字符,所以用char
//打印棋盘
void Displayboard(char board[ROWS][COLS], int row, int col);
//布置雷
void Inment(char mine[ROWS][COLS], int row, int col);
//排查雷
void Fundmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col);
game.c代码:
#include "game.h"
void Initboard(char board[ROWS][COLS], int rows, int cols,char set)
{
int a = 0;//横坐标
int b = 0;//纵坐标
for (a = 0; a < rows; a++)
{
for (b = 0; b < cols; b++)
{
board[a][b] = set;//使棋盘初始化成传递过去的参数得到想要的函数
}
}
}
void Displayboard(char board[ROWS][COLS], int row, int col)
{
int x = 0;//打印棋盘的每一行
int y = 0;//列
for (x = 0; x <= col; x++) //方便让玩家好判断坐标,打印列第一个数1-9
{
printf("%d ", x);
}
printf("\n");
for (x = 1; x <= row; x++)
{
printf("%d ", x);//打印每行开头的数1-9
for (y = 1; y <= col; y++)
{
printf("%c ", board[x][y]);
}
printf("\n");//打印完一行就换行
}
}
void Inment(char mine[ROWS][COLS], int row, int col)
{
int count = 10;//布置10个雷
while (count)//循环到0结束
{//随机放置
int a = rand() % row + 1;//放置雷的位置在1 —9之间
int b = rand() % col + 1;//不超出棋盘
if (mine[a][b] == '0')
{
mine[a][b] = '1';//放置一个减去一个
count--;
}
}
}
static int get_mine_count(char mine[ROWS][COLS], int x, int y)
{//把附近八个坐标都判断下统计有多雷
return mine[x - 1][y] +
mine[x - 1][y - 1] +
mine[x][y - 1] +
mine[x + 1][y] +
mine[x + 1][y + 1] +
mine[x + 1][y - 1] +
mine[x][y + 1] +
mine[x - 1][y + 1] - 8 * '0';
}//在11*11的中间实现9*9的棋盘,判断边缘上的棋子是否有炸弹而不会越界
void Fundmine(char mine[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int z = 0;//记录排查出的雷的个数
while (z<row*col-10)//获胜的条件
{
printf("请输入检查的坐标: ");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= row && y >= 1 && y <= col)//判断坐标的合法性
{
if (mine[x][y] == '1')//碰到雷
{
printf("over\n");
Displayboard(mine, row,col);
break;
}
else //mine[x][y]=='0'则坐标不是雷统计周围雷的数目
{
int count = get_mine_count(mine, x, y);
show[x][y] = count + '0';//周围有雷统计雷的数
Displayboard(show, row,col);
z++;//排查出的雷++
}
}
else {
printf("输入坐标错误,重新输入\n");
}
}
if (z == row * col - 10)//当排除的雷等于时则雷排完游戏胜利
{
printf("恭喜你,游戏成功\n");
Displayboard(mine, row, col);
}
}
test.c代码;
#include "game.h"
void menu()//打印菜单
{
printf("*******************\n");
printf("***** 1.play ******\n");
printf("***** 0.exit ******\n");
printf("*******************\n");
}
void game()
{
char mine[ROWS][COLS] = { 0 };//存放布置的雷的信息
char show[ROWS][COLS] = { 0 };//存放排查出雷的信息
//初始化棋盘的参数
Initboard(mine, ROWS, COLS, '0');//想要初始化什么样的就由传过去的参数
Initboard(show, ROWS, COLS, '*');//为了初始化棋盘样子多传递个字符就可以解决冲突
//打印棋盘
Displayboard(show, ROW, COL);
//布置雷
Inment(mine, ROW, COL);
//排查雷
Fundmine(mine, show, ROW, COL);
}
int main()
{
srand((unsigned int)time(NULL));
int input = 0;//创建一个变量
do//反复循环,让玩家可以多次玩游戏
{
menu();//菜单
printf("请选择:");
scanf("%d",&input);
switch (input)//选择语句来实现玩家和游戏交互界面
{
case 1:
game();//游戏实现的函数
break;
case 0:
printf("退出游戏\n");
default:
printf("选择错误,重新选择\n");
break;
}
} while (input);
return 0;
}