推箱子游戏-C语言

更新时间:2023-12-21 21:15:01 阅读量: 教育文库 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

/*在这个程序里'm'表示目的地,'w'表示墙,'b'表示箱子,0表示空地,i表示在目的地的箱子,因为在目的地的箱子颜色与不是的是不一样的*/ #include /*dos接口函数*/ #include #include

#include /*ROM基本输入输出函数*/ #include

struct clock {

int hours; int minutes; int seconds; };

char status[20][20];/*定义二维数组status来记录屏幕上各点的状态,*/

char far *printScreen=(char far* )0xB8000000; /*定义了一个远指针,它指向计算机彩色显示器的视频缓冲区地址,用于在屏幕上输出字符,彩色显示器的字符缓冲区首地址为0xB8000000*/

void showtime(); void display(); void update();

void putoutChar(int y,int x,char ch,char fc,char bc); void drawWall(int x,int y); void drawBox(int x,int y);

void drawDestination(int x,int y); void drawMan(int x,int y); void drawBoxDes(int x,int y); void init();

void playgame();

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);/*从目的地移动箱子到目的地*/ void move(int x,int y,char a); /*人移动*/

void main() {

int key;/*记录按下的键*/ int x,y; showtime(); init();

playgame(); do

{

_AH=3; /*设置AH,读取光标位置*/ geninterrupt(0x10);

x=_DH+1; /*读取光标所在的行,加1*/ y=_DL+1; /*读取光标所在的列,加1*/

while(bioskey(1)==0);/*直接使用BIOS服务的键盘接口在头文件bios.h中*/ key=bioskey(0);/*等待键盘输入;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; default: break; }

if(status[6][12]=='i'&&status[6][13]=='i'&&status[6][14]=='i') /*如果所有的目的地的'm',都变为'i'时,说明已经赢了*/ {

gotoxy(15,20);

printf(\ gotoxy(15,22);

printf(\ getch(); /*按任意键结束*/ break; }

}while(key!=0x011b); display();

key=bioskey(0);/*接收按键*/

if(key==0x011b)/*按ESC键退出*/ return; }

void showtime() {

int key; while(1)

{

while(!kbhit()) {

update(); display(); sleep(1); if(kbhit()) break; }

key=bioskey(0); if(key==0x011b) break; }

return; }

void display() {

time_t nowtime; struct tm *timeinfo;

time( &nowtime ); /*获取时间,以秒计从1970年1月一日起算,存于nowtime*/ timeinfo = localtime( &nowtime ); /*转为当地时间,tm时间结构asctime() 转为标准ASCII时间格式*/

printf(\ return; }

void update() {

struct clock times; times.seconds=0;

if(times.seconds==60)/*秒针达到60秒时*/ {

times.seconds=0; /*秒针重设为0*/ times.minutes++; /*把分针自加*/ }

if(times.minutes==60)/*分针到达60时*/ {

times.minutes=0;/*分针重设为0*/ times.hours++; /*把时钟自加*/ }

if(times.hours==24) /*当时钟达到24时*/ {

times.hours=0; /*把时钟重设为0*/ }

times.seconds++;

return; }

void putoutChar(int y,int x,char ch,char fc,char bc) /*一个字符在视频缓冲区里占两个字节,屏幕上文本显示格式一行80个字符,所以*160时字符变动一行,视频缓冲区里位置变动160个字节,第一个字节,存的是显示字符的ASCII码 ch 第二个字节 高四位 存的是 显示字符的背景色 bc,低四位存的是 字符的颜色 fh */ {

printScreen[(x*160)+(y<<1)+0]=ch;

printScreen[(x*160)+(y<<1)+1]=(bc*16)+fc; return; }

void drawWall(int x,int y) /*这个function用来画墙*/ {

putoutChar(y-1,x-1,219,GREEN,BLACK); /*用小方块表示墙(ASCII值为219),墙的颜色为绿色,以黑色为背景*/

status[x][y]='w'; /*把这位置设为w*/ return; }

void drawBox(int x,int y) /*这个function是在非目的地画箱子*/ {

putoutChar(y-1,x-1,10,WHITE,BLACK);/*用ASCII值为10的字符表示箱子*/ status[x][y]='b'; /*这位置设为b*/ return; }

void drawDestination(int x,int y) /*用于画目的地*/ {

putoutChar(y-1,x-1,003,YELLOW,BLACK); /*以黑色为背景画黄色目的地,用心型表示(ASCII值为003)*/ status[x][y]='m'; return; }

void drawMan(int x,int y)/*画人*/ {

gotoxy(y,x);

_AL=02; /*设置寄存器低位02(ASCII值),表示输出的字符*/

_CX=01; /*设置寄存器CX为01,表示重复输出的次数,这里只输出一次*/

_AH=0xa; /*,设置寄存器高位0xa表示在光标位置显示字符*/ geninterrupt(0x10); /*产生类型为0x10的中断,表示显示器输出*/ return; }

void drawBoxDes(int x,int y)/*在目的地画箱子*/ {

putoutChar(y-1,x-1,10,YELLOW,BLACK);/*以黑色为背景画黄色箱子,仍用ASCII值为

10的字符表示箱子*/ status[x][y]='i'; return; }

void init() /*初始化屏幕*/ {

int i,j;

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

status[i][j]=0; /*首先将屏幕20*20范围内的状态初始化为0,然后根据具体情况,在画箱子时,将箱子所在点的状态改为\ gotoxy(41,4);

printf(\

gotoxy(41,6); /*移动光标到指定位置输出屏幕信息*/

printf(\ \ /*也就是说在第41行,第6列的地方输出*/

gotoxy(41,8);

printf(\ \ /*同理*/ gotoxy(41,10);

printf(\ \ gotoxy(41,12);

printf(\ gotoxy(40,16);

printf(\ gotoxy(40,18);

printf(\ return; }

void playgame() {

int x,y;

for(x=1,y=1;x<=14;x++) drawWall(x+4,y+10); for(x=1,y=9;x<=14;x++) drawWall(x+4,y+10); for(y=2,x=1;y<=8;y++) drawWall(x+4,y+10); for(y=2,x=14;y<=8;y++) drawWall(x+4,y+10); for(x=3,y=2;y<=6;y++) drawWall(x+4,y+10); for(x=6,y=4;x<=13;x++) drawWall(x+4,y+10);

for(x=6,y=6;y<=8;y++) drawWall(x+4,y+10); drawWall(10,12); drawBox(10,13); drawBox(12,16); drawBox(14,17);

drawDestination(6,12); drawDestination(6,13); drawDestination(6,14); drawMan(7,18); return; }

void moveBoxSpacetoSpace(int x,int y,char a)/*人空地移动箱子到空地*/ {

switch(a) {

case 'u': /*'u'表示up,如果按向上键*/ status[x-1][y]=0;/*重设((x-1),y)位置的状态为0*/ printf(\ /*清空(x,y)处原有的小人*/ drawBox(x-2,y); /*在((x-2),y)处重新画箱子*/ drawMan(x-1,y); /*在((x-1),y)处重新画小人*/ status[x-2][y]='b'; /*重设((x-2),y)位置的状态为箱子*/ break;

case 'd': /*'d'表示down,如果按向下键*/ status[x+1][y]=0;

printf(\ /*同上*/ drawBox(x+2,y); drawMan(x+1,y); status[x+2][y]='b'; break;

case 'l': /*left,向左键*/ status[x][y-1]=0; printf(\ drawBox(x,y-2); drawMan(x,y-1); status[x][y-2]='b'; break;

case 'r': /*right,向右键*/ status[x][y+1]=0; printf(\

drawBox(x,y+2); drawMan(x,y+1); status[x][y+2]='b'; break;

default: break; }

return; }

void moveBoxDestoSpace(int x,int y,char a) /*从目的地移动箱子到空地*/ {

switch(a) {

case 'u':

status[x-1][y]='m'; /*重设((x-1),y)位置的状态为'm'*/ printf(\ drawBox(x-2,y);

drawMan(x-1,y); /*同上个function*/ status[x-2][y]='b'; break; case 'd':

status[x+1][y]='m'; printf(\

drawBox(x+2,y); drawMan(x+1,y); status[x+2][y]='b'; break; case 'l':

status[x][y-1]='m'; printf(\ drawBox(x,y-2); drawMan(x,y-1); status[x][y-2]='b'; break; case 'r':

status[x][y+1]='m'; printf(\

drawBox(x,y+2); drawMan(x,y+1); status[x][y+2]='b'; break; default: break; }

return; }

void moveBoxSpacetoDes(int x,int y,char a)/*从空地移动箱子到目的地*/ {

switch(a) {

case 'u':

status[x-1][y]=0; printf(\

drawBoxDes(x-2,y); drawMan(x-1,y); status[x-2][y]='i'; break; case 'd':

status[x+1][y]=0; printf(\

drawBoxDes(x+2,y); drawMan(x+1,y); status[x+2][y]='i'; break; case 'l':

status[x][y-1]=0; printf(\

drawBoxDes(x,y-2); drawMan(x,y-1); status[x][y-2]='i'; break; case 'r':

status[x][y+1]=0; printf(\

drawBoxDes(x,y+2); drawMan(x,y+1); status[x][y+2]='i'; break; default: break; }

return; }

void moveBoxDestoDes(int x,int y,char a) /*从目的地移动箱子到目的地*/ {

switch(a) {

case 'u':

status[x-1][y]='m'; printf(\

drawBoxDes(x-2,y); drawMan(x-1,y);

status[x-2][y]='i'; break; case 'd':

status[x+1][y]='m'; printf(\

drawBoxDes(x+2,y); drawMan(x+1,y); status[x+2][y]='i'; break; case 'l':

status[x][y-1]='m'; printf(\

drawBoxDes(x,y-2); drawMan(x,y-1); status[x][y-2]='i'; break; case 'r':

status[x][y+1]='m'; printf(\

drawBoxDes(x,y+2); drawMan(x,y+1); status[x][y+2]='i'; break; default: break; }

return; }

void move(int x,int y,char a) /*人移动*/ {

switch(a) {

case 'u': /*如果按向上键*/

if(status[x-1][y]=='w') /*如果(x-1,y)即小人的下一步状态为墙*/ {

gotoxy(y,x); /*则跳转到(y,x),并跳出循环*/ break; }

else if(status[x-1][y]==0||status[x-1][y]=='m')/*如果小人的下一步状态为什么都没有或者是目的地*/ {

if(status[x][y]=='m') /*如果当前状态为目的地*/ {

drawDestination(x,y);/*画目的地*/

drawMan(x-1,y); /*在新位置重新画小人*/ break; }

else /*如果当前状态为0*/ {

printf(\输出空字符,覆盖当前状态的小人*/ drawMan(x-1,y);/*在下一步重新画小人*/ break; } }

else if(status[x-1][y]=='b') /*如果下一步状态是箱子*/ {

if(status[x-2][y]==0) /*如果下下一步为空*/ {

moveBoxSpacetoSpace(x,y,'u');/*则将箱子从空地向上移动到空地*/ if(status[x][y]=='m') /*如果当前状态为目的地*/ drawDestination(x,y); /*画目的地*/ gotoxy(y,x-1); }

else if(status[x-2][y]=='m') /*如果下下一步为目的地*/ {

moveBoxSpacetoDes(x,y,'u'); /*则将箱子从空地向上移动到目的地*/ if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y,x-1); } else

gotoxy(y,x); /*以下都同上的方法*/ break; }

else if(status[x-1][y]=='i') {

if(status[x-2][y]==0) {

moveBoxDestoSpace(x,y,'u'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y,x-1); }

else if(status[x-2][y]=='m') {

moveBoxDestoDes(x,y,'u'); if(status[x][y]=='m')

drawDestination(x,y);

gotoxy(y,x-1); } else

gotoxy(y,x); break; } case 'd':

if(status[x+1][y]=='w') {

gotoxy(y,x); break; }

else if(status[x+1][y]==0||status[x+1][y]=='m') {

if(status[x][y]=='m') {

drawDestination(x,y); drawMan(x+1,y); break; } else {

printf(\

drawMan(x+1,y); break; } }

else if(status[x+1][y]=='b') {

if(status[x+2][y]==0) {

moveBoxSpacetoSpace(x,y,'d'); if(status[x][y]==3)

drawDestination(x,y); gotoxy(y,x+1); }

else if(status[x+2][y]=='m') {

moveBoxSpacetoDes(x,y,'d'); if(status[x][y]=='m') drawDestination(x,y); gotoxy(y,x+1); } else

gotoxy(y,x); break; }

else if(status[x+1][y]=='i') {

if(status[x+2][y]==0) {

moveBoxDestoSpace(x,y,'d'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y,x+1); }

else if(status[x+2][y]=='m') {

moveBoxDestoDes(x,y,'d'); if(status[x][y]=='m') drawDestination(x,y); gotoxy(y,x+1); } else

gotoxy(y,x); break; } case 'l':

if(status[x][y-1]=='w') {

gotoxy(y,x); break; }

else if(status[x][y-1]==0||status[x][y-1]=='m') {

if(status[x][y]=='m') {

drawDestination(x,y); drawMan(x,y-1); break; } else {

printf(\

drawMan(x,y-1); break; } }

else if(status[x][y-1]=='b') {

if(status[x][y-2]==0) {

moveBoxSpacetoSpace(x,y,'l'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y-1,x); }

else if(status[x][y-2]=='m') {

moveBoxSpacetoDes(x,y,'l'); if(status[x][y]=='m') drawDestination(x,y); gotoxy(y-1,x); } else

gotoxy(y,x); break; }

else if(status[x][y-1]=='i') {

if(status[x][y-2]==0) {

moveBoxDestoSpace(x,y,'l'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y-1,x); }

else if(status[x][y-2]=='m') {

moveBoxDestoDes(x,y,'l'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y-1,x); } else

gotoxy(y,x); break; } case 'r':

if(status[x][y+1]=='w') {

gotoxy(y,x);

break; }

else if(status[x][y+1]==0||status[x][y+1]=='m') {

if(status[x][y]=='m') {

drawDestination(x,y); drawMan(x,y+1); break; } else {

printf(\

drawMan(x,y+1); break; } }

else if(status[x][y+1]=='b') {

if(status[x][y+2]==0) {

moveBoxSpacetoSpace(x,y,'r'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y+1,x); }

else if(status[x][y+2]=='m') {

moveBoxSpacetoDes(x,y,'r'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y+1,x); } else

gotoxy(y,x); break; }

else if(status[x][y+1]=='i') {

if(status[x][y+2]==0 ) {

moveBoxDestoSpace(x,y,'r'); if(status[x][y]=='m')

drawDestination(x,y);

gotoxy(y+1,x); }

else if(status[x][y+2]=='m') {

moveBoxDestoDes(x,y,'r'); if(status[x][y]=='m')

drawDestination(x,y); gotoxy(y+1,x); } else

gotoxy(y,x); break; } default: break; } return; }

本文来源:https://www.bwwdw.com/article/1p85.html

Top