c++之 推箱子小游戲

      網友投稿 753 2025-04-01

      前言


      推箱子小游戲相信是很多人的同年記憶了,今天用c++語言來嘗試下,用的是vs編譯器。

      代碼還有很多可以優化的地方,為了更直觀了解函數的形參和實參,所以地圖沒有用全局變量聲明了,其實用全局變量聲明會簡潔很多。

      頭文件和main函數分享在最下面了。

      提示:以下是本篇文章正文內容,下面案例可供參考

      一、初始化游戲數據

      void GameInit(int(*&pMap)[10][10], int index)//兩張地圖數據 { // static:返回靜態全局區變量 static int localmap[2][10][10] = { { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 5, 0, 1, 0, 0, 3, 0, 1, 1, 0, 0, 0, 1, 0, 0, 3, 0, 1, 1, 0, 0, 4, 1, 0, 0, 3, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 }, { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 4, 0, 0, 0, 1, 1, 0, 5, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 3, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } }; // 數組指針指向對應關卡的地址 pMap = localmap ;//數組名表示指針,此時指向第一個二維數組地圖 }

      用3維數組來編寫兩個地圖,第一關過了就進入下一關,用static關鍵字聲明數組,保證地圖數據可以返回出去

      二、渲染地圖

      void RenderMap(int(*pMap)[10][10]) { system("CLS"); for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { int element = (*pMap)[i][j]; switch (element) { case 0: cout << " ";//空地 break; case 1:cout << "■";//墻 break; case 3: cout << "☆";//勝利點 break; case 4: cout << "□";//箱子 break; case 5: cout << "♀";//人 posx = i;//記錄人的坐標 posy = j; break; case 7: cout << "★";//箱子進入勝利點 break; case 8: cout << "♀";//人進入勝利點 posx = i;//記錄人的坐標 posy = j; break; } } cout << endl; } }

      渲染地圖其實很簡單了,做個二維數組的遍歷,用switch語句進行渲染,

      這里其實還有一點可以渲染的更明了一點,可以在全局聲明,拿人來舉例子

      const int people = 5;

      這樣的好處呢其實用people來代替5這個數字,顯得更直觀,不然下面更新地圖數據還要翻上去看哪個數字代表什么就很麻煩

      三、 更新地圖數據

      void UpdateMap(int(*&pMap)[10][10]) { char input = _getch();//獲取從鍵盤輸入的字母 int offsetx=0, offsety=0;//設置偏移量 switch (input) { case 's': case 'S'://輸入s,人物向下走,x加1,偏移量為1,y不變,一次類推 offsetx= 1; offsety = 0; break; case 'w': case 'W': offsetx = -1; offsety = 0; break; case 'd': case 'D': offsety = 1; offsetx = 0; break; case 'a': case 'A': offsety = -1; offsetx = 0; break; default: break; } move(pMap, offsetx, offsety);//調用了move函數 }

      這是move函數,形參為地圖和偏移量,在move函數中調用了 nextElement函數。

      可以看到,在一開始定義了兩個int型常量分別保存英雄下一個位置和下下個位置的值。

      void move(int(*&pMap)[10][10], int offsetx, int offsety) { int nextelementOfpos = nextElement(pMap, posx+offsetx, posy+offsety);//下一個位置 int nextnextelementOfpos = nextElement(pMap, posx+offsetx * 2,posy+offsety * 2);//下下個位置 if (nextelementOfpos == 0 || nextelementOfpos == 3) { *((*((*(pMap )) + posx)) + posy) -= 5; *((*((*(pMap )) + posx + offsetx)) + posy + offsety) += 5; } else if (nextelementOfpos == 4 || nextelementOfpos == 7) { if (nextnextelementOfpos == 0 || nextnextelementOfpos == 3) { *(*((*(pMap )) + posx) + posy) -= 5; *(*((*(pMap)) + posx + offsetx) + posy + offsety) += 5; *(*((*(pMap )) + posx + offsetx) + posy + offsety) -= 4; *(*((*(pMap )) + posx + offsetx * 2) + posy + offsety * 2) += 4; } } }

      記錄移動后人物的下一個位置

      int nextElement(int(*&pMap)[10][10], int x, int y) { int k = *(*((*(pMap)) + x) + y);//指針偏移運算,運行結果為偏移后的地址,用k保存并返回 return k; } //判定游戲過關 bool isWin(int(*&pMap)[10][10]) { for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if ((*pMap)[i][j] == 4) return false; } } return true; }

      c++之 推箱子小游戲

      四、頭文件的定義和引用

      以下是頭文件的聲明

      // 初始化游戲數據 void GameInit(int(*&pMap)[10][10], int index); // 渲染地圖 void RenderMap(int(*pMap)[10][10]); // 更新地圖數據 void UpdateMap(int(*&pMap)[10][10]); void move(int(*&pMap)[10][10], int offsetx, int offsety); int nextElement(int(*&pMap)[10][10], int x, int y); int posx, posy;//人物坐標 int mapPage=1;//第一張地圖 bool isWin(int(*&pMap)[10][10]);//判斷是否過關

      main函數

      #include #include using namespace std; #include "header.h" int main() { // 地圖數據 int(*mMap)[10][10]; // 1.初始化游戲數據(地圖) GameInit(mMap, mapPage); while (true) { // 2.渲染地圖 RenderMap(mMap); if (isWin(mMap)) { if (mapPage == 2) { cout << "恭喜你,已經通關了" << endl; break; } cout << "游戲勝利,按任意鍵進入下一關" << endl; getch(); mapPage++; mMap++; continue; } // 3.更新地圖數據 UpdateMap(mMap); } return 0; }

      五、總結

      1.對于推箱子來說找到規律很重要,還要一點要注意的就是形參為數組形式出現,實參傳入數組進去,數組會退化為指針的形式

      2.在更新地圖時調用了move函數,要分清楚著重于人物要移動時的下一個位置和下下個位置是什么來分開討論,所以這也就是為什么要用兩個int型變量來保存偏移后的位置

      3.函數聲明取名字的重要性,不然等代碼一長,很難區分函數的功能,還要區仔細看代碼,會浪費很多時間,還要就是多敲注釋的重要性

      C++

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。

      上一篇:多個文檔怎么匯總到一個文檔
      下一篇:如何查找相同資料(怎么查找相同的內容)
      相關文章
      亚洲免费黄色网址| 亚洲AV无码男人的天堂| 亚洲午夜福利AV一区二区无码| 亚洲精品无码久久久久秋霞| 亚洲国产电影在线观看| 亚洲一区二区三区首页| 国产午夜亚洲精品午夜鲁丝片| 亚洲伊人久久大香线蕉AV| 亚洲一区二区三区免费在线观看 | 亚洲中文字幕日本无线码 | 久久久久亚洲精品无码网址色欲| 久久亚洲AV无码精品色午夜麻豆| 亚洲精品在线观看视频| 亚洲电影一区二区| 亚洲成AV人片久久| 亚洲AV成人片色在线观看| 久久国产亚洲电影天堂| 亚洲AV日韩AV高潮无码专区| 亚洲AV无码乱码在线观看富二代 | 亚洲热妇无码AV在线播放| 国产亚洲精品看片在线观看| 亚洲一区二区三区影院| 亚洲人成网站在线播放vr| 亚洲国产成人片在线观看 | 亚洲欧洲无码一区二区三区| 亚洲av无码专区亚洲av不卡| 成人精品国产亚洲欧洲| 久久水蜜桃亚洲AV无码精品| 亚洲精品无码久久久| 一本色道久久综合亚洲精品高清| 国产精品亚洲综合专区片高清久久久 | 亚洲精品成人在线| 在线观看亚洲av每日更新| 久久精品国产亚洲一区二区| 亚洲人成电影福利在线播放 | 亚洲综合视频在线观看| 亚洲三级在线视频| 亚洲αⅴ无码乱码在线观看性色| 亚洲?v无码国产在丝袜线观看| 中文字幕亚洲日本岛国片| 亚洲AV无一区二区三区久久|