结对编程作业

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老师果真是又快乐又痛苦啊!!

原文地址:https://www.cnblogs.com/Blusher/p/15451030.html