Peng Lv

毋意,毋必,毋固,毋我。 言必行,行必果。

导航

RPG游戏 C++源码 文字RPG游戏

 

文字RGP游戏——人魔之战!

  • NOTE:更新,源码及程序可以从百度网盘下载下载文字RPG游戏
  • NOTE:此游戏是很久之前的作品,由于某些原因不再提供更新,未来有可能提供新版本的游戏代码,敬请期待。
  • NOTE:游戏里面的BUG还很多,所以代码只是供大家参考!  

===============================================================================

        这个RPG游戏算是自己写的比较正规的一个程序了吧,毕竟下了不少功夫,公开源代码,程序是在VS2005下编译的,想要程序,或想学习C++和游戏框架编程的朋友可以给我发邮件: lvpengms@gmail.com

    上学期开学时,开始想写一个RPG游戏,但是由于自己个体能力有限,Directx也不怎么会,所以只能就写一个文字版的RPG游戏了,写了一个多月,每天晚上晚自习后就开始写坚持了一个月,算是写完了,然后就是编译和调试,总共用了一周的时间,最后一天调试时从下午2点一直到第二天凌晨4点,眼和身体几经都不行了,但是总算是完成了,整个代码大约8000~9000行,里面还有一些功能没完善,存储游戏功能还没有加入,不过最近时间很紧,过一些日子再把这个功能加入。
  
=========================================================================
游戏简介:
   《人魔之战》:由于没有图形效果的支持,所以使游戏简陋了不少,不过麻雀虽小,五脏俱全,游戏里面包括了NPC系统、任务系统、物品道具系统、地图系统、打斗系统、技能,任务系统中可以添加收集物品类任务、NPC对话类任务、BOSS类任务、循环类任务,游戏大致是依据升级打怪过任务来设置的,就当是练手了。
游戏骨架:
   Mission Class 任务类是非常重要的一个类,这个继而衍生出了其他几个子任务类,包括MissionBoss,MissionUsing,MissionNPC等几个小类。
   Map Class 这个就是地图的结构,里面有显示地图,查找地图等功能。
   NPC Class 是npc类,里面定义了npc的几个函数:对话、买卖、任务等。
   Role Class & Monster Class 就是人物和怪物的类,操作都是些必要的功能。
   Using Class Skill Class 定义了物品和技能。
   Battle Class 是战斗场景,可以执行打斗和掉宝的功能。
   Weapon Class 武器防具类,这个就不多说了。
=================================================================
回头看看写游戏时的档案,启发还是很多的,现在就贴一部分出来,与大家共勉!
-----stl中类对象的拷贝
   stl中list执行压入类对象的操作时,类对象是被复制,而不是执行引用操作,但是当动态建立一个类对象时,
   压入此动态对象,当list被清空或者执行erase操作时,类对象是会被自动销毁的,不管原对象是通过动态
   申请或者是直接写入得来的,故只要记住要手工销毁原动态申请的类对象就行了。
-----虚基类的构造函数和拷贝构造函数
   当声明一个类为虚基类,其子类要重写虚基类中的虚函数,尤其是析构函数,若不重写析构函数,那么当
   派生类对象执行销毁操作时,会执行基类中的析构函数,那么有可能会造成内存泄露,引起程序崩溃,故写一个
   虚基类的派生类时,一定要重写基类的析构函数!
-----拷贝复制在项目中的作用
   拷贝构造函数是用该类型的另外一个实例化的对象来初始化一个新建的对象,C++中拷贝构造函数有三种用途:
       1) 一个对象以值传递的方式传入函数体;
   2) 一个对象以值传递的方式从函数返回;
     3) 一个对象需要通过另外一个对象进行初始化;
      在本项目中用到的大致是以传地址引用的方法,当然也有以传值得方式进入函数主体,这种情况下要及时销毁
      源对象,以免造成内存泄露。(当然,如果不是动态申请的对象可以不用手动析构)
------今天写了些重要的类函数,好累,近一千行代码,我的眼.脑&手快受不了了。。。。。。
-------再谈srand()函数
    写游戏肯定离不开rand()产生的伪随机数,先看一个简单例子
      for(int i=0;i<n;++i)
     {
     srand(unsigned(time(NULL)));
     a[i]=rand()%100;
       }
     运行之快后会发现,输出的结果是大致一样的,原因就是time计算是以s为单位,srand()以不同的种子做种
     ,进而rand()产生不同的伪随机数,而这段程序整个执行时间不到1s,所以每次做种时种子是一样的,故
     产生的伪随机数是一样的,要解决问题很简单,只要把srand(unsigned(time(NULL)))放在for循环的前
     面就好了,同理,在游戏中,对于循环很而且每次到随机数时,最好把种子函数放在外面,这
     样会保险一点。最最保险的做法是把种子在程序开始时就做了循环都要用。
---------在控制台下显示地图的函数写完了,算法太慢了,不过不想再改了。。。凑合着用吧。。。。。
----------list<class> lt,lt.size() 返回的是size_t类型,用时别忘了类型区别
---------终于知道游戏开发文档在开发游戏历程中是多么重要了,因为没有考虑周全,想当然的写了些函数和调用,结果
    到头来吃亏的还是自己,最后修改时才发现,写的类是多么的脆弱,类间耦合太差,函数接口太乱,分层
    机制没有弄好,只是调试错误就让我马不停蹄得足足用了整整6个小时才搞定,开始时的编译错误有600多个,
    我当场晕,眼前眼花撩轮,那种感觉。。。。沙漠中忽然看见绿洲却发现那是幻觉。。。。还好
    坚持过来了,下面的工作就是添加游戏数据,修改游戏bug,估计要用2周的时间来完成,尽量赶吧,时间
    不早了,眼皮快掉下来了。。。。。(2009-10-03)
--------调试工作进行中,程序中有太多意想不到的错误,有些甚至连做梦都不敢想,如果说类似悬挂else是手误的话,
    那么 if() { stat; return 1; } 写成 if() stat; return 1;又该如何解释?像 a==b&&c==d 写成
    a==d||c==d 这种错误是很难察觉的,有时就是这么一个小错误却让你费尽心机花费一个小时的时间来找出来,
    比如修改一个全局的量,这个量可能经过几层函数最后修改,可是你能保证这几层函数栈关系没有发生过拷贝?
    传指针是个不错的选择,那么有如何有效的避免野指针的出现?少写一个&或*对程序造成的影响,又该谁来
    负责?这些问题都是不可避免的,我们的目标是如何尽量避免这些问题。
--------bug修正:
    修正npc任务显示问题(原因:代码逻辑错误)
    修改 物品npc 卖物品问题(逻辑错误)
    修正部分技能显示及使用错误(代码问题)
    修正魔法使用mp为负bug(白痴错误)
    修正任务完成不能揭开新任务bug
    修正 role卖装备部分内存错误(情况少考虑)
    修正npc对话问题
    修正任务信息显示问题
    修正程序中类似cout<<var<<func()<<endl;func()执行不同一情况
    修正游戏任务无法放弃bug(添加)
    修正已做任务和未做任务删减出现的内存读取错误
    修正一个NPC老邢任务循环显示问题
    修正怪物打人掉血BUG
    修正金钱减少时显示问题
  
                                lvpengms

=======================================================

最后附上游戏截图

posted on 2010-03-19 22:56  Lvpengms  阅读(16493)  评论(0编辑  收藏  举报