紧急求救:用C语言编写推箱子游戏的程序!!
游戏规则:用户可操作上下左右四键控制人的行走方向,假如人的前面有箱子那么人向这个方向走时就可以推动箱子.箱子前面必须要保证没有阻挡物(如墙壁,砖块和其他箱子),否则推动无...
游戏规则: 用户可操作上下左右四键控制人的行走方向,假如人的前面有箱子那么人向这个方向走时就可以推动箱子.箱子前面必须要保证没有阻挡物(如墙壁,砖块和其他箱子),否则推动无效.当把所有箱子都推入预先要求的地方时,即为过关,游戏结束.
下面是游戏中的一个例图:
* * *
* X *
* * * □ * * *
* X □ P □ X *
* * * □ * * *
* X *
* * *
* 代表墙壁中的砖块;
X 代表需要填充的位置;
□ 代表箱子;
P 代表推箱子的人;
〇 代表箱子已经移到需要填充的位子;
以下是此题中要求实现的两关:
第一关如图:
* * * * *
* * * * *
* * * □ □ *
* □ * *
* * X * * * *
* X 〇 〇 X * * □ *
* P X *
* * * * * * * * *
第二关如图:
* * * * *
* * * * *
* X * * X □ *
* * □ * □ *
* 〇 X X * *
* * 〇 〇 □ *
* * * * * P *
* * * * * *
程序设计要求:
1. 由键盘中四字母W/w,S/s,A/a,D/d代表上下左右控制人的运动;
2. 在任何情况下都可以进行选关;
3. 当认为本关过不去的时候,可以重新开始;
4. 当两关都成功闯过时,游戏结束;
5. 在任何情况下都可以选择结束;
6. 输入M/m时会显示MENU菜单,菜单内容如下:
a. 选择关数;
b. 从新开始本关;
c. 选择结束;
d. 帮助;
关于帮助的内容可包含游戏规则和操作键的说明
7.当过完一关而且另一关没有闯过或没有闯,这样会询问是否继续,用Y/y代表继续,N/n代表退出,当为Y/y时会自动进入下关;
8.推出时会告知你闯过哪关,没有闯过任何一关时会显示没闯过任何一关。
提示:
1. 用void display()来显示界面,每一次调用时都会清除原有屏幕内容;
2. 用void Menu()来显示菜单内容;
3. 每一步执行都会通过bool isvalid(char ch)来判断操作是否有效,若无效不作任何反应,若有效会执行相应操作;
4. 用一个函数bool isover()来判断游戏是否结束,用bool ispass()来判断本关是否完成;
5. 每一关开始时分别使用void start1()和void start2()进行开始的布局;
6. 可以不拘泥于以上所提供的建议自行设计解决;
有个错误,你自己运行一下看看,我不知道错在哪里 展开
下面是游戏中的一个例图:
* * *
* X *
* * * □ * * *
* X □ P □ X *
* * * □ * * *
* X *
* * *
* 代表墙壁中的砖块;
X 代表需要填充的位置;
□ 代表箱子;
P 代表推箱子的人;
〇 代表箱子已经移到需要填充的位子;
以下是此题中要求实现的两关:
第一关如图:
* * * * *
* * * * *
* * * □ □ *
* □ * *
* * X * * * *
* X 〇 〇 X * * □ *
* P X *
* * * * * * * * *
第二关如图:
* * * * *
* * * * *
* X * * X □ *
* * □ * □ *
* 〇 X X * *
* * 〇 〇 □ *
* * * * * P *
* * * * * *
程序设计要求:
1. 由键盘中四字母W/w,S/s,A/a,D/d代表上下左右控制人的运动;
2. 在任何情况下都可以进行选关;
3. 当认为本关过不去的时候,可以重新开始;
4. 当两关都成功闯过时,游戏结束;
5. 在任何情况下都可以选择结束;
6. 输入M/m时会显示MENU菜单,菜单内容如下:
a. 选择关数;
b. 从新开始本关;
c. 选择结束;
d. 帮助;
关于帮助的内容可包含游戏规则和操作键的说明
7.当过完一关而且另一关没有闯过或没有闯,这样会询问是否继续,用Y/y代表继续,N/n代表退出,当为Y/y时会自动进入下关;
8.推出时会告知你闯过哪关,没有闯过任何一关时会显示没闯过任何一关。
提示:
1. 用void display()来显示界面,每一次调用时都会清除原有屏幕内容;
2. 用void Menu()来显示菜单内容;
3. 每一步执行都会通过bool isvalid(char ch)来判断操作是否有效,若无效不作任何反应,若有效会执行相应操作;
4. 用一个函数bool isover()来判断游戏是否结束,用bool ispass()来判断本关是否完成;
5. 每一关开始时分别使用void start1()和void start2()进行开始的布局;
6. 可以不拘泥于以上所提供的建议自行设计解决;
有个错误,你自己运行一下看看,我不知道错在哪里 展开
4个回答
2009-04-03
展开全部
给:
#include"stdio.h"
#include"bios.h"
#define LEFT 75
#define RIGHT 77
#define UPPER 72
#define DOWN 80
#define ESC 27
struct Boxss /*定义箱子结构体,其中包含坐标属性*/
{
int x,y;
};
union keyboard /*定义读取键盘码的共用体类型*/
{
unsigned int iKeyInfo;
char chKeyBit[2];
};
int fnGetKey(void) /*定义读取键盘码的函数*/
{
union keyboard uniKey1; /*定义读取键盘码的共用体变量*/
while(bioskey(1)==0); /*检测用户是否按键*/
uniKey1.iKeyInfo=bioskey(0); /*读取按键信息*/
return(uniKey1.chKeyBit[0]==0?uniKey1.chKeyBit[1]:uniKey1.chKeyBit[0]); /*返回ASCII码或扩充码*/
}
void main()
{
int iKey,x=11,y=6,tx=11,ty=6; /*x,y为人物移动后坐标,tx,ty为人物移动前坐标*/
struct Boxss Box[4]; /*定义箱子数量*/
int chMap[10][10]={ /*用二维数组定义地图*/
{0,0,0,0,0,0,0,0,0,0}, /*0表示墙1表示路2表示目标*/
{0,1,0,0,0,0,1,1,1,0},
{0,1,0,2,0,0,1,0,1,0},
{0,1,0,1,0,0,1,0,1,0},
{0,1,1,1,0,0,1,0,1,0},
{0,1,0,0,0,0,1,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,0,1,0,0,0,0,2,0},
{0,2,0,1,1,1,1,2,0,0},
{0,0,0,0,0,0,0,0,0,0},
};
int i,j;
Box[0].x=13; /*定义箱子的坐标属性*/
Box[1].x=11;
Box[2].x=14;
Box[3].x=18;
Box[0].y=8;
Box[1].y=7;
Box[2].y=13;
Box[3].y=7;
while(1) /*反复进行求移动的坐标运算*/
{
for(i=0;i<10;i++) /*输出新地图(刷新地图)*/
{
gotoxy(10,5+i);
for(j=0;j<10;j++)
{
if(chMap[i][j]==0)
printf("#");
if(chMap[i][j]==1)
printf(" ");
if(chMap[i][j]==2)
printf("X");
}
}
j=0; /*判断是否所有箱子都在目标坐标上*/
for(i=0;i<4;i++)
if(chMap[Box[i].y-5][Box[i].x-10]==2)
j++;
if(j==4) /*如果所有箱子都就位输出"YOU WIN!"退出*/
{
clrscr();
printf("You Win!");
break;
}
for(i=0;i<4;i++) /*在起始(或移动后)的坐标输出箱子*/
{
gotoxy(Box[i].x,Box[i].y);
printf("0");
}
gotoxy(x,y); /*在起始(或移动后)的坐标输出人*/
printf("*\b");
tx=x; /*记录本次移动前的坐标*/
ty=y;
iKey=fnGetKey();
if(iKey==LEFT&&chMap[y-5][x-1-10]!=0) /*按读取的按键信息改变坐标如果改变的坐标和墙(0)重合则不改变*/
x--;
if(iKey==RIGHT&&chMap[y-5][x+1-10]!=0)
x++;
if(iKey==UPPER&&chMap[y-1-5][x-10]!=0)
y--;
if(iKey==DOWN&&chMap[y+1-5][x-10]!=0)
y++; /*输入ESC退出并输出"YOU LOST"*/
if(iKey==ESC)
{
clrscr();
printf("You Lost");
break;
}
for(i=0;i<4;i++) /*如果移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格*/
if(Box[i].x==x&&Box[i].y==y)
{
Box[i].x+=(x-tx);
Box[i].y+=(y-ty);
if(chMap[Box[i].y-5][Box[i].x-10]==0) /*如果移动后的箱子坐标会出现在墙上,则使箱子坐标和人坐标都返回移动前的值*/
{
Box[i].x-=(x-tx);
Box[i].y-=(y-ty);
x=tx;
y=ty;
}
break;
}
clrscr();
}
getch();
}
#include"stdio.h"
#include"bios.h"
#define LEFT 75
#define RIGHT 77
#define UPPER 72
#define DOWN 80
#define ESC 27
struct Boxss /*定义箱子结构体,其中包含坐标属性*/
{
int x,y;
};
union keyboard /*定义读取键盘码的共用体类型*/
{
unsigned int iKeyInfo;
char chKeyBit[2];
};
int fnGetKey(void) /*定义读取键盘码的函数*/
{
union keyboard uniKey1; /*定义读取键盘码的共用体变量*/
while(bioskey(1)==0); /*检测用户是否按键*/
uniKey1.iKeyInfo=bioskey(0); /*读取按键信息*/
return(uniKey1.chKeyBit[0]==0?uniKey1.chKeyBit[1]:uniKey1.chKeyBit[0]); /*返回ASCII码或扩充码*/
}
void main()
{
int iKey,x=11,y=6,tx=11,ty=6; /*x,y为人物移动后坐标,tx,ty为人物移动前坐标*/
struct Boxss Box[4]; /*定义箱子数量*/
int chMap[10][10]={ /*用二维数组定义地图*/
{0,0,0,0,0,0,0,0,0,0}, /*0表示墙1表示路2表示目标*/
{0,1,0,0,0,0,1,1,1,0},
{0,1,0,2,0,0,1,0,1,0},
{0,1,0,1,0,0,1,0,1,0},
{0,1,1,1,0,0,1,0,1,0},
{0,1,0,0,0,0,1,0,1,0},
{0,1,1,1,1,1,1,0,1,0},
{0,1,0,1,0,0,0,0,2,0},
{0,2,0,1,1,1,1,2,0,0},
{0,0,0,0,0,0,0,0,0,0},
};
int i,j;
Box[0].x=13; /*定义箱子的坐标属性*/
Box[1].x=11;
Box[2].x=14;
Box[3].x=18;
Box[0].y=8;
Box[1].y=7;
Box[2].y=13;
Box[3].y=7;
while(1) /*反复进行求移动的坐标运算*/
{
for(i=0;i<10;i++) /*输出新地图(刷新地图)*/
{
gotoxy(10,5+i);
for(j=0;j<10;j++)
{
if(chMap[i][j]==0)
printf("#");
if(chMap[i][j]==1)
printf(" ");
if(chMap[i][j]==2)
printf("X");
}
}
j=0; /*判断是否所有箱子都在目标坐标上*/
for(i=0;i<4;i++)
if(chMap[Box[i].y-5][Box[i].x-10]==2)
j++;
if(j==4) /*如果所有箱子都就位输出"YOU WIN!"退出*/
{
clrscr();
printf("You Win!");
break;
}
for(i=0;i<4;i++) /*在起始(或移动后)的坐标输出箱子*/
{
gotoxy(Box[i].x,Box[i].y);
printf("0");
}
gotoxy(x,y); /*在起始(或移动后)的坐标输出人*/
printf("*\b");
tx=x; /*记录本次移动前的坐标*/
ty=y;
iKey=fnGetKey();
if(iKey==LEFT&&chMap[y-5][x-1-10]!=0) /*按读取的按键信息改变坐标如果改变的坐标和墙(0)重合则不改变*/
x--;
if(iKey==RIGHT&&chMap[y-5][x+1-10]!=0)
x++;
if(iKey==UPPER&&chMap[y-1-5][x-10]!=0)
y--;
if(iKey==DOWN&&chMap[y+1-5][x-10]!=0)
y++; /*输入ESC退出并输出"YOU LOST"*/
if(iKey==ESC)
{
clrscr();
printf("You Lost");
break;
}
for(i=0;i<4;i++) /*如果移动后的人的坐标与箱子坐标重合,则改变箱子坐标向前一格*/
if(Box[i].x==x&&Box[i].y==y)
{
Box[i].x+=(x-tx);
Box[i].y+=(y-ty);
if(chMap[Box[i].y-5][Box[i].x-10]==0) /*如果移动后的箱子坐标会出现在墙上,则使箱子坐标和人坐标都返回移动前的值*/
{
Box[i].x-=(x-tx);
Box[i].y-=(y-ty);
x=tx;
y=ty;
}
break;
}
clrscr();
}
getch();
}
展开全部
你给我最佳答案 我把回答发到你邮箱里去 诚信第一绝无欺诈 邮箱你在对最佳答案的评价里告诉
本回答被提问者采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
123
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
展开全部
kk
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询