今天咱就不聊快捷键了 (聊不完啊) 写了扫雷游戏的代码,基本能运行了,接下来就差完善人性化的功能了 经计算 本代码行数也就100多行 好的 废话不多说 先上代码!!
(本篇涉及到随机数的生成,未来我们会谈到)
游戏结构
//实现扫雷
//可以自主(作者)选择棋盘大小
//初始化棋盘initialize map
//跟玩家互动打印棋盘display map
//玩家选择排雷坐标
//统计坐标周围雷个数
int win_record = 0;
#define ROW 9//自己拟定地图的行row,列column
#define COL 9
#define COLS (COL + 2) //加上边界 进行初始化 便于get_mine_num的函数实现
#define ROWS (ROW + 2)
#define mine_min (COL*ROW-1) //用于维护游戏,方便作者测试
#define mine_num 10 //拟定雷的个数
void menu(void)//菜单
{
puts("************************");
puts("****** 扫 雷 ******");
puts("****** 1. play ******");
puts("****** 0. exit ******");
puts("****** 请输入:< ******");
puts("************************");
}
char map_inside[ROWS][COLS];
char map_show[ROWS][COLS];
void game()
{
srand((unsigned int)time(NULL));
//被调函数 游戏实现!
puts("--------扫雷--------");
initial_map(map_inside,ROWS,COLS, '0');
initial_map(map_show, ROWS, COLS,'*');
//显示地图
display_map(map_show,ROW,COL);
//display_map(map_inside, ROW, COL);//维护游戏用
//设置雷需要生成随机数
set_mine(map_inside, ROW, COL, mine_num);
//display_map(map_inside, ROW, COL);//维护游戏用
//玩家输入坐标找点
int i = find_mine(map_inside,map_show, ROWS, COLS);
if (i)
win_record++;
}
int main()
{
//主调函数 游戏结构
int option = 0;
menu();
int cnt = 0;
do
{
if(cnt != 0)
menu();
scanf("%d", &option);
switch (option)
{
case 1:
game();
cnt++;
break;
case 0:
puts("正在结算......");
Sleep(1000);//伪结算
puts("退出成功!");
printf("您共游玩了%d次,胜利%d次", cnt,win_record);
return 0;
default:
system("cls");
puts("输入不合法,请重新输入!");
break;
}
} while (option);
return 0;
}
游戏主体(结构实现/函数实现)
void initial_map(char a[ROWS][COLS], int row, int col, char set)//初始化地图 地图符号由 char set 决定
{
for (int i = 0; i < row; i++)
for (int j = 0; j < col; j++)
a[i][j] = set;
}
void display_map(char a[ROWS][COLS], int row, int col)//输出打印地图其中包括inside(隐藏,来储存雷的坐标)和 show(显示,来和玩家互动)
{
puts("--------------------");
for (int c = 0; c <= col; c++)
printf("%d ", c);
puts("");
for (int i = 1; i <= row; i++)
{
printf("%d ", i);
for (int j = 1; j <= col; j++)
{
printf("%c ", a[i][j]);
}
puts("");
}
puts("--------------------");
}
void set_mine(char a[ROWS][COLS], int row, int col, int num)//设置随机雷
{
while (num)
{
row = rand() % 9 + 1;
col = rand() % 9 + 1;
if (a[row][col] == '0')
{
a[row][col] = '1';//1代表雷
num--;
}
}
}
int get_mine_number(char a[ROWS][COLS], int r, int c)//得到玩家选择坐标周围雷的个数
{
return a[r - 1][c - 1] + a[r - 1][c + 1]
+ a[r][c - 1] + a[r][c + 1]
+ a[r - 1][c] + a[r + 1][c]
+ a[r + 1][c + 1] + a[r + 1][c - 1] - 8 * '0';
}
int find_mine(char inside[ROWS][COLS], char show[ROWS][COLS], int row, int col)//玩家输入坐标排雷
{
int r, c;
int win = 0;
int flag = 1;
while (win < row * col - mine_min)
{
do
{
printf("请输入排查坐标(行,列)"); scanf("%d %d", &r, &c);
if (r <= row && r >= 1 && c <= row && c >= 1)
{
flag = 0;
}
else puts("输入不合法!请输入两个1~9的数字中间用逗号隔开!");
} while (flag);
if (inside[r][c] == '0')
{
int num = get_mine_number(inside, r, c);
show[r][c] = num + '0';
system("cls");
display_map(show, ROW, COL);
win++;
}
else if (inside[r][c] == '1')
{
puts("很遗憾,你被炸死了!");
display_map(inside, ROW, COL);
puts("是否继续?(输入0/1)");
return 0;
}
}
if(win == row * col - mine_min)
{
printf("恭喜你排雷成功!");
return 1;
}
}
谈谈思路
“扫雷”的游戏规则前人之述备,不在此赘述。##注意!在接下来的每一步最好都进行调试找bug
1.想想需要什么功能
与玩家互动让他们做出选择 需要菜单,需要显示output 需要初始化地图而且一个用来显示周围地雷数,一个是内部用来储存地雷的坐标的地图(也就是数组) 记录胜场数 然后就是循环、选择等等语句 慢慢想你也可以写出来。
2.拆分结构
1.首先是主体结构,需要选择语句,一般写在主调函数里面
2.其次是游戏内部结构,需要实现上述功能其中游戏结构也可以拆分为a.初始化地图 b.显示地图 c.设置地雷 d.玩家输入坐标排雷
3.将结构包装为函数 并注释
4.用自己的方法实现函数
因为每一步目的都是清晰的,此时排查bug效率高
好了 写完了就发给朋友让他们玩玩 让他们给你找找bug
总结
好耶!又水了一篇博客(bushi) 大学时间真的好紧啊真的太充实了
本篇所需的基础不高,也算是对本蒟蒻的目前所学的总结
经次一历,我发现快捷键真的节约时间。不知道跟大家一不一样,每次写代码,每次使用快捷键我心情都会变好。敲代码真的让人快乐!!
快捷键还会更新的,大家稍作观望!