推箱子总结完整(附有源代码)

推箱子总结完整(附有源代码)
推箱子总结完整(附有源代码)

推箱子复习总结

推箱子基本概括思路:

/* 定义二维数组ghouse来记录屏幕上各点的状态,

其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。*/

1.人物设置:即在特定的坐标将人画出。

(1)1个,在ghouse数组中特定的坐标点用printman函数画出小人:如

/* 在特定的坐标上画人的函数*/

void printman(int x,int y)

{

gotoxy(y,x);

_AL=02;_CX=01;_AH=0xa;

geninterrupt(0x10);

}

printman(2+4,4+10);/* 在特定的坐标上画人*/

2.箱子设置:在特定的坐标点画出箱子,并写下'b'

箱子:3个,

在ghouse数组中特定的三个坐标设置三个箱子并由printbox函数给箱子写下'b':如

/* 在特定的坐标上画箱子并用数组记录状态的函数*/

void printbox(int x,int y)

{

putchxy(y-1,x-1,10,WHITE,BLACK); /*设置箱子,样式10,前景色白色,背景色黑色*/ ghouse[x][y]='b';

}

printbox(3+4,6+10); /*在特定的坐标点写下箱子*/

printbox(3+4,7+10);

printbox(4+4,7+10);

3.墙壁设置:在ghouse数组中画出墙壁,并写下'w'

在ghouse数组中画出墙壁,并用printwall函数写下'w':如

(通过for循环实现)

/* 在特定的坐标上画墙壁并用数组记录状态的函数*/

void printwall(int x,int y)

{

putchxy(y-1,x-1,219,MAGENTA,BLACK);

/*x,y,219 样式参数,MAGENTA前景色,BLACK 背景色(x,y初始值为1,所以减1)*/ ghouse[x][y]='w';

}

for(x=1,y=5;y<=9;y++)/*初始化墙壁,根据printwall函数设置墙,重点:写上‘w’*/ 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);

4.目的地的设置:通过特定的坐标点画出目的地,并写下'm',并用链表与ghouse数组记录目的地的信息,用链表记录目的地在ghouse数字组中位置(下标)

目的地:3个,在ghouse函数中在特定的三个坐标点画出目的地,并用printwhither1函数写下'm'并记录记录'm':如//目的地的坐标是由链表记录的,6个值表示坐标,由三个节点的链表来记录

/* 在特定的坐标上画目的地并用数组记录状态的函数*/

winer *qw;

putchxy(y-1,x-1,'*',YELLOW,BLACK);

ghouse[x][y]='m';

if(*win==NULL) /*刚输入时*win==null,if语句执行,将第一个目的地存入第一节点*/ {

*win=*pw=qw=(winer* )malloc(sizeof(winer));

(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL; /* -> 结构体成员符*/

}

else /*存入信息后执行else语句,将链表进行连接*/

{

qw=(winer* )malloc(sizeof(winer));

qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL;

}

5.关卡设置:初始化箱子、目的地、墙壁、小人:通过for循环与printman,printbox,printwhither1,printwall函数的调用进行初始化:如(其他三关同理)

/* 第一关的图象初始化*/

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函数设置墙,重点:写上‘w’*/ 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); /*在特定的坐标点画箱子,并写下'b'*/

printbox(3+4,7+10);

printbox(4+4,7+10);

printwhither1(4+4,2+10,&win,&pw); /* 在特定的坐标上画目的地,写下'm'并用数组记录状态*/

printwhither1(5+4,2+10,&win,&pw);

printwhither1(6+4,2+10,&win,&pw);

printman(2+4,8+10); /* 在特定的坐标上画人*/

return win;

}

6.箱子的下一个位置的情况:/* 在特定的坐标上画箱子在目的地上并用数组记录状态的函数*/

1)下一个位置是目的地,空地:当下一个位置为目的地时写下'i',当下一个位置为空地时写下'b',并擦去原位置的状态(将原位置ghouse数组==0)如

/* 移动在空地上的箱子到空地上*/

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;

}

}

2)下一个位置是箱子:如果上面是箱子则有b标记,两个b相撞则不能移动

3)下一个位置是箱子或墙壁:b与b,b与w相碰则不能移动

2),3)例子

case 'u':if(!judge(x-1,y)) {gotoxy(y,x);break;} /*(1)人的上面是墙*/

else if(judge(x-1,y)==1||judge(x-1,y)==3) /*(2)人的上面是空地或是目的地*/ {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); /*else 情况则包括箱子的下一个状态是箱子或箱子的下一个状态是障碍物(箱子或墙壁)*/

break;

}

7./* 按下空格键后,回到本关开头的函数*/ 如何实现的

1)当按下空格键时返回一个i的值

2)调用/* 初始化函数,初始化数组和屏幕*/

3)调用关卡函数如inithouse1()进行重新开始

/* 按下空格键后,回到本关开头的函数*/

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;

}

}

8.主函数设计:

1)首先定义了一些变量和指针,然后初始化数组、屏幕和第一关

main()

{int key,x,y,s,i=0;

winer *win,*pw;

_AL=3;_AH=0;

geninterrupt(0x10);

init(); /* 初始化函数,初始化数组和屏幕*/

win=inithouse1(); /*设置第一关win指针接收inithouse1返回的图像*/

2)设计了一个大的do,while循环条件:重点:是本游戏的主要部分

do{

_AH=3;

geninterrupt(0x10);

x=_DH+1;y=_DL+1;

while(bioskey(1)==0);

key=bioskey(0); /*bioskey 从键盘上返回数值*/

switch(key)

{

case 0x4800:move(x,y,'u');break; /* 按下向上键后*/

case 0x5000:move(x,y,'d');break; /* 按下向下键后*/

case 0x4b00:move(x,y,'l');break; /* 按下向左键后*/

case 0x3920:reset(i);break; /* 按下空格键后*/

default:break;

}

s=0; /**switch 每执行一次就触发一次判断**/

pw=win;

while(pw)

{

if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地)能和i(箱子在目的地)进行转换*/

pw=pw->p;

}

if(s==0) /* 过关*/

{

free(win);

gotoxy(25,2);

printf("Congratulate! Y ou 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! Y ou 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);

}

3)do循环首先设计了一个while 死循环,接收键盘信息,在进行switch循环将得到的键盘码进行操作(输入的键盘码在case语句中时)

while(bioskey(1)==0);

key=bioskey(0); /*bioskey 从键盘上返回数值*/

switch(key)

{

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;

}

4)接下来又有一个while循环,作用:触发判断和判断是否过关。

原理:目的地只有两个时刻:'m','i'

当有'm'时进行s++,当没有m时,从而执行if(s==0)语句进行判断过关

过关之后进行i++,执行switch语句选关或执行语句

s=0; /**switch 每执行一次就触发一次判断**/

pw=win;

while(pw)

{

if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地)能和i(箱子在目的地)进行转换*/

pw=pw->p;

}

if(s==0) /* 过关*/

{

free(win);

gotoxy(25,2);

printf("Congratulate! Y ou 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! Y ou have passed all the levels! Press any key to quit!");

key=0x011b;getch();break;

default: break;

}

}

9链表的作用:/* 在特定的坐标上画目的地并用数组记录状态的函数*/

/* 在特定的坐标上画目的地并用数组记录状态的函数*/

winer *qw;

putchxy(y-1,x-1,'*',YELLOW,BLACK);

ghouse[x][y]='m';

if(*win==NULL) /*刚输入时*win==null,if语句执行,将第一个目的地存入第一节点*/ {

*win=*pw=qw=(winer* )malloc(sizeof(winer));

(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL; /* -> 结构体成员符*/

}

else /*存入信息后执行else语句,将链表进行连接*/

{

qw=(winer* )malloc(sizeof(winer));

qw->x=x;qw->y=y;(*pw)->p=qw;(*pw)=qw;qw->p=NULL;

}

}

10.judge 判断特定的坐标上的状态,根据ghouse得到的状态返回特定的值

/*记录3坐标点,从而在ghouse中进行访问,switch中才会返回出w、b、i、m相对应的值*/

/* 判断特定的坐标上的状态*/

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;

}

11.如何触发判断与如何判断过关

(1)如何触发判断,只要有移动就触发

有M变为I时:如

s=0;

pw=win;

while(pw)

{

if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地)能和i(箱子在目的地)进行转换*/

pw=pw->p;

}

解析:通过链表对其处理,当有'm'时,s++,从而知道有多少个‘m’

(2)如何判断过关:当所有的M变为I时,即S==0过关

s=0;

pw=win;

while(pw)

{

if(ghouse[pw->x][pw->y]=='m') s++; /* m(目的地)能和i(箱子在目的地)进行转换*/

pw=pw->p;

}

if(s==0) /* 过关条件*/

{

free(win);

gotoxy(25,2);

printf("Congratulate! Y ou have passed Level %d!",i+1);

getch();

12如何与键盘结合:通过while,bioskey,switch的结合接收键盘信息和对操作的处理:如while(bioskey(1)==0);

key=bioskey(0); /*bioskey 从键盘上返回数值*/

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;

}

#include

#include

#include

#include

#include

#include

#include

/* 定义二维数组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)+(y<<1)+0]=ch;

screen[(x*160)+(y<<1)+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); /*x,y,219 样式参数,MAGENTA前景色,BLACK 背景色(x,y初始值为1,所以减1)*/

ghouse[x][y]='w';

}

/* 在特定的坐标上画箱子并用数组记录状态的函数*/

void printbox(int x,int y)

{

putchxy(y-1,x-1,10,WHITE,BLACK); /*设置箱子,样式10,前景色白色,背景色黑色*/

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==null,if语句执行,将第一个目的地存入第一节点*/

*win=*pw=qw=(winer* )malloc(sizeof(winer));

(*pw)->x=x;(*pw)->y=y;(*pw)->p=NULL; /* -> 结构体成员符*/

}

else /*存入信息后执行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;i<20;i++)

for(j=0;j<20;j++)

ghouse[i][j]=0;

_AL=3;

_AH=0;

geninterrupt(0x10); /*中断*/ gotoxy(40,4);

printf("Welcome to game home!");

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函数设置墙,重点:写上‘w’*/ 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;

}

}

/*记录3坐标点,从而在ghouse中进行访问,switch中才会返回出w、b、i、m相对应的值*/

/* 判断特定的坐标上的状态*/

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;} /*(1)人的上面是墙*/

else if(judge(x-1,y)==1||judge(x-1,y)==3) /*(2)人的上面是空地或是目的地*/ {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;

推箱子程序设计报告

程序设计报告 推 箱 子 通信学院 电子信息1204工程班 1207050420 郝国成 一.设计思路 推箱子游戏是一款很有趣味的游戏,其开发过程有一定的技

巧和方法,其中涉及到二维数组、键盘操作以及图形化函数等方面的知识。 设计推箱子这个游戏,目的是将箱子推到指定的空位,以完成游戏。 首先,要在窗口上,绘制地图,画出墙和草地。 然后,要保证人和箱子可以移动,这个就用到了case WM_KEYDOWN函数去控制了。 下来,就是要制定游戏规则,根据游戏规则,箱子可以在空地之间、目的地之间、空地和目的地之间来回移动,。 最后,把全部箱子移动到指定位置才算完成本次游戏,因此箱子每移动一次都必须判断全部箱子当前位置是否到达指定坐标。 而且,只要游戏没有结束,就没有时间的限制。 大体思路确定以后就是要去怎么做,怎么去实现自己的想法。 我是采用二维数组绘制地图的原理,把资源图片一张张绘制到窗口DC上,然后记录人物资源的坐标,通过方向键响应,改变人物坐标,达到控制人物移动的目的。箱子也同样是这个道理。 想好思路以后,就是动手写代码。这期间我又认识了好多新的Windows的函数,不断的修改,使我更能深刻理解到WIN 32 的作用,收获很大。 二.部分代码 // 推箱子.cpp : Defines the entry point for the application. #include "stdafx.h" #include "resource.h" //#include "mmsystem.h"//导入声音头文件

//#pragma comment(lib,"winmm.lib")//导入声音头文件库 #define MAX_LOADSTRING 100 #define width 48 #define heigth 48 typedefstruct { int x; int y; }point; char map1[10][10]= //地图二维数组 { " ####", " ### @#", " # b #", " ## # ###", " # # #*#", " # # b*#", " # b *#", " ########", " " }; char map2[10][10]= //地图二维数组 { "nnnn#####", "nnnn# @#", "###n#bb #", "#*#n# b #", "#*### ###", "#* ##n", "# # #n", "#### #", "nnn#####", " " }; staticintbStarted=0; int a = 0; intaimnum_qj=0; intaimnum=0; intboxoknum_qj=0; charmap_mid[10][10]; char map[10][10];

推箱子游戏报告书

推箱子游戏设计报告书 一、项目背景 本实训要求对“推箱子游戏”进行分析、设计。 本实训对实训项目已经作了较为详细的分析及相关知识讲解,通过实训,促使专业技能得到综合训练,让我们了解软件开发基本技术和工作过程。同时,本实训中了解图形界面设计基本技术。 通过本系统的开发,要了解软件开发的整个过程,掌握软件开发的基本方法,提前培养从事软件行业应具备的基本素质和能力,为以后的学习作一个铺垫。 二、设计目的 本课程的课程设计实际是重在提升学生对程序的理解力和游戏界面的设计能力,进行的一次全面的综合训练,其目的在于加深动手能力以及对游戏设计思想的理解,掌握运用VB 开发应用程序的基本方法及基本技巧。 三、游戏介绍 本游戏设计了关卡设计器对有难度进行设计,同时用方向键↑↓←→控制小人的移动,空格重新开始,回车选择下一关,page up 上一关,page down 下一关,Esc 退回。小人移动来推箱子使箱子到达指定位置,如果箱子全部到达指定位置就表示过关 3.1界面设计 3.1.1界面设计原则: 1用户帮助 2向导 3快捷键 4鼠标与键盘对应 5布局合理化 6显示信息一致性 7界面一致性 8美观与协调性 9合理性 10规范性 11易用性 12一般交互 13数据输入 本游戏是一个简单游戏所以只涉及一些简单的界面设计原则.

3.2用户界面 又称人机界面,实现用户与计算机之间的通信,以控制计算机或进行用户与计算机之间的数据传送的系统部件。 GUI:即图形用户界面,一种可视化的用户界面,它使用图形界面代替正文界面。 本系统坚持图形用户界面(GUI)设计原则,界面直观、对用户透明。用户接触软件后对界面上对应的功能一目了然、不需要多少培训就可以方便地使用本应用系统。

基于VC++的推箱子游戏设计与实现

本科毕业设计(论文) 基于VC++的推箱子游戏设计与实现 学院自动化学院 专业电子信息科学与技术 年级班别2008级(2)班 学号3108001166 学生姓名吕文财 指导教师 ________张学习 ___ __ 2012年6月

基于 VC++ 的推箱子游戏的设计与实现 吕文财 自动化学院

摘要 近年来随着科技的飞速发展, Visual C++语言的应用正在不断深入。Visual C++语言是当今国际上非常流行的计算机高级编程语言之一,它是面向对象的可视化集成编程系统。它不但具有程序框架自动生成、灵活方便的类管理、代码编写和界面设计集成交互操作、可开发多种程序等优点,而且通过简单的设置就可使其生成的程序框架支持数据库接口、OLE2,WinSock网络、3D控制界面。它更以自动编译功能和高级除错功能著称。因此,广泛受到编程人员青睐。不仅适合作为系统描述语言,也用来编写系统软件,还可以用来编写应用软件和设计游戏等。 本论文着重分析用Microsoft Visual C++语言实现一个较为简单的推箱子游戏,旨在介绍推箱子游戏的实现方法,并逐步介绍Microsoft Visual C++6.0图形编程的方法和技巧。本设计通过主界面对话框类、关口选择对话框类、帮助对话框类三大类以及键盘操作模块、游戏规则模块、地图文件读取模块、背景音乐播放模块、地图绘制模块,共五大模块构成。实现了任意关数选择、难度依次加大、游戏步数记录、背景音乐播放、游戏帮助、胜负判断等多个功能,采用图形函数的使用实现了一个完整的推箱子游戏界面,界面清晰可见。 关键词:推箱子,c++语言,模块,图形编程

推箱子java代码

import java.util.*; import java.io.*; public class Main{ int r;//地图行数 int c;//地图列数 int begx, begy;//箱子开始坐标 int endx, endy;//目标坐标 int begsx, begsy;//人开始坐标 char map[][];//地图 int[] dx ={-1, 1, 0, 0};//人和箱子都有四个方向可移动 int[] dy ={0, 0, 1, -1}; char[] P ={'N', 'S', 'E', 'W'};//表示箱子向某个方向移动 char[] M ={'n', 's', 'e', 'w'};//表示人向某个方向移动 Node f=new Node(0,0,0,0,""); Node g=new Node(0,0,0,0,""); node1 F=new node1(0,0,""); node1 G=new node1(0,0,""); int mark[][];//标志数组,表示地图上某一位置mark[i][j]是否访问过。 public Main(char[][] map,int r,int c,int begx,int begy,int endx,int endy,int begsx,int begsy){ this.map=map; this.r=r; this.c=c; this.begx=begx; this.begy=begy; this.endx=endx; this.endy=endy; this.begsx=begsx; this.begsy=begsy; mark=new int[r][c]; } public boolean ok(int x,int y) { if (x >= 0 && x < r && y >= 0 && y < c) return true; return false; } public boolean SToB(int bx,int by,int ex, int ey) {//人到箱子BFS int[][] Mark1= new int[r][c]; //标志数组,表示地图上某一位置Mark1[i][j]是否访问过。 Queue P = new LinkedList();

c语言推箱子代码

#include #include void map1(); void map2(); void map3(); void show(); void move(); void main(int argc,char*argv[]) { time_t a,b; time(&a); system("color 1E"); loop1: { system("cls");//刷屏 printf("\n\n\n\n\n\n\t\t\t\t欢迎进入推箱子游戏\n\n\t\t\t\t 请按a b c选择游戏\n\n\t\t\t\t 按 d 键结束"); int t=getch(); if(t=='d') { printf("\n\t\t\t "); } else { if(t=='a') { map1(); goto loop1; } if(t=='b') { map2(); goto loop1; } if(t=='c') { map3(); goto loop1; } else { printf("\n\n\t\t\t\t 请重新输入:"); goto loop1; } }

time(&b); printf("\n\n\n\n\t\t\t\t 游戏总共用时%.3d秒\n\t\t\t ",b-a); getch();//等待读取回车符以结束程序 } void map1() { time_t p,q,o; time(&p); int i=4,j=4,m=6,n=2,t=1,k=3; system("cls");//刷屏 system("color 2E"); int x=1,y=7; char z,a[9][9]= { /*为背景设置初始资料*/ {'#','#','#','#','#','#','#','#','#'}, {'#','#','#', 3, 0 , 0 , 0 , 1 ,'#'}, {'#','#', 0 , 0 , 0 ,'#', 0 ,'#','#'}, {'#', 0 , 0 ,'#', 0 , 0 , 5 , 0 ,'#'}, {'#', 0 , 5 , 5 , 3 , 0 , 0 , 0 ,'#'}, {'#','#', 0 ,'#', 0 , 0 ,'#','#','#'}, {'#','#', 3 , 0 , 0 , 0 ,'#','#','#'}, {'#','#','#','#','#','#','#','#','#'}, {'#','#','#','#','#','#','#','#','#'} }; show(a);//调用输出函数 loop://语句标号 move(a,&x,&y,i,j,m,n,t,k,&z); if(a[i][j]=='!'&&a[m][n]=='!'&&a[t][k]=='!') { system("cls");//刷屏 show(a); printf("\t\t\t\t YOU ARE WIN!\n"); time(&q); printf("\t\t\t\t\t 用时%.3d秒\n",q-p); printf("\t\t\t\t*******回车重新选择*******\n\t\t\t\t"); getch(); } else { time(&o); if(z=='d') { return;

JAVA推箱子游戏

淮海工学院计算机工程学院 课程设计报告 设计名称:面向对象课程设计 选题名称:推箱子的设计与实现 系(院):计算机工程学院 设计时间:2014.3.10~2014.4.12 设计地点:软件实验室、教室

(3)功能模块 本程序包括四个功能模块:class mainFrame,class mainpanel,class Sound,class Readmap, 既主面板类,绘图的面板,播放背景音乐,用输入流读取地图文件。class mainpanel 主要是实现地图的初始化以及每一关地图的重载,class Sound主要是播放背景音乐。Adpressed的功能是响应工人和箱子的移动以及工人、箱子、墙之间的碰撞检测。 表1 成员变量表 成员变量变量类型名称 开始状态Boolean Start 窗口高度int fHeight 窗口宽度int fWidth 计时器Timer timer 延时int delay 开始时间Date starttime 步数int steps 地图容器MapPanel mapPanel 玩法介绍String instruction 开始状态Boolean Start 表2方法表 方法名功能备注 Puzzle() 创建游戏窗口和设置图标 backaction() 后台操作getmap() 返回地图的方法 StartGame() 开始游戏控制,更新开始菜单 endgame() 结束游戏控制弹出结束窗口 getmap()/ 返回地图的方法调用类spite() menuShowClik() 在游戏中显示完整图片调用类class ShowImage actionPerformed() 动作演示 menuExit() 退出游戏 flush() 清空缓存 游戏过程设计 游戏中过程中,最为主要地方在于对地图矩阵,以及主角状态信息(包括位置、行走状态等)的维护,主角每行走一步,就更新一次地图信息和主角状态信息。另外一个比较重要的地方是游戏状态的保存方面。在该游戏中,使用栈结构保存主角每次行走的

推箱子游戏攻略.pdf

第一关: 直接将箱子推向钱币处就完成任务,此关是给大家一个基础练习,知道先点击一下箱子,然后再点击一下钱币,工人会自动帮助将箱子推向所想推到的位置。 第二关: 先将最下面的箱子推向最里面的钱币,然后再点击最外的箱子,推向第二个钱币,最后将余下的箱子推进最后一枚钱币。 第三关: 将挡在中间的箱子向下推两步,将靠右边的箱子向上顶一步,将最下面的箱子向左推一步, 将原先推下来的箱子向顶回原来的位置,这时将挡在左边的箱子推至钱币的右下角,然后将中间挡路的箱子推向右上角,再将靠中间墙的箱子推至左下角,最后将余上的箱子推至最后 一枚钱币。 第四关: 将挡路的箱子向下推一步,将挡路的第二个箱子向右推一步,工人向下走一步,然后将右手的箱子向右推一步,将已经在钱币中的箱子向上推至顶,将第二排右手边的第一个箱子向右 推一步入钱币中,再将头顶的箱子上顶入钱币,将左手的箱子向右推两步进钱币,最后将余下的箱子推入最后一枚钱币。 第五关: 将挡路的箱子向右推两步,将右下角的箱子向上顶两步,将中间的箱子推入最里的钱币,将第一个箱子推入中间的钱币,最后将余下的箱子推入最后的钱币。 第六关: 将中间右下角的箱子推至目前工人所站位置的头顶,然后将另三个箱子按顺时针的顺序推入 相邻的钱币,最后将第一个推动的箱子再直顶入钱币中。 第七关: 从下往上,将第一个箱子向右推一步,将第二个箱子向上顶一步,将最上的箱子推入最顶的钱币,然后将并排的三个箱子右手边的第一个推入第二枚钱币,将并排的两个箱子的左手那

个箱子向上顶一步,将右手的箱子推入钱币的最下一枚,将上墙的箱子向右直推入第三枚钱币,最后余下的箱子推入最后的钱币中。 第八关: 直接将中间的箱子顶入品字形的箱子中形成连体,将并排的三个箱子中的右手箱子直接顶至 最顶的钱币,将最品字形最顶的箱子向左推一步,将并排的两个箱子的右手那个直顶入最高 的钱币中,将最下的箱子直顶入钱币,将竖排两箱子的最下那个箱子推入中间的钱币,最后再完成最后一个箱子。 第九关: 先将右边中间的箱子推入左下角的钱币中,再将右手边的上下两箱分别推入左手边的中、上两钱币,将最上挡路的箱子向左推一步,将中间挡路的箱子向下推两步,将最下的箱子推入右下角的钱币中,最后将余下的两个箱子分别推入右手的钱币中就完成任务。 第十关: 先将最右边的箱子推至最底,将纵列三个箱子中的中间箱子向右推两步入钱币,将三列中的中间箱子向上顶一步,然后再将其向下推至最底,将最上的箱子向右推两步,将最后箱子推入钱币完成任务。 第十一关: 先将脚下的箱子向左挪一步,再将第二排的箱子向下推至与第三排箱子并排,然后将最上的箱子推至第一枚钱币,再将并排的箱子的右手箱子直接顶回到第二枚钱币,最后按从下往上的顺序将最后的两箱推入相应的钱币即完成任务。 第十二关: 先将最上的第一个箱子向上顶一步,再向下推两步入钱币,将中间的箱子向上顶两步,将最下的箱子向左推一步入钱币,最后推完余下的箱子完成任务。 第十三关: 这关开始有些难度了,别看箱子少,但确实得花一段时间思考一下呵。先将左数过来的第二个箱子向下推两步,再将左手第一个箱子向左推两步入钱币,将第右手由上往下数的第一个 箱子向左推三步入钱币,再将目前并排未入钱币的右数第一个箱子向上顶一步,将第二个箱子向右推一步,好,现在将排成列的右手的箱子由上往下的第一个推至钱币的最上面一枚,

用java实现推箱子(sokoban)游戏

推箱子游戏 一、功能描述: 可以通过面板上的按钮或是键盘上的pageup,pagedown键选择上下关 可以通过面板上按钮或是键盘上的Backspace键后退,一直后退自己想要的位置,知道游戏开始时的位置。 可以通过面板上的按钮或是键盘上的字母r重新开始当前关卡游戏。 可以在复选框内选择想要玩的关卡。 二、界面及运行截图

三、源代码(三部分) 1、地图类 package box; import java.io.BufferedReader; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader;//读取字符文件类FileReader import java.io.IOException; public class map { int[][] map=new int[20][20]; int manX,manY;

public map(int level){ String filepath="mapc/"+level+".txt"; File file = new File(filepath); FileReader fr = null;//利用FileReader流来读取一个文件中的数据 BufferedReader br = null;//字符读到缓存里 try { fr = new FileReader(file); br = new BufferedReader(fr); for (int i = 0; i < 15; i++){ String line = br.readLine();//以行为单位,一次读一行利用BufferedReader 的readLine,读取分行文本 byte[] point = line.getBytes();//将字符串转换为字节数组 for (int j = 0; j < 15; j++) { map[i][j] = point[j] - 48;// 根据ASCall码表要减掉30H(十进制的48) if (map[i][j] == 5 || map[i][j] == 6 || map[i][j] == 7|| map[i][j] == 8){ manX = i; manY = j; } } } } catch (FileNotFoundException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch (IOException e){ e.printStackTrace();//深层次的输出异常调用的流程 } catch(NullPointerException e){ e.printStackTrace();//深层次的输出异常调用的流程 } finally { if (br == null){ try{ br.close(); } catch (IOException e){ e.printStackTrace(); } br = null; } if (fr == null){ try {

推箱子源代码

#include #include #include #include #include using std::cout; using std::endl; #ifndef SOKOBAN_H_ //防止文件重复包含 #define SOKOBAN_H_ #include 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)

推箱子游戏代码

#include #include #include #include #include #include typedef struct winer { int x,y; struct winer *p; }winer; char status [20][20]; char far *printScreen=(char far* )0xB8000000; void putoutChar(int y,int x,char ch,char fc,char bc); void printWall(int x, int y); void printBox(int x, int y); void printBoxDes(int x, int y); void printDestination(int x, int y); void printDestination1(int x,int y,winer **win,winer **pw); void printMan(int x, int y); void init(); winer *initStep1(); winer *initStep2(); winer *initStep3(); winer *initStep4(); void moveBoxSpacetoSpace(int x ,int y, char a); void moveBoxDestoSpace(int x ,int y, char a) ; void moveBoxSpacetoDes(int x, int y, char a); void moveBoxDestoDes(int x, int y, char a); int judge(int x, int y); void move(int x, int y, char a); void reset(int i); void putoutChar(int y,int x,char ch,char fc,char bc) { printScreen[(x*160)+(y<<1)+0]=ch; printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; } void printWall(int x,int y) { putoutChar(y-1,x-1,219,GREEN,BLACK); status[x][y]='w'; } void printBox(int x,int y) { putoutChar(y-1,x-1,10,WHITE,BLACK); status[x][y]='b'; } void printDestination1(int x,int y,winer **win,winer **pw) {

java推箱子游戏源代码(含推箱子的判断)

第一个Java文件: package xiaoA; import java.awt.Color; import java.awt.HeadlessException; import java.awt.event.KeyEvent; import java.awt.event.KeyListener; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JOptionPane; import javax.swing.JPanel; public class GameFrame extends JFrame { JPanel zhuobu = new JPanel(); //工人 JLabel worker = null; //箱子 JLabel box = null; //目的地 JLabel goal = null; JLabel[] walls = null; public static final int SPEED = 12; //设置图片大小 int imgSize = 48; public void setImgSize(int imgSize){ this.imgSize = imgSize; } public GameFrame(String title) throws HeadlessException { super(title); //构造方法中调用本类的其它方法 this.initContentPane(); this.addKeyListener(new KeyListener() { //键盘按下事件 public void keyPressed(KeyEvent e) { //[2.5] 使工人可以移动 int xSpeed = 0, ySpeed = 0; switch (e.getKeyCode()) { case KeyEvent.VK_LEFT :

一个C语言编写的推箱子游戏源代码 (1)

/* 一个C语言编写的推箱子游戏源代码*/ /* 本游戏是字符模式的,请不要在中文dos下运行。本游戏在TURBO C下调试通过*/ 程序预处理部分包括加载头文件、定义全局变量和定义数据结构,并对它们进行初始化工作。#include #include #include #include #include #include /* 定义二维数组ghouse来记录屏幕上各点的状态, 其中:0表示什么都没有,'b'表示箱子,'w'表示墙壁,'m'表示目的地,'i'表示箱子在目的地。*/ char ghouse[20][20]; /* 以下函数为直接写屏函数,很酷的函数哦!是我朋友告诉我的。*/ 定义全局变量 char far *screen=(char far* )0xb8000000; 用于在屏幕上输出字符。彩色显示器的字符缓冲区首地址为0xB8000000,每一个字符占2个字节(第一个字节为ASCII值,第二个字节为颜色值),字符模式下屏幕宽80像素,高25像素,一屏可以写80*25个字符。 void putchxy(int y,int x,char ch,char fc,char bc) Putchxy()函数在屏幕上的指定位置输出指定的字符。其中,x、y指明输出的位置,ch表示输出的字符,fc表示输出的字符颜色,bc 表示背景色。 { screen[(x*160)+(y<<1)+0]=ch; /*屏幕输出字符*/ screen[(x*160)+(y<<1)+1]=(bc*16)+fc; /*指定字符颜色fc,背景色bc*/ } /* 定义判断是否胜利的数据结构*/ typedef struct winer { int x,y; struct winer *p; }winer; 定义结构体struct winer用于判断每一关是否已完成。其中x用于存放目的地的横坐标,y用于存放目的地的纵坐标。如果所有表示目的地坐标对应的状态都为“i”,即箱子在目的地,则表示已经过关,可以进入下一关。该结构体的初始化在每一关的初始化时进行。 /* 箱子位置的数据结构*/ typedef struct boxs { int x,y; struct boxs *next; }boxs; /* 在特定的坐标上画墙壁并用数组记录状态的函数*/ void printwall(int x,int y) printwall()用于画墙传入参数x、y指明位置。该函数调用putoutChar()进行输出,以黑色为背景画绿色墙,用小方块表示墙(ASCII值为219)。 { /*以黑色为背景画绿色墙,用小方块表示*/ putchxy(y-1,x-1,219,GREEN,BLACK);

java推箱子游戏源代码

第一个Java文件: import java.awt.Color; import java.awt.HeadlessException; import javax.swing.ImageIcon; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; public class GameFrame extends JFrame { JPanel zhuobu = new JPanel(); //工人 JLabel worker = null; //箱子 JLabel box = null; //目的地 JLabel goal = null; JLabel[] walls = null; //设置图片大小 int imgSize = 48; public void setImgSize(int imgSize){ this.imgSize = imgSize; } public GameFrame(String title) throws HeadlessException { super(title); //构造方法中调用本类的其它方法 this.initContentPane(); } /** * 设置内容面板 */ void initContentPane() { zhuobu.setBackground(Color.red); zhuobu.setLayout(null); //调用父类的属性和方法 super.setContentPane(zhuobu);

C语言推箱子小游戏程序

推箱子程序: #include #include #include #define U 1 #define D 2 #define L 3 #define R 4 //按键状态,U:上;D:下;L:左R:右 #define ofx 10 #define ofy 9 //x,y方向偏移量 typedef struct MAP //地图 { int wall[50][2]; //墙 int box[9][2]; //箱子 int des[9][2]; //终点 int overlap[9][2];//箱子与终点的重叠位置 int all,now; //总箱子个数,到位箱子个数 int x,y; //起点 }MAP,*map; //全局变量// int player[2]; //玩家位置 int nextp[2],nextb[2]; //玩家下一步位置,箱子下一步位置 MAP Pass[5]; //关卡数组 map Group,p; //关卡数组指针,当前关卡指针 int level; //关卡等级 int status; //玩家状态 int boxc[9][2],overlapc[9][2]; //箱子状态栈,重叠箱子状态栈 int nowbox; //当前到位箱子个数 int regame; //是否重玩 //声明全部函数// void Pos(int x,int y); //设置光标位置 void welcometogame(); //开始界面 void initgame(); //初始化游戏 void startgame(); //开始游戏 void copybox(int copy[9][2],int b[9][2]); //复制箱子信息 void loadmap(); //加载地图 void printfoverlap(int b[9][2]); //打印重叠箱子位置 void move(); //玩家移动 void trans(int p[2],int q[2]); //状态传递 void inputmap(int a[][2]); //输入地图数据 void gamecircle(); //控制游戏 int main() { system("mode con cols=80 lines=30"); //控制台宽度80,高度30

Java面向对象推箱子源代码(可扩展)

Java面向对象实现推箱子的源代码 目录 一、首先: (1) 二、以下为工程中各个类的源代码: (1) 1、Box (1) 2、GameMainTest (3) 3、Man (5) 4、Map (6) 5、MovingException (7) 6、Out (8)

一、首先: 在eclipse中新建一个工程,包名和类名(工程结构)如下: 二、以下为工程中各个类的源代码: 源代码按对应的类名复制粘贴进去即可。 1、Box package tuixiangzi; import java.util.Random; publicclass Box { privatestatic Random ran = new Random(); privatestaticint x = ran.nextInt(10); //箱子所在的位置(随机) privatestaticint y = ran.nextInt(10); //箱子所在的位置(随机) privateint[][]map = Map.getArray(); privateint h = map.length - 1; privateint l = map[h].length - 1; /** * 箱子左移 */ publicvoid boxLMove()throws MovingException{ if(y-1 < 0) { thrownew MovingException("You Can't Moving Left!"); } if(Man.getX() == x&&Man.getY() == y) { y=(y-1);

推箱子java课程设计

推箱子趣味游戏 1. 课程设计的目的 随着科技水平的发展,人们的生活,工作节奏越来越快,同时人们的各方面的压力也越来越大。在社会的条件下,压力给人们带来很多烦恼,所以合理的解压,但又不会浪费很多时间的方式成为现代人的共同心愿。游戏随之产生,他的娱乐性和有趣性也越来越被大家所认可,小游戏可以安装在手机里,让人们无论何时何地都能玩到游戏。基于这样的目的, 我们在本次课程设计中为大家开发了一款适合休闲娱乐的小游戏—推箱子趣味游戏。他不仅可以帮助人们消磨时间,还可以在一定程度上开发智力, 此游戏的挑战性更加激发大家玩此游戏的热情。此课设计是配合JA V A 程序设计课程,深入学习掌握JA V A语言,熟练运用Java工具对系统的编写。通过课程设计各个项目的综合训练,培养学生实际分析问题,编程和动手能力,提高学生的综合素质。 2. 系统总体设计 在此游戏中本着娱乐为目的,游戏者不仅可以在玩游戏还可以享受音乐,游戏界面简单,操作容易,在玩游戏的同时还可以锻炼大家的反应速度及灵敏程度,在游戏中设置关数,级别由低到高,一关比一关难,提高大家的兴趣,玩家可以自由的选关,并设置了分数的存储系统。系统中又增加了音乐的设置可以让玩家享受音乐。通过对小人移动箱子是否到达墙边进行判断决定胜负及是否可以进入下一关。 2.1系统功能模块划分 在该系统中总共划分了五个模块 (1)初始化模块,对游戏界面进行初始化操作,对各个按钮的功能进行操作使之当动作发生时有一定的反应及相应。 (2)画图模块,主要是对地图的绘制进行画图的操作,在此游戏中不同的数字代表不同的含义。 (3)移动箱子模块,在推箱子游戏中最主要的模块,用户可以移动箱子到界

推箱子FLASH小游戏的设计与实现(含flash源文件)

推箱子FLASH小游戏的设计与实现(含flash源文件) 推箱子FLASH小游戏的设计与实现(含flash源文件)(11500字) 摘要:随着现代科技的高速发展,短短几十年,电脑游戏得到迅猛发展。电脑游戏充分利用多媒体网络优势,拓宽了传统游戏的界限,给人们带来全新的体验。在这些游戏中,FLASH游戏以其好看的动画,绚丽... 推箱子小游戏的设计与实现(含flash源文件)(字)

摘要:随着现代科技的高速发展,短短几十年,电脑游戏得到迅猛发展。电脑游戏充分利用多媒体网络优势,拓宽了传统游戏的界限,给人们带来全新的体验。在这些游戏中,FLASH 游戏以其好看的动画,绚丽的声光效果,高度的通畅性,以及很强的可玩性,而受到广大青少年的青睐。
本文主要针对目前网络流行的FLASH小游戏——推箱子游戏的设计与实现进行了浅要分析,采用FLASH  8进行游戏设计以及解决设计中遇到的一系列问题,以各游戏模块为线索,详细说明了FLASH  8的基本操作和脚本编程,深入浅出地对FLASH基本功能和脚本编程进行全面细致的讲解,涵盖了FLASH在开发过程中的一些基本技术,充分展示了FLASH的一些经典特色。该游戏既能锻炼思维的严密性,又有很多乐趣。
关键词:结构;模块;流程;设计

Design And Implementaion Of Sokokan Flash Game
Abstract:With the rapid development of modern science and technology, only lasts for a few decades, computer games rapid development. Computer games make full use of multimedia network advantage, and widened the boundaries of traditional games, people brings a whole new experience. In these games, FLASH game with its nice animation, gorgeous effects of sound, high unobstructed sex, and strong can play sex, by the broad adolescent's favor.
     This paper mainly aiming at the network popular FLASH get-away drama -- pushed box game the design and implementation of the shallow analysis, using FLASH 8 games design and solve a series of problems encountered in the design, with each game module for clues, detail the FLASH 8 basic operation and scripting, explaining the basic function and scripts to FLASH on the thorough and careful programming explained that covers a FLASH in the process of developing the basic technology, displayed to the full FLASH for some of the classic characteristic. This game can exercise thinking of rigor, and lots of fun.
Keywords: structure;modules;process;design

游戏设计
游戏设计的任务是:在游戏分析提出的游戏逻辑模型结构的基础上,科学合理的进行物理模型的设计。具体的说,就是根据游戏逻辑模型提出的各项功能要求,结合实际的设计条件,详细的设计出游戏的处理流程和基本结构,并为游戏实施阶段的各项工作准备还全部必要的技术资料和有关文件。游戏模型分为逻辑模型和物理模型。逻辑模型主要确定系统做什么,而物理模型则主要解决这样做的问题,前者是游戏设计的任务。经过游戏设计,设计人员应能为程序员提供完整、清楚的设计文档,并做出解释[17]。

相关文档
最新文档