首页 > 其他分享 >5.10推箱子2.0

5.10推箱子2.0

时间:2023-05-10 21:01:13浏览次数:37  
标签:箱子 return map int 5.10 dy uy 2.0

一 升级说明

修复第一版 bug 真正可运行的推箱子 增加重开系统;

增加 多关卡地图 复制到编译器 编译运行 即可开玩 能过第四关算我输;

二 代码

#include<iostream>
using namespace std;
#include<stdlib.h>
#include<conio.h>
#include "Map.h"//地图关卡
#define WIDTH 8 //地图宽度
#define HEIGHT 8 //地图长度
//定义地图 后期会做多地图
/*地图表示
0 空地
1 墙
2 人
3 箱子
4 箱子的目的地
5 到达目的地的箱子
*/
//原地图 重开用的
int map0[WIDTH][HEIGHT] =
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 3, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 2, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 4, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
};//地图初始第一关

int map[WIDTH][HEIGHT] = { 0 };

//人的位置
int x, y;
//箱子个数 成功的标志是箱子=0;关卡数mapn
int boxs = 0; int mapn = 1;
//数据初始化
void initDate();
//打印地图
void drawMap();
//向上移动
void moveUp();
//向左移动
void moveLeft();
//向下移动
void moveDown();
//向右移动
void moveRight();
//更换地图
void tmap();

int main()
{
void intmap();//初始第一关
t1:

char direction; //存储输入
initDate(); //数据初始化
//开始循环 每按一次按键都会刷新直至胜利
while (1)
{
system("cls");//清屏函数
drawMap();//画图
//彩蛋
if(mapn==4)
{
cout << "能过算我输" << endl;
}
//接受输入
direction = _getch();
//用switch选择语句判断输入
switch (direction)
{
case'w':
moveUp();//向上移动
break;
case 'a':
moveLeft();
break;
case's':
moveDown();
break;
case'd':
moveRight();
break;
case'r':
goto t1;

}
//箱子数量为0时胜利
if(!boxs)
{
break;
}
}
//跳出循环时恭喜胜利
system("cls");
cout << "恭喜你过关了"<<endl;
cout << "按z开始下一关" << endl;
cout << "按p后按任意键退出" << endl;
t2:
direction = _getch();
if (direction == 'z')
{
tmap();
goto t1;
}
else if (direction == 'p') { return 0; }
else { goto t2; }

}
void initDate()//数据初始化
{
int i, j;
boxs = 0;//箱子初始0
cout << "游戏加载中...";
//遍历地图数据
for (i = 0; i < HEIGHT; i++)
{
for (j = 0; j < WIDTH; j++)
{//地图初始化
map[i][j] = map0[i][j];
//遍历到2时记录人的坐标
if (map[i][j] == 2)
{
x = j;
y = i;
}
//遍历到3时 箱子数目增加
if (map[i][j] == 3)
{
boxs++;
}

}
}
}
void drawMap()
{
int i, j;
for (i = 0; i < WIDTH; i++)
{
for (j = 0; j < HEIGHT; j++)
{
switch(map[i][j])
{
case 0:
cout << " ";
break;
case 1:
cout << "墙";
break;
case 2:
cout << "你";
break;
case 3:
cout << "箱";
break;
case 4:
cout << "标";
break;
case 5:
cout << "达";
break;
}
}
cout << endl;
}
cout << "按'w'向上走,a左,d右,s下,r重开" << endl;
}
void moveUp()
{
//定义人物上方的目标
int ux, uy;
//人在最上方不能上移
if (y == 0)
{
return;
}
ux = x;
uy = y - 1;
//上方为完成的箱子 或本身
if (map[uy][ux] == 5|| map[uy][ux] == 2)
{
return;
}
//上方为墙
if (map[uy][ux] == 1)
{
return;
}
//上方为空地
if (map[uy][ux] == 0)
{
map[y][x] = 0;
map[uy][ux] = 2;
y = uy;//更新人的坐标
}
//上方为箱子
if (map[uy][ux] == 3)
{
//箱子上方为墙 箱子 或完成的箱子
if (map[uy - 1][ux] == 1 || map[uy - 1][ux] == 3 || map[uy - 1][ux] == 5)
{
return;
}
//箱子上方为目的地
if (map[uy - 1][ux] == 4)
{
map[uy - 1][ux] = 5;
map[uy][ux] = 2;
map[y][x] = 0;
x = ux;
y = uy;
boxs--;
}
//箱子上方是空地
if (map[uy - 1][ux] == 0)
{
map[uy - 1][ux] = 3;
map[uy][ux] = 2;
map[y][x] = 0;
x = ux;
y = uy;
}
else return;
}
}
void moveLeft()
{
//定义人物左方的目标
int lx, ly;
//人在最左方不能左移
if (x == 0)
{
return;
}
lx = x - 1;
ly = y;
//左方为完成的箱子
if (map[ly][lx] == 5)
{
return;
}
//左方为墙
if (map[ly][lx] == 1)
{
return;
}
//左方为空地
if (map[ly][lx] == 0)
{
map[y][x] = 0;
map[ly][lx] = 2;
x = lx;//更新人的坐标
}
//左方为箱子
if (map[ly][lx] == 3)
{
//箱子左方为墙 箱子 或完成的箱子
if (map[ly][lx - 1] == 1 || map[ly][lx - 1] == 3 || map[ly][lx - 1] == 5)
{
return;
}
//箱子左方为目的地
if (map[ly][lx - 1] == 4)
{
map[ly][lx - 1] = 5;
map[ly][lx] = 2;
map[y][x] = 0;
x = lx;
y = ly;
boxs--;
}
//箱子左方是空地
if (map[ly][lx - 1] == 0)
{
map[ly][lx - 1] = 3;
map[ly][lx] = 2;
map[y][x] = 0;
x = lx;
y = ly;
}
else return;
}
}
void moveDown()
{
//定义人物下方的目标
int dx, dy;
//人在最下方不能下移
if (y == 7)
{
return;
}
dx = x;
dy = y + 1;
//下方为完成的箱子
if (map[dy][dx] == 5)
{
return;
}
//下方为墙
if (map[dy][dx] == 1)
{
return;
}
//下方为空地
if (map[dy][dx] == 0)
{
map[y][x] = 0;
map[dy][dx] = 2;
y = dy;//更新人的坐标
}
//下方为箱子
if (map[dy][dx] == 3)
{
//箱子下方为墙 箱子 或完成的箱子
if (map[dy + 1][dx] == 1 || map[dy + 1][dx] == 3 || map[dy + 1][dx] == 5)
{
return;
}
//箱子下方为目的地
if (map[dy + 1][dx] == 4)
{
map[dy + 1][dx] = 5;
map[dy][dx] = 2;
map[y][x] = 0;
x = dx;
y = dy;
boxs--;
}
//箱子下方是空地
if (map[dy + 1][dx] == 0)
{
map[dy + 1][dx] = 3;
map[dy][dx] = 2;
map[y][x] = 0;
x = dx;
y = dy;
}
else return;
}
}
void moveRight()
{
//定义人物右方的目标
int rx, ry;
//人在最右方不能右移
if (x == 7)
{
return;
}
rx = x + 1;
ry = y;
//右方为完成的箱子
if (map[ry][rx] == 5)
{
return;
}
//右方为墙
if (map[ry][rx] == 1)
{
return;
}
//右方为空地
if (map[ry][rx] == 0)
{
map[y][x] = 0;
map[ry][rx] = 2;
x = rx;//更新人的坐标
}
//右方为箱子
if (map[ry][rx] == 3)
{
//箱子右方为墙 箱子 或完成的箱子
if (map[ry][rx + 1] == 1 || map[ry][rx + 1] == 3 || map[ry][rx + 1] == 5)
{
return;
}
//箱子右方为目的地
if (map[ry][rx + 1] == 4)
{
map[ry][rx + 1] = 5;
map[ry][rx] = 2;
map[y][x] = 0;
x = rx;
y = ry;
boxs--;
}
//箱子右方是空地
if (map[ry][rx + 1] == 0)
{
map[ry][rx + 1] = 3;
map[ry][rx] = 2;
map[y][x] = 0;
x = rx;
y = ry;
}
}
}
void tmap()
{
if (mapn == 1)
{
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
map0[i][j] = Map2[i][j];
}
}
}
if (mapn == 2)
{
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
map0[i][j] = Map3[i][j];
}
}
}
if (mapn == 3)
{
for (int i = 0; i < HEIGHT; i++)
{
for (int j = 0; j < WIDTH; j++)
{
map0[i][j] = Map4[i][j];
}
}
}
mapn++;

}

#ifndef A
#define A


int Map1[8][8] =
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 3, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 2, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 4, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
};
int Map2[8][8] =
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 1, 3, 0, 1, 0, 1,
1, 0, 3, 0, 0, 0, 0, 1,
1, 0, 0, 2, 0, 0, 0, 1,
1, 0, 1, 0, 0, 1, 0, 1,
1, 0, 0, 0, 0, 4, 4, 1,
1, 1, 1, 1, 1, 1, 1, 1
};
int Map3[8][8] =
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 3, 3, 0, 0, 1,
1, 0, 1, 0, 0, 0, 0, 1,
1, 0, 1, 2, 0, 0, 0, 1,
1, 4, 1, 1, 0, 0, 0, 1,
1, 0, 4, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
};
int Map4[8][8] =
{
1, 1, 1, 1, 1, 1, 1, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 0, 1, 1, 1, 3, 0, 1,
1, 0, 1, 2, 1, 4, 0, 1,
1, 0, 1, 1, 1, 0, 0, 1,
1, 0, 0, 0, 0, 0, 0, 1,
1, 1, 1, 1, 1, 1, 1, 1
};

#endif

三 游戏截图

 

 

标签:箱子,return,map,int,5.10,dy,uy,2.0
From: https://www.cnblogs.com/galileo9527/p/17389076.html

相关文章

  • 每日总结 5.10
    今日操作了python的大作业。随后进行了供货商web端的页面显示。实现每条请求所需要付款数 实现对于售卖机的页面改进广告弹窗的自动关闭和主动关闭 ......
  • 5.10
    #include<iostream>usingnamespacestd;inti=1;voidother(){   staticinta=2;   staticintb;   intc=10;   a+=2;   i+=32;   c+=5;   cout<<"---OTHER---"<<endl;   cout<<"i:"......
  • 2023.5.10——软件工程日报
    所花时间(包括上课):6h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习。我了解到的知识点:1.了解了一些数据库的知识;2.了解了一些python的知识;3.了解了一些英语知识;5.了解了一些Javaweb的知识;4.了解了一些数学建模的知识;6.了解了一些计算机网络的知识; ......
  • 5.10打卡
    一、问题描述:求任意两个正整数的最小公倍数(LCM)。二、设计思路:对于输入的两个正整数m和n,每次输入的大小顺序可能不同,为了使程序具有一般性,首先对整数m和n进行大小排序,规定变量m中存警大数、变量n中存储小数。若输入时m的值小于变量n的值,则需要交换两个变量中存储的内容。再次强调:......
  • 5.10
    #include<stdio.h>main(){intx,y,z,number=0;printf("MenwomenChildren\n");for(x=0;x<=10;x++){y=20-2*x;z=30-x-y;if(3*x+2*y+z==50)printf("%2d:%4d%5d%6d\n",++number,x,y,z);}}......
  • day69(2023.5.10)
    第四阶段--网页编程和设计(一)HTML5day571.第一个前端程序2.前端工具的选择与安装3.VScode开发者工具快捷键4.HTML5简介与基础骨架5.标签之标题6.标签之段落、换行、水平线7.标签之图片8.图片路径详解9.标签之超文本链接10.标签之文本11.列表标签之有序列表12.列表标签之无序列表13......
  • Ubuntu服务器版 ubuntu 22.04.2 下载
    使用USB或者DVD的物理镜像安装承诺的系统安全更新至2027年4月扩展更新维护至2032年4月为企业客户提供商业支持https://cn.ubuntu.com/download/server/step1https://cn.ubuntu.com/download/server/thank-you?version=22.04.2&architecture=amd64......
  • 如何在Ubuntu 22.04上安装Linux 内核、更新内核以后出现:nas挂不上、nas挂载失败、moun
    按照如下链接安装Linux内核:如何在Ubuntu22.04上安装Linux内核6.0?,内核安装确实成功了,但是我在挂载nas的时候会出现如下错误:mounterror:cifsfilesystemnotsupportedbythesystemmounterror(19):NosuchdeviceRefertothemount.cifs(8)manualpage(e.g.manmoun......
  • 5.10打卡
    #include<bits/stdc++.h>usingnamespacestd;shortinthanshu(unsignedshortintx,unsignedshortinty){if(y==0)return-1;elsereturnx/y;}intmain(){unsignedshortinta,b;cout<<"pleaseenteraandb&qu......
  • 【GDOI2020模拟02.05】生成树 (矩阵树扩展)
    Description:给定一张N个点,M条边的无向图,边有红、绿、蓝三种颜色,分别用1,2,3表示。求这张图有多少生成树,满足绿色边数量不超过x,蓝色边数量不超过y,答案对10^9+7取模。n<=40题解:考虑正常的用矩阵树求生成树个数的方法。基尔霍夫矩阵里的每个位置只是一个数,事实上可以把它扩......