一、结对探索
1.1队伍基本信息
结对编号:56;队伍名称:赫露艾斯塔;
学号 | 姓名 | 作业博客链接 | 具体分工 |
---|---|---|---|
032002423 | 刘晓宇 | 博客链接 | me myself and i |
1.2描述结对的过程
一人成军
1.3非摆拍的两人在讨论设计或结对编程过程的照片
二、原型设计
2.1原型工具的选择
选择了Axure,没用过类似的软件,网上搜那一款好也没有头绪。所以没有特别的原因。
2.2遇到的困难与解决办法
首先,完全没有接触过相关的软件,一开始根本无从下手。想着b站搜点教程吧,看着视频的长度我就陷入了沉思。于是自己慢慢尝试吧,花了不少时间熟悉axure的操作。
接着,诸如点击跳转页面的简单操作实现起来是不在话下的,但是需求总是更复杂的。但是这软件也没有写代码的地方,只能用它自设的一系列程序。于是我还是到b站学习了一会,学会了一点高级的操作比如如何设置变量。
最后就是以为要打包了html文件出来,但是发现这玩意可以上传到它云盘上,点链接就可以了。不知道试用期到了后链接还能不能用就是了。
2.3原型作品链接
https://w30cry.axshare.com
2.4
该原型有三个场景,第一个是一开始进入游戏时,如下。当然最后时间不够,成品没有在线对战和对战历史这两个功能。
------------------------------------------开始界面---------------------------------------
点击对战后,就会进入第二个场景,即准备场景
当两个玩家都点击confirm后(人机的话ai会自动点击p2confirm),投掷硬币,决定先后手。
------------------------------------------玩家就绪确认-------------------------------------
------------------------------------------随机决定先手--------------------------------------
双方玩家准备就绪,一秒后,进入场景三:游戏。
---------------------------------------------游戏界面-------------------------------------
⚪代表骰子,点击后随机生成1-6间一个整数。roll完之后,点击方框即可set摇到的点数,随后切换回合,下一个玩家roll dice,set,如此反复。
(surrender仅做测试用)
三、编程实现
3.1网络接口的使用
无
3.2代码组织与内部实现设计(类图)
----------------------------------------GameManager类-----------------------------------
----------------------------------------DiceControl类-------------------------------------
----------------------------------------BoxControl类-----------------------------------
-------------------------------------------Dicer类-----------------------------------
3.3说明算法的关键与关键实现部分流程图
DiceControl类使用Roll()函数在可以roll的时候生成随机点数,BoxControl类使用Set()函数在可以set的时候设置DiceControl生成的点数。GameManager控制回合,储存骰子点数,控制什么时候可以roll,什么时候可以set。
3.4贴出重要的/有价值的代码片段并解释
这里解释一下Ai算法。(纯自己想的很烂的算法)
首先从结果考虑,ai只要从三行中选一行。所以我简单用一个长度3的数组来储存最后的每一行的可能性,通过一点计算后分别将每一行可能性存入对应的下标。最后AI选值最大的下标对应的行。
public int[] linePossibility = new int[3];
那么如何计算呢?
首先肯定是看能不能消去对面的。如果下这一行能消去,那么该行的可能性增加 (能消去的数量 * 能消去的数量 * 消去的点数)
private int AttackPossible(List<BoxControl> line_opp)
{
int cnt=0, flag=0;
foreach (var item in line_opp)
{
if (item.point > GameManager.dicePoint)
{
//flag = 0;
}
if (item.point == GameManager.dicePoint)
{
cnt++;
}
}
return (cnt * cnt * GameManager.dicePoint) + flag;
}
其次,避免下满己方一行.该行可能性减去己方该行的骰子数量*2
private int SeperatePossible(List<BoxControl> line)
{
return -CountOfLine(line)*2;
}
最后, 也是可能性改变最少的,如果能翻倍,可能性仅增加1,但是如果该行对方已有三个骰子不可能消去我方的,增加的可能性就上升为骰子点数
private int DoublePossible(List<BoxControl> line)
{
int cnt = 0;
foreach (var item in line)
{
if (item.point == GameManager.dicePoint)
{
cnt = 1 ;
}
}
return cnt;
}
if (CountOfLine(kLine_opp) == 3)
{
kDoubleP *= GameManager.dicePoint;
}
if(CountOfLine(eLine_opp) == 3)
{
eDoubleP *= GameManager.dicePoint;
}
if(CountOfLine(vLine_opp) == 3)
{
vDoubleP *= GameManager.dicePoint;
}
以上为我的ai思想.
3.5性能分析与改进
消耗最大的top10函数
性能分析(使用unity的profile analyzer,我也看不懂)
游戏不大,算法简单,画面也很拉,所以性能应该是很好的罢(
3.6 单元测试
测试函数 SmartChoose()返回数组最大值的下标
private int SmartChoose()
{
for (int i = 0; i < linePossibility.Length; i++)
{
linePossibility[i] = 0;
}
ChangeOnState();
return linePossibility.ToList().IndexOf(linePossibility.Max()); ;
}
private void ChangeOnState()
{
int kDoubleP = DoublePossible(kLine), eDoubleP = DoublePossible(eLine), vDoubleP = DoublePossible(vLine);
if (CountOfLine(kLine_opp) == 3)
{
kDoubleP *= GameManager.dicePoint;
}
if(CountOfLine(eLine_opp) == 3)
{
eDoubleP *= GameManager.dicePoint;
}
if(CountOfLine(vLine_opp) == 3)
{
vDoubleP *= GameManager.dicePoint;
}
linePossibility[0] += AttackPossible(kLine_opp) + SeperatePossible(kLine) + kDoubleP;
linePossibility[1] += AttackPossible(eLine_opp) + SeperatePossible(eLine) + eDoubleP;
linePossibility[2] += AttackPossible(vLine_opp) + SeperatePossible(vLine) + vDoubleP;
}
3.7贴出GitHub的代码签入记录,合理记录commit信息
四、总结反思
4.1本次任务的PSP表格
PSP2.1 | Personal Software Process Stages | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 60 | 90+ |
Estimate | 估计这个任务需要多少时间 | 10 | 10 |
Analysis | 开发 | 1000 | 1500 |
Design Review | 设计复审 | 30 | 60+ |
Design Spec | 生成设计文档 | 10 | 20 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 10 | 0 |
Design | 具体设计 | 60 | 10 |
Coding | 具体编码 | 2000 | 1145 |
Code Review | 代码复审 | 100 | 514 |
Test | 测试(自我测试,修改代码,提交修改) | 100 | 99.8 |
Reporting | 报告 | 120 | 150 |
Test Repor | 测试报告 | 30 | 50 |
Size Measurement | 计算工作量 | 200 | 30 |
Postmortem & ProcessImprovement Plan | 事后总结, 并提出过程改进计划 | 50 | 80 |
合计 | 3780 | 3608.8 |
4.2 学习进度条(每周追加)
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 10 | 10 | 1 | 1 | 学会Axure |
2 | 400 | 410 | 20 | 21 | 新建项目 |
3 | 400 | 810 | 40 | 61 | 学会完善 |
4.3最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?
今天晚上算是完成了。但是是被迫完成的,因为没时间了,也是理所当然的。最初想象的产品只有一个模模糊糊的雏形,像是炉石或是游戏王master duel那样的棋盘游戏,至少应该是非常酷炫。到了设计原型的时候,也不会用软件,只能做出简陋的模型,但是还是幻想有诸如线上对战,对战记录这样的功能。最后开始的时候,当然由于时间关系功能一砍再砍。
总结一下,理想很美好,原型很架空,成果很现实。
是为什么呢?我想还是时间吧,或者说自己对这个项目的态度。有时候就会想我花这么多时间做这个东西出来,有什么意义?意义是在过程中,还是我的成果中呢。
4.4 评价你的队友
我的队友,那就是我自己了。我的评价是,感谢我和我自己。thank to me,myself and i。你能做出更棒的游戏的。
我对制作游戏是有兴趣的,正因如此,我对我的队友是很挑剔的。从一开始组队的时候,我就决定没有志同道合的人的话不如自己一个人,也就是一人成军,从程序到美术。
4.5 结对编程作业心得体会
- 这次作业,我使用了从前用过的unity来开发。也是我第一款比较正式的游戏。名字叫Dicer,也是我ai脚本的名字。
- Dicer由我一人独自开发,除了开始界面一张漂亮的像素背景图(出自@CamiUnknown)以外其他所有美术素材均出自我手。
- 游戏没有中文,因为我懒得去找中文像素字体,相信大家四六级都过了吧。
- 开发中遇到unity崩溃一次,没有保存,我也崩溃了。
- 成功完成后总之就是非常激动。真的有花不少时间,但是时间总是不够的,就到此为止吧。
- 我已经开始想我的下一个游戏了。