C語言/C++編程—編寫的迷宮小游戲

C語言是面向過程的童芹,而C++是面向?qū)ο蟮?/p>

C和C++的區(qū)別:

C是一個結(jié)構(gòu)化語言晦闰,它的重點(diǎn)在于算法和數(shù)據(jù)結(jié)構(gòu)腹侣。C程序的設(shè)計(jì)首要考慮的是如何通過一個過程,對輸入(或環(huán)境條件)進(jìn)行運(yùn)算處理得到輸出(或?qū)崿F(xiàn)過程(事務(wù))控制)巍糯。

C++,首要考慮的是如何構(gòu)造一個對象模型值纱,讓這個模型能夠契合與之對應(yīng)的問題域鳞贷,這樣就可以通過獲取對象的狀態(tài)信息得到輸出或?qū)崿F(xiàn)過程(事務(wù))控制。 所以C與C++的最大區(qū)別在于它們的用于解決問題的思想方法不一樣虐唠。之所以說C++比C更先進(jìn)搀愧,是因?yàn)椤?設(shè)計(jì)這個概念已經(jīng)被融入到C++之中 ”。

C與C++的最大區(qū)別:在于它們的用于解決問題的思想方法不一樣疆偿。之所以說C++比C更先進(jìn)咱筛,是因?yàn)椤?設(shè)計(jì)這個概念已經(jīng)被融入到C++之中 ”,而就語言本身而言杆故,在C中更多的是算法的概念迅箩。那么是不是C就不重要了,錯处铛!算法是程序設(shè)計(jì)的基礎(chǔ)饲趋,好的設(shè)計(jì)如果沒有好的算法,一樣不行撤蟆。而且奕塑,“C加上好的設(shè)計(jì)”也能寫出非常好的東西。

最初覺得程序的關(guān)鍵應(yīng)該是求解迷宮家肯,后來發(fā)現(xiàn)求解迷宮很簡單龄砰,難點(diǎn)是如何生成迷宮。 這里采用接合圖的深度優(yōu)先遍歷讨衣,生成迷宮的算法换棚,定義了搜索步長以便控制迷宮分支多少和分支深度。 由于程序中多處用到鏈表反镇,所以對于迷宮求解部分也是用鏈表固蚤,沒有用棧。 代碼比較多歹茶,就不出了夕玩,只列舉了C和C++主要全局變量和函數(shù)

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

//C++主要變量和函數(shù)定義

//////////////////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; //內(nèi)存位圖

HDC h_MemDC = NULL; //內(nèi)存DC

RECT rCliRet; //游戲窗口大小

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

#endif

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

#ifndef _LINK_LIST_H

#define _LINK_LIST_H

#include

template

class Node

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 二六三,六八八辆亏,二七六 】,無論你是大牛還是小白鳖目,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)扮叨!裙內(nèi)有開發(fā)工具,很多干貨和技術(shù)資料分享领迈!

{

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); //此功能需要模板類重載等于運(yùn)算符

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; // 內(nèi)存位圖

extern HDC h_MemDC; // 內(nèi)存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處理狀態(tài)彻磁,已經(jīng)處理

#define IN_DEAL 1 //正在處理

#define NOT_DEAL 2 //未處理

#define STEP 12 //搜索步長

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

#define PLAY_MODE 1 //手動

#define INIT 0 //玩家狀態(tài)初始化

#define GOING 1 //運(yùn)行

#define STOP 2 //暫停

#define OVER 3 //結(jié)束

#define IDT_TIMER1 1 // 定時器編號

#define IDT_TIMER2 2

//坐標(biāo)點(diǎn)類

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:不可以通過

//每個節(jié)點(diǎn)只需判斷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

小編推薦一個學(xué)C語言/C++的學(xué)習(xí)裙【 二六三碍沐,六八八,二七六 】衷蜓,無論你是大牛還是小白累提,是想轉(zhuǎn)行還是想入行都可以來了解一起進(jìn)步一起學(xué)習(xí)!裙內(nèi)有開發(fā)工具磁浇,很多干貨和技術(shù)資料分享斋陪!

{

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

};

//路徑節(jié)點(diǎn)類

class CPathNode

{

friend class CPlayer;

private:

int index; //節(jié)點(diǎn)在鏈表中編號

int indir; //最初進(jìn)去方向

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

class point pos; //節(jié)點(diǎn)位置

public:

CPathNode();

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

~CPathNode();

CPathNode(const CPathNode &p);

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

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

};

//游戲玩家類

class CPlayer: public CBoard

{

private:

int curdir; //當(dāng)前的移動方向

int steps; //當(dāng)前步數(shù)

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

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

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

LinkList *mazeptr; //指向當(dāng)前迷宮的指針

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; //存放迷宮墻壁數(shù)據(jù)鏈表

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); //游戲主控函數(shù)

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

void onPaint(HDC hdc);

LinkList *getWallList();

};

#endif

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

//C語言主要變量和函數(shù)定義

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

#include

#include

#include

#include

#include

#include

#define M 50000 /* 迷宮最大墻壁數(shù) */

#define MAX_NODE_NUMBER 50000 /* 最大分配內(nèi)存節(jié)點(diǎn) */

#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; /* 背景位置坐標(biāo) */

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]; /* 墻壁坐標(biāo)數(shù)據(jù) */

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

int num; /* 墻壁個數(shù) */

}maze;

struct MapCfg

{

struct position pos;

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

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

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

/* 每個節(jié)點(diǎn)只需判斷up&left是否可以通過即可 */

};

struct MapCfg **map;

struct travInfo

{

struct position pos;

struct travInfo *next;

};

struct RoadInfo

{

int index; /* 編號 */

int indir; /* 進(jìn)去方向 */

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; /* 內(nèi)存位圖 */

HDC h_MemDC = NULL; /* 內(nèi)存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++能做的

服務(wù)器開發(fā)工程師、人工智能置吓、云計(jì)算工程師无虚、信息安全(黑客反黑客)、大數(shù)據(jù) 衍锚、數(shù)據(jù)平臺友题、嵌入式工程師、流媒體服務(wù)器戴质、數(shù)據(jù)控解度宦、圖像處理、音頻視頻開發(fā)工程師告匠、游戲服務(wù)器戈抄、分布式系統(tǒng)、游戲輔助等

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末凫海,一起剝皮案震驚了整個濱河市呛凶,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌行贪,老刑警劉巖漾稀,帶你破解...
    沈念sama閱讀 216,372評論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異建瘫,居然都是意外死亡崭捍,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評論 3 392
  • 文/潘曉璐 我一進(jìn)店門啰脚,熙熙樓的掌柜王于貴愁眉苦臉地迎上來殷蛇,“玉大人,你說我怎么就攤上這事橄浓×C危” “怎么了?”我有些...
    開封第一講書人閱讀 162,415評論 0 353
  • 文/不壞的土叔 我叫張陵荸实,是天一觀的道長匀们。 經(jīng)常有香客問我,道長准给,這世上最難降的妖魔是什么泄朴? 我笑而不...
    開封第一講書人閱讀 58,157評論 1 292
  • 正文 為了忘掉前任重抖,我火速辦了婚禮,結(jié)果婚禮上祖灰,老公的妹妹穿的比我還像新娘钟沛。我一直安慰自己,他們只是感情好局扶,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評論 6 388
  • 文/花漫 我一把揭開白布恨统。 她就那樣靜靜地躺著,像睡著了一般详民。 火紅的嫁衣襯著肌膚如雪延欠。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,125評論 1 297
  • 那天沈跨,我揣著相機(jī)與錄音由捎,去河邊找鬼。 笑死饿凛,一個胖子當(dāng)著我的面吹牛狞玛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播涧窒,決...
    沈念sama閱讀 40,028評論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼心肪,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了纠吴?” 一聲冷哼從身側(cè)響起硬鞍,我...
    開封第一講書人閱讀 38,887評論 0 274
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎戴已,沒想到半個月后固该,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,310評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡糖儡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評論 2 332
  • 正文 我和宋清朗相戀三年伐坏,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片握联。...
    茶點(diǎn)故事閱讀 39,690評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡桦沉,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出金闽,到底是詐尸還是另有隱情纯露,我是刑警寧澤,帶...
    沈念sama閱讀 35,411評論 5 343
  • 正文 年R本政府宣布代芜,位于F島的核電站埠褪,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜组橄,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望罚随。 院中可真熱鬧玉工,春花似錦、人聲如沸淘菩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,659評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潮改。三九已至狭郑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間汇在,已是汗流浹背翰萨。 一陣腳步聲響...
    開封第一講書人閱讀 32,812評論 1 268
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留糕殉,地道東北人亩鬼。 一個月前我還...
    沈念sama閱讀 47,693評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像阿蝶,于是被迫代替她去往敵國和親雳锋。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評論 2 353

推薦閱讀更多精彩內(nèi)容