C语言实现推箱子——我的游戏开发学习路01

参考的是 自然向日葵 的文章,在这里感谢大佬无私分享!!!
https://codebus.cn/contributor/post/zrxrk-boxman

在这里插入图片描述

以下是代码:

/*
///
// 程序名称:推箱子
// 编译环境:Visual C++ 6.0,EasyX_2018春分版
// 程序编写:TReemonkey
// 日期:2020-4-1
//


游戏一共5关;
方向键和wsad上下左右移动;
r键重新开始当前关;


0为地板,1为玩家,2为箱子,3为箱子放置的区域,
4为玩家在箱子放置的区域,5为箱子成功放置,6为墙壁
	
*/


#include <stdio.h>
#include <conio.h>
#include <graphics.h>

#define Width 720
#define High 540

//变量定义	
IMAGE img[8];		//图像变量存储图片
char FileName[10] = "";
int man_x, man_y;	//人物的位置
int count;			//判断游戏是否结束
int Rcanvas[9][12];
int a;				//记录当前进行的关卡

int	canvas[5][9][12] =		//地图元素的定义
{
	//第一关
	{
		0,0,0,0,6,6,6,0,0,0,0,0,
			0,0,0,0,6,3,6,0,0,0,0,0,
			0,0,0,0,6,2,6,6,6,6,0,0,
			0,0,6,6,6,1,0,2,3,6,0,0,
			0,0,6,3,2,0,0,6,6,6,0,0,
			0,0,6,6,6,6,2,6,0,0,0,0,
			0,0,0,0,0,6,3,6,0,0,0,0,
			0,0,0,0,0,6,6,6,0,0,0,0,
			0,0,0,0,0,0,0,0,0,0,0,0			
	},
	
	//第二关
	{
			0,0,6,6,6,6,6,0,0,0,0,0,
				0,0,6,1,0,0,6,0,0,0,0,0,
				0,0,6,0,2,2,6,0,6,6,6,0,
				0,0,6,0,2,0,6,0,6,3,6,0,
				0,0,6,6,6,0,6,6,6,3,6,0,
				0,0,0,6,6,0,0,0,0,3,6,0,
				0,0,0,6,0,0,0,6,0,0,6,0,
				0,0,0,6,0,0,0,6,6,6,6,0,
				0,0,0,6,6,6,6,6,0,0,0,0			
				
		},
		
		//第三关
		{
				0,0,0,0,0,0,0,0,0,0,0,0,
					0,0,6,6,6,6,6,6,6,0,0,0,
					0,0,6,0,0,0,0,0,6,6,6,0,
					0,6,6,2,6,6,6,0,0,0,6,0,
					0,6,0,1,0,2,0,0,2,0,6,0,
					0,6,0,3,3,6,0,2,0,0,6,0,
					0,6,6,3,3,6,0,0,0,6,6,0,
					0,0,6,6,6,6,6,6,6,6,6,0,
					0,0,0,0,0,0,0,0,0,0,0,0
			},
			
			//第四关
			{
					0,0,0,0,6,6,6,6,0,0,0,0,
						0,0,0,6,6,0,0,6,0,0,0,0,
						0,0,0,6,1,2,0,6,0,0,0,0,		
						0,0,0,6,6,2,0,6,6,0,0,0,
						0,0,0,6,6,0,2,0,6,0,0,0,
						0,0,0,6,3,2,0,0,6,0,0,0,
						0,0,0,6,3,3,5,3,6,0,0,0,
						0,0,0,6,6,6,6,6,6,0,0,0,
						0,0,0,0,0,0,0,0,0,0,0,0								
				},
				//第五关
				{
						0,0,0,6,6,6,6,6,0,0,0,0,
							0,0,0,6,1,0,6,6,6,0,0,0,
							0,0,0,6,0,2,0,0,6,0,0,0,			
							0,0,6,6,6,0,6,0,6,6,0,0,
							0,0,6,3,6,0,6,0,0,6,0,0,
							0,0,6,3,2,0,0,6,0,6,0,0,
							0,0,6,3,0,0,0,2,0,6,0,0,
							0,0,6,6,6,6,6,6,6,6,0,0,
							0,0,0,0,0,0,0,0,0,0,0,0,													
					}
};

void StartUp()
{
	initgraph(Width,High);
	count = 1;
	a = 0;
	
	for (int i=0; i<7; i++)
	{
		sprintf(FileName, "%d.jpg", i);
		
		loadimage(&img[i], FileName);
	}
	for (i=0; i<9; i++)
	{
		for (int j=0; j<12; j++)
		{
			Rcanvas[i][j] = canvas[a][i][j];
		}
	}
}

void Show()
{
	int x, y;

	//判断是否本关卡结束
	if (count == 0)
	{
		a++;
		
		for (int i=0; i<9; i++)
		{
			for (int j=0; j<12; j++)
			{
				Rcanvas[i][j] = canvas[a][i][j];
			}
		}
	}
	
	for (int i=0; i<9; i++)
	{
		for (int j=0; j<12; j++)
		{
			x = 60 * j;
			y = 60 * i;
			
			switch(canvas[a][i][j])
			{
			case 0:
				putimage(x, y, &img[0]);
				break;
			case 1:
				putimage(x, y, &img[1]);
				break;
			case 2:
				putimage(x, y, &img[2]);
				break;
			case 3:
				putimage(x, y, &img[3]);
				break;
			case 4:
				putimage(x, y, &img[4]);
				break;
			case 5:
				putimage(x, y, &img[5]);
				break;
			case 6:
				putimage(x, y, &img[6]);
				break;
			}
		}
	}
}

int IsOver()
{
	count=0;
	for (int i=0; i<9; i++)
	{
		for (int j=0; j<12; j++)
		{
			if (canvas[a][i][j] == 2)
			{
				count=1;
			}
		}
	}
	return count;
}

void UpdateWithInput()
{
	for (int i=0; i<9; i++)
	{
		for (int j=0; j<12; j++)
		{
			if (canvas[a][i][j] == 1 || canvas[a][i][j] == 4)
			{
				man_x = j;
				man_y = i;
				break;
			}
		}
		if (canvas[a][i][j] == 1 || canvas[a][i][j] == 4)
		{
			man_x = j;
			man_y = i;
			break;
		}
	}
	
	char input;
	
	if (kbhit())
	{
		input = getch();
		switch(input)
		{
		case 'W':
		case 'w':
		case 72:
			if (canvas[a][man_y-1][man_x] == 0 || canvas[a][man_y-1][man_x] == 3)		//一般情况
			{
				canvas[a][man_y][man_x] -= 1;
				canvas[a][man_y-1][man_x] += 1;
			}
			else if (canvas[a][man_y-1][man_x] == 2 || canvas[a][man_y-1][man_x] == 5)		//推箱子
			{
				if ( canvas[a][man_y-2][man_x] == 0 || canvas[a][man_y-2][man_x] == 3)
				{
					canvas[a][man_y][man_x] -= 1;
					canvas[a][man_y-1][man_x] -= 1;
					canvas[a][man_y-2][man_x] += 2;
				}
			}
			break;
			
		case 'S':
		case 's':
		case 80:
			if (canvas[a][man_y+1][man_x] == 0 || canvas[a][man_y+1][man_x] == 3)		//一般情况
			{
				canvas[a][man_y][man_x] -= 1;
				canvas[a][man_y+1][man_x] += 1;
			}
			else if (canvas[a][man_y+1][man_x] == 2 || canvas[a][man_y+1][man_x] == 5)		//推箱子
			{
				if ( canvas[a][man_y+2][man_x] == 0 || canvas[a][man_y+2][man_x] == 3)
				{
					canvas[a][man_y][man_x] -= 1;
					canvas[a][man_y+1][man_x] -= 1;
					canvas[a][man_y+2][man_x] += 2;
				}
			}
			
			break;
			
		case 'A':
		case 'a':
		case 75:
			if (canvas[a][man_y][man_x-1] == 0 || canvas[a][man_y][man_x-1] == 3)		//一般情况
			{
				canvas[a][man_y][man_x] -= 1;
				canvas[a][man_y][man_x-1] += 1;
			}
			else if (canvas[a][man_y][man_x-1] == 2 || canvas[a][man_y][man_x-1] == 5)		//推箱子
			{
				if ( canvas[a][man_y][man_x-2] == 0 || canvas[a][man_y][man_x-2] == 3)
				{
					canvas[a][man_y][man_x] -= 1;
					canvas[a][man_y][man_x-1] -= 1;
					canvas[a][man_y][man_x-2] += 2;
				}
			}
			break;
			
		case 'D':
		case 'd':
		case 77:
			if (canvas[a][man_y][man_x+1] == 0 || canvas[a][man_y][man_x+1] == 3)		//一般情况
			{
				canvas[a][man_y][man_x] -= 1;
				canvas[a][man_y][man_x+1] += 1;
			}
			else if (canvas[a][man_y][man_x+1] == 2 || canvas[a][man_y][man_x+1] == 5)		//推箱子
			{
				if ( canvas[a][man_y][man_x+2] == 0 || canvas[a][man_y][man_x+2] == 3)
				{
					canvas[a][man_y][man_x] -= 1;
					canvas[a][man_y][man_x+1] -= 1;
					canvas[a][man_y][man_x+2] += 2;
				}
			}
			break;
			
		case 'R':
		case 'r':
			for (int i=0; i<9; i++)
			{
				for (int j=0; j<12; j++)
				{
					canvas[a][i][j] = Rcanvas[i][j];
				}
			}
			break;
		}
	}
}

void gameover()
{
	getch();
	closegraph();
}

int main()
{
	StartUp();
	do
	{
		Show();
		UpdateWithInput();
		IsOver();
	}while(count || (a<6));
	gameover();
	return 0;
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值