C語言實現的推箱子遊戲

來源:互聯網
上載者:User

/* 這是彭搏同學的推箱子遊戲,大家試試玩,誰有更好的Idea?*/

#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();
}

相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。