C语言课程设计--推箱子

本文介绍了使用C语言进行推箱子游戏的课程设计,涵盖游戏的五大模块:开始场景、输入检测、碰撞检测、胜负判定和结束画面。游戏场景通过二维数组存储坐标信息,输入检测响应键盘操作,碰撞检测涉及多种逻辑判断,胜负判断依据箱子和终点位置。代码实现部分包括主函数、主菜单、选择难易程度、选择地图、开始游戏等关键函数的详细解析。
摘要由CSDN通过智能技术生成

一、游戏设计

游戏总共有分开始场景(游戏初始场景)、输入检测、碰撞检测、胜负判定、结束画面(关卡选择)五大模块;
(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++
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值