推箱子游戏(图形版)

一、.开发环境:vs2019  +  easyx图形库

二、.开发流程步骤:I、绘制推箱子地图并初始化 ----- 几*几大小的地图 

                            II、根据宏定义和推箱子地图上的数字来选择不同的图形

                            III、获取玩家坐标   -----------重点

                                        (有两种情况:1.最开始玩家的坐标,并获取其横纵坐标

                                                                 2. 玩家在目的地上时的坐标,  并获取其横纵坐标 )

                            IV、移动箱子        ----------------重点、难点

                                        根据你所要移动的方向    分别判断箱子是否可以移动

                                        以向上为例:分为以下几种情况

                                        1.玩家上面是否为空地或目的地,若是,那就箱子移动

                                        2.玩家前面为箱子或箱子加目的地,箱子的前面是否为目的地或空地,若是,则移动箱子(箱子移动到原来箱子的前面,人移动到原来箱子的位置

                           V、判断是否通关,并设置多关卡

                                        判断通关的条件:是否还有箱子

三、具体代码

1、初始化地图、定义全局变量

#define _CRT_SECURE_NO_WARNINGS
#if UNICODE
#undef UNICODE
#endif
#include<stdio.h>
#include<Windows.h>
#include<graphics.h>
#include<conio.h>
#include<stdlib.h>
#define SPACE 0       //空白     "  "
#define WALL 1		  //墙		"墙 "
#define DEST 2		  //目的地	"@@"
#define BOX 3		  //箱子		"¥"
#define PLAYER 4	  //玩家		"&&"


//tip:注意获取人在目的地时的坐标,    
// 
//定义两个全局变量   m,n 分别为玩家的横纵坐标
int m, n;
int level = 0;
IMAGE image[7];


//初始化地图
int arr[5][10][10] = {
	{
		 {0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,1,1,1,0,0,0,0},
		 {0,0,0,1,2,1,0,0,0,0},
		 {0,0,0,1,3,1,1,1,1,0},
		 {0,1,1,1,0,0,3,2,1,0},
		 {0,1,2,3,4,0,1,1,1,0},
		 {0,1,1,1,1,3,1,0,0,0},
		 {0,0,0,0,1,2,1,0,0,0},
		 {0,0,0,0,1,1,1,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0},
	},
	{
		 {0,0,0,0,0,0,0,0,0,0},
		 {0,1,1,1,0,0,1,1,1,0},
		 {1,0,0,0,1,1,0,0,0,1},
		 {1,2,0,0,3,0,0,0,0,1},
		 {0,1,2,3,4,3,0,0,1,0},
		 {0,0,1,0,3,0,2,1,0,0},
		 {0,0,0,1,0,2,1,0,0,0},
		 {0,0,0,0,1,1,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0},
		 {0,0,0,0,0,0,0,0,0,0},
	},
	{
		 {0,0,0,0,0,0,0,0,0,0},
		 {0,1,1,1,1,1,1,1,1,0},
		 {0,1,2,0,1,2,0,0,1,0},
		 {0,1,0,0,1,1,0,0,1,0},
		 {0,1,0,3,4,0,3,0,1,0},
		 {0,1,0,0,3,0,0,1,1,0},
		 {0,1,1,0,1,0,0,1,0,0},
		 {0,0,1,0,1,2,0,1,0,0},
		 {0,0,1,1,1,1,1,1,0,0},
		 {0,0,0,0,0,0,0,0,0,0},
	},
	{
		 {1,1,1,1,1,1,1,1,1,1},
		 {1,0,1,0,0,2,0,0,0,1},
		 {1,2,1,1,0,0,0,1,0,1},
		 {1,0,0,0,3,0,1,1,2,1},
		 {1,0,1,1,4,3,0,1,0,1},
		 {1,0,1,0,3,0,3,0,0,1},
		 {1,0,1,0,0,0,1,0,0,1},
		 {1,2,0,0,0,1,1,1,0,1},
		 {1,0,0,0,0,0,0,0,0,1},
		 {1,1,1,1,1,1,1,1,1,1},

	},
	{
		 {0,0,0,0,1,1,0,0,0,0},
		 {0,0,0,1,2,0,1,0,0,0},
		 {0,0,1,0,3,0,2,1,0,0},
		 {0,1,0,0,3,1,0,0,1,0},
		 {1,0,0,3,0,3,0,0,0,1},
		 {1,0,0,1,0,3,1,2,0,1},
		 {0,1,2,0,0,0,2,0,1,0},
		 {0,0,1,0,1,0,0,1,0,0},
		 {0,0,0,1,0,0,1,0,0,0},
		 {0,0,0,0,1,1,0,0,0,0},
	},
};

2、加载图片并绘制推箱子界面

void initgame(){
	initgraph(700,700);
	//加载图片
	char buff[66];
	for (int i = 0; i < 7; i++) {
		sprintf(buff, "image\\%d.bmp", i );
		loadimage(&image[i], buff, 70, 70, true);
	}
}

//绘制页面
void drawMap() {
	
	//输出地图
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			printf("%d  ", arr[level][i][j]);
			putimage(j * 70, i * 70, &image[arr[level][i][j]]);

		}
		printf("\n");
	}
	
}

3、通过方向键移动,推箱子----------重难点

//按键控制移动方向
void move() {
	char userkey = _getch();
	switch (userkey)
	{
	case 72:
	case 'W':
	case 'w':
		//玩家前面是否为空地
		if (arr[level][m - 1][n] == SPACE || arr[level][m - 1][n] == DEST) {
			arr[level][m - 1][n] = PLAYER + arr[level][m - 1][n];
			arr[level][m][n] = arr[level][m][n] - PLAYER;
		}
		//玩家前面是否为箱子
		else if (arr[level][m - 1][n] == BOX || arr[level][m - 1][n] == BOX + DEST) {

			//箱子前面是否为空地或目的地
			if (arr[level][m - 2][n] == SPACE || arr[level][m - 2][n] == DEST) {

				arr[level][m - 2][n] = arr[level][m - 2][n] + BOX;
				arr[level][m - 1][n] = arr[level][m - 1][n] - BOX;
				arr[level][m - 1][n] = arr[level][m - 1][n] + PLAYER;
				arr[level][m][n] = arr[level][m][n] - PLAYER;
			}
		}

		/*printf("up\n");
		Sleep(1000);*/
		break;
	case 80:
	case 'S':
	case 's':
		//玩家后面是否为空地
		if (arr[level][m + 1][n] == SPACE || arr[level][m + 1][n] == DEST) {
			arr[level][m + 1][n] = arr[level][m + 1][n] + PLAYER;
			arr[level][m][n] = arr[level][m][n] - PLAYER;
		}
		//玩家后面是否为箱子
		else if (arr[level][m + 1][n] == BOX || arr[level][m + 1][n] == BOX + DEST) {

			//箱子后面是否为空地或目的地
			if (arr[level][m + 2][n] == SPACE || arr[level][m + 2][n] == DEST) {

				arr[level][m + 2][n] = arr[level][m + 2][n] + BOX;
				arr[level][m + 1][n] = arr[level][m + 1][n] - BOX;
				arr[level][m + 1][n] = arr[level][m + 1][n] + PLAYER;
				arr[level][m][n] = arr[level][m][n] - PLAYER;
			}
		}
		break;
	case 75:
	case 'A':
	case 'a':
		//玩家左边是否为空地
		if (arr[level][m][n - 1] == SPACE || arr[level][m][n - 1] == DEST) {

			arr[level][m][n - 1] = arr[level][m][n - 1] + PLAYER;
			arr[level][m][n] = arr[level][m][n] - PLAYER;
		}
		//玩家左边是否为箱子
		else if (arr[level][m][n - 1] == BOX || arr[level][m][n - 1] == BOX + DEST) {

			//箱子左边是否为空地或目的地
			if (arr[level][m][n - 2] == SPACE || arr[level][m][n - 2] == DEST) {

				arr[level][m][n - 2] = arr[level][m][n - 2] + BOX;
				arr[level][m][n - 1] = arr[level][m][n - 1] - BOX;
				arr[level][m][n - 1] = arr[level][m][n - 1] + PLAYER;
				arr[level][m][n] = arr[level][m][n] - PLAYER;
			}
		}
		break;
	case 77:
	case 'D':
	case 'd':
		//玩家右边是否为空地
		if (arr[level][m][n + 1] == SPACE || arr[level][m][n + 1] == DEST) {
			arr[level][m][n + 1] = arr[level][m][n + 1] + PLAYER;
			arr[level][m][n] = arr[level][m][n] - PLAYER;
		}
		//玩家右边是否为箱子
		else if (arr[level][m][n + 1] == BOX || arr[level][m][n + 1] == BOX + DEST) {

			//箱子右边是否为空地或目的地
			if (arr[level][m][n + 2] == SPACE || arr[level][m][n + 2] == DEST) {

				arr[level][m][n + 2] = arr[level][m][n + 2] + BOX;
				arr[level][m][n + 1] = arr[level][m][n + 1] - BOX;
				arr[level][m][n + 1] = arr[level][m][n + 1] + PLAYER;
				arr[level][m][n] = arr[level][m][n] - PLAYER;
			}
		}
		break;
	}
}

 

 

 4、判断是否通过--------有无箱子的存在

//判断是否通关--------------是否还有箱子
bool judge() {
	for (int i = 0; i < 10; i++) {
		for (int j = 0; j < 10; j++) {
			if (arr[level][i][j] == BOX) {
				return false;
			}

		}
	}
	return true;
}

5.main函数里面

int main() {
	
	
	SetWindowText(GetHWnd(), "推箱子");
	initgame();
	drawMap();

	while (1)
	{
		//获取玩家坐标,并将其下标分别赋给 m,n
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10; j++) {
				if ((arr[level][i][j] == PLAYER)| (arr[level][i][j]== PLAYER+DEST)) {
					m = i;
					n = j;
				}
			}
		}

		move();
		system("cls");
		drawMap();
		if (judge()) {
			if (level > 1) {
				/*exit(666);*/
				MessageBox(GetHWnd(), "恭喜你通关了", "提示", MB_OKCANCEL);
				Sleep(3000);
			}
			level += 1;
			printf("恭喜你过关了,大佬666\n");
		}

	}
	return 0;
}

四、总结

 推箱子相信你们每一个都玩过吧,自己开发一个推箱子游戏,自己设置难易度,这该是一件多妙的事呀
 

所用素材:

                                            

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值