仓库地址

https://github.com/li-letian/Monopoly

成员信息

GitHub:

li-letian

is-not-matter

long200329

游戏概述

本游戏是模仿大富翁4,实现的一个复(jian)刻(dan)版的大富翁。
本游戏主要由鼠标操作,目前只有Windows版本,后期可能会考虑移植Android等其他平台。点击monopoly.exe运行,按照提示操作即可。
目前版本为单机版,加入了AI角色,玩家在选择界面点击switch可切换玩家或者AI。后续可能会考虑联网功能以及存档功能。

下载与操作说明

下载本链接中Assets中的release.zip解压后运行monopoly.exe即可

地图与小地图

基本交互

地图为一个循环路径,路径上的位置存在不同的地产,会触发不同的效果。
在允许操作时,鼠标点击路径的格子,即可显示当前位置的地产信息。
在允许操作时,鼠标拖动非路径的格子,即可实现地图拖拽。
在允许操作时,鼠标点击小地图相应位置,即可实现视角跳转。

地图选点

道具的相关操作可能会涉及到地图选点,在相应文字提示下点击路径上的有效位置即可。地图选点时允许拖动地图,小地图视角跳转。
若地图选点时若点击到路径非道具指定的有效格子,则道具作废。

面板

菜单

点击道具按钮可以打开道具面板,再次点击可关闭。
点击股市按钮可以打开股市面板,再次点击可关闭。
点击退出按钮可回到主菜单,慎点。
点击音乐按钮可以关闭背景音乐,再次点击可重新播放。

日历

回合制游戏,一回合为一天。

信息

实时更新当前人物的一些基本信息,头像,色块,名字。
现金可随时使用。
路过银行可进行存款取款,银行存款每天会得到一定的利息。
着陆银行可进行贷款还款,贷款同样每天需要背负利息。

游戏元素

角色

玩家角色

6个角色供选择
miku、nanxiaoniao、jingtian、luff、usagi、iori
其中miku为默认玩家角色,不可更改为AI控制,其余角色可以更改为AI控制

AI

除了不会使用道具以及购买股票,可以执行玩家角色的一切动作。

房产与特殊位置

旅店房产

地图中最多的空地,首次着陆可以购买,归属者再次着陆可以升级。

其余玩家着陆后,需要根据本处旅馆归属者在这条街道上的房产总数和等级缴纳住宿费用。

商业项目房产

地图中相对较少的空地,首次可以购买,归属者再次着陆可以升级。

公园

无任何特殊效果。

度假村

其余玩家着陆后需要休息一定时间并且缴纳住宿费用。

购物广场

其余玩家着陆后需要依据现有道具数量缴纳费用。

研发中心

归属者着陆时可以生产道具。

实体上市公司

地图中非常少的建筑物,可在股市中购买该公司的股票持股,持有股份最多的人为董事长。

保险公司

其余玩家着陆后需要向董事长缴纳保险费用,同时在投保天数内意外损失减半。

石油企业

玩家着陆后需要向董事长缴纳油费。

科技公司

董事长着陆后可随机获得研发出来的道具。

航空公司

其他玩家着陆后强制出国观光,并向该公司股权的持有者支付旅行费用。

医院

应对医疗事件,着陆可以给其它角色办理出院手续。

监狱

应对刑事事件,着陆可以保释其它角色。

银行

着陆可进行借贷与贷款还款。

路过可进行存取钱。

机会、命运地带

会触发各种随机事件,通常来说金色位置为机会,多触发有利事件,红色位置为命运,多触发不利事件。不完全包括:医疗事件、刑事事件、度假事件、经济事件、股市事件、房产事件、道具事件等等,详细效果会在游戏中弹窗说明。

神灵

着陆会被附身一段时间,附身时间内会触发一些特殊效果:
衰神:投资失败。
穷神:罚钱加倍。
福神:投资加倍。
财神:免受罚钱。
天使:着陆加楼。
恶魔:着陆拆楼。
土地公:着陆占地。

道具

由研发中心,科技公司、机会事件得到,每人开局随机赠送10个道具。

道具表列

  1. 远行鞋:行走步数期望增为原来2倍。
  2. 飞速鞋:行走步数期望增为原来3倍。
  3. 乌龟卡:有三次只走一步的机会,如走到自己并排几栋的房屋时可以逐个升级。
  4. 遥控骰子:决定10步内的行走点数。
  5. 机器娃娃:清除道路上10格内的一切神。
  6. 出院证明:可办理出院。
  7. 保释证明:可办理保释。
  8. 地雷:炸伤所有踩到它的人并使其住院。
  9. 飞弹:对全地图范围内的任何人或房屋发射,威力范围1格,房屋下降一级,范围内自己和对手进医院。
  10. 机器工人:加盖1级己方房屋或者拆除一层敌方房屋。
  11. 恶魔卡:整个路段的一排房子瞬间消失。
  12. 天使卡:整个路段的房屋都增盖一层。
  13. 传送机:将地图上的人物、神、物品瞬移到指定的地方,如果指定目标为自己则本回合不能继续移动。
  14. 怪兽卡:直接拆除所在的房屋到空地级别。
  15. 购地证明:走到对手的房屋时,可立即购买下来。
  16. 改建证明:变更商业用地,可以对自己的商业用地或他人的商业用地使用。
  17. 涨价卡:地价、房价的费用增值。
  18. 红卡:自己持有的股票立即上涨。
  19. 黑卡:除了自己持有的股票立即下跌。
  20. 共同小康:可将指定对手与自己的现金平分。
  21. 逍遥法外卡:当面临牢狱之灾时,可抵消徒刑一次。
  22. 嫁祸卡:面临牢狱之灾时,可嫁祸给你选择的对手。
  23. 请神符:立即请到步数离自己最近的神仙。
  24. 送神符:遇到坏神仙可马上送走,摆脱骚扰。
  25. 停留卡:指定自己或对手原地停走一次。
  26. 转向卡:使用后自己立即掉头向后转。
  27. 复仇卡:当对手对你进行陷害的时候,让害人者有同样下场。
  28. 陷害卡:使指定对手立刻入狱。
  29. 度假:使所有对手都去度假,丧失收租金的权利。

股市

分为实体上市公司和控股公司。

任何角色在摇色子前都可参与。

可进行买进,抛出操作,提供一部分力所能及的可视化。

提供力所能及的股市模拟。

破产

现金为0即破产,直接被抬出游戏,房产被收缴。

胜利

坚持到最后没有破产的人即为胜利者。

开发文档

项目进度时间线

第一周 学习知识

建立仓库
完成基本界面和类框架
学习cocos2dx相关知识

第二周 收集素材

实现各种地图交互
完成素材收集和地图绘制
完成类框架设计
学习cocos2dx相关知识

第三周 肝肝肝!!!

实现回合制
实现部分触发事件
实现部分地产
学习cocos2dx相关知识

第四周 肝肝肝!!!+Debug

实现股票功能
实现信息栏功能
实现了大部分触发事件
实现了基本的游戏房产机制
完成地产和特殊地点触发功能

第五周 肝肝肝!!!+Debug

实现大量道具及卡片机制
实现神灵
完成了所有触发事件

第六周 收尾+Debug

实现AI功能
添加背景音乐及音效
撰写设计文档及游戏说明
撰写答辩幻灯片

整体架构设计与小组分工

整体构架设计

小组分工

li-letian 33.33%:地图绘制 菜单 交互 地产内容 部分道具
is-not-matter 33.33%:角色动画 回合制实现 事件 神灵 AI
long200329 33.33%:股市内容 道具部分内容 角色信息显示栏 音效与音乐

功能点与实现思路

  1. 游戏开始界面、选择界面、设置界面、背景音乐、退出功能
  2. 游戏回合制
    通过回调函数的不断嵌套调用实现
  3. 人物行走动画
    使用TexturePacker将人物动作打包生成图集与plist文件
    将图集全部加载到SpriteFrameCache
    创建动画时直接读取SpriteFrameCache
  4. 人物沿路行走
    在地图类中增加储存路径坐标的vector,人物沿着路径坐标的位置行走。
  5. 地图拖拽、地图选点、视角跟随、小地图选点定位
  6. AI玩家混合功能
    为角色类添加成员变量标记该角色是否为AI。
    在与玩家可能产生交互的部分判断该角色是否为AI并单独加上AI决策的代码。
  7. 旅店房产、街道机制
  8. 特殊房产:公园、度假村、购物中心、研发中心。
  9. 实体公司:航空公司、石油公司、保险公司、科技公司。
  10. 特定位置触发随机事件(命运与机会)
  11. 29种道具(包括卡片)
    每个道具为道具基类的派生类,通过调用各个类的虚函数完成相应效果
  12. 股市功能
    每只股票为一个类,通过调用成员函数改变信息,更新时刷新显示效果
  13. 角色信息显示栏
    与角色等类相关,当状态信息改变时,刷新显示内容
  14. 房屋建造、升级功能
  15. 特殊房产(银行,医院)
  16. 神灵
    在地图中储存神灵的位置,在人物类中增加成员变量判断人物是否以及被什么神灵附身。
    被附身的人着陆后会先判断地产再发动神灵功能。

技术难点与其解决方案

1. 回合制

技术难点

最初认为for循环轮流遍历所有人物即可实现回合制,后来发现不是这样。
for循环的执行是程序开始执行后瞬间完成的,无法与用户在任何时刻都有可能进行的操作产生交互。

解决方案

使用回调函数的不断嵌套调用。
调用层次为:
等待用户按下Go->按下Go->掷骰子->人物行走->判断神灵->判断地产-
->下一个人的回合开始,等待用户按下Go->按下Go->……
从而实现人物根据用户按下Go的时机轮流行走。

2. 坐标

技术难点

cocos2dx的坐标系统非常复杂,涉及到两套方向,不同参考系,不同量纲。
在程序设计的过程中,会涉及到大量的鼠标选点,地图定位,位置识别等等问题,就非常的让人头疼。

解决方案

通过对地图的封装,在地图类外的所有地方使用位置的数组索引作为位置编号,创建自然坐标系。在地图类里,经过绞尽脑汁的计算整出来一套坐标变换方法。

3. 内存管理

难点

cocos2dx的类都使用单独实现的引用计数,为了风格统一,游戏设计中的类多继承自cocos2dx使用其自动内存管理,导致类内部无法定义静态变量。早期调试过程中也因为对cocos2dx内存管理理解不够透彻,导致了很多很严重的bug,变量经常会被释放掉。

4. 字符编码

技术难点

不知道为什么VS使用的MSVC编译器对UTF8编码格式的源代码支持不够完善,整个项目的源代码文件编码格式最后使用了GB2312,而cocos2dx默认解码导致输出中文会乱码。

解决方案

无奈之下只能使用windows头文件中的相关函数硬性转码,但是这就带来了跨平台移植的困难。Android平台使用的Clang编译器没有windows头文件,而且对GB2312的支持不够完善。考虑以后可以使用plist配置文件的字符串映射解决中文问题。

项目亮点

图集的使用

使用TexturePacker将人物的4向行走图片打包生成图集与.plist文件
并将图集全部加载到精灵帧缓存中
创建动画时读取精灵帧缓存即可,提高了性能

1
2
3
4
character_frame_cache_ = SpriteFrameCache::getInstance();
character_frame_cache_->addSpriteFramesWithFile
(StringUtils::format("%s.plist", name_.c_str()),
StringUtils::format("%s.png", name_.c_str()));

常量与全局常用方法

将项目中的常量定义于CommonConstant.h中,方便增删调整。

1
2
3
constexpr int hotel_land_value = 300;
constexpr int hotel_sell_value[5] = { 500,1000,2000,4000,0 };
constexpr int hotel_rent_value[5] = { 100,400,1200,3000,7000 };

将项目中的一些常见代码段包装成函数声明于CommonMethod.h中。

1
2
3
4
5
6
7
8
9
10
11
12
13
void SendMsg(int msg)
{
auto dispatcher = Director::getInstance()->getEventDispatcher();
char* buf = new char[10];
sprintf(buf, "%d", msg);

log("message sending : %s", buf);

EventCustom event = EventCustom("monopoly_msg");
event.setUserData(buf);
dispatcher->dispatchEvent(&event);
CC_SAFE_DELETE_ARRAY(buf);
}

丰富的地图交互

实现了小地图定位、视角跟随、位置信息显示、地图拖拽、地图选点等交互,提高了游戏可玩性。

大量道具、地产、事件的实现

本项目共实现近30款道具,10余种地产,大量相关的事件,游戏内容非常丰富,机制复杂,可玩性极高。

使用的c++特性

包括单不限于:
Lambda表达式
STL容器
类和多态
函数重载
类型判断
范围for语句
类内初始值
常量表达式constexpr

代码规范

遵循C++风格类型转换
贯彻落实Google风格的命名
尽量使用Cocos2dx风格的类设计与内存管理

版本控制与团队协作

全程使用GitHub和Git进行版本控制
尽量做到了符合GoogleAngularJS规范的commit记录

项目运行效果(不超过4张)