① void putoutChar(int y,int x,char fc,char bc),在屏幕上指定的位置输出指定的字符。
② int judge(int x,int y),判断位置(x,y)处的状态,状态值可参见“数据结构设计”部分。
③ void reset (int i),重置关卡。
其中在屏幕上的指定位置输出指定的字符函数的代码如下: void putoutChar(int y,int x,char ch,char fc,char bc) {
/*屏幕输出字符*/
printScreen[(x*160)+(y<<1)+0]=ch; /*指定字符颜色fc,背景色bc*/
printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; }
7、主函数
主函数实现整个程序的控制,其游戏操作流程可参见图(二)。详细代码如下: void main() {
int key; /*记录按下的键*/
int x,y;
int s;/*记录未被推到目的地的箱子个数*/ int i=0; /*记录已经过了几关*/ winer *win,*pw;
_AL=3;/*设置寄存器AX低位*/ _AH=0; /*设置寄存器AX高位*/ geninterrupt(0x10); init();
win=initStep1();
do{
_AH=3; /*设置AH,读取光标位置*/ geninterrupt(0x10);
x=_DH+1;/*读取光标所在的行,加1*/ y=_DL+1; /*读取光标所在的列,加1*/
while(bioskey(1)==0);/*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;
第 11 页 共 26 页
case 0x3920:/*如果按下空格键*/ reset(i);break; default:break; } s=0;
pw=win;
while(pw) /*如果指针非空*/
{
if(status[pw->x][pw->y]=='m')/*如果目的地的状态为m,不是i,表示还有箱子未被推到目的地,该关还未完成*/
s++; /*未被推到目的地的箱子数*/ pw=pw->p;/*判断下一个目的地的状态*/ }/*该关完成*/ if(s==0)
{
free(win); /*释放分配的空间*/ gotoxy(15,20);
printf(\ getch(); i++;
switch(i) {
case 1:/*进入第二关*/ init();
win=initStep2(); break;
case 2:/*进入第三关*/ init();
win=initStep3(); break;
case 3:/*进入第四关*/ init();
win=initStep4(); break;
case 4:/*完成所有关*/ gotoxy(15,21);
printf(\ gotoxy(15,22);
printf(\ key=0x011b;/*设置键为Esc以便退出程序*/ getch();/*按任意键结束*/ break; default: break;
第 12 页 共 26 页
}
}
}while(key!=0x011b); _AL=3; _AH=0;
geninterrupt(0x10); }
四、参考文献
【1】《C程序设计(第三版)》,谭浩强编,清华大学出版社; 【2】《Turbo C 2.0实用大全》,常玉龙等编写,北京航空航天大学出版社; 【3】《C语言趣味程序百例精解》,陈朔鹰 陈英主编,北京理工大学出版社; 【4】《C游戏编程从入门到精通》,浦滨著, 北京希望电子出版社; 【5】《C函数实用手册》,张曜 郭立山 吴天著, 冶金工业出版社;
五、课程设计总结
推箱子游戏是目前比较流行的游戏之一,很多操作系统或者流行软件都会带有这种游戏。它既能锻炼思维的严密性,又有很多乐趣。我个人也比较喜欢玩这个游戏,因此,我就借这个机会将这个推箱子游戏用C语言实现了出来,当然,我也借鉴了前人的一些技巧经验。由于时间仓促和本人水平有限,此游戏的制作显得有些粗糙,希望老师能够谅解,我以后将会再接再厉。
六、软件使用说明书
本游戏一共4关,由易到难,每一关都有初化、按键处理、重置及退出功能。
① 初始化包括屏幕初始化和每一关卡的初始化,屏幕被初始化宽80像素,高25像素。
② 按键处理包括移动小人和移动箱子,通过移动上下左右键来控制小人的移动,从而推动箱子,以把箱子推到指定的目的地为过关。
③ 每一关都可以重置,按空格键可以重置当前关。 ④ 按Esc键可以在任何时候退出游戏。
七、附录
#include
int x,y;
struct winer *p; }winer;
char status [20][20];
第 13 页 共 26 页
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) {
winer *qw;
putoutChar(y-1,x-1,003,YELLOW,BLACK); status[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));
第 14 页 共 26 页
qw->x=x; qw->y=y;(*pw)->p=qw; (*pw)=qw;qw->p=NULL; } }
void printDestination(int x,int y) {
putoutChar(y-1,x-1,003,YELLOW,BLACK); status[x][y]='m'; } void printMan(int x,int y) {
gotoxy(y,x); _AL=02; _CX=01; _AH=0xa;
geninterrupt(0x10); }
void printBoxDes(int x,int y) {
putoutChar(y-1,x-1,10,YELLOW,BLACK); status[x][y]='i'; }
void init() {
int i,j;
for(i=0;i<20;i++) for(j=0;j<20;j++) status[i][j]=0; _AL=3; _AH=0; geninterrupt(0x10);
gotoxy(41,4); printf(\ gotoxy(41,6); printf(\ gotoxy(41,8); printf(\ gotoxy(41,10); printf(\ gotoxy(40,12); printf(\ gotoxy(40,14); printf(\
gotoxy(40,4);
_CX=01;_AH=0xa;_AL=24; geninterrupt(0x10); gotoxy(40,6);
_CX=01;_AH=0xa;_AL=25; geninterrupt(0x10);
gotoxy(40,8);_CX=01;_AH=0xa;_AL=27; geninterrupt(0x10);
gotoxy(40,10);_CX=01;_AH=0xa;_AL=26; geninterrupt(0x10);
第 15 页 共 26 页