用C/C++实现推箱子小游戏

想要实现,要先下载exsay,并且将下面的图片放到当前目录下。
图片链接:链接:https://pan.baidu.com/s/1AkOixt9i7gNs8NL7813GpQ
提取码:sui7
复制这段内容后打开百度网盘手机App,操作更方便哦

效果演示

在这里插入图片描述

实现功能

如上图所示。按键控制小猪的运动,推箱子到达目的地。

如何实现

1.首先思考要保存箱子,小猪等信息,添加多个map可以用到三维数组。
2.定义小猪,箱子,墙,空地等信息在三维数组里的数值。

 空地             0      
 墙	              1
 目的地           2	   
 箱子             3
 猪               4  2+4=6 猪到达目的地也显示猪
 箱子到达目的地   2+3=5

3.按键实现推箱子运动。
考虑多种情况:
①.小猪的运动(空地,目的在)
②.小猪推箱子运动(空地,目的地)

用三维数组保存map信息:这里我只做了两种图,可自行添加

int backgrand[MAP][ROW][COL] =//map图
{
	{
		1, 1, 1, 1, 1, 1, 1, 1,
		1, 0, 0, 0, 2, 0, 0, 1,
		1, 1, 0, 0, 3, 1, 1, 1,
		1, 2, 3, 0, 4, 0, 0, 1,
		1, 0, 1, 0, 3, 3, 2, 1,
		1, 1, 0, 3, 2, 0, 0, 1,
		1, 0, 0, 2, 0, 0, 1, 1,
		1, 1, 1, 1, 1, 1, 1, 1
	},
	{
		0, 1, 1, 1, 1, 1, 1, 1,
		1, 1, 0, 2, 0, 0, 0, 1,
		1, 1, 0, 0, 3, 0, 1, 1,
		1, 2, 3, 0, 4, 0, 0, 1,
		1, 0, 1, 0, 0, 0, 1, 1,
		1, 1, 0, 3, 2, 3, 0, 1,
		1, 0, 0, 0, 0, 2, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1
	},
};

绘图用到了easyx库,加载图片和绘制窗口只用到了三条语句:很简单

initgraph();//绘制窗口大小
loadimage();//加载图片
putinmage();//放出图片

具体可看代码!

代码块

#include<stdio.h>
#include<Windows.h>
#include<stdlib.h>
#include<time.h>
#include<conio.h>
#include<graphics.h>
#define ROW 8
#define COL 8
#define MAP 2//map个可以自己添加数


int count = 0;//哪个map图
/*
空地             0
墙	              1
目的地           2
箱子             3
猪               4  2+4=6 猪到达目的地也显示猪
箱子到达目的地   2+3=5


*/


IMAGE image1, image2, image3, image4, image5, image6;

int backgrand[MAP][ROW][COL] =//map图
{
	{
		1, 1, 1, 1, 1, 1, 1, 1,
		1, 0, 0, 0, 2, 0, 0, 1,
		1, 1, 0, 0, 3, 1, 1, 1,
		1, 2, 3, 0, 4, 0, 0, 1,
		1, 0, 1, 0, 3, 3, 2, 1,
		1, 1, 0, 3, 2, 0, 0, 1,
		1, 0, 0, 2, 0, 0, 1, 1,
		1, 1, 1, 1, 1, 1, 1, 1
	},
	{
		0, 1, 1, 1, 1, 1, 1, 1,
		1, 1, 0, 2, 0, 0, 0, 1,
		1, 1, 0, 0, 3, 0, 1, 1,
		1, 2, 3, 0, 4, 0, 0, 1,
		1, 0, 1, 0, 0, 0, 1, 1,
		1, 1, 0, 3, 2, 3, 0, 1,
		1, 0, 0, 0, 0, 2, 0, 1,
		1, 1, 1, 1, 1, 1, 1, 1
	},
};
int Judge(){//p判断是否结束一局
	int i = 0;
	for (i = 0; i < ROW; i++){
		int j = 0;
		for (j = 0; j < COL; j++){
			if (backgrand[count][i][j] == 3 || backgrand[count][i][j] == 2){//判断是否还有箱子或者目的地
				return 0;
			}
		}
	}
	return 1;
}

void Backgrand(){//绘制地图
	int i = 0;
	for (; i < ROW; i++){
		int j = 0;
		for (; j < COL; j++){
			int x = 80 * j;//横轴是y(列),数轴是x(行)。
			int y = 80 * i;
			switch (backgrand[count][i][j]){
			case 0:
				putimage(x, y, &image3);
				break;
			case 1:
				putimage(x, y, &image1);
				break;
			case 2:
				putimage(x, y, &image6);
				break;
			case 3:
				putimage(x, y, &image4);
				break;
			case 4:
			case 6:
				putimage(x, y, &image2);
				break;
			case 5:
				putimage(x, y, &image5);
				break;
			default:
				break;
			}
		}
	}
}

void Keymove(){//按键控制猪的运动
	int i = 0;
	int j = 0;//j定义出来了,里面for循环要初始化
	for (i = 0; i < ROW; i++){ //找到猪的坐标
		for (j = 0; j < COL; j++){
			if (backgrand[count][i][j] == 4 || backgrand[count][i][j] == 6){
				break;
			}
		}
		if (backgrand[count][i][j] == 4 || backgrand[count][i][j] == 6){
			break;
		}
	}
	char key = _getch();//获得按键
	switch (key){
	case 'w':
	case 'W':
	case 72:
		if (backgrand[count][i - 1][j] == 0 ||\
			backgrand[count][i - 1][j] == 2)
		{  
			backgrand[count][i][j] = backgrand[count][i][j] - 4;//猪运动,猪旁边是空地或者是目的地
			backgrand[count][i - 1][j] = backgrand[count][i - 1][j] + 4;
		}
		if (backgrand[count][i - 1][j] == 3 && (backgrand[count][i - 2][j] == 0 || \
			backgrand[count][i - 2][j] == 2))   //猪推箱子运动条件,猪旁边是箱子与上箱子旁边是空地。
		{                                       //后面或的条件要括号括起来
			backgrand[count][i][j] = backgrand[count][i][j] - 4;                                      
			backgrand[count][i - 1][j] = backgrand[count][i - 1][j] + 4;
			backgrand[count][i - 1][j] -= 3;
			backgrand[count][i - 2][j] += 3;
		}
		if (backgrand[count][i - 1][j] == 5 &&\
			backgrand[count][i - 2][j] == 0)  //箱子到达目的地,后面还有空的情况
		{
			backgrand[count][i][j] -= 4;
			backgrand[count][i - 1][j] += 4;
			backgrand[count][i - 1][j] -= 3;
			backgrand[count][i - 2][j] += 3;
		}
		break;
	case 's':
	case 'S':
	case 80:
		if (backgrand[count][i + 1][j] == 0 || \
			backgrand[count][i + 1][j] == 2)
		{  //猪运动
			backgrand[count][i][j] = backgrand[count][i][j] - 4;
			backgrand[count][i + 1][j] = backgrand[count][i + 1][j] + 4;
		}
		if (backgrand[count][i + 1][j] == 3 && (backgrand[count][i + 2][j] == 0 ||\
			backgrand[count][i + 2][j] == 2))
		{
			backgrand[count][i][j] = backgrand[count][i][j] - 4;
			backgrand[count][i + 1][j] = backgrand[count][i + 1][j] + 4;
			backgrand[count][i + 1][j] -= 3;
			backgrand[count][i + 2][j] += 3;
		}
		if (backgrand[count][i + 1][j] == 5 && \
			backgrand[count][i + 2][j] == 0)
		{
			backgrand[count][i][j] -= 4;
			backgrand[count][i + 1][j] += 4;
			backgrand[count][i + 1][j] -= 3;
			backgrand[count][i + 2][j] += 3;
		}
		break;
	case 'a':
	case 'A':
	case 75:
		if (backgrand[count][i][j - 1] == 0 || \
			backgrand[count][i][j - 1] == 2)
		{  //猪运动
			backgrand[count][i][j] = backgrand[count][i][j] - 4;
			backgrand[count][i][j - 1] = backgrand[count][i][j - 1] + 4;
		}
		if (backgrand[count][i][j - 1] == 3 &&\
			(backgrand[count][i][j - 2] == 0 ||\
			backgrand[count][i][j - 2] == 2))
		{
			backgrand[count][i][j] = backgrand[count][i][j] - 4;
			backgrand[count][i][j - 1] = backgrand[count][i][j - 1] + 4;
			backgrand[count][i][j - 1] -= 3;
			backgrand[count][i][j - 2] += 3;
		}
		if (backgrand[count][i][j - 1] == 5 && \
			backgrand[count][i][j - 2] == 0)
		{
			backgrand[count][i][j] -= 4;
			backgrand[count][i][j - 1] += 4;
			backgrand[count][i][j - 1] -= 3;
			backgrand[count][i][j - 2] += 3;
		}
		break;
	case 'd':
	case 'D':
	case 77:
		if (backgrand[count][i][j + 1] == 0 || \
			backgrand[count][i][j + 1] == 2)
		{  //猪运动
			backgrand[count][i][j] = backgrand[count][i][j] - 4;
			backgrand[count][i][j + 1] = backgrand[count][i][j + 1] + 4;
		}
		if (backgrand[count][i][j + 1] == 3 && (backgrand[count][i][j + 2] == 0 ||\
			backgrand[count][i][j + 2] == 2))
		{
			backgrand[count][i][j] -= 4;
			backgrand[count][i][j + 1] += 4;
			backgrand[count][i][j + 1] -= 3;
			backgrand[count][i][j + 2] += 3;
		}
		if (backgrand[count][i][j + 1] == 5 && backgrand[count][i][j + 2] == 0){
			backgrand[count][i][j] -= 4;
			backgrand[count][i][j + 1] += 4;
			backgrand[count][i][j + 1] -= 3;
			backgrand[count][i][j + 2] += 3;
		}
		break;
	default:
		break;
	}


}


void Initgraph(){
	initgraph(80 * ROW, 80 * COL);
	loadimage(&image1, "1.jpg");//墙
	loadimage(&image2, "2.jpg");//猪
	loadimage(&image3, "3.jpg");//空地
	loadimage(&image4, "4.jpg");//箱子
	loadimage(&image6, "6.jpg");//目的地
	loadimage(&image5, "5.jpg");//箱子到目的地
}




int main(){
	Initgraph();
	while (1){
		Backgrand();
		Keymove();
		if (Judge()){
			Backgrand();
			Sleep(500);
			count++;
		}
		if (count == MAP){
			break;
		}
	}


	getchar();
	closegraph();
	system("pause");
	return 0;
}
  • 18
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 11
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值