計(jì)算機(jī)二級(jí)考試C++/C推箱子游戲

字號(hào):

#include"stdio.h"
    #include"bios.h"
    #define LEFT 75
    #define RIGHT 77
    #define UPPER 72
    #define DOWN 80
    #define ESC 27
    struct Boxss  /*定義箱子結(jié)構(gòu)體,其中包含坐標(biāo)屬性*/
    {
    int x,y;
    };
    union keyboard  /*定義讀取鍵盤碼的共用體類型*/
    {
    unsigned int iKeyInfo;
    char chKeyBit[2];
    };
    int fnGetKey(void)  /*定義讀取鍵盤碼的函數(shù)*/
    {
    union keyboard uniKey1;  /*定義讀取鍵盤碼的共用體變量*/
    while(bioskey(1)==0);  /*檢測(cè)用戶是否按鍵*/
    uniKey1.iKeyInfo=bioskey(0); /*讀取按鍵信息*/
    return(uniKey1.chKeyBit[0]==0?uniKey1.chKeyBit[1]:uniKey1.chKeyBit[0]);  /*返回ASCII碼或擴(kuò)充碼*/
    }
    void main()
    {
    int iKey,x=11,y=6,tx=11,ty=6; /*x,y為人物移動(dòng)后坐標(biāo),tx,ty為人物移動(dòng)前坐標(biāo)*/
    struct Boxss Box[4];  /*定義箱子數(shù)量*/
    int chMap[10][10]={ /*用二維數(shù)組定義地圖*/
    {0,0,0,0,0,0,0,0,0,0},  /*0表示墻1表示路2表示目標(biāo)*/
    {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; /*定義箱子的坐標(biāo)屬性*/
    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) /*反復(fù)進(jìn)行求移動(dòng)的坐標(biāo)運(yùn)算*/
    {
    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; /*判斷是否所有箱子都在目標(biāo)坐標(biāo)上*/
    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++) /*在起始(或移動(dòng)后)的坐標(biāo)輸出箱子*/
    {
    gotoxy(Box[i].x,Box[i].y);
    printf("0");
    }
    gotoxy(x,y); /*在起始(或移動(dòng)后)的坐標(biāo)輸出人*/
    printf("*b");
    tx=x;  /*記錄本次移動(dòng)前的坐標(biāo)*/
    ty=y;
    iKey=fnGetKey();
    if(iKey==LEFT&&chMap[y-5][x-1-10]!=0)  /*按讀取的按鍵信息改變坐標(biāo)如果改變的坐標(biāo)和墻(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++)  /*如果移動(dòng)后的人的坐標(biāo)與箱子坐標(biāo)重合,則改變箱子坐標(biāo)向前一格*/
    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) /*如果移動(dòng)后的箱子坐標(biāo)會(huì)出現(xiàn)在墻上,則使箱子坐標(biāo)和人坐標(biāo)都返回移動(dòng)前的值*/
    {
    Box[i].x-=(x-tx);
    Box[i].y-=(y-ty);
    x=tx;
    y=ty;
    }
    break;
    }
    clrscr();
    }
    getch();
    }