结对编程作业
https://github.com/B1usher/Pig_Tail
姓名 | 学号 | 分工 | 博客链接 |
---|---|---|---|
赵文涛 | 031902630 | 原型设计,AI设计 | https://www.cnblogs.com/Blusher/p/15451030.html |
杨寓荃 | 031902629 | 游戏开发,游戏测试 | https://www.cnblogs.com/yyq24/p/15456216.html |
一、原型设计
1.1 设计说明
- 使用的原型开发工具
我们使用的原型开发工具是Axure Rp9,共开发了“开始界面”、“游戏界面”、“在线大厅”三个界面,以及各界面基本交互功能的实现。
- 界面说明介绍
(1)开始界面:
开始界面提供了三种模式选择的功能。点击本地对战和人机对战跳转至游戏界面,点击在线对战跳转至在线大厅
(2)游戏界面:
游戏界面提供了所有游戏进行时的画面展示。界面上侧为玩家2,下侧为玩家1,中间左侧为牌堆,中间右侧为放置区。界面中提供了玩家id的显示,以及牌堆、手牌各花色牌数量的显示,方便玩家选择合适的操作。当手动或通过提示选中一种花色后,通过“打出键”打出;或通过“抽牌键”从牌堆中抽取。并有退出键和托管键,点击后弹出相应提示。
托管提示:
退出提示:
(3)在线大厅:
开始界面提供了登录,创建,加入三个功能。只有登录后才能看到创建、加入模块,否则会提示错误,点击登录后会弹出登录区域。
登录区域
登入后可以选择房间或输入uuid来加入已有游戏
登入后也可以自己创建房间
1.2 遇到的困难和解决方法
(1)困难描述:无法实现在线界面中房间列表的页码中文本的变化;分享的网页版加载速度慢;各种事件执行的顺序不好确定。
(2)解决过程:页码问题我们首先添加了一个全局变量,设它的默认值与当前页码的文本值一样,通过点击下一页按钮,使这个变量的值加减,再把页码的文本值设成这个变量的值;加载问题应该是图片过多的原因,于是我们把原型设计中的几乎所有图片都删了。
(3)有何收获:感觉自己的强迫症又重了几分,对于一些元件大小和位置的选择,几乎是一个像素一个像素去调,虽然肉眼看不出两侧一个像素的不对称。虽然最终结果还是挺简陋的,但我觉得原型设计能体现基本功能和界面布置就可以了。
二、原型设计实现
2.1 代码实现思路
- 网络接口的使用
刚开始学习如何使用接口时,画了下面这张流程图,开始写代 码时发现其中还是有一些不一样的,但大体也还是这么实现的。(流程图未修改)
- 具体代码
由于最终是使用微信小程序来实现整个游戏的运行,为了展示的方便,我们用C++写了个文字版的猪尾巴小游戏(未加入在线功能,但预留了函数),具体功能与微信小程序类似。下面会结合两者的代码进行分析。
(1)代码中的类可分为牌堆类、放置区类、玩家类,都是用于存储牌库、各花色牌数量等信息提供给各函数使用class PaiDui //牌堆类 { public: int poker[52] = { 0 }; //牌堆牌序 0:无牌;1~13:黑桃A~K;14~26:红桃A~K;27~39:梅花A~K;40~52:方片A~K int top = 0; //牌顶当前位置 int heitao = 13; //各花色数量 int hongtao = 13; int meihua = 13; int fangpian = 13; void create(); //创建随机牌堆 }; class FangZhiQU //放置区类 { public: stack<int> card; stack<int> decor; //花色 1: 黑桃 2:红桃 3:梅花 4:方片 }; class WanJia //玩家类 { public: stack<int> heitao; //黑桃 stack<int> hongtao; //红桃 stack<int> meihua; //梅花 stack<int> fangpian; //方片 int total() //手牌总数 { return heitao.size() + hongtao.size() + meihua.size() + fangpian.size(); } };
(2)Ai的实现思路为记录抽牌、打黑桃、打红桃、打梅花、打方片5种操作的得分,通过有着不同权重的策略改变每种操作的得分,最终选择得分最高的操作。通过测试不同策略互相对战的胜率,增删改不同策略的权重,得出不同的分数比例(在C++文字版中实现)。本来想的是用这个得分作为博弈树的评估值,但最终没写出来,小程序中只能用最基础的了。
int Ai(WanJia& me, WanJia& you, FangZhiQU& fangzhiqu, PaiDui& paidui, int rule) //Ai操作选择 rule表示使用什么策略 0:所有; 1:牌堆数量; 2:对手手牌数量; 3:放置区顶牌 { int score[5] = { 0 }; //5种操作的得分 0:从牌堆中抽取 1: 打出黑桃 2:打出红桃 3:打出梅花 4:打出方片 //计算分数 if (rule == 0) { Update_1(me, you, fangzhiqu, paidui, score); Update_2(me, you, fangzhiqu, paidui, score); Update_3(me, you, fangzhiqu, paidui, score); } else if (rule == 1) Update_1(me, you, fangzhiqu, paidui, score); else if (rule == 2) Update_2(me, you, fangzhiqu, paidui, score); else if (rule == 3) Update_3(me, you, fangzhiqu, paidui, score); //选择操作 int max = score[0]; int operation = 0; for (int i = 0; i < 5; i++) { if (score[i] > max) { operation = i; max = score[i]; } } return operation; }
(3)关于操作的执行,我们也将其进行了拆分,真人和AI只要提供操作的类型就可以了,操作的实现是一致的,也便于后期维护。
(4)性能分析
2.2 Github的代码签入记录
2.3 遇到的代码模块异常或结对困难及解决方法。
(1)困难描述:程序总是报错,但由于代码未分块和没有好的备注习惯,导致找不到错在哪。
(2)解决过程:一开始没办法只能一行行看,在关键位置写一些输出,慢慢看控制台,最终发现居然是复制黏贴变量名未改,两个人的讨论也是很重要的解决办法。
(3)有何收获:优化了代码里的备注,加了许多新的备注,不然过几天就不知道自己写了啥了。将代码进行了功能的划分,调用、维护起来也容易。
2.4 队友评价
赵文涛
(1)值得学习的地方
队友的学习能力和积极性是我望尘莫及的,这次的微信小程序的编码也都是他完成的,积极性方面要向他学习,不能不到dl不学习
(2)需要改进的地方
写代码没有一个总的思路,想到哪写到哪,导致后期测试的时候十分痛苦,出错也找不到错在哪。
杨寓荃
(1)值得学习的地方
队友真的是太给力了,高效爆肝让低效爆肝的我羞愧得无地自容,同时拒绝摆烂将在线ai进度推进到ddl前夕
(2)需要改进的地方
由于我俩都是ddl型选手,在ddl前是真滴给我带上了面具。
2.4 提供此次结对作业的PSP和学习进度条
- PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | ||
· Estimate | · 估计这个任务需要多少时间 | 30 | 30 |
Development | 开发 | ||
· Analysis | · 需求分析 (包括学习新技术) | 900 | 1200 |
· Design Spec | · 生成设计文档 | 120 | 150 |
· Design Review | · 设计复审 | 20 | 20 |
· Coding Standard | · 代码规范 (为目前的开发制定合适的规范) | 30 | 20 |
· Design | · 具体设计 | 60 | 100 |
· Coding | · 具体编码 | 1500 | 3000 |
· Code Review | · 代码复审 | 120 | 300 |
· Test | · 测试(自我测试,修改代码,提交修改) | 300 | 600 |
Reporting | 报告 | ||
· Test Repor | · 测试报告 | 60 | 60 |
· Size Measurement | · 计算工作量 | 10 | 15 |
· Postmortem & Process Improvement Plan | · 事后总结, 并提出过程改进计划 | 60 | 60 |
· 合计 | 3210 | 5555 |
- 学习进度条
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 5 | 5 | 理解了题目要求,思考了实现方式,分配了任务 |
2 | 0 | 0 | 10 | 15 | 考虑了游戏运行逻辑,设计了原型,学习了HTML+CSS+JS |
3 | 1000 | 1000 | 25 | 40 | 初步实现了界面开发与人人对战功能,学习了如何开发微信小程序 |
4 | 2500 | 3500 | 50 | 90 | 开发了人机对战,对网络接口的使用有了一定的了解,试着开发了在线模式 |
三、心得
赵文涛
这次结对编程教会了我选一个好队友的重要性,真是大佬带我飞!因为在学js时,队友已经开始开发微信小程序了,导致我直接摆烂,最终小程序的开发都是队友完成的,我只能做些思路设计的工作,闲着无聊还想用C++写一个,但能力有限做不成图形界面,在线也做不了,白白查了几个小时,学到的东西不知道为什么又用不来。只能说前面玩的爽,后面熬的爽,基本每天都没睡多久,中间还要弄团队项目的事情,导致现在整个人都不好了。但是每天想打开游戏就有一种负罪感,导致我不玩游戏不行的生活习惯改变了,哈哈哈。还好能看懂代码,能帮忙查了下错,也算是尽到自己的一份力了,未来要更加努力才行呀。
杨寓荃
看到作业的时候我就感觉心态崩了,这是一个我之前完全没有接触过的项目, 根本不知该如何下手。好在隔壁班结对作业较早截止,让我感受到了小程序的能力,于是乎开始了猪尾巴小程序之旅。前几个星期主要是学习js,html,css,学习的时候自我感觉良好,然而上手之后就被自己折磨到,小程序中window对象,一些方法使用不了,html和css做出各种畸形页面,在线对战举步维艰,ai设计更是无从下手,最后人机对战可以简单的实现,但由于单机对战和在线对战本地数据不同,在线托管还无法进行。虽然这次作业做得不是很完整,但是也学到了很多东西,跟着kx老师果真是又快乐又痛苦啊!!