C語言C++編寫——迷宮遊戲

最初用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 <iostream.h>

template <class T>

class Node

{

private:

Node<T> *nextptr;

public:

T data;

Node();

~Node();

Node <T> *next() const;

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

void setNext(Node<T> *ptrnext=NULL);

};

template <class T>

class LinkList

{

private:

Node<T> *head;

Node<T> *tail;

Node<T> *curr;

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

void freeNode(Node <T> *p);

int size;

public:

LinkList();

~LinkList();

Node<T> *next();

Node<T> *current();

Node<T> *first();

Node<T> *last();

Node<T> *findNode(int index);

Node<T> *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 <iostream.h>

#include <string.h>

#include <time.h>

#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 <class CPathNode> path; //保存走過的正確路徑鏈表

LinkList <class CPathNode> error; //保存走過的錯誤路勁鏈表

LinkList <class CWall> *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 <class CWall> wlist; //存放迷宮牆壁數據鏈表

class CPlayer *m_player;

void drawWall(class CWall wall);

int createWallList(LinkList<class point> *list);

int chgRoomStatus(point pos, LinkList<class point> *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<class CWall> *getWallList();

};

#endif

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

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

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

#include <stdio.h>

#include <string.h>

#include <malloc.h>

#include <stdlib.h>

#include <math.h>

#include <time.h>

#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)


代碼可能看着有點暈~~~

c/c++問題羣裏問QQ羣948954484 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章