c++ 推箱子小游戏

一、简介
这个小游戏是我开始学c++的时候写的,它里面实现了推箱子的逻辑和界面展示
下载试玩:http://www.shopnc.cladmining.top/Sokoban.exe
二、思路
图片

1.它界面素材有:背景图,人物,墙,箱子,目标,空地,成功图这样7个
2.把图按照一行一行的进行分组 并用数字把图片的位置和信息表示出来下面是我进行的切片素材
图片素材
把图片分成7*8组 表示如下
图片用数字表示
3.加载图片并渲染页面(注意:图片等资源要先引用到项目)
资源右键-》添加-资源-acre...-导入

渲染
4.玩耍(具体的逻辑我就不多说了直接上代码)
5.截图
效果图
三、源代码

#include <iostream>
#include "resource.h"
#include <conio.h>
#include <string.h>
#include <stdlib.h>
#include <graphics.h> //c++图形界面库

//存放每个图片对应的位置
int Map[7][8] = {
	{ 0,0,0,0,0,0,0,0 },{ 0,1,1,1,1,1,1,0 },{ 0,1,5,1,2,3,1,0 },{ 0,1,0,1,0,1,1,0 },{ 0,1,1,4,1,1,1,0 },{ 0,1,0,1,0,1,1,0 },{ 0,0,0,0,0,0,0,0 }
};
IMAGE Img[6], bk;
//把图片数据读到数组里
void LoadImg() {
	for (int i = 0; i < 6;i++) {
		if (i==5) {
			loadimage(&Img[i], "jpeg",MAKEINTRESOURCE(107), 60, 60);
		}
		else {
			loadimage(&Img[i], "jpg", MAKEINTRESOURCE(101+i), 60, 60);
		}
	}
	loadimage(&bk, "jpg",MAKEINTRESOURCE(IDR_JPG6),800,800);
}

void Draw() {
	putimage(0, 0, &bk);//显示背景图
	int pass = 0;
	for (int i = 0; i < 7; i++) {//i行 0-7
		for (int j = 0; j < 8; j++) {//j列 0-7
			switch (Map[i][j]) {
			case 0:
				putimage(j * 60+160, i * 60+190, &Img[0]);
				break;
			case 1:
				putimage(j * 60 + 160, i * 60 + 190, &Img[1]);
				break;
			case 2:
				putimage(j * 60 + 160, i * 60 + 190, &Img[2]);
				pass++;
				break;
			case 3:
				putimage(j * 60 + 160, i * 60 + 190, &Img[3]);
				break;
			case 4:
				putimage(j * 60 + 160, i * 60 + 190, &Img[4]);
				break;
			case 5:
				putimage(j * 60 + 160, i * 60 + 190, &Img[5]);
				break;
			}
		}

	}
	if (pass==0) {
		printf("%d\n",MessageBox(GetForegroundWindow(), "恭喜过关!!!","闯关结果",1));
	}
}


//1.确定人物的位置
//2.监听键盘的输入
//3.改变人物的坐标
void PlayGame() {
	//1.找到人物的位置  
	int x, y;
	for (int i = 0; i < 7; i++) {
		for (int j = 0; j < 8; j++) {
			if (Map[i][j] == 4) {
				y = i;  //行
				x = j;  //列
			}
		}
	}
	//getch 从键盘输入一个字符 
	switch (getch()) {
	case 'w':
		if (Map[y - 1][x] == 1) {
			//人物可以往前面走
			Map[y - 1][x] = 4;
			Map[y][x] = 1;
		}
		else if (Map[y - 1][x] == 3) {
			if (Map[y - 2][x] == 2) {
				Map[y - 2][x] = 5;
				Map[y - 1][x] = 4;  //人物
				Map[y][x] = 1;  //清0
			}else if (Map[y - 2][x] == 1) {
				Map[y - 2][x] = 3;
				Map[y - 1][x] = 4;  //人物
				Map[y][x] = 1;  //清0
			}
		}
		break;
	case 's':
		if (Map[y + 1][x] == 1) {
			//人物可以往前面走
			Map[y + 1][x] = 4;
			Map[y][x] = 1;
		}
		else if (Map[y + 1][x] == 3) {
			if (Map[y + 2][x] == 2) {
				Map[y + 2][x] = 5;
				Map[y + 1][x] = 4;  //人物
				Map[y][x] = 1;  //清0
			}
			else if (Map[y + 2][x] == 1) {
				Map[y + 2][x] = 3;
				Map[y + 1][x] = 4;  //人物
				Map[y][x] = 1;  //清0
			}
		}
		break;
	case 'a':
		if (Map[y][x-1] == 1) {
			//人物可以往前面走
			Map[y][x-1] = 4;
			Map[y][x] = 1;
		}
		else if (Map[y][x-1] == 3) {
			if (Map[y][x-2] == 2) {
				Map[y][x-2] = 5;
				Map[y][x-1] = 4;  //人物
				Map[y][x] = 1;  //清0
			}
			else if (Map[y][x - 2] == 1) {
				Map[y][x - 2] = 3;
				Map[y][x-1] = 4;  //人物
				Map[y][x] = 1;  //清0
			}
		}
		break;
	case 'd':
		if (Map[y][x+1] == 1) {
			//人物可以往前面走
			Map[y][x+1] = 4;
			Map[y][x] = 1;
		}
		else if (Map[y][x+1] == 3) {
			if (Map[y][x+2] == 2) {
				Map[y][x + 2] = 5;
				Map[y][x + 1] = 4;  //人物
				Map[y][x] = 1;  //清0
			}
			else if (Map[y][x+ 2] == 1) {
				Map[y][x + 2] = 3;
				Map[y][x + 1] = 4;  //人物
				Map[y][x] = 1;  //清0
			}
		}
		break;
	}
}

int main() {
	initgraph(800, 800);
	LoadImg();
	while (1) {
		Draw();
		PlayGame();
	}
	system("pause");
	return EXIT_SUCCESS;

}

资源的话可以从我上面的截图里面切。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值