一、简介
这个小游戏是我开始学c++的时候写的,它里面实现了推箱子的逻辑和界面展示
下载试玩:http://www.shopnc.cladmining.top/Sokoban.exe
二、思路
1.它界面素材有:背景图,人物,墙,箱子,目标,空地,成功图这样7个
2.把图按照一行一行的进行分组 并用数字把图片的位置和信息表示出来下面是我进行的切片素材
把图片分成7*8组 表示如下
3.加载图片并渲染页面(注意:图片等资源要先引用到项目)
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;
}
资源的话可以从我上面的截图里面切。