⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 txz.txt

📁 简单的用C语言编写的推箱子游戏
💻 TXT
📖 第 1 页 / 共 2 页
字号:
#include<stdio.h> 
#include<dos.h> 
#include<string.h> 
#include<stdlib.h> 
#include<bios.h> 
#include<graphics.h> 
#include<conio.h> 
#include <alloc.h> 
#include<time.h> 
#include <math.h> 
#define  MAX   3        /*游戏的总关数*/ 
#define  STEPMAX   3    /*悔棋的最大步数*/ 
#define Key_R 0x1372 
#define Key_Up  0x4800 
#define Key_Enter 0x1c0d 
#define Key_Down  0x5000 
#define Key_P     0x1970 
#define Key_Esc   0x11b 
#define Key_Right  0x4d00 
#define Key_Left  0x4b00 
#define  BKCOLOR   GREEN /*设置背景颜色*/ 
#define  STARTX   40     /*画游戏界面时,二维数组中ghose[0][0]左上角顶点在VGA模式下的横坐标*/ 
#define  STARTY   80     /*画游戏界面时,二维数组中ghose[0][0]左上角顶点在VGA模式下的纵坐标*/  
int ghose[10][10];       /*用来表示游戏中各种状态的二维数组*/ 
int BOXNUM;              /*每关中箱子的个数*/ 
int MISSIONNUM;          /*玩家正在玩的关数*/ 
int Key;                 /*从键盘读取按键值*/ 
int STEPNUM;             /*人走的步数*/ 
int DIRECTIONKEY;        /*用来记录玩家所按的方向键*/ 
int BOXMOVE[STEPMAX];    /*记录人行走时箱子移动了没有.如有,BOXMOVE[i]=1,否则BOXMOVE[i]=0*/ 
int STEP[STEPMAX];           /*记录人行走的方向*/ 
typedef  struct  CURRENT    
{ int x; 
  int y; 
  }PLAYER;           
PLAYER  p;               /*p.x和p.y分别表示人当前所在的横纵坐标*/ 
typedef  struct ADD 
{ int x; 
  int y; 
}ADD;                    /*人行走或悔棋时,用来表示人下一步移动需要增加的横纵坐标值*/ 
typedef struct STAR 
{ int x; 
  int  y; 
  int  c; 
} STAR;                  
STAR  s[300];            /*画星星闪动的画面,x,y分别表示每颗星星所在的位置,c表示星星的颜色*/ 
DRAWSTAR1()              /*画星星*/ 
{int  i,j,m,n,dotx,doty,color,maxcolor; 
 m=getmaxx(); 
 n=getmaxy(); 
 maxcolor=getmaxcolor(); 
for(i=0;i<300;i++) 
{ s[i].x=random(m+1); 
  s[i].y=random(n+1); 
  s[i].c=random(maxcolor); 
  putpixel(s[i].x,s[i].y,s[i].c);}} 
  DRAWSTAR()            /*让星星的坐标不变,颜色变换*/ 
{int  i,j,m,n,dotx,doty,color,maxcolor; 
 m=getmaxx(); 
 n=getmaxy(); 
 maxcolor=getmaxcolor(); 
 for(i=0;i<300;i++) 
{ s[i].x=random(m+1); 
  s[i].y=random(n+1); 
  s[i].c=random(maxcolor); 
  putpixel(s[i].x,s[i].y,s[i].c); 
} 
 do{ for(i=0;i<20000;i++) 
 delay(2); 
 for(j=0;j<300;j++) 
{ 
  s[j].c=random(maxcolor); 
  putpixel(s[j].x,s[j].y,s[j].c);} 
}while(!bioskey(1)); 
} 
GOOD()                /*画火球滚动的画面*/ 
{void * ptr; 
float i; 
setactivepage(1); 
setcolor(RED); 
setfillstyle(1,14); 
fillellipse(10,10,10,10); 
ptr=malloc(imagesize(0,0,20,20)); 
getimage(0,0,20,20,ptr); 
randomize(); 
setactivepage(0); 
DRAWSTAR1(); 
for(i=0;i<6.28*4;i=i+0.005) 
{putimage(300+8*(cos(i)+i*sin(i)),240+6*(sin(i)-i*cos(i)),ptr,COPY_PUT); 
 putimage(300+8*(cos(i)+(i)*sin(i)),240+6*(sin(i)-(i)*cos(i)),ptr,COPY_PUT); 
if(kbhit()) break; 
delay(10); 
} 
} 
void GAME()     /*游戏过程的控制*/ 
{ int i,j,flag; 
  ADD  a; 
  MISSIONNUM=0; 
  NEXTMISSION(); 
  do { flag=0; 
    Key=bioskey(0); 
    switch(Key) 
{ case  Key_Enter:{NEXTMISSION();break;} 
  case  Key_Up:{a.x=-1;a.y=0;flag=1;DIRECTIONKEY=Key;break;} 
  case  Key_Down:{a.x=1;a.y=0;flag=1;DIRECTIONKEY=Key;break;} 
 
 
  
  
   case  Key_Left:{a.x=0;a.y=-1;flag=1;DIRECTIONKEY=Key;break;} 
  case  Key_Right:{a.x=0;a.y=1;flag=1;DIRECTIONKEY=Key;break;} 
  case  Key_R:{MISSIONNUM--;NEXTMISSION();break;} 
  case  Key_P:{REVERSELYMOVE();break;} 
  case  Key_Esc:{DRAWEND();break;}} 
  if(flag==1) 
  { if(MOVE(a)) 
  {  REGISTERSTEP(); 
     if(JUDGEWIN()) 
     {settextstyle(1,0,2); 
     setcolor(RED); 
     outtextxy(40,10,"YOU HAVE PASSED THIS MISSION!"); 
     outtextxy(40,30,"PLEASE PRESS ANYKEY TO CONTINUE!"); 
     bioskey(0); 
     NEXTMISSION();}}}}while(1); 
    } 
  NEXTMISSION()          /*画下一关的游戏界面*/ 
  {int i,j; 
   if(MISSIONNUM+1>MAX) 
   MISSIONNUM=1; 
   else  MISSIONNUM++; 
   cleardevice(); 
   CHOOSEMISSION(MISSIONNUM); 
   for(i=0;i<10;i++) 
   for(j=0;j<10;j++) 
   DRAWMISSION(ghose[i][j],j,i); 
   DRAWINTRODUCTION(); 
   settextstyle(1,0,2); 
   switch(MISSIONNUM) 
   { case 1:outtextxy(60,50,"MISSION 1");break; 
     case 2:outtextxy(60,50,"MISSION 2");break; 
     case 3:outtextxy(60,50,"MISSION 3");break; 
   } 
   for(i=0;i<STEPMAX;i++) 
   STEP[i]=BOXMOVE[i]=0; 
   STEPNUM=0;} 
REGISTERSTEP()            /*登记步子*/ 
{ int i; 
  STEPNUM++; 
  i=(STEPNUM-1)%STEPMAX; 
  STEP[i]=DIRECTIONKEY;} 
  int JUDGEWIN()         /*人每走一步,就判断赢了没有*/ 
  {int n=0,i,j; 
   for(i=0;i<10;i++) 
   for(j=0;j<10;j++) 
   if(ghose[i][j]==6)  n++; 
   if(n==BOXNUM)    return 1; 
   else return  0;} 
REVERSELYMOVE()            /*对悔棋的处理*/ 
{ int i; 
  ADD  a; 
  i=(STEPNUM-1)%STEPMAX; 
  if(STEP[i]==0)   return; 
  else{ switch(STEP[i]) 
   {case  Key_Up:{a.x=1;a.y=0;MOVEBACK(a);break;} 
    case  Key_Down:{a.x=-1;a.y=0;MOVEBACK(a);break;} 
    case  Key_Left:{a.x=0;a.y=1;MOVEBACK(a);break;} 
    case  Key_Right:{a.x=0;a.y=-1;MOVEBACK(a);break;} } 
 STEPNUM--;STEP[i]=0;BOXMOVE[i]=0;}} 
 MOVE(ADD a)     /*依据人的下一位置的状态来控制人的行走*/ 
 { int flag; 
   int i=STEPNUM%STEPMAX; 
   switch(ghose[p.x+a.x][p.y+a.y]) 
{ case  0:{if(ghose[p.x][p.y]==5) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=4;} 
           if(ghose[p.x][p.y]==2) 
           {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=0;} 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           p.x=p.x+a.x;p.y=p.y+a.y; 
           ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=2; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           flag=1;break;} 
   case  3:{if(ghose[p.x+2*a.x][p.y+2*a.y]==0||ghose[p.x+2*a.x][p.y+2*a.y]==4) 
          {if(ghose[p.x+2*a.x][p.y+2*a.y]==0) 
          {if(ghose[p.x][p.y]==5) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=4;} 
           if(ghose[p.x][p.y]==2) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=0;} 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
 
 
  
 
    DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
           ghose[p.x+a.x][p.y+a.y]=2; 
           ghose[p.x+2*a.x][p.y+2*a.y]=3; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
           DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
           if(ghose[p.x+2*a.x][p.y+2*a.y]==4) 
             {if(ghose[p.x][p.y]==5) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=4;} 
           if(ghose[p.x][p.y]==2) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=0;} 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
           ghose[p.x+a.x][p.y+a.y]=2; 
           ghose[p.x+2*a.x][p.y+2*a.y]=6; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
           DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
           p.x=p.x+a.x; p.y=p.y+a.y;flag=1;BOXMOVE[i]=1;} 
           else  flag=0;break;} 
           case 1:flag=0;break; 
           case 4:{if(ghose[p.x][p.y]==5) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=4;} 
           if(ghose[p.x][p.y]==2) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=0;} 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           p.x=p.x+a.x;p.y=p.y+a.y; 
           ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=5; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           flag=1;break;} 
       case  6:{if(ghose[p.x+2*a.x][p.y+2*a.y]==0||ghose[p.x+2*a.x][p.y+2*a.y]==4) 
          {if(ghose[p.x+2*a.x][p.y+2*a.y]==0) 
          {if(ghose[p.x][p.y]==5) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=4;} 
            if(ghose[p.x][p.y]==2) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=0;} 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
           ghose[p.x+a.x][p.y+a.y]=5; 
           ghose[p.x+2*a.x][p.y+2*a.y]=3; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
           DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
           if(ghose[p.x+2*a.x][p.y+2*a.y]==4) 
             {if(ghose[p.x][p.y]==5) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=4;} 
            if(ghose[p.x][p.y]==2) 
          {ghose[p.x][p.y]=0; 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
           ghose[p.x][p.y]=0;} 
           DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
 
 
  
 
            ghose[p.x+a.x][p.y+a.y]=ghose[p.x+2*a.x][p.y+2*a.y]=0; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); 
           ghose[p.x+a.x][p.y+a.y]=5; 
           ghose[p.x+2*a.x][p.y+2*a.y]=6; 
           DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
           DRAWMISSION(ghose[p.x+2*a.x][p.y+2*a.y],p.y+2*a.y,p.x+2*a.x); } 
           p.x=p.x+a.x; p.y=p.y+a.y;flag=1;BOXMOVE[i]=1;} 
           else  flag=0;break;}} 
           return  flag; 
          } 
  MOVEBACK(ADD a)    /*分箱子没有移动和箱子移动了两种情况分别进行悔棋*/ 
  { int i=(STEPNUM-1)%STEPMAX; 
    if(BOXMOVE[i]==0) 
  { if(ghose[p.x+a.x][p.y+a.y]==0&&ghose[p.x][p.y]==2) 
   {ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x][p.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=2; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
    if(ghose[p.x+a.x][p.y+a.y]==4&&ghose[p.x][p.y]==5) 
   {ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x][p.y]=4; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=5; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
    if(ghose[p.x+a.x][p.y+a.y]==5&&ghose[p.x][p.y]==0) 
   { ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x][p.y]=4; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=2; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
    if(ghose[p.x+a.x][p.y+a.y]==2&&ghose[p.x][p.y]==4) 
  { ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x][p.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=5; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x);} 
    p.x=p.x+a.x;p.y=p.y+a.y;} 
    else if(BOXMOVE[i]==1) 
  { 
   if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==2&&ghose[p.x+a.x][a.y+p.y]==0) 
   {ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
    ghose[p.x-a.x][p.y-a.y]=0; 
    DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
    ghose[p.x][p.y]=3; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
    ghose[p.x+a.x][p.y+a.y]=2; 
    DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   } 
    if(ghose[p.x-a.x][p.y-a.y]==3&&ghose[p.x][p.y]==5&&ghose[p.x+a.x][a.y+p.y]==0) 
   {ghose[p.x-a.x][p.y-a.y]=ghose[p.x][p.y]=ghose[p.x+a.x][p.y+a.y]=0; 
    DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
   DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
 
 
  

    ghose[p.x-a.x][p.y-a.y]=0; 
   DRAWMISSION(ghose[p.x-a.x][p.y-a.y],p.y-a.y,p.x-a.x); 
   ghose[p.x][p.y]=6; 
   DRAWMISSION(ghose[p.x][p.y],p.y,p.x); 
   ghose[p.x+a.x][p.y+a.y]=2; 
   DRAWMISSION(ghose[p.x+a.x][p.y+a.y],p.y+a.y,p.x+a.x); 
   } 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -