zoukankan      html  css  js  c++  java
  • 结对编程作业

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

  • 相关阅读:
    JS LeetCode 1423. 可获得的最大点数简单题解
    SpringBoot 学集 (第六章) Docker
    Linux 学记 (第三章)
    Linux 学记 (第二章)
    Linux 学记 (第一章)
    SpringBoot 学集 (第五章) Web开发续
    SpringBoot 学集 (第四章)Web开发
    SpringBoot 学集 (第三章) 日志框架
    SpringBoot 学集 (第二章) 配置文件
    SpringBoot 学集 (第一章)
  • 原文地址:https://www.cnblogs.com/Blusher/p/15451030.html
Copyright © 2011-2022 走看看