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

📄 c语言编写的推箱子程序.txt

📁 C语言编写的推箱子程序... C语言初学者能写出来的小游戏!!
💻 TXT
字号:
#include "stdio.h"
#include "graphics.h"
#include "alloc.h"

#define VK_LEFT 0x4b00
#define VK_RIGHT 0x4d00
#define VK_DOWN 0x5000
#define VK_UP 0x4800
#define VK_HOME 0x4700
#define VK_END 0x4f00
#define VK_SPACE 0x3920
#define VK_ESC 0x011b
#define VK_ENTER 0x1c0d
#define spread 20
#define VK_R 0x1372

/*定义主数据结构*/
struct Map
{
   int path[19][19];/*包含每张地图的路径,(0空白(2墙(3箱子(4目的地(5工人(6已完成的箱子
   X轴在前Y在后*/
   int NUM;/*关卡编号*/
   int Condition; /*胜利条件*/
   struct Map *next;/*指向下一个节点*/
};

/*函数说明*/
/*画图函数各有三个参数(宽度(X(Y*/
void LineWall(int x,int y); /*画墙壁*/
void LineBox(int x,int y); /*画木箱*/
void LineWorker(int x,int y); /*画工人*/
void LineEnd(int x,int y); /*画木箱的目的地*/
void LineHatchway(int x,int y); /*画地板*/
void LineEndBox(int x,int y);/*画推好的箱子*/

/*逻辑判断函数*/
int MayMove(int key,struct Map *head);/*判断是否可以移动,参数是用户按下的键值
返回值(1代表可以,0代表不可以)*/
int Victoryed(struct Map *P);/*判断是否获胜返回值(0代表没有,1代表获胜)*/
void FormatPath(int key,struct Map *point);/*更改当前布局的值,2个参数分别是用户按下的键值和当前关卡的指针*/
void Format(struct Map *point);/*画当前布局一个参数,当前关卡的指针*/

/*初始化函数*/
void CreateRole();/*创建任务*/


/*全局变量*/
int IsVictory=0;/*判断是否胜利*/
int WorkerX;/*当前工人位置横向的值*/
int WorkerY;/*当前工人位置竖向的值*/
struct Map *head,*Dp;

void format1(s,x,y)
{
   setfillstyle(SOLID_FILL,YELLOW);
   bar(x,y,x+(s-1),y+s-1);
}
void main()
{
   int InputKey=0;/*获取用户的按键*/
   int IsMove;/*判断是否可以移动*/
   int IsVoc;/*判断是否获胜*/
   int gdriver=DETECT,gmode;
   /*初始化任务*/
   ReStart:
   CreateRole();
   initgraph(&gdriver,&gmode,"C:\Win-TC");/*进入图形模式*/
   Format(Dp);

   while(InputKey!=VK_ESC)
   {
      outtextxy(20,20,"Enter \"R\" to restart!");   
      InputKey=bioskey(0);
      if(InputKey==VK_R)/*重新开始*/
         goto ReStart;
      /*判断是否可以移动*/
      IsMove=MayMove(InputKey,Dp);
      if(IsMove)/*可以移动*/
      {
         FormatPath(InputKey,Dp);/*更改当前地图发生变动的值*/
         cleardevice();
         Format(Dp);
         IsVoc=Victoryed(Dp);/*判断是否获胜*/
         if(IsVoc)/*获胜*/
         {
            outtextxy(290,170,"Victory!");
         }
         else
         {
            IsVictory=0;
            continue;
         }
      }
      else
         continue;
   }
   closegraph();


}

void CreateRole()
{
   int x,y;
   Dp=(struct Map *)malloc(sizeof(struct Map));
   head=Dp;
   for(x=0;x<19;x++)
      for(y=0;y<19;y++)
      {
         if((x>=3&&x<=14)&&(y==6))
            Dp->path[x][y]=2;
         else if(x==3&&(y>=7&&y<=11))
            Dp->path[x][y]=2;
         else if((x>=4&&x<=14)&&y==11)
            Dp->path[x][y]=2;
         else if(x==14&&(y>=7&&y<=10))
            Dp->path[x][y]=2;
         else if((x>=7&&x<=10)&&(y>=7&&y<=8))
            Dp->path[x][y]=2;
         else if((x>=6&&x<=10)&&y==9)
            Dp->path[x][y]=4;
         else
            Dp->path[x][y]=0;
      }
   Dp->path[4][7]=2;
   Dp->path[5][8]=3;
   Dp->path[6][9]=3;
   Dp->path[4][10]=2;
   Dp->path[9][10]=2;
   Dp->path[13][10]=2;
   Dp->path[11][8]=3;
   Dp->path[12][9]=3;
   Dp->path[11][10]=5;
   Dp->NUM=1;
   Dp->Condition=4;
   WorkerX=11;
   WorkerY=10;
}

void Format(struct Map *Point)
{
   int x,y;
   int LineX,LineY;
   int style;
   LineX=139;
   LineY=59;
   for(y=0;y<19;y++)
   {
      for(x=0;x<19;x++)
      {
     &

nbsp;   style=Point->path[x][y];
         if(style==6)
            IsVictory+=1;
         switch(style)
         {
            case 2:LineWall(LineX,LineY);break;
            case 3:LineBox(LineX,LineY);break;
            case 4:LineEnd(LineX,LineY);break;
            case 5:LineWorker(LineX,LineY);break;
            case 6:LineEndBox(LineX,LineY);break;
         }
         LineX+=20;
      }
      LineY+=20;
      LineX=139;

  }

}

void FormatPath(int Key,struct Map *Point)
{
   int style,style1,style2;
   style=Point->path[WorkerX][WorkerY];
   switch(Key)
   {
      case VK_UP:
      {
         style1=Point->path[WorkerX][WorkerY-1];
         style2=Point->path[WorkerX][WorkerY-2];
         if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
            Point->path[WorkerX][WorkerY-2]=3;
         else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
            Point->path[WorkerX][WorkerY-2]=6;
         else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
            Point->path[WorkerX][WorkerY-2]=6;
         else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
            Point->path[WorkerX][WorkerY-2]=3;
         Point->path[WorkerX][WorkerY-1]=5;
         Point->path[WorkerX][WorkerY]=0;
         WorkerY--;
         break;
      }
      case VK_DOWN:
      {
         style1=Point->path[WorkerX][WorkerY+1];
         style2=Point->path[WorkerX][WorkerY+2];
         if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
            Point->path[WorkerX][WorkerY+2]=3;
         else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
            Point->path[WorkerX][WorkerY+2]=6;
         else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
            Point->path[WorkerX][WorkerY+2]=6;
         else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
            Point->path[WorkerX][WorkerY+2]=3;
         Point->path[WorkerX][WorkerY+1]=5;
         Point->path[WorkerX][WorkerY]=0;
         WorkerY++;
         break;
      }
      case VK_LEFT:
      {
         style1=Point->path[WorkerX-1][WorkerY];
         style2=Point->path[WorkerX-2][WorkerY];
         if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
            Point->path[WorkerX-2][WorkerY]=3;
         else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
            Point->path[WorkerX-2][WorkerY]=6;
         else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
            Point->path[WorkerX-2][WorkerY]=6;
         else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
            Point->path[WorkerX-2][WorkerY]=3;
         Point->path[WorkerX-1][WorkerY]=5;
         Point->path[WorkerX][WorkerY]=0;
         WorkerX--;
         break;
      }
      case VK_RIGHT:
      {
         style1=Point->path[WorkerX+1][WorkerY];
         style2=Point->path[WorkerX+2][WorkerY];
   &

nbsp;     if(style1==3&&style2==0)/*旁边是箱子后面是空地*/
            Point->path[WorkerX+2][WorkerY]=3;
         else if(style1==3&&style2==4)/*旁边是箱子后面是目的地*/
            Point->path[WorkerX+2][WorkerY]=6;
         else if(style1==6&&style2==4)/*旁边是已推好的箱子后面是目的地*/
            Point->path[WorkerX+2][WorkerY]=6;
         else if(style1==6&&style2==0)/*旁边是已推好的箱子后面的空地*/
            Point->path[WorkerX+2][WorkerY]=3;
         Point->path[WorkerX+1][WorkerY]=5;
         Point->path[WorkerX][WorkerY]=0;
         WorkerX++;
         break;
      }
   }
   style1=9;
   for(style=7;style<11;style++)
   {
      if(Point->path[style][style1]!=5&&Point->path[style][style1]!=6)
         Point->path[style][style1]=4;
   }
}

int Victoryed(struct Map *P)
{
   if(IsVictory==P->Condition)
      return(1);
   return(0);
}

int MayMove(int key,struct Map *head)
{
   int style,style1,style2;
   switch(key)
   {
      case VK_UP:
      {
         style=head->path[WorkerX][WorkerY];
         style1=head->path[WorkerX][WorkerY-1];
         style2=head->path[WorkerX][WorkerY-2];
         break;
      }
      case VK_DOWN:
      {
         style=head->path[WorkerX][WorkerY];
         style1=head->path[WorkerX][WorkerY+1];
         style2=head->path[WorkerX][WorkerY+2];
         break;
      }
      case VK_LEFT:
      {
         style=head->path[WorkerX][WorkerY];
         style1=head->path[WorkerX-1][WorkerY];
         style2=head->path[WorkerX-2][WorkerY];
         break;
      }
      case VK_RIGHT:
      {
         style=head->path[WorkerX][WorkerY];
         style1=head->path[WorkerX+1][WorkerY];
         style2=head->path[WorkerX+2][WorkerY];
         break;
      }
      default:return(0);break;
   }
   if(style1==0 || style1==4)/*旁边没有箱子*/
      return(1);
   else if((style1==3)&&(style2==0 || style2==4))/*旁边有一只箱子且箱子后面是空地或目的地*/
      return(1);
   else if((style1==6)&&(style2==0 || style2==4))/*旁边是一只已推好的箱子且后面是空白或目的地*/
      return(1);
   else
      return(0);
}

void LineWall(int x,int y)
{
   setfillstyle(SOLID_FILL,RED);
   bar(x,y,x+spread-1,y+spread-1);
}

void LineBox(int x,int y)
{
   setfillstyle(INTERLEAVE_FILL,YELLOW);
   bar(x,y,x+spread-1,y+spread-1);
}

void LineWorker(int x,int y)
{
   setfillstyle(LTSLASH_FILL,BLUE);
   fillellipse(x+10,y+10,spread/4,spread/2);
}

void LineEnd(int x,int y)
{
   circle(x+10,y+10,(spread-1)/2);
}

void LineHatchway(int x,int y)/*本来是用来画地板的后来*/
{
}

void LineEndBox(int x,int y)
{
   setfillstyle(INTERLEAVE_FILL,YELLOW);
   bar(x,y,x+spread-1,y+spread-1);
   circle(x+10,y+10,(spread-1)/2);
}


文章出处:http://www.diybl.com/course/3_program/c/cyxibch/2007213/21234_3.html

⌨️ 快捷键说明

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