推箱子步数java代码 推箱子代码流程图

谁能给我一个C的推箱子游戏代码啊我刚学编程没多久也是自己写的啊,但我是用HGE游戏引擎写的,自己多想想,逻辑不太难的啊 。利用二维数组来编制地图就好 。
用C语言写推箱子游戏,怎样把每次的步数写进文件并比较的出最小步数我可以给你一些C操作文件的建议
写入文件使用fwrite()函数,
比较文件中各个数据的最小值,你可以逐个读出,在比较
下面是一个例子
#includestdio.h
int main()
{
FILE *fp;
int num[5]={10,20,50,40,60};
int i;
int number;
fp=fopen("Data","w");//打开Data文件,文件操作为写入
if(NULL==fp)//若打开失败,返回NULL
{
printf("Can't open the file\n");
return;
}
for(i=0;i5;i)//将num中的数据逐个写入
{
fwrite(num[i],sizeof(int),1,fp);
}
fclose(fp);//关闭文件
fp=fopen("Data","r");//重新打开 , 文件操作为读
while(fread(number,sizeof(int),1,fp)!=0) //逐个读取文件中的数据 , 并赋予number
printf("\n%d",number);//输出每个数据
fclose(fp);
}
求经典游戏推箱子的C(C)语言的源代码 游戏界面友好有背景音乐为佳#includestdio.h
#includestdlib.h
typedef struct ele{
int vno; /*物品号*/
struct ele *link; /*另一物品的指针*/
}ELE;
typedef struct hnode{
int remainder;/*箱子尚剩空间*/
ELE *head; /*箱内物品链首元指针*/
struct hnode *next;/*箱子链的后继箱子指针*/
}HNODE;
main()
{
int n,i,box_count,box_volume,*a;
HNODE *box_h,*box_t,*j;
ELE *p,*q;
printf("输入箱子容积 ");
scanf("%d",box_volume);
printf("输入物品种数 ");
scanf("%d",n);
a=(int *)malloc(sizeof(int )*n);/*存储物品体积信息的数组*/
printf( "请按体积大小顺序输入各物品的体积: ");
for(i=0;in;i)
scanf("%d",a i);
box_h=box_t=NULL; /*预置已用箱子链为空*/
box_count=0; /*预置已用箱子计数器为0*/
for(i=0;in;i)
{/*从第一只箱子开始顺序寻找能放入物品i 的箱子j*/
p=(ELE *)malloc(sizeof(ELE));
p-vno=i;
for(j=box_h;j!=NULL;j=j-next)
if(j-remainder=a[i ])
break;/*找到还可以装物品i的箱子*/
if(j==NULL)
{/*已用箱子都不能装物品i*/
j=(HNODE *)malloc(sizeof(HNODE));/*使用一只新的箱子*/
j-remainder=box_volume-a[i ];
j-head=NULL;
if(box_h==NULL)
box_h=box_t=j;/* box-t有什么用处,能解释一下吗?*/
else box_t=box_t-next=j; /*此外box-t又有什么用(在程序中),请说详一细*/
j-next=NULL;
box_count;
}
else
j-remainder=a[i ];/*将物品i放入箱子j*/
for(q=j-head;q!=NULLq-link!=NULL;q=q-link);/*从这里起是放入物品号*/
if(q==NULL)
{
p-link=j-head;
j-head=p;
}
else
{
p-link=NULL;
q-link=p;
}
}/*for i*/
}
c 推箱子问题先说说思路吧 。
从k处开始看起 。如果想让P进入k,必须要从与k相邻推箱子步数java代码的w处推入 。所以,展开分支 。最后一步推箱子步数java代码的p和m确定 。
下一步,p和m推箱子步数java代码的位置确定 。然后计算 , m是否可以和上一步推箱子步数java代码的m的位置连通,即可以到达 。
直至p回归到最初确定的地方 。m可以回到最初的地方 。则证明可解 。计算递归深度即为p移动步数 。
若有某一步不可解,则直接跳出递归,证明无解 。
问题是这里没证明是最优解 。那只能通过一个分支求出一个解,就记下步数,直到所有分支完成为止,记下最小的步数为最优解 。
求个推箱子的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] == Emptyx != 0y != 0
x != H-1y != 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; i4; i)
{
e.bx = s.bxdx[i];e.by = s.bydy[i];
switch(i) //人推箱子的位置
{
case 0:pe_x = s.bxdx[2]; pe_y = s.bydy[2]; break;
case 1:pe_x = s.bxdx[3]; pe_y = s.bydy[3]; break;
case 2:pe_x = s.bxdx[0]; pe_y = s.bydy[0]; break;
case 3:pe_x = s.bxdx[1]; pe_y = s.bydy[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 == ext.py == ey)//人可到达(ex,ey)该点
return 1;
for(int i = 0; i4; i)
{
end.px = t.pxdx[i];end.py = t.pydy[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_ts = clock();
while(clock() - sCLOCKS_PER_SEC/2)
;
//先判断按键在移动
Sokoban::Button();
Sokoban::Move();
system("cls");
for(i = 0; iH; i)
{
for(j = 0; jL; j)
coutGameMap[i][j];
coutendl;
}
coutendl;
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 = Pexdx[dir];y = Peydy[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 = xdx[dir];Boxy = ydy[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 = xdx[dir];Boxy = ydy[dir];
GameMap[Pex][Pey] = '.';//人的位置改变
GameMap[x][y] = 'P';
Pex = x;Pey = y;
dir = -1;
Succeed = 1;//记录成功到达目的地
}
}
}
//判断越界情况
bool Sokoban::Check(int x, int y)
{
if(x0 || x = H || y0 || 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语言推箱子代码Here you are!
编译通过 。
/* 推箱子游戏 */
#include dos.h
#include stdio.h
#include stdlib.h
#include ctype.h
#include conio.h
#include bios.h
#include alloc.h
/* 定义二维数组ghouse来记录屏幕上各点的状态,
其中:0表示什么都没有,'b'表示箱子 , 'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地 。*/
char ghouse[20][20];
/* 以下函数为直接写屏函数 , 很酷的函数哦!是我朋友告诉我的 。*/
char far *screen=(char far* )0xb8000000;
void putchxy(int y,int x,char ch,char fc,char bc)
{
screen[(x*160) (y1) 0]=ch;
screen[(x*160) (y1) 1]=(bc*16) fc;
}
/* 定义判断是否胜利的数据结构 */
typedef struct winer {
int x,y;
struct winer *p;
}winer;
/* 箱子位置的数据结构 */
typedef struct boxs {
int x,y;
struct boxs *next;
}boxs;
/* 在特定的坐标上画墙壁并用数组记录状态的函数 */
void printwall(int x,int y)
{
putchxy(y-1,x-1,219,MAGENTA,BLACK);
ghouse[x][y]='w';
}
/* 在特定的坐标上画箱子并用数组记录状态的函数 */
void printbox(int x,int y)
{
putchxy(y-1,x-1,10,WHITE,BLACK);
ghouse[x][y]='b';
}
/* 在特定的坐标上画目的地并用数组记录状态的函数 */
void printwhither1(int x,int y,winer **win,winer **pw)
{
winer *qw;
putchxy(y-1,x-1,'*',YELLOW,BLACK);
ghouse[x][y]='m';
if(*win==NULL)
{
*win=*pw=qw=(winer* )malloc(sizeof(winer));
(*pw)-x=x;(*pw)-y=y;(*pw)-p=NULL;
}
else
{
qw=(winer* )malloc(sizeof(winer));
qw-x=x;qw-y=y;(*pw)-p=qw;(*pw)=qw;qw-p=NULL;
}
}
/* 在特定的坐标上画目的地并用数组记录状态的函数 */
void printwhither(int x,int y)
{
putchxy(y-1,x-1,'*',YELLOW,BLACK);
ghouse[x][y]='m';
}
/* 在特定的坐标上画人的函数 */
void printman(int x,int y)
{
gotoxy(y,x);
_AL=02;_CX=01;_AH=0xa;
geninterrupt(0x10);
}
/* 在特定的坐标上画箱子在目的地上并用数组记录状态的函数 */
void printboxin(int x,int y)
{
putchxy(y-1,x-1,10,YELLOW,BLACK);
ghouse[x][y]='i';
}
/* 初始化函数,初始化数组和屏幕 */
void init()
{
int i,j;
system("cls");
for(i=0;i20;i)
for(j=0;j20;j)
ghouse[i][j]=0;
_AL=3;
_AH=0;
geninterrupt(0x10);
gotoxy(40,4);
printf("Welcome to push box world!");
gotoxy(40,6);
printf("Press up,down,left,right to play.");
gotoxy(40,8);
printf("Press Esc to quit it.");
gotoxy(40,10);
printf("Press space to reset the game.");
gotoxy(40,12);
printf("April 30th 2004.");
}
/* 第一关的图象初始化 */
winer *inithouse1()
{
int x,y;
winer *win=NULL,*pw;
gotoxy(8,2);
printf("Level No.1");
for(x=1,y=5;y=9;y)
printwall(x 4,y 10);
for(y=5,x=2;x=5;x)
printwall(x 4,y 10);
for(y=9,x=2;x=5;x)
printwall(x 4,y 10);
for(y=1,x=3;x=8;x)
printwall(x 4,y 10);
for(x=3,y=3;x=5;x)
printwall(x 4,y 10);
for(x=5,y=8;x=9;x)
printwall(x 4,y 10);
for(x=7,y=4;x=9;x)
printwall(x 4,y 10);
for(x=9,y=5;y=7;y)
printwall(x 4,y 10);
for(x=8,y=2;y=3;y)
printwall(x 4,y 10);
printwall(5 4,4 10);
printwall(5 4,7 10);
printwall(3 4,2 10);
printbox(3 4,6 10);
printbox(3 4,7 10);
printbox(4 4,7 10);
printwhither1(4 4,2 10,win,pw);
printwhither1(5 4,2 10,win,pw);
printwhither1(6 4,2 10,win,pw);
printman(2 4,8 10);
return win;
}
/* 第三关的图象初始化 */
winer *inithouse3()
{int x,y;
winer *win=NULL,*pw;
gotoxy(8,3);
printf("Level No.3");
for(x=1,y=2;y=8;y)
printwall(x 4,y 10);
for(x=2,y=2;x=4;x)
printwall(x 4,y 10);
for(x=4,y=1;y=3;y)
printwall(x 4,y 10);
for(x=5,y=1;x=8;x)
printwall(x 4,y 10);
for(x=8,y=2;y=5;y)
printwall(x 4,y 10);
for(x=5,y=5;x=7;x)
printwall(x 4,y 10);
for(x=7,y=6;y=9;y)
printwall(x 4,y 10);
for(x=3,y=9;x=6;x)
printwall(x 4,y 10);
for(x=3,y=6;y=8;y)
printwall(x 4,y 10);
printwall(2 4,8 10);
printwall(5 4,7 10);
printbox(6 4,3 10);
printbox(4 4,4 10);
printbox(5 4,6 10);
printwhither1(2 4,5 10,win,pw);
printwhither1(2 4,6 10,win,pw);
printwhither1(2 4,7 10,win,pw);
printman(2 4,4 10);
return win;
}
/* 第二关的图象初始化 */
winer *inithouse2()
{int x,y;
winer *win=NULL,*pw;
gotoxy(8,2);
printf("Level No.2");
for(x=1,y=4;y=7;y)
printwall(x 4,y 10);
for(x=2,y=2;y=4;y)
printwall(x 4,y 10);
for(x=2,y=7;x=4;x)
printwall(x 4,y 10);
for(x=4,y=1;x=8;x)
printwall(x 4,y 10);
for(x=8,y=2;y=8;y)
printwall(x 4,y 10);
for(x=4,y=8;x=8;x)
printwall(x 4,y 10);
for(x=4,y=6;x=5;x)
printwall(x 4,y 10);
for(x=3,y=2;x=4;x)
printwall(x 4,y 10);
for(x=4,y=4;x=5;x)
printwall(x 4,y 10);
printwall(6 4,3 10);
printbox(3 4,5 10);
printbox(6 4,6 10);
printbox(7 4,3 10);
printwhither1(5 4,7 10,win,pw);
printwhither1(6 4,7 10,win,pw);
printwhither1(7 4,7 10,win,pw);
printman(2 4,6 10);
return win;
}
/* 第四关的图象初始化 */
winer *inithouse4()
{int x,y;
winer *win=NULL,*pw;
gotoxy(8,2);
printf("Level No.4");
for(x=1,y=1;y=6;y)
printwall(x 4,y 10);
for(x=2,y=7;y=8;y)
printwall(x 4,y 10);
for(x=2,y=1;x=7;x)
printwall(x 4,y 10);
for(x=7,y=2;y=4;y)
printwall(x 4,y 10);
for(x=6,y=4;y=9;y)
printwall(x 4,y 10);
for(x=3,y=9;x=5;x)
printwall(x 4,y 10);
for(x=3,y=3;y=4;y)
printwall(x 4,y 10);
printwall(3 4,8 10);
printbox(3 4,5 10);
printbox(4 4,4 10);
printbox(4 4,6 10);
printbox(5 4,5 10);
printbox(5 4,3 10);
printwhither1(3 4,7 10,win,pw);
printwhither1(4 4,7 10,win,pw);
printwhither1(5 4,7 10,win,pw);
printwhither1(4 4,8 10,win,pw);
printwhither1(5 4,8 10,win,pw);
printman(2 4,2 10);
return win;
}
/* 移动在空地上的箱子到空地上 */
movebox(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]=0;printf(" ");
printbox(x-2,y);printman(x-1,y);
ghouse[x-2][y]='b';break;
case 'd':ghouse[x 1][y]=0;printf(" ");
printbox(x 2,y);printman(x 1,y);
ghouse[x 2][y]='b';break;
case 'l':ghouse[x][y-1]=0;printf(" ");
printbox(x,y-2);printman(x,y-1);
ghouse[x][y-2]='b';break;
case 'r':ghouse[x][y 1]=0;printf(" ");
printbox(x,y 2);printman(x,y 1);
ghouse[x][y 2]='b';break;
default: break;
}
}
/* 移动在目的地上的箱子到空地上 */
moveinbox(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]='m';printf(" ");
printbox(x-2,y);printman(x-1,y);
ghouse[x-2][y]='b';break;
case 'd':ghouse[x 1][y]='m';printf(" ");
printbox(x 2,y);printman(x 1,y);
ghouse[x 2][y]='b';break;
case 'l':ghouse[x][y-1]='m';printf(" ");
printbox(x,y-2);printman(x,y-1);
ghouse[x][y-2]='b';break;
case 'r':ghouse[x][y 1]='m';printf(" ");
printbox(x,y 2);printman(x,y 1);
ghouse[x][y 2]='b';break;
default: break;
}
}
/* 移动在空地上的箱子到目的地上 */
moveboxin(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]=0;printf(" ");
printboxin(x-2,y);printman(x-1,y);
ghouse[x-2][y]='i';break;
case 'd':ghouse[x 1][y]=0;printf(" ");
printboxin(x 2,y);printman(x 1,y);
ghouse[x 2][y]='i';break;
case 'l':ghouse[x][y-1]=0;printf(" ");
printboxin(x,y-2);printman(x,y-1);
ghouse[x][y-2]='i';break;
case 'r':ghouse[x][y 1]=0;printf(" ");
printboxin(x,y 2);printman(x,y 1);
ghouse[x][y 2]='i';break;
default: break;
}
}
/* 移动在目的地上的箱子到目的地 */
moveinboxin(int x,int y,char a)
{switch(a)
{
case 'u':ghouse[x-1][y]='m';printf(" ");
printboxin(x-2,y);printman(x-1,y);
ghouse[x-2][y]='i';break;
case 'd':ghouse[x 1][y]='m';printf(" ");
printboxin(x 2,y);printman(x 1,y);
ghouse[x 2][y]='i';break;
case 'l':ghouse[x][y-1]='m';printf(" ");
printboxin(x,y-2);printman(x,y-1);
ghouse[x][y-2]='i';break;
case 'r':ghouse[x][y 1]='m';printf(" ");
printboxin(x,y 2);printman(x,y 1);
ghouse[x][y 2]='i';break;
default: break;
}
}
/* 判断特定的坐标上的状态 */
int judge(int x,int y)
{int i;
switch(ghouse[x][y])
{
case 0: i=1;break;
case 'w': i=0;break;
case 'b': i=2;break;
case 'i': i=4;break;
case 'm': i=3;break;
default: break;
}
return i;
}
/* 处理按下键盘后,人物移动的主函数 */
move(int x,int y,char a)
{switch(a)
{
case 'u':if(!judge(x-1,y)) {gotoxy(y,x);break;}
else if(judge(x-1,y)==1||judge(x-1,y)==3)
{if(judge(x,y)==3)
{ printwhither(x,y);printman(x-1,y);break;}
else
{printf(" ");printman(x-1,y);break;}
}
else if(judge(x-1,y)==2)
{ if(judge(x-2,y)==1)
{movebox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else if(judge(x-2,y)==3)
{ moveboxin(x,y,'u');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y,x-1);
}
else gotoxy(y,x);
break;
}
else if(judge(x-1,y)==4)
{ if(judge(x-2,y)==1)
{moveinbox(x,y,'u');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
}
else if(judge(x-2,y)==3)
{ moveinboxin(x,y,'u');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x-1);
}
else gotoxy(y,x);
break;
}
case 'd':if(!judge(x 1,y)) {gotoxy(y,x);break;}
else if(judge(x 1,y)==1||judge(x 1,y)==3)
{if(judge(x,y)==3)
{ printwhither(x,y);printman(x 1,y);break;}
else
{printf(" ");printman(x 1,y);break;}
}
else if(judge(x 1,y)==2)
{ if(judge(x 2,y)==1)
{movebox(x,y,'d');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x 1);
}
else if(judge(x 2,y)==3)
{moveboxin(x,y,'d');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x 1);
}
else gotoxy(y,x);
break;
}
else if(judge(x 1,y)==4)
{ if(judge(x 2,y)==1)
{moveinbox(x,y,'d');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x 1);
}
else if(judge(x 2,y)==3)
{moveinboxin(x,y,'d');
if(judge(x,y)==3) printwhither(x,y);gotoxy(y,x 1);
}
else gotoxy(y,x);
break;
}
case 'l':if(!judge(x,y-1)) {gotoxy(y,x);break;}
else if(judge(x,y-1)==1||judge(x,y-1)==3)
{if(judge(x,y)==3)
{ printwhither(x,y);printman(x,y-1);break;}
else
{printf(" ");printman(x,y-1);break;}
}
else if(judge(x,y-1)==2)
{ if(judge(x,y-2)==1)
{movebox(x,y,'l');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);
}
else if(judge(x,y-2)==3)
{moveboxin(x,y,'l');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);
}
else gotoxy(y,x);
break;
}
else if(judge(x,y-1)==4)
{ if(judge(x,y-2)==1)
{moveinbox(x,y,'l');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);
}
else if(judge(x,y-2)==3)
{moveinboxin(x,y,'l');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y-1,x);
}
else gotoxy(y,x);
break;
}
case 'r':if(!judge(x,y 1)) {gotoxy(y,x);break;}
else if(judge(x,y 1)==1||judge(x,y 1)==3)
{if(judge(x,y)==3)
{printwhither(x,y);printman(x,y 1);break;}
else
{printf(" ");printman(x,y 1);break;}
}
else if(judge(x,y 1)==2)
{ if(judge(x,y 2)==1)
{movebox(x,y,'r');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y 1,x);
}
else if(judge(x,y 2)==3)
{moveboxin(x,y,'r');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y 1,x);
}
else gotoxy(y,x);
break;
}
else if(judge(x,y 1)==4)
{ if(judge(x,y 2)==1)
{moveinbox(x,y,'r');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y 1,x);
}
else if(judge(x,y 2)==3)
{moveinboxin(x,y,'r');
if(judge(x,y)==3) printwhither(x,y); gotoxy(y 1,x);
}
else gotoxy(y,x);
break;
}
default: break;
}
}
/* 按下空格键后,回到本关开头的函数 */
void reset(int i)
{switch(i)
{
case 0: init();
inithouse1();break;
case 1: init();
inithouse2();break;
case 2: init();
inithouse3();break;
case 3: init();
inithouse4();break;
default:break;
}
}
/* 主函数main */
main()
{int key,x,y,s,i=0;
winer *win,*pw;
_AL=3;_AH=0;
geninterrupt(0x10);
init();
win=inithouse1();
do{
_AH=3;
geninterrupt(0x10);
x=_DH 1;y=_DL 1;
while(bioskey(1)==0);
key=bioskey(0);
switch(key)
{
case 0x4800:move(x,y,'u');break; /* 按下向上键后 */
case 0x5000:move(x,y,'d');break; /* 按下向下键后 */
case 0x4b00:move(x,y,'l');break; /* 按下向左键后 */
case 0x4d00:move(x,y,'r');break; /* 按下向右键后 */
case 0x3920:reset(i);break; /* 按下空格键后 */
default:break;
}
s=0;
pw=win;
while(pw)
{
if(ghouse[pw-x][pw-y]=='m') s;
pw=pw-p;
}
if(s==0)
{
free(win);
gotoxy(25,2);
printf("Congratulate! You have passed Level %d!",i 1);
getch();
i;
switch(i)
{
case 1: init();
win=inithouse2();break;
case 2: init();
win=inithouse3();break;
case 3: init();
win=inithouse4();break;
case 4: gotoxy(8,14);
printf("Great! You have passed all the levels! Press any key to quit!");
key=0x011b;getch();break;
default: break;
}
}
}while(key!=0x011b);
_AL=3;
_AH=0;
geninterrupt(0x10);
}
【推箱子步数java代码 推箱子代码流程图】关于推箱子步数java代码和推箱子代码流程图的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。

    推荐阅读