重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
用C语言实现扫雷这样的小游戏,本身逻辑并不复杂,大体上来说就是布置雷和排除雷。因此在用代码实现的时候,一定要注意每个代码的可行性以及语法问题。
在阿坝州等地区,都构建了全面的区域性战略布局,加强发展的系统性、市场前瞻性、产品创新能力,以专注、极致的服务理念,为客户提供网站设计、网站建设 网站设计制作定制开发,公司网站建设,企业网站建设,成都品牌网站建设,营销型网站建设,外贸网站建设,阿坝州网站建设费用合理。首先,该游戏需要运用到多个函数,可以创建两个源文件test.c和game.c,分别用来实现游戏运行逻辑和函数定义。为了让test.c可以使用game.c中的函数定义,还需要再头文件中创建game.h实现函数声明。
先来看看函数声明,了解本次制作的大致思路:
#define _CRT_SECURE_NO_WARNINGS 1
#include#include#define ROW 9
#define COL 9
#define ROWS ROW+2
#define COLS COL+2
#define MINE 10
//初始化棋盘
void init(char board[ROWS][COLS], int row, int col, char i);
//打印棋盘
void print(char show[ROWS][COLS], int row, int col);
//布置地雷
void Putmine(char mine[ROWS][COLS], int row, int col);
//排除地雷
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col);
//获取周围地雷信息
int Getmine(char mine[ROWS][COLS],char show[ROWS][COLS], int x, int y);
其中的ROWS与COLS是为了获得一个11*11的棋盘,而本次玩家所能使用的扫雷棋盘为9*9(目的是为了后续获取周围地雷信息更加方便,不会发生数组越界的错误)
大体思路如上,现在来看看test.c中的主函数部分:
#define _CRT_SECURE_NO_WARNINGS 1
#include"game.h"
#includeint main()
{
test();
return 0;
}
再看看test():
void test()
{
menu();
int input = 0;
do
{
scanf("%d", &input);
switch (input)
{
case 1:
Game();
break;
case 0:
printf("游戏结束\n");
break;
default:
printf("输入非法,请选择玩或不玩\n");
}
} while (input);
}
因为只是调用test函数,所以不需要test返回值,直接用void即可
接下来看看游戏逻辑Game()部分:
void Game()
{
char mine[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
init(mine, ROWS, COLS, '0');
init(show, ROWS, COLS, '#');
print(show, ROW, COL);//打印棋盘
Putmine(mine, ROW, COL);//布置地雷
//print(mine, ROW, COL);//用来测试游戏的透视版本
Findmine(mine,show, ROW, COL);//排除地雷
}
首先创建两个二维数组,一个用来布置地雷,另一个则给玩家游玩
里面的init函数 print函数 Putmine函数 Findmine函数分别对应
初始化棋盘 打印棋盘 放置地雷 扫除地雷
1.初始化棋盘:
void init(char board[ROWS][COLS], int rows, int cols, char ret)
{
for (int i = 0; i< rows; i++)
{
for (int j = 0; j< cols; j++)
{
board[i][j] = ret;
}
}
}
我们将mine棋盘全部初始化为字符0(‘0’),show棋盘全部初始化为字符#(‘#’)
2.打印棋盘:
void print(char show[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
printf("---------扫雷----------\n");
for (j = 0; j<= col; j++)
{
printf("%d ", j);
}
printf("\n");
for (i = 1; i<= row; i++)
{
printf("%d ", i);
for (j = 1; j<= col; j++)
{
printf("%c ", show[i][j]);
}
printf("\n");
}
printf("---------扫雷----------\n");
}
需要注意的是,每次调用棋盘都是用的mine/show[ROWS][COLS],而不是mine/show[ROWS][COLS]!并且为了让玩家玩到9*9的棋盘,我们要在11*11的初始化棋盘里打印出9*9的棋盘给玩家游玩
3.放置地雷:
void Putmine(char mine[ROWS][COLS], int row, int col)
{
int count = MINE;
srand((unsigned int)time(NULL));
while (count >0)
{
int x = rand() % 9 + 1;
int y = rand() % 9 + 1;
if (mine[x][y] != '1')
{
mine[x][y] = '1';
}
else if (mine[x][y] == '1')
{
continue;
}
count--;
}
}
我们让mine中每一个地雷为字符1(‘1’),当随机值放置的地雷与原先地雷重合时,则用continue函数重新返回布置
4.扫除地雷:
void Findmine(char mine[ROWS][COLS],char show[ROWS][COLS], int row, int col)
{
int win = 0;
while (win< ROW * COL - MINE)
{
int x = 0;
int y = 0;
scanf("%d %d", &x, &y);
if (x >= 1 && x<= row && y >= 1 && y<= col)
{
if (mine[x][y] == '0'&&show[x][y] == '#')
{
int n = Getmine(mine, show, x, y);
show[x][y] = n + '0';
print(show, ROW, COL);
win++;
}
else if (show[x][y] == '0')
{
printf("该坐标已被排除,请重新选择坐标\n");
continue;
}
else if (mine[x][y] == '1')
{
printf("砰!很遗憾,游戏结束\n");
print(mine, ROW, COL);
break;
}
}
}
}
其中获取周围地雷信息的Getmine函数如下:
int Getmine(char mine[ROWS][COLS], char show[ROWS][COLS], int x, int y)
{
return (mine[x - 1][y - 1] + mine[x - 1][y] + mine[x - 1][y + 1] + mine[x + 1][y - 1] + mine[x + 1][y] + mine[x + 1][y + 1] + mine[x][y - 1] + mine[x][y + 1]) - 8 * '0';
}
注意这里用的是int整形来存储Getmine的值。当Getmine的值返回后,通过 数字+‘0’ = ‘数字’(字符数字)的方式,将周围地雷的信息存储于show棋盘上。
最后,让程序运行,简易版的扫雷即完成了。
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧