2022软工K班结对编程任务

游戏github地址
bilibili介绍

一、结对探索

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

该原型有三个场景,第一个是一开始进入游戏时,如下。当然最后时间不够,成品没有在线对战和对战历史这两个功能。
------------------------------------------开始界面---------------------------------------
start
点击对战后,就会进入第二个场景,即准备场景
enter
当两个玩家都点击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.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划6090+
Estimate估计这个任务需要多少时间1010
Analysis开发10001500
Design Review设计复审3060+
Design Spec生成设计文档1020
Coding Standard代码规范 (为目前的开发制定合适的规范)100
Design具体设计6010
Coding具体编码20001145
Code Review代码复审100514
Test测试(自我测试,修改代码,提交修改)10099.8
Reporting报告120150
Test Repor测试报告3050
Size Measurement计算工作量20030
Postmortem & ProcessImprovement Plan事后总结, 并提出过程改进计划5080
合计37803608.8

4.2 学习进度条(每周追加)

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
1101011学会Axure
24004102021新建项目
34008104061学会完善

4.3最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?

今天晚上算是完成了。但是是被迫完成的,因为没时间了,也是理所当然的。最初想象的产品只有一个模模糊糊的雏形,像是炉石或是游戏王master duel那样的棋盘游戏,至少应该是非常酷炫。到了设计原型的时候,也不会用软件,只能做出简陋的模型,但是还是幻想有诸如线上对战,对战记录这样的功能。最后开始的时候,当然由于时间关系功能一砍再砍。
总结一下,理想很美好,原型很架空,成果很现实。
是为什么呢?我想还是时间吧,或者说自己对这个项目的态度。有时候就会想我花这么多时间做这个东西出来,有什么意义?意义是在过程中,还是我的成果中呢。

4.4 评价你的队友

我的队友,那就是我自己了。我的评价是,感谢我和我自己。thank to me,myself and i。你能做出更棒的游戏的。
我对制作游戏是有兴趣的,正因如此,我对我的队友是很挑剔的。从一开始组队的时候,我就决定没有志同道合的人的话不如自己一个人,也就是一人成军,从程序到美术。

​ 4.5 结对编程作业心得体会

  • 这次作业,我使用了从前用过的unity来开发。也是我第一款比较正式的游戏。名字叫Dicer,也是我ai脚本的名字。
  • Dicer由我一人独自开发,除了开始界面一张漂亮的像素背景图(出自@CamiUnknown)以外其他所有美术素材均出自我手。
  • 游戏没有中文,因为我懒得去找中文像素字体,相信大家四六级都过了吧。
  • 开发中遇到unity崩溃一次,没有保存,我也崩溃了。
  • 成功完成后总之就是非常激动。真的有花不少时间,但是时间总是不够的,就到此为止吧。
  • 我已经开始想我的下一个游戏了。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值