一、游戏设计
游戏总共有分开始场景(游戏初始场景)、输入检测、碰撞检测、胜负判定、结束画面(关卡选择)五大模块;
(1)游戏场景
基于C语言的游戏场景搭建分为控制台输出界面与GUI图像绘制界面两类;此次短训讲解控制台输出界面,更多详细方法可咨询联微学校,获取相关课程;
游戏场景中包含游戏背景布局、游戏人物位置、游戏石块位置、箱子位置。此版本游戏使用二维数组存储游戏各类重要坐标信息;
(2)输入检测
游戏中通过键盘输入判断小人的位置,’w’’a’’s’’d’’q’’r’分别代表上、左、下、右、退出游戏、重置游戏;
(3)碰撞检测
主要逻辑包括前方物体,本案例存在五种情况,分别是前方是空阔地、前方是箱子、前方是墙壁、前方是目的地,前方为已完成的箱子,以下对这五类逻辑判断进行分析:
1)前方是空阔地人可以往前行动一格,行动有效,人向前移动一格;
2)前方是墙壁人保持原地不动、(完整版中包含“无法行动”反馈);
3)前方是箱子情况逻辑判断分为两种
3.1)第一种是箱子前是空阔地,行动有效,人与箱子同时向前移动一格
3.2)第二种是箱子前是墙壁,行动无效。
3.3)第三种是箱子前面为目的地,行动有效,人与箱子同时向前移动一格
4)前方是目的地,行动有效,人与箱子同时向前移动一格
5)前方为已完成的箱子
5.1)已完成箱子上方为墙,方块,已完成的方块,行为无效
5.2)已完成方块上方为球,行动有效,人与箱子同时向前移动一格
5.3)已完成方块上方为空白,行动有效,人与箱子同时向前移动一格
(4)胜负判断
1) 胜利判断 设定终点位置 箱子坐标与终点坐标一致则判断游戏胜利;
2)失败判断 如果游戏过程中 出现3.2)即箱子前方是墙壁的情况 反馈游戏者是否重来。
(5)结束画面
二、代码实现
(1)方法声明
//开始游戏
void startGame();
//初始化数据
void initData();
//绘制地图
void drawMap();
//向上移动
void moveUp();
//向左移动
void moveLeft();
//向下移动
void moveDown();
//向右移动
void moveRight();
//菜单
void menu();
//选择难易程度
void choose();
//选择地图
void chooseMap();
(2)参数说明
#define WIDTH 9
#define HEIGHT 9
/**
* 0 表示空
* 1 表示墙
* 2 表示人
* 3 表示箱子
* 4 表示球
* 5 表示推到目的地的箱子
* 6 表示人和目的地的箱子重合
*/
int map[HEIGHT][WIDTH] = {
{
0, 0, 1, 1, 1, 0, 0, 0, 0},
{
0, 0, 1, 4, 1, 0, 0, 0, 0},
{
0, 0, 1, 0, 1, 1, 1, 1, 0},
{
1, 1, 1, 3, 0, 3, 4, 1, 0},
{
1, 4, 0, 3, 2, 1, 1, 1, 0},
{
1, 1, 1, 1, 3, 1, 0, 0, 0},
{
0, 0, 0, 1, 4, 1, 0, 0, 0},
{
0, 0, 0, 1, 1, 1, 0, 0, 0},
{
0, 0, 0, 0, 0, 0, 0, 0, 0}
};
//临时存储map数组
int tmap[HEIGHT][WIDTH];
//x,y表示人的位置,k表示关卡数
int x, y,k=1;
//箱子的个数
int boxs;
(3)函数的具体分析
1.main函数
在这里插入代码片
int main(int argc, char *argv[]) {
menu();
printf("恭喜你完成游戏!※\n");
return 0;
}
main函数是程序的入口,主函数主要实现的是函数的调用
2.主菜单
/*
*主菜单
*/
void menu(){
int option;
printf("\n\n\n\n\n\n\t\t\t\t\t\t 菜 单\n");
printf("\t\t\t\t\t\t1.开 始 游 戏\n");
printf("\t\t\t\t\t\t2.难 易 程 度\n");
printf("\t\t\t\t\t\t3.退 出 游 戏\n");
printf("请输入你的选择:");
scanf("%d",&option);
switch(option){
case 1:
startGame();
break;
case 2:
choose();
break;
case 3:
return;
}
}
游戏的主界面,通过玩家输入的信息来做出判断,从而进入不同的游戏界面。
3.选择难易程度
/*
*选择难易程度
*/
void choose(){
int option1;
system("cls");
printf("\n\n\n\n\n\n\t\t\t\t\t\t 难易程度\n");
printf("\t\t\t\t\t\t 1.简 单\n");
printf("\t\t\t\t\t\t 2.一 般\n");
printf("\t\t\t\t\t\t 3.困 难\n");
printf("请输入你的选择:");
scanf("%d",&option1);
switch(option1){
case 1:
k=1;
chooseMap();
break;
case 2:
k=3;
chooseMap();
break;
case 3:
k=5;
chooseMap();
break;
}
system("cls");
menu();
}
游戏难度的选择界面,通过获取玩家输入的信息,再由switch函数做出判断设置初始关卡从而使游戏难度不同。
4.选择地图
/*
*选择地图
*/
void chooseMap(){
int i,j;
switch(k){
case 1:
{
int map1[HEIGHT][WIDTH] =
{
{
0, 0, 1, 1, 1, 0, 0, 0, 0},
{
0, 0, 1, 4, 1, 0, 0, 0, 0},
{
0, 0, 1, 0, 1, 1, 1, 1, 0},
{
1, 1, 1, 3, 0, 3, 4, 1, 0},
{
1, 4, 0, 3, 2, 1, 1, 1, 0},
{
1, 1, 1, 1, 3, 1, 0, 0, 0},
{
0, 0, 0, 1, 4, 1, 0, 0, 0},
{
0, 0, 0, 1, 1, 1, 0, 0, 0},
{
0, 0, 0, 0, 0, 0, 0, 0, 0}
};
for(i=0;i<HEIGHT;i++