结对编程作业
- 具体分工
王梓瑶 | 陈玉娜 |
---|---|
游戏实现 | 原型设计 |
AI实现 | UI实现 |
一、原型设计
(1.1)提供此次结对作业的设计说明,要求:
- 原型设计
- 原型开发工具:Axure Rp 9
- 设计说明
原型由多级逻辑页面组成,以首页、游戏模式、游戏界面为主,通过按钮进入不同界面-
首页
首页拥有三个按钮,分别是开始游戏、游戏玩法、历史记录,点击按钮即可进入相应页面
-
二级界面
按下首页的按钮即可进入二级界面,二级界面同样设有按钮,按下可进行逻辑跳转。其中游戏模式有三个按钮:人人对战、人机对战、在线对战,按下按钮可进入相应界面-
游戏模式
-
游戏方法
-
历史记录
-
-
三级界面——游戏模式
三级及之后的界面都是游戏模式之下的子界面,包括但不限于人人对战、人机对战、在线对战、创建/加入对局、游戏界面、游戏结束等-
人人对战、人机对战
人人对战和人机对战的逻辑差不多,选择模式后输入昵称并决定先后手,之后便可以开始游戏。游戏界面中设置了托管按钮、中止按钮,按下后可进入相应界面,同时点击卡组区即可抽牌。(在此以人人对战为例)-
进入游戏
-
游戏界面
-
游戏结束
-
-
在线对战
选择在线对战模式进入后,先输入用户ID和密码进行登录,之后可以选择加入对局或创建对局。选择加入对局可根据标识码加入对局,或者是从更多对局中获取标识码加入对局。而创建战局可自定义标识码,或者是由系统自动生成标识码,其他参与者可根据标识码进入对局。-
用户登录
-
加入对局/创建对局
-
加入对局
-
创建对局
-
游戏界面
-
更多对局
-
-
-
(1.2)遇到的困难及解决方法:
-
困难
设计之前的问题当然是原型工具的选择,有Axure Rp、GUI Design Studio、墨刀等诸多原型设计工具,各有各的特点,实在难以抉择。
在开始设计之后,首先面临的最大问题就是风格问题,简约风担心对于游戏而言会太单调,但又担心加入素材过量会太杂乱>︿<
同时素材也是一个很大的Bug,网上找到的素材大多都不是心仪之选,而且还需要抠图,工作量倍增。Axure RP 9自带的元件库可供选择的元件并不多,难以满足需求。 -
解决过程
在了解原型工具之后,我会更倾向Axure RP和墨刀,但是考虑到之后还需要运行设计以及墨刀的时效性问题等,最终我选择了Axure RP 9
之后进行原型设计的过程中,一开始参考了世界游戏大全51猪尾巴游戏,但是在尝试高仿真还原之后,发现其中需要大量抠图,在衡量工作量和风格之后,我决定重新设计原型。
首先面临的一个问题就是素材问题,在各大网站检索之后,发现了超可爱的猪猪,是由MOTITATA_绘制的猪猪插画。因此,原型中猪猪的主体就打算采用MOTITATA_的猪猪插画啦( ̄▽ ̄)"
还有一些小猪猪是来自PicShu,而其他图标部分则是来源于inconfont-阿里巴巴矢量图库以及Axure RP 9自带的元件库。然而在我完成大部分原型设计之后,发现了一个同样可以提供开源素材的网站Flaticon,因为这个是国外的网站,所以其中的风格跟之前的原型并不太适用,就只能忍痛放弃了/(ㄒoㄒ)/~~ -
收获
最大的收获大概就是初步学习并使用Axure RP 9,发现了两个超好用的网站inconfont-阿里巴巴矢量图库和Flaticon。以及,知乎真的是个宝藏👍
二、原型设计实现
(2.1)代码实现思路
-
网络接口的使用
主要是调用python的requests模块进行Post、put、get的请求,以下是调用函数列表和两个具体函数
关于登录的接口函数
关于查询游戏是否开始的函数
-
代码组织与内部实现设计(类图)
Op=0 供对方查询上一轮出牌选择:1.摸牌 2.出牌 放置区( 新出的牌card=["flo",1] 顶部花色Up_card = "flower" 放置区卡牌数SAtotal = 0 # 放置区卡牌标记 SA_Heart = [] # 红心 SA_Spade = [] # 黑桃 SA_Cube = [] # 梅花 SA_Diamond = [] # 方块 出牌后更新放置区addSA(x) 放置区卡牌数SAtotal ++; 将卡牌增加到相应队列 清空放置区 顶部花色、放置区卡牌数格式化 清空所有队列 游戏玩家类 初始化 玩家姓名name 选择出牌的花色flower 选择出牌的数字number 当前手牌数total 四个手牌队列flower 当前各花色卡牌数cntflower 托管标记位manage=0 手动为0 托管为1 对手卡牌数量opponent 上一轮结束后存储区的卡牌数last_SAtotal 托管必胜局面标志位winwin=0 初始为0 必胜为1 游戏行动 得到当前要出的牌 If 托管:跳转到AI_action( ) ShowPoker() 显示当前所有扑克 询问玩家操作1、摸牌2、出牌3、托管 1. 直接摸牌 2. 人工选择出牌 3.将托管标志位标志为1 并运行托管算法 得到需要出的牌card 并更新顶部card (全局变量) addSA( )将该卡牌添加到放置区 if 与顶部花色相同card[0]==Up_card 收入并清空 else 更新放置区顶部花色Up_card=self.flower 标记放置区此时的数量 判断是否为必胜局面 查询当前牌局enquire( ) # 得到当前对方卡牌数及放置区卡牌数 更新对方卡牌数 判断是否必胜局面 摸牌并出牌draw( ) 更新Card and 这张牌的顶部花色 出牌函数Outpoker( ) 用户选择 更新个人出牌花色数字 出牌并更新放置区顶部卡牌card 删除这张牌delcard ( ) 托管功能AI_action( ) 没有手牌或必胜局面:直接摸牌 仅剩与放置区顶部卡牌花色相同手牌 则只能摸牌 否则用AI_OutPoker() 自动出牌机制AI_OutPoker ( ) 在已有手牌中选择非顶部花色且数量最多的卡牌 并删除这张卡牌 删除卡牌delcard ( ) 手牌总数total— 删除这张手牌 显示当前牌组ShowPoke r( ) 判断是否只能出牌onlydraw( ) 判断是否只剩下与放置区顶部花色相同手牌,如是则返回1:选择摸牌 将放置区所有卡牌收入手牌Allin ( ) total+=SAtotal 按卡牌花色加入相应队列 按卡牌花色增加相应花色排数 显示玩家姓名showname( ) Ai机器类 游戏行动action( ) # 与User类中的AI_action托管功能相同 判断是否手牌为空:draw) 判断是否必胜局面:draw( ) if只能摸牌onlydraw( ) :draw( ) else 选择ai出牌算法OutPoker( ) addSA( )将该卡牌添加到放置区 if 与顶部花色相同card[0]==Up_card 收入并清空 else 更新放置区顶部花色Up_card=self.flower```
-
说明算法的关键与关键实现部分流程图
算法的关键是记录对手手牌数、放置区卡牌数及未翻牌组的卡牌数,计算当 对方手牌 > 放置区剩余手牌 *3 +我方手牌 +未翻牌数 时,进入我方必胜局面,则只要一直翻拍就好了(虽然这也是个靠运气的事情),还有优先选择手牌中其他花色数量最多的出,如果剩下与底牌同花色则摸牌。
-
贴出你认为重要的/有价值的代码片段,并解释
-
性能分析与改进
这是通过profile命令的性能分析图
-
描述你改进的思路
最开始设计的时候AI是一个继承User类的子类,用于实现人机对战,而User类只模拟玩家选择的行为和游戏流程,写托管的想法是用User数据来创建新的AI对象,但是十分浪费空间时间,还很容易出错。于是直接将AI的功能及增加参数全添加到User类本身,这样在人机对战的时候所用到的机器类中只需要继承并调用就可以了,减少了代码量和细节,也增加了可复用性。
AI的算法最开始是:在优先选择手牌中其他花色数量最多的出,如果剩下与底牌同花色则摸牌。升级后增加了如果达到必胜点,即当对方手牌足够多时,就一直摸牌直到结束。 -
展示性能分析图和程序中消耗最大的函数
这是通过profile命令的性能分析图
这是消耗最大的函数:玩家行动的主函数体
-
展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路
通过不断输入1摸牌来测试在线函数Online_game()
通过让人机对战选择托管来测试托管函数AI_action()
(2.2)贴出Github的代码签入记录,合理记录commit信息。
(2.3)遇到的代码模块异常或结对困难及解决方法。
-
困难描述
因为以前没有用Python写过代码,这次可以说是非常勤勤恳恳地在写bug了,关于局部变量和全局变量的使用,遇到了很多次都是由于没有使用global在函数体内声明这是个全局变量而报错,还有因为改变了函数体内而未修改全局变量而导致数据未更新,许多次后才意识到并完整地浏览检查了一遍,修改后好了许多。在试图开始写人机对战的时候,才发现人人对战也有问题,类属性与实例属性没有分清楚。由于代码比较长,一开始又写得很凌乱,找Bug找到眼花,细节比较多且繁琐。
以前也没有接触过关于接口的使用,可以说是一无所知了,菜是原罪。人机本地还好一些,在线加入自己的对局总是出错,对战调试又需要两个ID,比较不好操作。 -
解决过程
写设计文档、目录,写清楚注释,认认真真再从头到尾看一遍。
分成多个.py文件再导入模块调用。
看了关于requests模块的使用说明,也翻了往年十三水的一些帖子。
找同学借了教务处账号和电脑,再创建\加入对局调试(但最后还是没改完)。 -
有何收获
细节决定成败 诚不欺我。知道了生成设计文档真的很重要,磨刀不误砍柴工啊!也学会了接口的调用,熟悉了Python的使用。
-
评价你的队友
-
我对队友的评价
-
值得学习的地方:
- 超自律,学习能力超强。同样都是0基础学Python,队友的学习能力和学习速度是我遥不可及的ᓚᘏᗢ
- 实践能力强,0基础学习Python,但是能很快上手完成AI设计与实现
- 思路清晰,理解能力强。可以准确get到作业的要求,把我的思路拉回来
-
需要改进的地方:
- ?!没有需要改进的,是我太菜了(┬┬﹏┬┬)
-
-
队友对我的评价
-
值得学习的地方:
心态不错 -
需要改进的地方:
分析实现需求,提早学习
-
-
(2.5) 提供此次结对作业的PSP和学习进度条(每周追加)
- PSP表格
- 我的PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 120 | 130 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 1200 | 1560 |
· Design Spec | · 生成设计文档 | 60 | 60 |
· Design Review | · 设计复审 | 30 | 30 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 30 |
· Design | · 具体设计 | 600 | 720 |
· Coding | · 具体编码 | 1200 | 1560 |
· Code Review | · 代码复审 | 60 | 70 |
· Test | · 测试(自我测试,修改代码,提交修改) | 120 | 180 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 20 | 20 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
· 合计 | 3530 | 4480 |
- 队友的PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 15 | 15 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 1500 | 1700 |
· Design Spec | · 生成设计文档 | 60 | 90 |
· Design Review | · 设计复审 | 15 | 15 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 15 | 20 |
· Design | · 具体设计 | 30 | 30 |
· Coding | · 具体编码 | 1000 | 1800 |
· Code Review | · 代码复审 | 60 | 90 |
· Test | · 测试(自我测试,修改代码,提交修改) | 1000 | 1000 |
Reporting | 报告 | 30 | 20 |
· Test Repor | · 测试报告 | 0 | 0 |
· Size Measurement | · 计算工作量 | 20 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 120 |
·合计 | 3190 | 4915 |
-
学习进度条
-
我的学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(h) | 累计学习耗时(h) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 6 | 6 | 了解学习Axure RP 9 |
2 | 0 | 0 | 12 | 18 | 用Axure RP 9进行原型设计 |
3 | 300 | 300 | 8 | 26 | 学习Python,进一步完善原型设计,尝试用Python实现前端 |
4 | 1000 | 1300 | 28 | 54 | 学习PYQT5、Pygame、QTdesigner |
- 队友的学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 120 | 0 | 17 | 17 | 看网课、整理笔记、编程,大概学会了用Python语言 |
2 | 207 | 327 | 15 | 32 | 熟悉Python语言,实现基础游戏框架和流程,可以进行人人对战 |
3 | 153 | 480 | 5 | 37 | 实现了人机对战和简单ai算法,学会打包exe |
4 | 732 | 1212 | 35 | 72 | 实现了托管功能,升级了ai算法,学会了接口,实现了在线人人对战和一半的在线人机对战,学会用github的一些功能 |
三、心得
-
我的心得
我觉得这个作业对我来说太太太太难了
之前并没有怎么接触过前端,稍微可以挂勾的就是之前学了一点点HTML,but没什么用。想着用什么都要从零学起,就跟队友一起学Python。没想到Python、PYQT5、Pygame、QTdesigner根本不像表面看起来那么温和无害,从安装编译器、模块安了一晚上就可以初见端倪(。﹏。*)作业的水也特别的深,初看好像还行,之后越看越不明白,边学边做发现要学要做的越来越多。
不过这次作业完成情况这么糟糕还是我自己的问题。一开始并没有准确估计作业的难度跟我的能力,在计划上出现了重大失误。再加上期间伴随着的考试、测验和各种各样的ddl,让我本不富裕的时间更是雪上加霜。但最难过的其实不是这些,最难过的是我拖累了队友,没能完成整个项目,辜负了队友的期待,导致我们作业的呈现效果并不好
这次作业对我最大的启发大概就是要正确衡量自己的能力和作业难度,制定灵活可变的计划,给自己预留充足的时间。以及,提前学习真的很重要!!! -
队友的心得
这次的作业我还是挺感兴趣的,给的时间也很足,相对来说难度就没有那么大了,但是我太太拖延了,国庆写了几天,中间很长一段时间都浪费了,导致一直到ddl下午在线对战还没有改出来,AI智商直线下跌。也没有合理安排时间比例,低估了任务的难度。 更没有好好认真地看接口文档,才发现很多地方跟我所写的有出入。
之前没想过会写后端,现在发现后端写起来还是蛮有意思的,虽然Bug很头疼,但是找出来真的很有成就感。