| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 20787 人关注过本帖, 10 人收藏
标题:原创-迷宫游戏
只看楼主 加入收藏
josen0205
Rank: 2
来 自:江苏
等 级:论坛游民
帖 子:307
专家分:52
注 册:2007-5-8
结帖率:100%
收藏(10)
 问题点数:0 回复次数:100 
原创-迷宫游戏
前几天无意间看见我的Red Hat Linux上面有个计算机走迷宫的屏保,于是就想写一个试试,在这里和大家分享一下。
最初用C语言写的,写了一天多写好。后来又改用C++,由于对C++不是很熟悉,改成C++用了三四天才改好。
程序是在VC++6.0中写的,新建一个Win32 Application即可。
最初觉得程序的关键应该是求解迷宫,后来发现求解迷宫很简单,难点是如何生成迷宫。
我这里采用接合图的深度优先遍历,生成迷宫的算法,定义了搜索步长以便控制迷宫分支多少和分支深度。
由于程序中多处用到链表,所以对于迷宫求解部分也是用链表,没有用栈。
代码比较多,就不在此贴出,只列举了C和C++主要全局变量和函数,附件中附带C和C++的全部代码VC++6.0可以编译。

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

maze-C++.zip (163.29 KB) 迷宫游戏-C++源程序



maze-C.zip (117.33 KB) 迷宫游戏-C源程序

搜索更多相关主题的帖子: 迷宫 游戏 
2008-12-09 19:36
我是菜鸟一只
Rank: 1
来 自:无泪之城
等 级:新手上路
帖 子:202
专家分:0
注 册:2008-6-10
收藏
得分:0 
好东东怎么没人顶?!!!



一向年光有限身等闲离别易消魂酒筵歌席莫辞频满目山河空念远落花风雨更伤春不如怜取眼前人
2008-12-10 14:03
liuyan520
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-12-10
收藏
得分:0 
我是个新手
虽然我看不懂但我看你写了那么多肯定不容易定下.希望可以交个朋友教我怎么学C语言
2008-12-10 14:33
zqy110007
Rank: 3Rank: 3
来 自:外太空
等 级:论坛游民
威 望:6
帖 子:1493
专家分:82
注 册:2008-11-19
收藏
得分:0 
顶!

每个人都是蛤蟆,只是井的大小不同罢了.
沙石下的泉水,挖得越深,泉水越清.
2008-12-10 19:09
lk0328
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2007-6-24
收藏
得分:0 
学习了!
2008-12-11 12:53
a414726442
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2008-12-11
收藏
得分:0 
真的服了,,,,还是新手就是没有手把手教,,,,有心的高手教下小菜,,QQ:414726442
2008-12-11 17:00
zourongbo
Rank: 1
等 级:新手上路
帖 子:8
专家分:0
注 册:2008-12-3
收藏
得分:0 
学习ing
2008-12-11 17:48
wyxssh
Rank: 1
等 级:新手上路
帖 子:13
专家分:1
注 册:2009-9-6
收藏
得分:0 
强悍~~~
2009-09-22 20:57
wyxssh
Rank: 1
等 级:新手上路
帖 子:13
专家分:1
注 册:2009-9-6
收藏
得分:0 
强悍~~~
2009-09-22 21:00
jimk5200
Rank: 2
等 级:论坛游民
帖 子:18
专家分:11
注 册:2009-9-4
收藏
得分:0 
真厉害,没想到用C也可以把程序写得这么好,以前总认为C不值得一学,现在看来是完全的错了,准备从头来过,一定好好学习编程!!
2009-09-25 18:55
快速回复:原创-迷宫游戏
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.024523 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved