<dl id="opymh"></dl>

<div id="opymh"></div>
      <div id="opymh"><tr id="opymh"></tr></div>

        <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

        <em id="opymh"></em>

        <em id="opymh"><ol id="opymh"></ol></em>

              頻道欄目
              首頁 > 程序開發 > 軟件開發 > C++ > 正文
              用C語言、C++編寫一個迷宮游戲(代碼實例)
              2018-07-28 16:17:44         來源:youyoumo123的博客  
              收藏   我要投稿

              最初用C語言寫的,寫了一天多寫好。后來又改用C++,由于對C++不是很熟悉,改成C++用了三四天才改好。

              程序是在VC++6.0中寫的,新建一個Win32 Application即可。

              最初覺得程序的關鍵應該是求解迷宮,后來發現求解迷宮很簡單,難點是如何生成迷宮。 這里采用接合圖的深度優先遍歷,生成迷宮的算法,定義了搜索步長以便控制迷宮分支多少和分支深度。 由于程序中多處用到鏈表,所以對于迷宮求解部分也是用鏈表,沒有用棧。 代碼比較多,就不出了,只列舉了C和C++主要全局變量和函數,時間有限本人就不去一一編輯代碼了;想要全部代碼私聊我

              ///////////////////////////////////////////////////

              //C++主要變量和函數定義

              //////////////////maze.h///////////////////////////

              //全局變量

              #ifndef _GLOBAL_VAR_

              #define _GLOBAL_VAR_

              #include "MazeClass.h"

              class CMaze *game = NULL; //迷宮類對象指針

              class CRoom **map; //游戲map指針

              HWND hWndMain; //主窗口句柄

              HBITMAP h_MemBm = NULL; //內存位圖

              HDC h_MemDC = NULL; //內存DC

              RECT rCliRet; //游戲窗口大小

              HBRUSH hBrushes[10]; //繪制方塊的畫刷

              #endif

              //////////////////LinkList.h///////////////////////

              #ifndef _LINK_LIST_H

              #define _LINK_LIST_H

              #include

              template

              class Node

              {

              private:

              Node *nextptr;

              public:

              T data;

              Node();

              ~Node();

              Node *next() const;

              Node(const T &item, Node *ptrnext=NULL);

              void setNext(Node *ptrnext=NULL);

              };

              template

              class LinkList

              {

              private:

              Node *head;

              Node *tail;

              Node *curr;

              Node *getNode(const T &item, Node *ptrnext=NULL);

              void freeNode(Node *p);

              int size;

              public:

              LinkList();

              ~LinkList();

              Node *next();

              Node *current();

              Node *first();

              Node *last();

              Node *findNode(int index);

              Node *findNode(const T &item); //此功能需要模板類重載等于運算符

              void reset();

              int getSize();

              int insertFront(const T &item);

              int insertTail(const T &item);

              int insertAfter(const T &item, int index);

              int deleteFront(T *item);

              int deleteTail(T *item);

              int deleteNode(T *item, int index);

              void clear();

              bool isEmpty();

              };

              #endif

              //////////////MazeClass.h///////////////////////////

              #ifndef _MAZE_CLASS_H

              #define _MAZE_CLASS_H

              #include

              #include

              #include

              #include "LinkList.h"

              //引入外部變量

              extern HWND hWndMain; // 主窗口句柄

              extern HBITMAP h_MemBm; // 內存位圖

              extern HDC h_MemDC; // 內存DC

              extern RECT rCliRet; // 窗口大小

              extern class CMaze *game; // 迷宮類指針

              extern class CRoom **map; //游戲map指針

              extern HBRUSH hBrushes[10]; //繪制路徑畫刷

              #define RIGHT 0 //向右

              #define DOWN 1 //向下

              #define LEFT 2 //向左

              #define UP 3 //向后

              #define NODIR 4

              #define LEFT_WALL 0 //左邊墻壁

              #define UP_WALL 1 //上面墻壁

              #define IS_WALL 0 //有墻壁

              #define NO_WALL 1 //沒有墻壁

              #define HAS_DEAL 0 //map處理狀態,已經處理

              #define IN_DEAL 1 //正在處理

              #define NOT_DEAL 2 //未處理

              #define STEP 12 //搜索步長

              #define AUTO_MODE 0 //玩家類型電腦自動

              #define PLAY_MODE 1 //手動

              #define INIT 0 //玩家狀態初始化

              #define GOING 1 //運行

              #define STOP 2 //暫停

              #define OVER 3 //結束

              #define IDT_TIMER1 1 // 定時器編號

              #define IDT_TIMER2 2

              //坐標點類

              class point

              {

              public:

              int x;

              int y;

              point();

              ~point();

              point(int x, int y);

              point(const point &p);

              point &operator =(const point &p);

              bool operator ==(const point &p);

              };

              //Room類,生成迷宮用到

              class CRoom

              {

              friend class CMaze;

              private:

              point pos;

              int status; //0:未訪問, 1:正在訪問, 2:已訪問

              int upstatus; //0:可以通過 1:不可以通過

              int leftstatus; //0:可以通過 1:不可以通過

              //每個節點只需判斷up&left是否可以通過即可

              };

              //迷宮墻壁類

              class CWall

              {

              friend class CMaze;

              private:

              point pos; //墻壁位置

              int dir; //方向 1:橫 0:豎

              public:

              CWall();

              CWall(const point &pos, const int &dir);

              CWall(const CWall &p);

              ~CWall();

              CWall &operator =(const CWall &p);

              bool operator ==(const CWall &p);

              };

              class CBoard

              {

              protected:

              HBRUSH hBrush; //繪制背景畫刷

              HPEN hPen; //繪制邊框線的畫筆

              point m_pos, m_entry, m_exit;

              int m_size, m_cell, m_nx, m_ny;

              int m_mode, m_speed, m_status;

              void fillCell(point pos, int color, int dir);

              void displayText(point p, char *text);

              public:

              CBoard();

              ~CBoard();

              int getCell();

              int getMode();

              int getSpeed();

              int getStatus();

              int getSize();

              point getPos();

              point getEntry();

              point getExit();

              void messageBox(char *errMsg, char *title, int style);

              void setTimer(int id, int time);

              void killTimer(int id);

              };

              //路徑節點類

              class CPathNode

              {

              friend class CPlayer;

              private:

              int index; //節點在鏈表中編號

              int indir; //最初進去方向

              int outdir; //最后一次出去方向

              class point pos; //節點位置

              public:

              CPathNode();

              CPathNode(point pos, int index, int indir, int outdir);

              ~CPathNode();

              CPathNode(const CPathNode &p);

              CPathNode &operator =(const CPathNode &p); //重載賦值運算符

              bool operator ==(const CPathNode &p); //重載等于號

              };

              //游戲玩家類

              class CPlayer: public CBoard

              {

              private:

              int curdir; //當前的移動方向

              int steps; //當前步數

              time_t usedTime, stopTime; //所有時間用時

              LinkList path; //保存走過的正確路徑鏈表

              LinkList error; //保存走過的錯誤路勁鏈表

              LinkList *mazeptr; //指向當前迷宮的指針

              int canMove();

              int doOper();

              int autoGo();

              void errOut(char *errMsg);

              void showInfo();

              void drawPath();

              public:

              CPlayer(CMaze *maze);

              ~CPlayer();

              void onKeyDown(unsigned short key);

              void onTimer(int id);

              };

              class CMaze: public CBoard

              {

              private:

              LinkList wlist; //存放迷宮墻壁數據鏈表

              class CPlayer *m_player;

              void drawWall(class CWall wall);

              int createWallList(LinkList *list);

              int chgRoomStatus(point pos, LinkList *list, int dir, int depth);

              int createMaze();

              void drawMaze();

              void showTime();

              void showHelpInfo();

              void initBkGnd();

              int newGame();

              void gameOver();

              public:

              CMaze();

              ~CMaze();

              void dialogBox(HINSTANCE hInst, LPCTSTR IDD, DLGPROC myFunc);

              int onInit();

              void initDlg(HWND hDlg);

              void onDlgOk(HWND hDlg);

              void onTimer(int id); //游戲主控函數

              void onKeyDown(unsigned short key); //游戲主控函數

              void onPaint(HDC hdc);

              LinkList *getWallList();

              };

              #endif

              ////////////////////////////////////////////

              //C語言主要變量和函數定義

              ////////////////maze.h//////////////////////

              #include

              #include

              #include

              #include

              #include

              #include

              #define M 50000 /* 迷宮最大墻壁數 */

              #define MAX_NODE_NUMBER 50000 /* 最大分配內存節點 */

              #define MAXGRADE 150 /* 游戲最大難度 */

              #define IDT_TIMER1 1 /* 定時器編號 */

              #define IDT_TIMER2 2

              #define STEP 16 /* 搜索步長 */

              #define RIGHT 0

              #define DOWN 1

              #define LEFT 2

              #define UP 3

              #define AUTO_MODE 0

              #define PLAY_MODE 1

              #define UP_WALL 0

              #define LEFT_WALL 1

              #define INIT 0

              #define GOING 1

              #define STOP 3

              #define OVER 4

              struct position

              {

              int x;

              int y;

              };

              struct GameInfo

              {

              struct position pos; /* 背景位置坐標 */

              int size; /* 大小 */

              int timer;

              int nx;

              int ny;

              int cell;

              int mode;

              int mazemode;

              int speed;

              int times;

              int status;

              }game;

              struct MazeWall

              {

              struct position pos;

              int diretcion; /* 方向 0:橫 1:豎 */

              };

              struct MazeCfg

              {

              struct MazeWall data[M]; /* 墻壁坐標數據 */

              struct position entry, exit; /* 入口和出口位置 */

              int num; /* 墻壁個數 */

              }maze;

              struct MapCfg

              {

              struct position pos;

              int status; /* 0:未訪問, 1:正在訪問, 2:已訪問 */

              int upstatus; /* 0:可以通過 1:不可以通過 */

              int leftstatus; /* 0:可以通過 1:不可以通過 */

              /* 每個節點只需判斷up&left是否可以通過即可 */

              };

              struct MapCfg **map;

              struct travInfo

              {

              struct position pos;

              struct travInfo *next;

              };

              struct RoadInfo

              {

              int index; /* 編號 */

              int indir; /* 進去方向 */

              int outdir; /* 出去方向 */

              struct position pos;

              struct RoadInfo *next;

              };

              struct playercfg

              {

              int direction;

              int steps;

              time_t usedTime, endTime, stopTime;

              struct RoadInfo *RoadPtr, *errPtr;

              }play;

              HWND hWndMain; /* 主窗口句柄 */

              HBITMAP h_MemBm = NULL; /* 內存位圖 */

              HDC h_MemDC = NULL; /* 內存DC */

              HBRUSH hBrushes[10]; /* 繪制方塊的畫刷 */

              HBRUSH hBrushBkGnd; /* 背景色畫刷 */

              HPEN hPenBorder; /* 繪制邊框線的畫筆 */

              int initgame(HWND hWnd);

              int markpath(int x, int y, int dir, int color);

              int drawWall(int x, int y, int dir);

              int drawMaze();

              int readMazedata(int *num, int id);

              char *GetFldStr(char *sFldStr, char *sStr, char sFld);

              void initMalloc();

              void addMallocNode(char *);

              void freeMallocNode();

              void *gcCalloc(size_t , size_t);

              int initBkGnd();

              int createMaze();

              int getWallCfg();

              int setDirStatus(struct position pos, struct travInfo *head, int dir, int depth);

              int createPlayer(int mode);

              int destroyPlayer();

              int canMove();

              int doOperation();

              int havePathed(struct RoadInfo node);

              int newGame(int type, int mode);

              void drawPath();

              void showTime();

              int gameOver();

              int autoGo(int num);

              void DisplayText(int posx, int posy, char *text);

              int initGameSet(HWND hDlg);

              int chgGameStatus();

              void showUsedTime();

              void showPlayInfo();

              void errOut(char *errMsg)

              點擊復制鏈接 與好友分享!回本站首頁
              上一篇:ubuntu系統下c++編譯cpp包含自定義類的多級調用的實例教程
              下一篇:C++基本語言-字符串string、向量vector和數組實例介紹
              相關文章
              圖文推薦
              點擊排行

              關于我們 | 聯系我們 | 廣告服務 | 投資合作 | 版權申明 | 在線幫助 | 網站地圖 | 作品發布 | Vip技術培訓 | 舉報中心

              版權所有: 紅黑聯盟--致力于做實用的IT技術學習網站

              极速飞艇好假
              <dl id="opymh"></dl>

              <div id="opymh"></div>
                  <div id="opymh"><tr id="opymh"></tr></div>

                    <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                    <em id="opymh"></em>

                    <em id="opymh"><ol id="opymh"></ol></em>

                          <dl id="opymh"></dl>

                          <div id="opymh"></div>
                              <div id="opymh"><tr id="opymh"></tr></div>

                                <em id="opymh"><ins id="opymh"><mark id="opymh"></mark></ins></em><sup id="opymh"><menu id="opymh"></menu></sup>

                                <em id="opymh"></em>

                                <em id="opymh"><ol id="opymh"></ol></em>