最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

使用C++實(shí)現(xiàn)迷宮游戲

 更新時(shí)間:2020年03月23日 08:43:37   作者:Viitasca  
這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)迷宮游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

迷宮游戲就是玩家在地圖中移動(dòng),移動(dòng)至終點(diǎn)則游戲結(jié)束。

自己用文本文檔手打了個(gè)小地圖,0表示空白,1表示墻,文件名隨意,我改成了map.MapData。然后程序里定義一個(gè)全局變量char Map[MapLenX][MapLenY];(長(zhǎng)寬自定義)行為X,列為Y。定義char型常量RoadSymbol = '0', WallSymbol = '1', PlayerSymbol = '+'。

本游戲?yàn)槊嫦驅(qū)ο缶帉懙模跃鸵O(shè)計(jì)一個(gè)類。數(shù)據(jù)需要一個(gè)坐標(biāo)和一個(gè)bool型儲(chǔ)存是否到達(dá)終點(diǎn)。所以自定義了個(gè)結(jié)構(gòu)體儲(chǔ)存坐標(biāo)

struct point
{
 int x, y;
};

還需要構(gòu)造函數(shù),析構(gòu)函數(shù),然后寫個(gè)移動(dòng)的函數(shù)PlayerMove(),再寫個(gè)判斷是否到達(dá)終點(diǎn)的函數(shù)CheckIfWin()。每走完一步就要刷新屏幕,所以還需要寫個(gè)函數(shù)Refresh(),然后PlayerActor類就完成了。

class PlayerActor
{
public:
 point m_Location;
 bool m_IfWin;
 PlayerActor();
 ~PlayerActor();
 void PlayerMove(int _Direc);
 void Refresh(void);
 void CheckIfWin(void);
};

構(gòu)造函數(shù)析構(gòu)函數(shù)先不著急, 先定義一下PlayerMove()。思路是先判斷是否可移動(dòng)。若能,當(dāng)前位置的地圖標(biāo)記設(shè)為RoadSymbol, 移動(dòng)即更新坐標(biāo),新坐標(biāo)位置在地圖上標(biāo)記為PlayerSymbol, 刷新畫面,判斷輸贏。Refresh()思路為先用system("cls")清屏,然后逐行打印。若地圖上某點(diǎn)為RoadSymbol輸出空格, WallSymbol輸出'*', PlayerSymbol輸出'+'。

接下來定義玩家起始位置和終點(diǎn)PlayerStart和PlayerEnd并初始化。main函數(shù)大體流程如下:讀入地圖,實(shí)例化PlayerActor,當(dāng)!m_IfWin時(shí)接收鍵盤按鍵來移動(dòng),當(dāng)m_IfWIn時(shí)彈出提示框并結(jié)束。所以還需要一個(gè)全局函數(shù)PlayerControl來接收按鍵并調(diào)用PlayerMove()。

至此,構(gòu)造函數(shù)的流程也明確了。初始化m_IfWin和m_Location,在地圖上表明玩家位置和重點(diǎn)位置,刷新屏幕,沒了。然后再把能定義為常量的都定位常量,修改一下細(xì)節(jié),就能得到一個(gè)簡(jiǎn)陋的走迷宮游戲了。

#include<iostream>
#include<cstdio>
#include"conio.h"
#include"windows.h"
/////////////////////////
struct point
{
 int x, y;
};
 
///////////////////////
 
const point PlayerStart = {10, 2};
const point PlayerEnd = {2, 10};
 
const int MapLenX = 11, MapLenY = 10;
const char EndSymbol = '#', PlayerSymbol = '+', WallSymbol = '1', RoadSymbol = '0';
char Map[MapLenX][MapLenY];
 
const int MoveX[4] = {-1, 1, 0, 0}, MoveY[4] = {0, 0, -1, 1};  //// UP, DOWN, LEFT, RIGHT
const int _UP = 0, _DOWN = 1, _LEFT = 2, _RIGHT = 3;
 
///////// CLASS ///////////////
 
class PlayerActor
{
public:
 point m_Location;
 bool m_IfWin;
 PlayerActor();
 ~PlayerActor();
 void PlayerMove(int _Direc);
 void Refresh(void);
 void CheckIfWin(void);
};
 
/////////// MEMBER FUNCTIONS /////////////
 
PlayerActor::PlayerActor()
{
 m_IfWin = false;
 this-> m_Location.x = PlayerStart.x;
 this-> m_Location.y = PlayerStart.y;
 Map[this-> m_Location.x][this-> m_Location.y] = PlayerSymbol;
 Map[PlayerEnd.x][PlayerEnd.y] = EndSymbol;
 PlayerActor::Refresh();
}
 
PlayerActor::~PlayerActor()
{
 
}
 
void PlayerActor::PlayerMove(int _Direct)
{
 if ( Map[this-> m_Location.x+MoveX[_Direct]][this-> m_Location.y+MoveY[_Direct]] == RoadSymbol
 || Map[this-> m_Location.x+MoveX[_Direct]][this-> m_Location.y+MoveY[_Direct]] == EndSymbol )/////// JUDGE IF CAN MOVE
 {
  Map[this-> m_Location.x][this-> m_Location.y] = RoadSymbol;
  this-> m_Location.x += MoveX[_Direct];
  this-> m_Location.y += MoveY[_Direct];
  Map[this-> m_Location.x][this-> m_Location.y] = PlayerSymbol;
  PlayerActor::Refresh();
  PlayerActor::CheckIfWin();
 }
}
 
void PlayerActor::Refresh(void)
{
 system("cls");  //////CLEAR SCREEN
 for (int i=1; i<=MapLenX; i++)
 {
  for (int j=1; j<=MapLenY; j++)
  {
   if (Map[i][j] == RoadSymbol)
    printf(" ");
   else if (Map[i][j] == WallSymbol)
    printf("* ");
   else if (Map[i][j] == '+')
    printf("%c ", PlayerSymbol);
   else if (Map[i][j] == EndSymbol)
    printf("%c ",EndSymbol);
  }
  printf("\n");
 }
}
 
void PlayerActor::CheckIfWin(void)
{
 if (this-> m_Location.x == PlayerEnd.x && this-> m_Location.y == PlayerEnd.y)
  m_IfWin = true;
}
 
///////////// GLOBAL FUNCTION ////////////////
 
void PlayerControl(PlayerActor* Player, int _KEY)
{
 switch (_KEY)
 {
  case 119 : Player->PlayerMove(_UP); //// w 119
   break;
  case 115 : Player->PlayerMove(_DOWN); ///////s 115
   break;
  case 97 : Player->PlayerMove(_LEFT); //// a 97
   break;
  case 100 : Player->PlayerMove(_RIGHT); //// d 100
   break;
  default:
   break;
 }
}
 
//////// MAIN FUNCTION ///////////
 
int main()
{
 ///////// READ MAP /////////////
 freopen("map.MapData", "r", stdin);
 for (int i=1; i<=MapLenX; i++)
 {
  for (int j=1; j<=MapLenY; j++)
  {
   std::cin >> Map[i][j];
  }
 }
 //// CREATE PLAYERACTOR ////
 PlayerActor* Player = new PlayerActor;
 while (!Player->m_IfWin)
 {
  PlayerControl(Player, _getch());
 }
 system("cls");
 MessageBox(NULL, "You Win!", "Congratulations!", MB_OK);
 delete Player;
 return 0;
}

地圖map.MapData:

1111111111
1000000001
1011111111
1010000001
1011111101
1000000101
1111110101
1000010101
1011110101
1000000001
1111111111

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • C++深入分析講解鏈表

    C++深入分析講解鏈表

    當(dāng)我們?cè)趯懸欢未a時(shí),如果要頻繁的在一塊區(qū)域進(jìn)行插入或者刪除操作時(shí),會(huì)發(fā)現(xiàn)用數(shù)組實(shí)現(xiàn)會(huì)比較復(fù)雜,這時(shí)候我們就要用另一種數(shù)據(jù)結(jié)構(gòu),鏈表來實(shí)現(xiàn)
    2022-06-06
  • C++數(shù)據(jù)精度問題的解決方案(對(duì)浮點(diǎn)數(shù)保存指定位小數(shù))

    C++數(shù)據(jù)精度問題的解決方案(對(duì)浮點(diǎn)數(shù)保存指定位小數(shù))

    對(duì)浮點(diǎn)數(shù)保存指定位小數(shù),怎么解決這個(gè)問題呢?如果有小伙伴對(duì)C++數(shù)據(jù)精度問題的解決方案感興趣的朋友一起看看吧
    2017-08-08
  • C++獲取zip文件列表方法

    C++獲取zip文件列表方法

    本文將介紹獲取zip文件列表的方法,有些新手的朋友可以參考下
    2012-12-12
  • C++學(xué)習(xí)之移動(dòng)語義與智能指針詳解

    C++學(xué)習(xí)之移動(dòng)語義與智能指針詳解

    智能指針和移動(dòng)語義是迄今為止,最難理解的兩個(gè)概念,下面這篇文章主要給大家介紹了關(guān)于C++學(xué)習(xí)之移動(dòng)語義與智能指針的相關(guān)資料,需要的朋友可以參考下
    2021-05-05
  • C++?使用?new?創(chuàng)建二維數(shù)組實(shí)例

    C++?使用?new?創(chuàng)建二維數(shù)組實(shí)例

    這篇文章主要介紹了C++?使用?new?創(chuàng)建二維數(shù)組實(shí)例的相關(guān)資料,需要的朋友可以參考下
    2023-01-01
  • 深入淺析C/C++?的條件編譯

    深入淺析C/C++?的條件編譯

    條件編譯是指預(yù)處理的時(shí)候根據(jù)條件編譯的指令有條件的選擇源程序中的一部分代碼送給編譯器進(jìn)行編譯,進(jìn)行有選擇性的操作,防止宏替換的內(nèi)容重復(fù)包含,這篇文章主要介紹了C/C++?的條件編譯,需要的朋友可以參考下
    2022-04-04
  • C++?中的?JSON?序列化和反序列化及結(jié)構(gòu)體與枚舉類型的處理方法

    C++?中的?JSON?序列化和反序列化及結(jié)構(gòu)體與枚舉類型的處理方法

    在?C++?編程中,處理?JSON?數(shù)據(jù)是一項(xiàng)常見任務(wù),特別是在需要與其他系統(tǒng)或前端進(jìn)行數(shù)據(jù)交換時(shí),本文將詳細(xì)介紹如何使用?nlohmann::json?庫對(duì)結(jié)構(gòu)體和枚舉類型進(jìn)行序列化和反序列化,感興趣的朋友一起看看吧
    2024-11-11
  • Qt利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的示例代碼

    Qt利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的示例代碼

    這篇文章主要為大家詳細(xì)介紹了Qt如何利用QNetwork實(shí)現(xiàn)上傳數(shù)據(jù)的 功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-02-02
  • C語言使用四種方法初始化結(jié)構(gòu)體

    C語言使用四種方法初始化結(jié)構(gòu)體

    這篇文章說明了什么是結(jié)構(gòu)體,介紹了結(jié)構(gòu)體的概念和使用優(yōu)點(diǎn),在C語言中如何使用和初始化結(jié)構(gòu)體方法,通過詳細(xì)的代碼展開進(jìn)行說明,希望該篇文章對(duì)你有所幫助
    2021-06-06
  • C語言實(shí)現(xiàn)帶頭雙向環(huán)形鏈表

    C語言實(shí)現(xiàn)帶頭雙向環(huán)形鏈表

    這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)帶頭雙向環(huán)形鏈表,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-11-11

最新評(píng)論

化州市| 巨鹿县| 昔阳县| 饶河县| 隆子县| 杭州市| 万源市| 义马市| 晋州市| 嵊泗县| 旌德县| 潜江市| 仙桃市| 阿拉尔市| 商水县| 阳西县| 旌德县| 太原市| 镇巴县| 宁晋县| 蓬安县| 铁力市| 正定县| 北碚区| 石台县| 青川县| 乌拉特前旗| 思茅市| 正定县| 东宁县| 米易县| 拜城县| 保定市| 桐乡市| 子长县| 广德县| 汾阳市| 台中市| 玛纳斯县| 延寿县| 绥中县|