感謝您打開了這篇文章,下面我將講述一下推箱子是如何實現(xiàn)的。 另外附贈適配該程序簡單好用 專..."/>
溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

C語言實現(xiàn)簡單推箱子游戲

發(fā)布時間:2020-09-19 09:37:28 來源:腳本之家 閱讀:132 作者:白家名 欄目:編程語言

使用C語言實現(xiàn)超簡單的推箱子游戲,供大家參考,具體內(nèi)容如下/p>

感謝您打開了這篇文章,下面我將講述一下推箱子是如何實現(xiàn)的。

另外附贈適配該程序簡單好用 專屬推箱子地圖編輯器 讓您在16 * 16大地圖的條件下也能輕松編輯地圖。
鏈接:地圖編輯器

本程序在沒有檢測到地圖文件的情況下也能獨自運(yùn)行!代碼中儲存了推箱子游戲第一關(guān)的標(biāo)準(zhǔn)地圖,讓您在沒有地圖文件的情況下也能熟悉整個程序的流程!

當(dāng)然,擁有地圖文件會也會獲得更好的游戲體驗,請自行編輯。

廢話不多說!

下面進(jìn)入技術(shù)環(huán)節(jié):

C語言版 多功能推箱子

編譯環(huán)境: Windows VS2019
其他編譯器,可通過查看下文的“注意事項”將代碼更正為其他平臺可正常版本

需求:

控制人物將箱子推至目標(biāo)中,目標(biāo)全部完成進(jìn)入下一關(guān)。

思路:

使用二維數(shù)組儲存不同數(shù)字,數(shù)字包括了地圖中所有的元素,通過按鍵控制人物完成推箱子的操作,達(dá)成關(guān)卡內(nèi)的所有目標(biāo)后,自動進(jìn)入下一關(guān)。

做法:

主要邏輯移動推箱子部分:按下方向鍵后,雙重循環(huán)找到人物,根據(jù)移動方向儲存 人物、人物前面、箱子、箱子前面四大基礎(chǔ)信息,并通過判斷前方數(shù)組值是否是墻壁、目標(biāo)等,進(jìn)行人物移動和箱子移動操作。
具體詳細(xì)做法我已經(jīng)整理到了代碼注釋當(dāng)中,以便一一對應(yīng)查看。

使用到知識點:

循環(huán)、二維數(shù)組、讀取文件

難點:

在人物和箱子移動的同時,有需要注意當(dāng)人物移動到了未完成目標(biāo)或已完成目標(biāo)、箱子移動到了已完成目標(biāo)的情況,這種情況需要判斷在人物/箱子離開之后,原地又再次變?yōu)樵亍?/p>

說明:

程序前部分有較多代碼用于寫出未檢測到文件的情況邏輯和關(guān)卡選擇邏輯,如果要直接查看核心代碼請移動到operation();操作人物函數(shù)和gbszszhs(char ch);修改二維數(shù)組函數(shù)。

注意:

由于編譯器原因,程序中_kbhit()和_getch()函數(shù)可能在其他編譯器上編譯會出現(xiàn)錯誤,解決辦法是去掉函數(shù)前面的“_”。
同時,要將 文件打開函數(shù)fopen_s(&fp, FLPA, “r”);更改為fp = fopen(FLPA, “r”);
fcanf_s更改為fcanf scanf_s()更改為scanf

運(yùn)行效果:

菜單選擇:

C語言實現(xiàn)簡單推箱子游戲

游戲進(jìn)行:

C語言實現(xiàn)簡單推箱子游戲

代碼實現(xiàn):

#include <stdio.h>
#include <windows.h>
#include <conio.h>


//0代表空地,1代表墻,2代表未達(dá)成的目標(biāo),3代表箱子,4代表玩家,5代表已放箱子的目標(biāo),
//6代表人暫時所在的未達(dá)成的目標(biāo),7代表人暫時所在的已達(dá)成的目標(biāo),8代表箱子暫時所在的已達(dá)成的目標(biāo)

#define WH 16   //地圖的寬高
#define BYT 529   //一關(guān)需要跳過的字?jǐn)?shù)  因為文件指針定位函數(shù)的原因,有時定位可能會不準(zhǔn)確,可以通過修改BYT進(jìn)行適配
#define FLPA "C:\\Users\\ASUS\\Desktop\\推箱子地圖.txt"  //需要讀取地圖文件的路徑 游戲之前需進(jìn)行設(shè)置?。?               //找不到路徑將只能進(jìn)行第一關(guān)游戲

//注意:游戲地圖邊界 不可以 當(dāng)做墻壁使用!

#define INITMAP            \
  int mapch_init[WH][WH] = {       \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 1, 1, 1, 3, 0, 3, 2, 1, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 1, 2, 0, 3, 4, 1, 1, 1, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 1, 1, 1, 1, 3, 1, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 1, 2, 1, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
  {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},  \
};

int mapch[WH][WH];

//所有函數(shù)之間不是獨立和順序的,會互相調(diào)用
void HideCursor();  //隱藏光標(biāo)
void gotoxy(int x, int y);//光標(biāo)定位
void scmbxyhs();  //輸出地圖下方文字信息函數(shù)
void wjzdwjzjjrqk(); //未找到文件直接進(jìn)入第一關(guān)情況
int gkxzhs();   //關(guān)卡選擇函數(shù)
void cwjzjrwkdhs();  //從文件中進(jìn)入關(guān)卡的函數(shù)
void gnxzjm();   //主菜單選擇
void cshhs();   //初始化函數(shù)

void tranmap();   //翻譯并畫出地圖
void detection();  //尋找所有該地圖中未完成的目標(biāo)
void gktgszxhs();  //判斷關(guān)卡是否通過,是進(jìn)行下一關(guān)卡
void operation();  //操作人物主要函數(shù)***
void gbszszhs(char ch); //改變數(shù)組數(shù)值函數(shù)
int updatetime();  //獲取一次電腦現(xiàn)在的時間
void process();   //主要流程

int main()
{
 cshhs();   //初始化函數(shù)

 process();   //主要流程

 return 0;
}

//游戲開始初始化部分
void scmbxyhs()   //輸出地圖提示信息函數(shù)
{
 gotoxy(34, 17);    
 printf("本關(guān)剩余目標(biāo)數(shù):");
 gotoxy(34, 19);
 printf("本關(guān)已走步數(shù):");
 gotoxy(32, 21);
 printf("您使用 秒完成了本關(guān)!");
 gotoxy(49, 19);
 printf("0");  //輸出初始的步數(shù)0
}

void wjzdwjzjjrqk()  //未找到文件直接進(jìn)入第一關(guān)情況
{
 system("cls");
 printf("地圖文件不存在,\n直接進(jìn)入第一關(guān)");

 INITMAP        //初始地圖數(shù)組

 for (int i = 0; i < WH; i )  //如果地圖文件不存在則將初始地圖數(shù)組的值賦給需要使用的地圖
  for (int j = 0; j < WH; j ) //將初始地圖數(shù)組的值復(fù)制給當(dāng)前地圖數(shù)組
   mapch[i][j] = mapch_init[i][j];

 Sleep(2000);    //等待兩秒進(jìn)入第一關(guān)
 system("cls");   //清屏
 tranmap();    //畫出初始地圖
 detection();    //目標(biāo)信息
 scmbxyhs();    //輸出地圖下方文字信息
}


int n = 1;     //輸入關(guān)卡變量**
int maxn = 0;    //最大關(guān)數(shù)

int dczdgshs()    //最大關(guān)數(shù)
{
 FILE* fp = NULL;  //因為用于提示和限制輸入情況,所以需要得到最大關(guān)卡數(shù)maxn
 fopen_s(&fp, FLPA, "r");

 if (fp == NULL)
 {
  wjzdwjzjjrqk();  //未找到文件直接進(jìn)入第一關(guān)情況
  return 0;
 }
 int temp = 0;   //臨時變量用來統(tǒng)計地圖文件全字節(jié)數(shù)

 rewind(fp);    //文件指針移動到文件首部

 while (!feof(fp))  //文件指針還沒有到文件尾進(jìn)入循環(huán)
 {
  fgetc(fp);   //讀字符函數(shù)從文件開頭讀,向后移動文件指針
  temp ;    //每讀一個字符則臨時變量自增,統(tǒng)計出全文件有幾個字符
 }
 fclose(fp);    //文件使用完成關(guān)閉文件
 maxn = temp / BYT 1; //最大關(guān)數(shù)就是所有字符的數(shù)量除以一關(guān)的字符數(shù)
 return 1;
}



int gkxzhs()     //選擇關(guān)卡函數(shù)
{
 system("cls");   //輸出關(guān)卡選擇提示
 gotoxy(26, 8);
 printf("請輸入想要挑戰(zhàn)的關(guān)卡:(回車確認(rèn))");

 if (!dczdgshs())  //得出最大關(guān)數(shù)函數(shù),返回值為0代表未找到地圖文件,直接進(jìn)入流程
  return 0;

 gotoxy(36, 10);
 printf("請輸入1- %d ", maxn);//輸出提示最大關(guān)數(shù)信息

 srgk:   //重新選擇關(guān)卡

 gotoxy(41, 12);
 scanf_s("%d", &n);

 if (n<1 || n>maxn)  //對輸入的錯誤關(guān)卡信息加以限制
 {
  gotoxy(36, 12);
  printf("    ");
  gotoxy(33, 11);
  printf("請輸入正確的關(guān)數(shù)");
  goto srgk;   //如果輸入錯誤的關(guān)卡輸出提示信息并返回到輸入的地方重新輸入
 }
 return 1;    //如果找到了文件就返回1
}

void cwjzjrwkdhs()   //從文件中進(jìn)入關(guān)卡,適用于可以找到地圖文件的情況
{
 //關(guān)數(shù)變量n的默認(rèn)初始化值為1
 FILE* fp = NULL;
 fopen_s(&fp, FLPA, "rb");

 if (fp == NULL)
 {
  wjzdwjzjjrqk();   //直接進(jìn)入第一關(guān)函數(shù)
  return;     //地圖文件不存在則直接進(jìn)入第一關(guān)
 }

 //讀文件進(jìn)入關(guān)卡的代碼,從第一關(guān)進(jìn)入和選擇特定關(guān)從n關(guān)進(jìn)入兩種情況都會執(zhí)行
   //流程如果用到該函數(shù),檢測已達(dá)成的目標(biāo)和未達(dá)成目標(biāo)的個數(shù)一直則調(diào)用函數(shù),n關(guān)數(shù)自增1
 int skip = (n - 1) * BYT; //到n關(guān)需要跳過的字?jǐn)?shù) 跳過一關(guān)需要的字?jǐn)?shù)為512

 fseek(fp, skip, 0);   //定位到地圖文件第skip個字節(jié)處開始讀取
 int i, j;
 for (i = 0; i < WH; i ) //讀取512個字符
 {
  for (j = 0; j < WH; j )
  {
   fscanf_s(fp, "%d ", &mapch[i][j]);//格式讀函數(shù),直接以整數(shù)格式讀取數(shù)值存入地圖數(shù)組mapch中
   printf("%d ", mapch[i][j]);
  }
  printf("\n");
 }
 fclose(fp);     //讀取文件完畢,將文件關(guān)閉
 system("cls");
}

void gnxzjm()     //主菜單頁面選擇
{
 system("cls");
 gotoxy(39, 8);
 printf("推箱子");
 gotoxy(34, 10);
 printf("輸入1 開始新游戲");
 gotoxy(34, 12);
 printf("輸入2 選擇關(guān)卡");
 gotoxy(34, 14);
 printf("輸入3 退出游戲");

 Head:      //用于返回的標(biāo)簽
 gotoxy(34, 17);
 char chn=_getch();   //選擇游戲模式

 if (chn == '3')
 {
  system("cls");   //退出游戲則輸出提示信息
  gotoxy(34, 12);
  printf("歡迎下次光臨");
  Sleep(2000);
  gotoxy(0, 24);
  exit(0); //退出游戲
 }
  
 else if (chn == '2')
 {
  if (!gkxzhs())   //進(jìn)入關(guān)卡選擇
   return;    //如果關(guān)卡選擇函數(shù)返回值為0則代表未找到文件,直接跳出初始化函數(shù)
  //如果返回1找到文件則繼續(xù)執(zhí)行該函數(shù)下面的內(nèi)容
 }

 else if (chn == '1')
  n = 1;     //如果選擇新游戲,直接從第一關(guān)開始
 else
 {
  gotoxy(34, 16);
  printf("請輸入正確的選擇:");
  goto Head;    //選擇錯誤的菜單,則重新返回選擇菜單的地方
 }

 //選擇1的情況:

 cwjzjrwkdhs();    //從文件讀取關(guān)卡的函數(shù)
 detection();    //統(tǒng)計當(dāng)前關(guān)卡的目標(biāo)數(shù)
 tranmap();     //畫出地圖
 scmbxyhs();     //輸出地圖下方文字信息
}

int detunf;//檢測未完成目標(biāo)的變量,初始為一個關(guān)卡中未完成目標(biāo)的個數(shù),箱子碰到未完成目標(biāo)時,自減

void detection()   //檢測當(dāng)前關(guān)中有多少個目標(biāo)
{
 //detunf
 detunf = 0;    //從0開始統(tǒng)計
 int i, j;
 for (i = 0; i < WH; i )
  for (j = 0; j < WH; j )
   if (mapch[i][j] == 2)
    detunf ;
 gotoxy(50,17);   //在提示信息的位置輸出剩余目標(biāo)信息
 printf("%d", detunf); 
}

void cshhs()   //總初始化函數(shù)
{
 system("title 推箱子");//控制臺標(biāo)題
 system("mode con cols=84 lines=26");//設(shè)置控制臺大小,第一個參數(shù)為橫軸,地圖參數(shù)32 16
 gnxzjm();   //主菜單頁面選擇
 HideCursor();  //隱藏光標(biāo)函數(shù)
 dczdgshs();   //找到地圖文件的情況下得出最大關(guān)數(shù)
}



//游戲流程部分
void tranmap()   //翻譯地圖
{
 gotoxy(26, 1);  //輸出地圖時在控制臺中間輸出,地圖最上方空一行
 int i, j;      
 for (i = 0; i < WH; i )
 {
  for (j = 0; j < WH; j )
  {
   if (mapch[i][j] == 1)
    printf("■");
   else if (mapch[i][j] == 2)
    printf("★");
   else if (mapch[i][j] == 3 || mapch[i][j] == 8)
    printf("●");
   else if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7)
    printf("♀");
   else if (mapch[i][j] == 5)
    printf("--");
   else
    printf(" ");
  }
  gotoxy(26, i 1);  //根據(jù)數(shù)組的y軸更改地圖輸出的y軸,地圖最上方空一行
 }
}

int opnum;   //每一關(guān)行走的步數(shù)
int time;
int time_2;

void gktgszxhs()   //判斷當(dāng)前關(guān)卡是否通過,是進(jìn)入下一關(guān)
{
 if (detunf == 0)  //當(dāng)前關(guān)卡目標(biāo)為0時
 {
  n ;    //關(guān)卡變量自增
  if (n > maxn)  //如果關(guān)數(shù)n大于了最大關(guān)卡數(shù)則返回主菜單
  {
   tranmap();  //畫出地圖
   gotoxy(26, 22);
   printf("您已通關(guān)所有關(guān)卡,3秒后返回主菜單!");
   Sleep(3000); //等待三秒
   opnum = 0, time = updatetime(),time_2 = 0;//行走的步數(shù),本關(guān)時間清0,重新獲取當(dāng)前時間,\
              因為需要輸出的time_2是用當(dāng)前時間-剛開始的時間
   gnxzjm();  //主菜單頁面選擇函數(shù)
  }
  else
  {
   tranmap();  //畫出地圖
   Sleep(2000); //等候兩秒
   cwjzjrwkdhs(); //當(dāng)前關(guān)卡目標(biāo)為0時,從文件中向地圖數(shù)組中讀入下一關(guān)卡的信息
   detection(); //統(tǒng)計當(dāng)前關(guān)卡目標(biāo)個數(shù)
   scmbxyhs();  //輸出地圖下方的信息
   opnum = 0, time = updatetime(),time_2 = 0;//注釋見297行
       //按鍵結(jié)束之后操控函數(shù)會調(diào)用畫出地圖函數(shù)
  }
 }
}

int i, j;     //找到后的人的坐標(biāo)

int box_x, box_y;   //箱子的坐標(biāo)
int boxnext_x, boxnext_y; //箱子前面的坐標(biāo)
int peonext_x, peonext_y; //人前面的坐標(biāo)

void gbszszhs(char ch)  //修改地圖數(shù)組值主要函數(shù)**
{
 for (i = 0; i < WH; i )  //遍歷 i是y軸,j是x軸
 {
  for (j = 0; j < WH; j )
  {
   if (mapch[i][j] == 4 || mapch[i][j] == 6 || mapch[i][j] == 7)    //找到人的位置
   {
    if (ch == 'w')  // 用于確定不同方向上 箱子、箱子前面、人前面的坐標(biāo)
    {
     box_y = i - 1; box_x = j;   //箱子當(dāng)前
     boxnext_y = i - 2; boxnext_x = j; //箱子前面
     peonext_y = i - 1; peonext_x = j; //人前面
    }
    else if (ch == 'a')
    {
     box_y = i; box_x = j - 1;
     boxnext_y = i; boxnext_x = j - 2;
     peonext_y = i; peonext_x = j - 1;
    }
    else if (ch == 's')
    {
     box_y = i 1; box_x = j;
     boxnext_y = i 2; boxnext_x = j;
     peonext_y = i 1; peonext_x = j;
    }
    else if (ch == 'd')
    {
     box_y = i; box_x = j 1;
     boxnext_y = i; boxnext_x = j 2;
     peonext_y = i; peonext_x = j 1;
    }

    //排除大的錯誤
    if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) //如果人的前邊是箱子
     if (mapch[boxnext_y][boxnext_x] == 1 || mapch[boxnext_y][boxnext_x] == 3 || mapch[boxnext_y][boxnext_x] == 8)
      return;  //如果箱子前邊是墻或者是箱子直接結(jié)束修改函數(shù)
    
    if (mapch[box_y][box_x] == 1)  //人的前邊不能是墻
     return;   //如果人的前邊是墻直接結(jié)束修改

    opnum ;   //每次有效操作步數(shù)自增一次,并輸出
    gotoxy(49, 19);
    printf("%d", opnum);//步數(shù)

    //箱子改變
    if (mapch[box_y][box_x] == 3 || mapch[box_y][box_x] == 8) //如果人的前邊是箱子
    {
     //箱子原地改變:
     if (mapch[box_y][box_x] == 3)  //如果箱子所在的位置是 一般箱子 
      mapch[box_y][box_x] = 0;  //改變?yōu)榭盏?     else if (mapch[box_y][box_x] == 8) //如果箱子所在的位置是 箱子暫時所在已達(dá)成的目標(biāo)
      mapch[box_y][box_x] = 5;  //改變?yōu)橐堰_(dá)成的目標(biāo)

     //箱子的下一步改變:

     if (mapch[boxnext_y][boxnext_x] == 2)  //如果箱子前面的格子是未放箱子的目標(biāo)
     {
      mapch[boxnext_y][boxnext_x] = 5;  //則該格子變?yōu)橐逊畔渥拥哪繕?biāo)
      detunf--;        //本關(guān)目標(biāo)減1
      gotoxy(50, 17);       //輸出本關(guān)剩余目標(biāo)個數(shù)
      printf("%d", detunf);
     }
     else if (mapch[boxnext_y][boxnext_x] == 0) //如果箱子前面是空地      
      mapch[boxnext_y][boxnext_x] = 3;  //則變?yōu)槠胀ㄏ渥?     else if (mapch[boxnext_y][boxnext_x] == 5) //如果箱子前面是已經(jīng)放過箱子的目標(biāo)
      mapch[boxnext_y][boxnext_x] = 8;  //則變?yōu)?箱子暫時所在已達(dá)成的目標(biāo)
    }

    //原地改變
    if (mapch[i][j] == 6)
     mapch[i][j] = 2; //走出去之后原地又變回2 未達(dá)成的目標(biāo)
    else if (mapch[i][j] == 7)
     mapch[i][j] = 5; //走出去之后原地又變回5 已達(dá)成的目標(biāo)
    else if (mapch[i][j] == 4)
     mapch[i][j] = 0; //走出去之后原地變回4 人的原型


    //人下一步改變
    if (mapch[peonext_y][peonext_x] == 0 || mapch[peonext_y][peonext_y] == 3)//如果他的下一步是普通箱子或者空地
     mapch[peonext_y][peonext_x] = 4;  //人是 普通的人

    if (mapch[peonext_y][peonext_x] == 2)  //如果他的下一步還是未達(dá)成的目標(biāo)
     mapch[peonext_y][peonext_x] = 6;  //人是 人暫時所在未達(dá)成的目標(biāo)

    if (mapch[peonext_y][peonext_x] == 5)  //如果人的下一步是已經(jīng)達(dá)成的目標(biāo)
     mapch[peonext_y][peonext_x] = 7;  //人是 人暫時所在已經(jīng)達(dá)成的目標(biāo)

    if (mapch[peonext_y][peonext_x] == 8)  //如果人的下一步是 箱子暫時所在已達(dá)成的目標(biāo)
     mapch[peonext_y][peonext_x] = 7;  //人還是 暫時所在已達(dá)成的目標(biāo)

    goto L1; //修改完成后不需要遍歷后面的數(shù)組,直接跳出所有循環(huán)
   }
  }
 }

 L1:      //用于跳出的標(biāo)簽
 gktgszxhs(); //關(guān)卡通過則進(jìn)入下一關(guān)
}

void operation() //操作人物函數(shù)
{
 char ch = _getch(); //接收輸入的方向 _getch()即使接收
 switch (ch)
 {
 case 'w':    //向不同方向移動
  gbszszhs(ch);  //傳遞參數(shù),修改二維數(shù)組
  break;
 case 'a':
  gbszszhs(ch);
  break;
 case 's':
  gbszszhs(ch);
  break;
 case 'd':
  gbszszhs(ch);
  break;
 }
 tranmap();    //重新畫出地圖
}

int updatetime()      //獲取一次電腦現(xiàn)在的時間
{
 int now;
 SYSTEMTIME system_time;
 GetLocalTime(&system_time);
 now = system_time.wMinute * 60 system_time.wSecond;
 return now;
}

void process()  //主要流程
{
 time = updatetime(); //初始時間
 while (1)
 {
  time_2 = updatetime() - time; //每關(guān)的時間time_2,值為當(dāng)前時間減去當(dāng)前關(guān)卡開始的時間
  gotoxy(39, 21);
  printf("%d s", time_2);   //輸出

  if(_kbhit())
   operation(); //操作人物、修改數(shù)值主要函數(shù)
  Sleep(20);   //游戲幀率和手感 休眠時間
 }
 
}

void gotoxy(int x, int y) //光標(biāo)定位
{
 COORD pos = { x,y };
 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);
}

void HideCursor()   //光標(biāo)隱藏
{
 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
}

主要函數(shù):gbszszhs()里面的邏輯是比較復(fù)雜的,我當(dāng)時寫這段代碼的時候也是反反復(fù)復(fù)修改好多次甚至推翻重做才理通順這些邏輯的。

如果對于程序代碼注釋有我沒寫明白的地方,歡迎在評論區(qū)下方留言詢問,如果我看到會盡最大的努力為您解惑。

不足之處:

地圖在屏幕上顯示時容易出錯,需要調(diào)整每關(guān)字?jǐn)?shù)。原因并不明確。

因為作者對C語言的學(xué)習(xí)還比較淺薄,代碼寫到初始化游戲的兩種模式(有文件和無文件)時思維有些混亂,導(dǎo)致代碼在這一部分有很多的缺陷,但最終程序的效果還是出來了。
但其實對整篇所有代碼而言最重要的部分還是gbszszhs()函數(shù),只要將這個函數(shù)完全理解并熟練掌握了,那么整個“推箱子”游戲也就非常簡單了。

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持億速云。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI