制作简易扫雷过程分析
笔记:扫雷笔记 工程:简易扫雷
本篇具体谈论思路和过程
一、文件构成
1. test.c
用来设计游戏主功能的基本框架,包含菜单,游戏棋盘,玩家操作,电脑操作
不包含具体如何实现此功能
2. game.c
用于游戏功能的实现,框架中功能是如何具体实现,基本为函数
3. game.h
包含实现 game.h 和 test.c 中语句所需要引用的库函数或者自定义函数
二、实现步骤分析
1. 游戏菜单
刚进入游戏界面,需要选择是开始游戏还是退出游戏,想要游戏可以反复游玩,它必须是个循环,选择环节我们使用switch语句进行选择,while循环退出的判断为玩家选择
代码:
void menu()
{
printf("********** 1:开始游戏 *********");
printf("********** 0:退出游戏 *********");
printf("请输入您的选择:");
}
void game()
{
}
int main()
{
int input = 0;
do
{
menu();
scanf("%d\n", &input);
switch (input)
{
case 1:
game();
case 0:
break;
default:
printf("请输入正确数字!\n");
break;
}
} while (input == 0);
return 0;
}
2. 准备棋盘
以 9x9 格式的棋盘为例,我们需要放置9个雷,位置随机
考虑因素:
因为需要计算周围有多少个雷,以防数组越界,四条边都必须+1,所以棋盘的大小是11x11的二维数组
将有多少雷的数字替换后,下一次如果要计算旁边的位置周围有多少个雷时候,会有上次计算周围雷个数数字,所以是否有雷的棋盘和计算周围有多少雷的棋盘不能在同一个棋盘
先准备两个只有单一符号的棋盘,这样两个棋盘都可以用该函数
代码:
void prepare_pan(char pan[ROWS][COLS], int row, int col, char set)
{
int i = 0;
int j = 0;
for (i = 0; i < row; i++)
{
for (j = 0; j < col; j++)
{
pan[i][j] = set;
}
}
}
然后我们需要再设置雷
代码:
void set_boom(char pan[ROWS][COLS], int row, int col)
{
int i = 0;
for (i = 0; i < BOOM; i++)
{
int x = rand() % row + 1;
int y = rand() % col + 1;
if (pan[x][y] != '1')
{
pan[x][y] = '1';
}
else
{
continue;
}
}
}
3. 打印扫雷棋盘
考虑到我们需要的棋盘是以符号形式打印的,所以需要以一个二维数组的形式存储棋盘。
又因为给玩家看的棋盘是玩家选择位置之后,在该位置显示周围有多少个雷,四条边都必须+1,所以棋盘的大小是11x11的二维数组
棋盘可以将边缘设置为1 2 3……方便玩家选择位置
void print_pan(char pan[ROWS][COLS], int row, int col)
{
int i = 0;
int j = 0;
for (i = 0; i <= row; i++)
{
if (i == 0)
{
for (j = 0; j <= col; j++)
{
printf("%d ", j);
}
}
else
{
for (j = 0; j <= col; j++)
{
if (j == 0)
{
printf("%d ", i);
}
else
{
printf("%c ", pan[i][j]);
}
}
}
printf("\n");
}
}
4. 玩家查雷,判断是否踩雷
以玩家输入的坐标,四周计算雷的个数
先判断该位置是否是雷,如果是雷则玩家输了
如果不是雷,则进行计数,该计数应以字符的形式打印,数字字符减去字符零等于该数字,以这个为原理计算
统计玩家查看位置次数,查看次数加上雷的个数等于可以选择的个数
void win(char local[ROWS][COLS], char show[ROWS][COLS], int row, int col)
{
int x = 0;
int y = 0;
int count = 0;
while (1)
{
printf("请输入您需要查看的坐标:");
scanf("%d%d", &x, &y);
if (x >= 1 && x <= 9 && y >= 1 && y <= 9)
{
if (local[x][y] == '1')
{
print_pan(show, ROW, COL);
printf("很遗憾,你踩到雷了,游戏结束!\n");
printf("-----------------------------------\n");
break;
}
else
{
char ret = judge(local, x, y);
show[x][y] = ret + '0';
print_pan(show, ROW, COL);
printf("-----------------------------------\n");
count++;
}
}
else
{
printf("坐标不存在,请输入正确坐标!\n");
}
if (count == (row * col - BOOM))
{
printf("恭喜你胜利了!");
break;
}
}
}
三、test.c文件
用来完成整个程序的测试
#define _CRT_SECURE_NO_WARNINGS
#include "game.h"
void menu()
{
printf("********** 1:开始游戏 *********\n");
printf("********** 0:退出游戏 *********\n");
printf("请输入您的选择:");
}
void game()
{
char local[ROWS][COLS] = { 0 };
char show[ROWS][COLS] = { 0 };
prepare_pan(show, ROWS, COLS, '*');
prepare_pan(local, ROWS, COLS, '0');
set_boom(local, ROW, COL);
print_pan(show, ROW, COL);
printf("--------------------------------\n");
win(local, show, ROW, COL);
}
int main()
{
int input = 0;
do
{
menu();
srand((unsigned)time(NULL));
scanf("%d", &input);
switch (input)
{
case 1:
game();
break;
case 0:
break;
default:
printf("请输入正确数字!\n");
break;
}
} while (input != 0);
return 0;
}
|