C语言小游戏——推箱子(一次性版本)

C语言小游戏——推箱子(一次性版本),第1张

目录

思路:

1.游戏的开始和地图设定

2.地图场景设置和人物的四项移动 

3 .分析人物的移动:

4 .判断结束条件:


思路:

l.分析
编写代码实现:
控制游戏角色,在地图上,避开障碍物,将箱子推到目标点

游戏元素:
角色(控制移动)
地图(游戏场所)(空地,墙壁,箱子,目标点)
2.代码分析
图形 ——>数据  图形数据化
             *** 作数据
数据 ——>图形  数据图形化

3.写成函数
函数:干活
功能——>函数

4.控制移动
从键盘获取指令,执行相应的函数
指令:wsad WSAD

1.游戏的开始和地图设定
#define _CRT_SECURE_NO_WARNINGS 1
#include
#include
#include
/*
l.分析
编写代码实现:
控制游戏角色,在地图上,避开障碍物,将箱子推到目标点

游戏元素:
角色(控制移动)
地图(游戏场所)(空地,墙壁,箱子,目标点)


2.代码分析
图形 ——>数据  图形数据化
			 *** 作数据
数据 ——>图形  数据图形化

3.写成函数
函数:干活
功能——>函数

4.控制移动
从键盘获取指令,执行相应的函数
指令:wsad WSAD
*/
#define		MAP_ROW		8		//地图行数
#define		MAP_CLO		8		//地图列数

void menu()
{
	printf("********************************\n");
	printf("****   1.play     0.exit   *****\n");
	printf("********************************\n");
}

typedef enum 
{
	map_land=0,	//空地
	map_wall,	//墙
	map_hero,	//人
	map__box,	//箱子
	map__end,	//目标点
	map_null	//黑的地方
}MapEle;

MapEle mapArr[MAP_ROW][MAP_CLO] = {
	{map_null,map_null,map_wall,map_wall,map_wall,map_null,map_null,map_null},
	{map_null,map_null,map_wall,map__end,map_wall,map_null,map_null,map_null},
	{map_null,map_null,map_wall,map_land,map_wall,map_wall,map_wall,map_wall},
	{map_wall,map_wall,map_wall,map__box,map_land,map__box,map__end,map_wall},
	{map_wall,map__end,map_land,map__box,map_hero,map_wall,map_wall,map_wall},
	{map_wall,map_wall,map_wall,map_wall,map__box,map_wall,map_null,map_null},
	{map_null,map_null,map_null,map_wall,map__end,map_wall,map_null,map_null},
	{map_null,map_null,map_null,map_wall,map_wall,map_wall,map_null,map_null}


};

//函数声明
void initGameData();
void drawMap();
void playGame();
void isEndGame();
void heroMove(int off_X,int off_Y);


void WanYX()
{
	while (1)
	{
		playGame();		//进行游戏
		isEndGame();	//结束条件	
	}
}
void test()
{
	int input = 0;
	srand((unsigned int)time(NULL));
	do {
		menu();
		printf("请选择:>");
		scanf("%d", &input);
		switch (input)
		{
		case 1:
			WanYX();
			break;
		case 0:
			printf("退出游戏\n");
			break;
		default:
			printf("选择错误,请重新选择!\n");
			break;
		}
	} while (input);
}


int main()
{
	here:
	while (1)
	{
		test();
	}
	//游戏初始化数据
	initGameData();
	//游戏主循环
	return 0;
}
2.地图场景设置和人物的四项移动 
void drawMap()
{
	system("cls");
	for (int i = 0; i < MAP_ROW; i++)
	{
		for (int j = 0; j < MAP_CLO; j++)
		{

			switch (mapArr[i][j])
			{
			case map_land:
				printf("  ");//空地
				break;
			case map_wall:
				printf("■");//墙
				break;
			case map_hero:
				printf("♂");//人物
				break;
			case map__box:
				printf("●");//箱子
				break;
			case map__end:
				printf("☆");//目标点
				break;
			case map__box+map__end:
				printf("★");    //箱子推到目标点上
				break;
			case map_hero + map__end:
				printf("♀");    //人物站在目标点上
				break;
			case map_null:
				printf("  ");    //黑色区域 
				break;
			default:
				break;
			}
		}
		printf("\n");
	}
	printf("\n");
}
void playGame()
{
	drawMap();
	switch (getch())
	{
		break;
	case'w':
	case'W':
		heroMove(-1,0);
		break;
	case's':
	case'S':
		heroMove(1, 0);
		break;
	case'A':
	case'a':
		heroMove(0, -1);
		break;
	case'D':
	case'd':
		heroMove( 0,1);
		break;
	default:
		break;
	}
}
3 .分析人物的移动:
void heroMove(int off_X, int off_Y)
{
	int heroPos_X = 0;
	int heroPos_Y = 0;
	/*
		****向上走****

		

一、找人 遍历当前关卡数组,记住下标

二、控制 判断不同的情况,决定移动逻辑(修改数组元素的值) */ for (int i = 0; i < MAP_ROW; i++) { for (int j = 0; j < MAP_CLO; j++) { if (map_hero == mapArr[i][j] || map_hero + map_land == mapArr[i][j] || map_hero + map__end == mapArr[i][j]) { heroPos_X = i; heroPos_Y = j; } } } // 人现在的坐标:mapArr[heroPos_X][heroPos_Y] // 人上面的坐标:mapArr[heroPos_X-1][heroPos_Y] // 人下面的坐标:mapArr[heroPos_X+1][heroPos_Y] // 人左面的坐标:mapArr[heroPos_X][heroPos_Y-1] // 人右面的坐标:mapArr[heroPos_X][heroPos_Y+1] // 人接下来的坐标:mapArr[heroPos_X+off_X][heroPos_Y+off_Y] //上面是空地或者目标点 if (map_land == mapArr[heroPos_X + off_X][heroPos_Y + off_Y] || map__end == mapArr[heroPos_X + off_X][heroPos_Y + off_Y]) { //人走上去(当前位置,人离开 上面位置,人过来) mapArr[heroPos_X][heroPos_Y] -= map_hero; mapArr[heroPos_X + off_X][heroPos_Y + off_Y] += map_hero; } //上面是箱子或者箱子在点上 else if (map__box == mapArr[heroPos_X + off_X][heroPos_Y + off_Y] || map__end + map__box == mapArr[heroPos_X - 1][heroPos_Y]) { //上面的上面:只有是空地或者目标点才能推动 if (map_land==mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2] || map__end==mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2]) { //推动箱子 //当前位置,人离开 mapArr[heroPos_X][heroPos_Y] -= map_hero; //上面位置,人过来 mapArr[heroPos_X + off_X][heroPos_Y + off_Y] += map_hero; //上面位置,箱子离开 mapArr[heroPos_X + off_X][heroPos_Y + off_Y] -= map__box; //上面的上面,箱子过来 mapArr[heroPos_X + off_X*2][heroPos_Y + off_Y*2] += map__box; } } }

4 .判断结束条件:

void isEndGame()
{
	int isEnd = 1;
	for (int i = 0; i < MAP_ROW; i++)
	{
		for (int j = 0; j < MAP_CLO; j++)
		{
			if (map__box==mapArr[i][j]||
				map__box +	map_land == mapArr[i][j])
			{
				isEnd = 0;
			}
		}
	}
	if(isEnd)
	{		
			drawMap();
			exit(0);

	}
}

我是Try_harder,正在磕磕绊绊中成长~

会结束之后重新开始游戏的小伙伴,留言一下咱们私聊一下。


看到最后不要忘记点赞哦!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/564442.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-04-06
下一篇 2022-04-06

发表评论

登录后才能评论

评论列表(0条)

保存