安卓推箱子游戏代码(推箱子游戏代码JAVA)
admin 发布:2022-12-20 00:03 150
本篇文章给大家谈谈安卓推箱子游戏代码,以及推箱子游戏代码JAVA对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
推箱子游戏java代码如何判断下一步是墙还是空地
1. 确定的功能:让玩家通过按上下左右键推箱子,当箱子们都推到了目的地后出现过关信息,并显示下一关。推错了玩家还按空格键从新玩过这关。直到过完全部关卡。
2. 定义的核心数据结构:我们定义一个二维数组ghouse来记录屏幕上各点的状态。char ghouse[20][20]; 其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。
3. 对整个进行功能模块划分。
(1)。初始化:在屏幕上输出欢迎信息,把ghouse数组的元素初始化为0。并根据各关的要求在屏幕上输出墙、箱子、目的地和人。并用ghouse 数组记录各点的状态。
(2)。进入游戏循环:这个游戏主循环是等待按键。当接受到上下左右键时执行相关操作:接受ESC键时退出游戏;接受空格键时返回本关开头;接受无效按键时做忽略处理。重点介绍按上下左右键时如何执行相关操作。
(3)。判断是否过关:用一个链表win由每关的初始化函数传给main函数。Win链表主要记录屏幕上的哪些点是目的地,并记录目的地的位置。Main函数每执行一次操作后就判断屏幕上的目的地是不是都有箱子了。
求个推箱子的C++代码 要有注解 800到1000行
//*******************************************************
Sokoban.h: 类定义 Sokoban.c: 类成员函数实现
Use_Sokoban.c: 主函数
请用VC6(别编译器的也行)先运行Use_Sokoban.c文件,要编译该文件一下,
再点Project- Add To Project- Files 选择Sokoban.c文件,
即将Sokoban.c加载到工程里,最后运行就OK拉。
//*******************************************************
Sokoban.h
//*******************************************************
#ifndef SOKOBAN_H_ //防止文件重复包含
#define SOKOBAN_H_
#include queue
using std::queue;
//每一步的数据类型
struct node
{
int bx, by; //箱子的坐标
int px, py; //人的坐标
};
//推箱子类
class Sokoban
{
private:
enum {L = 15, H = 7};
char GameMap[H][L]; //地图
int Pex, Pey; //人的位置
int Boxx, Boxy; //箱子的位置
int Succeed, Prove; //是否成功到目的地, 是否可玩性
int dx[4], dy[4]; //方向数组
protected:
char Empty;
char People;
char Box;
char Block;
char Target;
int dir; //记录按键方向
node s, e;
public:
Sokoban(); //构建函数
~Sokoban() {} //析构函数,即为inline
//地图初始化函数
void Initial();
//箱子路劲验证函数,参数为箱子坐标(bx,by),人坐标(px,py)
void Box_Bfs(int bx, int by, int px, int py);
//人路劲验证函数,人所到的目的地(ex,ey)
bool People_Bfs(int ex, int ey);
//地图刷新函数
void Show();
//按键判断函数
void Button();
//箱子人移动函数
void Move();
//验证越界函数
bool Check(int x, int y);
};
#endif
//*******************************************************
Sokoban.cpp
//*******************************************************
#include "Sokoban.h"
#include cstring
#include cstdlib
#include ctime
#include iostream
#include conio.h
using std::cout;
using std::endl;
Sokoban::Sokoban() //构建函数即对变量初始化
{
dir = -1;
Succeed = Prove = 0;
memset(GameMap, '.', sizeof(GameMap));
Empty = '.';
People = 'P';
Box = '#';
Block = '*';
Target = 'T';
//方向依次为上右下左
dx[0] = -1; dx[1] = 0; dx[2] = 1; dx[3] = 0;
dy[0] = 0; dy[1] = 1; dy[2] = 0; dy[3] = -1;
//随机种子,使程序每次运行时所产生的随机数不同
srand(time(0));
}
//地图初始化函数
void Sokoban::Initial()
{
int count = 0, x, y;
//对地图中随机产生25个阻碍物
while(count != 25)
{
x = rand()%H;
y = rand()%L;
if(GameMap[x][y] == Empty)
{
GameMap[x][y] = Block;
count++;
}
}
while(true) //随机产生人开始的位置
{
x = rand()%H;
y = rand()%L;
if(GameMap[x][y] == Empty)
{
GameMap[x][y] = People;
Pex = x;
Pey = y;
break;
}
}
while(true) //随机产生箱子开始的位置
{
x = rand()%H;
y = rand()%L;
//不让箱子在地图的边界处
if(GameMap[x][y] == Empty x != 0 y != 0
x != H-1 y != L-1)
{
GameMap[x][y] = Box;
Boxx = x;
Boxy = y;
break;
}
}
while(true) //随机产生目标的位置
{
x = rand()%H;
y = rand()%L;
if(GameMap[x][y] == Empty)
{
GameMap[x][y] = Target;
break;
}
}
//对游戏地图检查是否可将箱子推到目的地,即判断游戏可玩性
Sokoban::Box_Bfs(Boxx, Boxy, Pex, Pey);
//如游戏不可玩,即再随机产生地图
if(!Prove)
{
memset(GameMap, '.', sizeof(GameMap));
Sokoban::Initial();
}
else
Sokoban::Show();
}
//箱子路劲验证函数
//用BFS算法对箱子验证是否可到目的地
void Sokoban::Box_Bfs(int bx, int by, int px, int py)
{
queuenode_Box; //创建箱子队列
//visit对上一步走到下一步的记录,防止箱子走重复路劲
//visit[i][j][z][k]表示箱子从点(i,j)到点(z,k)
//visit[][][][]为0时表示为走过,1时表示已走过
int visit[H][L][H][L];
memset(visit, 0, sizeof(visit)); //visit数组初始化
s.bx = bx; s.by = by; //将起始的箱子、人位置放入队列
s.px = px; s.py = py;
_Box.push(s);
int pe_x, pe_y;
while(!_Box.empty()) //队列为空时跳出
{
s = _Box.front();
_Box.pop();
if(GameMap[s.bx][s.by] == Target) //到达目的地
{
Prove = 1;
break;
}
for(int i = 0; i 4; i++)
{
e.bx = s.bx + dx[i]; e.by = s.by + dy[i];
switch(i) //人推箱子的位置
{
case 0: pe_x = s.bx + dx[2]; pe_y = s.by + dy[2]; break;
case 1: pe_x = s.bx + dx[3]; pe_y = s.by + dy[3]; break;
case 2: pe_x = s.bx + dx[0]; pe_y = s.by + dy[0]; break;
case 3: pe_x = s.bx + dx[1]; pe_y = s.by + dy[1]; break;
}
//验证箱子和人的位置的合法性
if(!Check(e.bx, e.by) || !Check(pe_x, pe_y)
|| GameMap[e.bx][e.by] == Block || GameMap[pe_x][pe_y] == Block
|| visit[s.bx][s.by][e.bx][e.by] )
continue;
//如人可推箱子即进入队列
if(Sokoban::People_Bfs(pe_x, pe_y))
{
//保存人推箱子后的位置
e.px = pe_x; e.py = pe_y;
_Box.push(e);
visit[s.bx][s.by][e.bx][e.by] = 1; //箱子路劲的标记
}
}
}
}
//人路劲验证函数
//用BFS算法对人验证是否可推箱子
bool Sokoban::People_Bfs(int ex, int ey)
{
queuenode_People;
node t, end;
//visit数组对人的路劲进行标记,0为未走过,1为走过
int visit[H][L];
//visit数组初始化为0
memset(visit, 0, sizeof(visit));
t.px = s.px; t.py = s.py; //人初始位置进入队列
_People.push(t);
visit[t.px][t.py] = 1;
while(!_People.empty()) //对立为空时跳出
{
t = _People.front();
_People.pop();
if(t.px == ex t.py == ey) //人可到达(ex,ey)该点
return 1;
for(int i = 0; i 4; i++)
{
end.px = t.px + dx[i]; end.py = t.py + dy[i];
//检查人的位置合法性
if(!Check(end.px, end.py) || GameMap[end.px][end.py] == Block
|| GameMap[end.px][end.py] == Box || visit[end.px][end.py])
continue;
//进入队列
_People.push(end);
visit[end.px][end.py] = 1; //记录
}
}
return 0;
}
//地图刷新函数
void Sokoban::Show()
{
int i, j;
while(true)
{
//每半秒刷新一次地图
clock_t s = clock();
while(clock() - s CLOCKS_PER_SEC/2)
;
//先判断按键在移动
Sokoban::Button();
Sokoban::Move();
system("cls");
for(i = 0; i H; i++)
{
for(j = 0; j L; j++)
cout GameMap[i][j];
cout endl;
}
cout endl;
cout "\n**********************************" endl;
cout "* 小小C++语言推箱子游戏 *" endl;
cout "* 游戏规则: *" endl;
cout "* P: 人 #: 箱子 *" endl;
cout "* *: 障碍物 T: 目的地 *" endl;
cout "**********************************" endl;
cout "* 每次游戏地图不一样 *" endl;
cout "* 人将箱子推到目的地即过关 *" endl;
cout "*所给地图,一定可过关,请慎重移箱子*" endl;
cout "* 箱子无路可走时,机器不会提示 *" endl;
cout "**********************************" endl;
//箱子成功到达目的地
if(Succeed)
{
cout "\n ^_^ _" endl;
cout "恭喜过关成功! 再来一盘吧" endl;
getchar();
break;
}
}
}
//按键判断函数
void Sokoban::Button()
{
int key;
if(kbhit() != 0) //检查当前是否有键盘输入,若有则返回一个非0值,否则返回0
{
while(kbhit() != 0) //可能存在多个按键,要全部取完,以最后一个为主
key = getch(); //将按键从控制台中取出并保存到key中
switch(key)
{
//上
case 72: dir = 0;
break;
//右
case 77: dir = 1;
break;
//下
case 80: dir = 2;
break;
//左
case 75: dir = 3;
break;
}
}
}
//人推箱子移动函数
void Sokoban::Move()
{
int x, y;
//有按键时
if(dir != -1)
{
//人所推向的位置坐标
x = Pex + dx[dir]; y = Pey + dy[dir];
//人所推位置为空,即走向该位置
if(Check(x, y) GameMap[x][y] == '.')
{
GameMap[Pex][Pey] = '.'; //人的位置改变
GameMap[x][y] = 'P';
Pex = x; Pey = y;
dir = -1; //按键记录为无即-1
}
else //人所推位置为箱子,即将箱子推向该方向的前面这点
if(Check(x, y) GameMap[x][y] == '#'
Check(x+dx[dir], y+dy[dir])
GameMap[ x+dx[dir] ][ y+dy[dir] ] == '.')
{
GameMap[Boxx][Boxy] = '.'; //箱子的位置改变
GameMap[x+dx[dir] ][ y+dy[dir] ] = '#';
Boxx = x + dx[dir]; Boxy = y + dy[dir];
GameMap[Pex][Pey] = '.'; //人的位置改变
GameMap[x][y] = 'P';
Pex = x; Pey = y;
dir = -1;
}
else //将箱子推向该方向的前面这点为目的地
if(Check(x, y) GameMap[x][y] == '#'
Check(x+dx[dir], y+dy[dir])
GameMap[ x+dx[dir] ][ y+dy[dir] ] == 'T')
{
GameMap[Boxx][Boxy] = '.'; //箱子的位置改变
GameMap[x+dx[dir] ][ y+dy[dir] ] = '#';
Boxx = x + dx[dir]; Boxy = y + dy[dir];
GameMap[Pex][Pey] = '.'; //人的位置改变
GameMap[x][y] = 'P';
Pex = x; Pey = y;
dir = -1;
Succeed = 1; //记录成功到达目的地
}
}
}
//判断越界情况
bool Sokoban::Check(int x, int y)
{
if(x 0 || x = H || y 0 || y = L)
return 0;
else
return 1;
}
//*************************************************
Use_Sokoban.cpp
//*************************************************
#include iostream
#include "Sokoban.h"
using namespace std;
int main()
{
Sokoban s;
s.Initial();
return 0;
}
//*************************************************
求啊哈c 推箱子
我的可能可以帮到你
int main()
{
printf("现在玩一个新游戏,叫推箱子。");
system("pause");
system("cls");
printf("如果玩不过,或觉得太简单,请按t键跳过。。\n");
system("pause");
system("cls");
char a[50][50] = {
" ### ",
" #*# ",
" # # ",
"####0######",
"#* 0S 0 *#",
"#####0#####",
" # # ",
" #*# ",
" ### ",
};
int i, x, y, p, q;
char ch;
x = 4; y = 5; p = 1; q = 5;
while (1)
{
//打印图像
for (i = 0; i 10; i++)
{
puts(a[i]);
}
ch = _getch();//扫描键盘
//向下走。
if (ch == 's' || ch == 'S')
{
if (a[x + 1][y] == '#')//判断是否碰到墙
{
}
else if (a[x + 1][y] == '0')//判断是否碰到箱子
{
if (a[x + 2][y] == ' ')//判断箱子后面是不是空的
{
a[x][y] = ' ';
x++;
a[x][y] = 'S';
a[x + 1][y] = '0';
}
else if (a[x + 2][y] == '*')//箱子后面是否是*
{
a[x][y] = ' ';
x++;
a[x][y] = 'S';
a[x + 1][y] = '@';
}
}
else if (a[x + 1][y] == ' ')//判断前面是不是空的
{
a[x][y] = ' ';
x++;
a[x][y] = 'S';
}
}
if (ch == 'w' || ch == 'W')
{
if (a[x - 1][y] == '#')//判断是否碰到墙
{
}
else if (a[x - 1][y] == '0')//判断是否碰到箱子
{
if (a[x - 2][y] == ' ')//判断箱子后面是不是空的
{
a[x][y] = ' ';
x--;
a[x][y] = 'S';
a[x - 1][y] = '0';
}
else if (a[x - 2][y] == '*')//箱子后面是否是*
{
a[x][y] = ' ';
x--;
a[x][y] = 'S';
a[x - 1][y] = '@';
}
}
else if (a[x - 1][y] == ' ')//判断前面是不是空的
{
a[x][y] = ' ';
x--;
a[x][y] = 'S';
}
}
if (ch == 'd' || ch == 'D')
{
if (a[x][y + 1] == '#')//判断是否碰到墙
{
}
else if (a[x][y + 1] == '0')//判断是否碰到箱子
{
if (a[x][y + 2] == ' ')//判断箱子后面是不是空的
{
a[x][y] = ' ';
y++;
a[x][y] = 'S';
a[x][y + 1] = '0';
}
else if (a[x][y + 2] == '*')//箱子后面是否是*
{
a[x][y] = ' ';
y++;
a[x][y] = 'S';
a[x][y + 1] = '@';
}
}
else if (a[x][y + 1] == ' ')//判断前面是不是空的
{
a[x][y] = ' ';
y++;
a[x][y] = 'S';
}
}
if (ch == 'a' || ch == 'A')
{
if (a[x][y - 1] == '#')//判断是否碰到墙
{
}
else if (a[x][y - 1] == '0')//判断是否碰到箱子
{
if (a[x][y - 2] == ' ')//判断箱子后面是不是空的
{
a[x][y] = ' ';
y--;
a[x][y] = 'S';
a[x][y - 1] = '0';
}
else if (a[x][y - 2] == '*')//箱子后面是否是*
{
a[x][y] = ' ';
y--;
a[x][y] = 'S';
a[x][y - 1] = '@';
}
}
else if (a[x][y - 1] == ' ')//判断前面是不是空的
{
a[x][y] = ' ';
y--;
a[x][y] = 'S';
}
}
if (ch == 't' || ch == 'T')
{
break;
}
system("cls");
if (a[4][1] == '@'a[1][4] == '@'a[7][5] == '@'a[4][9] == '@')
{
printf("恭喜你过关了!!!!\n");
system("pause");
system("cls");
break;
}
}
system("cls");
}
安卓推箱子游戏代码的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于推箱子游戏代码JAVA、安卓推箱子游戏代码的信息别忘了在本站进行查找喔。
版权说明:如非注明,本站文章均为 AH站长 原创,转载请注明出处和附带本文链接;
- 上一篇:网页登录实现代码(web登录注册页面代码)
- 下一篇:包含日记本源代码的词条
相关推荐
- 05-17游戏推广平台代理,游戏推广代理赚钱吗
- 05-09百度游戏客服在线咨询,百度游戏客服在线咨询平台
- 05-09网页代码,网页代码快捷键
- 05-06单页网站的代码(完整的网页代码)[20240506更新]
- 05-06个人主页图片代码(个人主页图片代码怎么弄)[20240506更新]
- 05-06提取微信名片代码(微信名片信息提取)[20240506更新]
- 05-06php后台权限管理代码(php管理员权限)[20240506更新]
- 05-06付费观看代码php(付费观看代码)[20240506更新]
- 05-06在线html执行代码(html怎么运行)[20240506更新]
- 05-06源代码管理资源管理器(资源管理器运行代码)[20240506更新]
取消回复欢迎 你 发表评论:
- 标签列表
- 最近发表
- 友情链接