2022软工K班结对编程任务

github链接
bilibili链接

一、结对探索(4分)

1.1 队伍基本信息(1分)

​ 结对编号:21;队伍名称:只因

学号姓名作业博客链接具体分工
032002237叶夏雨原型设计,前端开发
032002239张陈玮原型设计,UI设计,后端开发

1.2 描述结对的过程(1分)

近水楼台 先得舍友,就这么简单~

1.3 非摆拍的两人在讨论设计或结对编程过程的照片(2分)

在这里插入图片描述

二、原型设计(16分)

​ 2.1 原型工具的选择(2分)

原型工具:墨刀
原因:Axure过于复杂,还是国产的好用,支持国产\ (•◡•) /

​ 2.2 遇到的困难与解决办法(3分)

困难1: 刚开始不知道什么是原型设计,以为就是咔咔咔直接用前端直接设计界面,后来迷途知返,用了Axure和墨刀进行设计。
困难2:零基础入门墨刀,许多功能不知道怎么实现,于是查找大量资料,一步一步完成想要的功能。
困难3:一直找不到满意的图片素材,之后去视觉中国上一看,哎呦,就是你们了!
收获:进一步了解了原型设计的流程,掌握了墨刀的使用。

​ 2.3 原型作品链接(5分)

逍遥骰原型链接

​ 2.4 原型界面图片展示(6分)

功能模块:游戏主页

可以点击进行双人对战,人机对战,并查看游戏规则。

在这里插入图片描述

双人对战 和 人机对战

双人对战下,两边都可以点击骰子进行游戏;
人机对战下,左边可以点击骰子游戏,右边由AI自动运行

在这里插入图片描述

功能模块 :游戏规则

介绍游戏的玩法规则,可通过上下翻页

在这里插入图片描述

三、编程实现(14分)

​3.1 网络接口的使用(2分)

使用了java的httpservlet类接收前端的post请求,并返回骰子落点。

​3.2 代码组织与内部实现设计(类图)(2分)

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

3.3 说明算法的关键与关键实现部分流程图(2分)

人机通过对场上形势的判断来决定相关模式,然后进行value的计算,比较value并得出落点。

在这里插入图片描述

​ 3.4 贴出重要的/有价值的代码片段并解释(2分)

棋盘元素类:将int[3]进行包装提供了许多必要的函数,之后的代码编写带来的很多便利

public class ChessElement {
	private int[] location = new int[6];
	private int score;
	private int left;
	public ChessElement(int[] location) {// 初始化棋盘元素(location长度为3)
		for (int i = 0; i < 3; i++) {
			if (location[i] != 0) {
				this.location[location[i] - 1]++;
			}
		}
		init();
	}
	public ChessElement(int[] location, int dice, boolean isOpposite) {// 初始化棋盘元素,并在己方或对方放一个骰子(location长度为6)
		this.location = location;
		if (isOpposite) {
			this.location[dice - 1] = 0;
		} else {
			this.location[dice - 1]++;
		}
		init();
	}
	public void setScore() {// 初始化得分
		for (int i = 0; i < 6; i++) {
			score += location[i] * location[i] * (i + 1);
		}
	}
	public boolean isFull() {// 判断棋盘元素是否已经满了
		int a = 0;
		for (int i = 0; i < 6; i++) {
			a += location[i];
		}
		if (a < 3) {
			return false;
		} else {
			return true;
		}
	}
	public int getScore() {// 获取该棋盘元素的当前得分
		return score;
	}
	private void setLeft() {//获取剩余空位数量
		for (int i = 0; i < 6; i++) {
			left += location[i];
		}
		left = 9 - left;
	}
	public int getNewScore(int x) {// 填入x后该棋盘元素的得分
		int result = 0;
		int a[] = new int[6];
		for (int i=0;i<6;i++) {
			a[i]=location[i];
		}
		a[x - 1] = 0;
		for (int i = 0; i < 6; i++) {
			result += a[i] * a[i] * (i + 1);
		}
		return result;
	}
	public int getAddition(int x) {// 填入x后该棋盘元素的得分增量
		return getNewScore(x) - score;
	}
	public int getDecrement(int x) {// 对面填入x后该棋盘元素的得分减量
		int result = 0;
		int a[] = new int[6];
		for (int i=0;i<6;i++) {
			a[i]=location[i];
		}
		a[x - 1] = 0;
		for (int i = 0; i < 6; i++) {
			result += a[i] * a[i] * (i + 1);
		}
		result = getScore() - result;
		return result;
	}
	public int[] getLocation() {// 以一维数组形式输出棋盘元素
		return location;
	}
	public int getLeft() {
		return left;
	}
	private void init() {
		setScore();
		setLeft();
	}
}

前后端交互函数

function senddata(){//向后端发送数据
	dice=Math.floor((Math.random() * 10) + 1) % 6 + 1;
	var data1 = "{";
	var data2 = "{";
	for (var i=0;i<9;i++){
		data1 = data1 + "\"" + i +"\"" + ":" + leftchess[i];
		data2 = data2 + "\"" + i +"\"" + ":" + rightchess[i];
		if (i!=8){
			data1 = data1 + ",";
			data2 = data2 + ",";
		}
	}
	data1 = data1 + "}";
	data2 = data2 + "}";
	$.ajax({
		type: "post",
		url: "http://localhost:8083/xyt/MyWebServlet",
		data:
		{
			"data1": data1,
			"data2": data2,
			"dice": dice
		},
		cache: false,
		dataType: "json", 
		success: 
		function(data){
			var position = data;
			if(position=="1"){
				for(var i=0;i<3;i++){
					if (rightchess[i]==0){
						rightchess[i]=dice;
						diceforscore=dice;
            			isright=0;
            			isleft=1;
            			dice=0;
						updatescore(10+i);
						break;
					}
				}
			}
			else if(position=="2"){
				for(var i=3;i<6;i++){
					if (rightchess[i]==0){
						rightchess[i]=dice;
						diceforscore=dice;
            			isright=0;
            			isleft=1;
            			dice=0;
						updatescore(10+i);
						break;
					}
				}
			}
			else{
				for(var i=6;i<9;i++){
					if (rightchess[i]==0){
						rightchess[i]=dice;
						diceforscore=dice;
            			isright=0;
            			isleft=1;
            			dice=0;
						updatescore(10+i);
						break;
					}
				}
			}
		}
	})
}

​​ 3.5 性能分析与改进(2分)

WholeChess类内部的calculateValue方法,count的值在大于7后对结果几乎没有影响,但是却极大的影响代码运行速度,所以将count从10改为7。

3.6 单元测试(2分)

基本算分

public static void main(String[] args) {
		int[][] a1 = { { 1, 0, 0}, { 2, 2, 2 }, { 0, 0, 0 } };
		int[][] a2 = { { 6, 6, 0 }, { 5, 5, 0 }, { 1, 1, 0 } };
		int dice = 1;
		InterfaceToJs i = new InterfaceToJs(a1,a2,dice);
		System.out.println(i.getPosition());
	}

防止为了得分而自杀

public static void main(String[] args) {
		int[][] a1 = { { 1, 1, 0}, { 2, 2, 2 }, { 2, 0, 0 } };
		int[][] a2 = { { 6, 6, 6 }, { 5, 5, 5 }, { 6, 1, 0 } };
		int dice = 1;
		InterfaceToJs i = new InterfaceToJs(a1,a2,dice);
		System.out.println(i.getPosition());
	}

​​ 3.7 贴出GitHub的代码签入记录,合理记录commit信息(2分)

在这里插入图片描述

四、总结反思(11分)

​ 4.1 本次任务的PSP表格(2分)

PSP2.1Personal Software Process Stages预估耗时(分钟)实际耗时(分钟)
Planning计划3030
· Estimate· 估计这个任务需要多少时间18002000
Development开发15001800
· Analysis· 需求分析 (包括学习新技术)10001200
· Design Spec· 生成设计文档120120
· Design Review· 设计复审3030
· Coding Standard· 代码规范 (为目前的开发制定合适的规范)3030
· Design· 具体设计6050
· Coding· 具体编码600700
· Code Review· 代码复审6050
· Test· 测试(自我测试,修改代码,提交修改)180200
Reporting报告6060
· Test Report· 测试报告3030
· Size Measurement· 计算工作量2020
· Postmortem & Process Improvement Plan· 事后总结, 并提出过程改进计划3030
· 合计55506350

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

叶:

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
115015088熟悉html,css,完成了基本界面设计
2300450816学习js,完成了掷骰子,棋盘的功能
3500950723进一步掌握前端三件套,优化作品

第N周新增代码(行)累计代码(行)本周学习耗时(小时)累计学习耗时(小时)重要成长
1001515了解了深度学习和Spring框架,虽然最后没用上
2500500520熟悉java语言httpservlet类
3100015001232通过练习前后端交互,掌握了ajax用法

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

1.产品形态和原型设计的最终的成果还是符合预期的 。
2.软件开发还是和理想的有差距,比如想要实现的小程序上线等等都没有实现。
原因:时间上过于紧张,对自己的能力进行了错误的估计

4.4 评价你的队友(2分)

To张:

  • 值得学习的地方:稳如老狗,学习能力强

  • 需要改进的地方:时间管理需要加强,期待早日成为时间管理大师~

To叶:

  • 值得学习的地方:努力学习,成为搭建网页小能手

  • 需要改进的地方:遇到困难摆大烂

​ 4.5 结对编程作业心得体会(3分)

叶:
  1. 零基础入门造火箭的体验,整个过程非常煎熬,因为这学期选修课选的太多,导致投入软工大作业的时间很难分配,于是只能不断压缩睡眠时间,还好队友给力,最终浑浑噩噩,勉勉强强完成了任务。
  2. 完成后的感受:天呐,我要好好睡一觉 zzzZZZ~
  3. 困难:因为一开始分工的时候就决定了要做前端,但是完全零基础,于是就紧锣密鼓地开始学习前端三件套。B站上搜集视频,然后倍速播放(看视频看到最后有点恶心的感觉呃呃呃…)。学习了一周后总算基本入门了前端,之后在B站上看到制作五子棋小游戏的视频,觉得大差不差,就跟着学,并用画布制作了棋盘,然后折腾了几天发现画布很难实现想要的功能,最后只能推翻重来用ul重新制作了棋盘,所以这一个简单的环节就浪费了许多时间(×_×)。
  4. 启发:再次深刻地意识到自己的不足,革命尚未成功,同志还需努力!
张:
  1. 作业难度:从未有过的体验,第一次尝试前后端分离的项目,收获十足
  2. 完成后的感受:spring框架很重要,需要尽快学习,然后就是好好放松一天
  3. 困难:变量的安全性欠考虑,类内的对象经常逸出。函数递归需要重新学习(卡了好久)。因为一开始想搞深度学习,所以投入的很多时间学习,结果最后还是没用上,浪费了不少时间。最后是使用的编程工具很大程度上决定了写代码的速度,idea在代码编写上确实比eclipse方便
  4. 启发:好好学习,提升自己的能力才是目前最重要的。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值