2022软件工程K班结对编程任务
https://github.com/vincigeorge/Pair_work2/tree/main
https://www.bilibili.com/video/BV1Ee411L7zR/?vd_source=62e29d203a3893e78331a6cd39e9bb4d
一、结对探索(4分)
1.1 队伍基本信息(1分)
结对编号:26;队伍名称:不会挂科对不队;
学号 | 姓名 | 作业博客链接 | 具体分工 |
---|---|---|---|
032002325 | 瞿林杰 | 代码框架初步实现,ui设计 | |
032002311 | 黄森 | 内部各个模块具体功能实现 |
1.2 描述结对的过程(1分)
在上学期就了解到软件工程这门课程,心里已经有了组队的大概人选,最后选上了同一个老师,就一拍即合,确定了组队~~(抱大腿)~~。
1.3 非摆拍的两个人在讨论设计或结对编程的照片(2分)
**二、原型设计(**16分)
2.1 原型工具的选择(2分)(选择了什么原型工具,为什么选择这一款原型软件?)
原型工具
- Mockitt(墨刀)
原因
- 首先是因为隔壁班(栋哥)他们布置作业的原型设计用的是墨刀,在舍友的推荐下,选择了墨刀。
- 了解后,发现墨刀是一个功能很全面,设计很简洁、方便且高效的一款原型设计工具,它不需要过多的学习成本,一上手就能使用,而且图形化界面也很友好。
2.2 遇到的困难与解决办法(3分)(原型设计中遇到的困难描述,尝试解决,是否解决,有何收获)
- 第一个遇到的困难就是初始界面的设计。由于没有前端开发的经验,审美也不太行,在设计初始界面时产生了许多的分歧,经过沟通交流与协商,最后完成了原型设计~~(虽然还是很丑)~~。
- 第二个就是功能模块的设计。在讨论之初,我们没有具体想到那些功能模块我们需要实现,导致后来的开发才确定了我们需要并且能实现的功能,也提醒了我们以后先了解我们的功能,再开始开发,磨刀不误砍柴工。
- 一些动态音效。比如背景音乐、点击的音效,按钮跳转的动作,其中大部分功能都完成了,只有其中的托管按钮,由于与我们人机对战的逻辑有点不同再加上点击事件无法触发,导致这个模块的功能没有完善。
- 按钮、界面的跳转与音效。在查询了墨刀的相关功能后,发现按钮的点击音效无法实现,于是原型上没有背景音乐与点击音效,但是在最后的web设计中实现了功能。
- 总体来说,我们原型设计的时间还是有点太短了,没有具体考虑到各个模块的需求,下次设计应该多下点功夫。在设计过程中收获也是有的,设计时人与人的沟通非常重要,在设计的每一个环节,我们之间都有着面对面的沟通。我们都有自己独特的想法,但交流的过程也是让步的过程,取其精华,弃其糟粕,才是结对编程的意义所在。除此之外,也了解到一个项目的完成必须要原型设计和如何进行原型设计,它相当于的你开发时的蓝图,其重要性也不言而喻。
2.3原型作品链接(5分)(静态原型作品2分,交互性强的作品5分)
原型作品地址
2.4原型界面图片展示(6分)(尽可能图文并茂地在此此处介绍你们队伍设计的功能模块,创新点也在此处展示)
初始界面:设计了四个按钮,分别是本地对战、人机对战、在线对战、排行榜。按钮设计了颜色,阴影,跳出的渐变动画,还有点击时的音效,本次设计总共采用了四种的点击音效,与背景音乐,其中背景音乐全程播放(可关闭)。初始界面的点击音效为音效1。在背景图片上覆盖添加了规则说明,让规则更加醒目。同时改变了透明度,让背景图片能够更加完整的保留。
输入大名界面:点进本地对战后,弹出输入姓名界面,用于后续排行榜记分,姓名界面黑底黄边,输入界面十分醒目,带有确定按钮,此按钮对应音效2。
本地对战:进入后改变背景(背景音乐继续播放),界面中有左右两个棋盘(可以更换背景图片),其内纵横交错着三行三列虚线。左上角有一系列功能界面,分别为对战双方、对战时间、步数、音乐开关、再骰一次、更换背景、托管等一系列按钮(都对应音效2),棋盘下方有得分按钮,与骰子按钮(对应音效四)
对战双方姓名:最后的赢家统计到数据内。
对战时间:随时间增加,最后结束时关闭,并统计到数据内。
步数:每下一步棋,步数加一,最后也计入统计数据内。
音乐按钮:点击后关闭/打开音乐。
重新开始:点击后退回到初始界面。
再投一次:当点击骰子按钮后,对所骰的点数不满意时,点击按钮即可获得再骰一次的机会。双方每局最多各使用一次。
更换背景:点击时改变棋盘背景。
托管:点击后自动帮忙落子。
骰子:点击后切换成动图(骰子点数),获得点数后,点击棋盘没落子的任一格子,触发音效四,且有立体的骰子落到棋盘上,同时更新双方得分。
人机对战:功能界面与本地对战类似,不同之处在于不需要输入大名,且每下一子后,对方人机自动落子。
在线对战:由于时间紧迫,暂未开发,只写出了按钮。
排行榜:样式与输入大名界面类似,界面内有每个人的排名,与返回菜单按钮。
7.战斗结束界面:与排行榜类似,也偶返回菜单按钮。
**三、编程实现(**14分)
3.1 网络接口的使用(2分)
这次项目是纯前端实现,使用了jquery.js实现的纯前端开发。
3.2 代码组织与内部实现设计(类图)(2分)
我们这次使用的是纯前端开发,大致分为三块
css文件夹:设置了前端元素的风格,例如颜色,大小,位置等。
images文件夹:我们完成项目所需要的全部图片(包括,背景图片、骰子动图、棋盘图片、棋盘背景图片等等)。
.music文件夹:存放背景音乐与点击音效
html文件:写了简单的页面布局,大致框架设计。
js方面:实现前端页面交互,以及游戏逻辑的实现,此文件写在了html内。
jQery.js:这次开发所用到的库。
3.3 说明算法的关键与关键实现部分流程图(2分)
函数名 | 用途 |
---|---|
$(‘#container’).on(‘click’,function() | 执行棋盘点击之后的逻辑 |
let player = async () | 实现点击的各种音效 |
setInterval(() | 更新时间 |
drawChess : function(i) | 绘制棋子 |
jump | 各种按钮的分支 |
computer:function() | 返回电脑落子的地方 |
down : function(x,y) | 具体实现整个落子过程的函数 |
rule :function(x,y) | 实现下(x,y)这个棋子之后根据规则改变棋面 |
CheckWin() | 实现判赢并返回分数 |
其实算法的关键就在于js交互部分,我认为棋盘点击的逻辑是算法的关键,具体解释参见3.4。
$('#container').on('click',function(e){console.log('棋盘被点击了!');if(dice_already==0) return ;if(chessboard_num==0) return ;chessboard_num=0;e = e || window.event;//点击棋盘,返回canvas坐标if(e.pageX||e.pageY){movex = e.pageX - parseInt($("#container").css('marginLeft'))-10;movey = e.pageY - parseInt($("#container").css('marginTop'))-10;}//超出棋盘范围返回 if(movex>126.6*3||movex>126.6*3) return;console.log(game.getPoints(movex,movey),movex,movey)//人人模式if(mode==1){dice_already=0;//返回棋盘下的坐标,从(1,1)-(3,3)let arr=game.getPoints(movex,movey);//落子函数game.down(arr[0],arr[1],dice);//人机对战}else if(mode==2){//返回棋盘下的坐标,从(1,1)-(3,3)let arr=game.getPoints(movex,movey);//落子函数game.down(arr[0],arr[1],dice);dice=getRandomNum(1,6);player1();//落子图片$(".click_dice1").attr('src','images/1dice'+dice+'.gif'); chessboard_num=1;dice_already=1;//机器人的函数let arr2=game.computer();game.down(arr2[0],arr2[1],dice);dice_already=0;chessboard_num=1;}})
3.4 贴出重要的有价值的代码片段并解释(2分)
这个是左边棋盘点击函数,思路如下:
dice_already代表的是骰子是否以及骰了,就是只有在骰子骰完,点击棋盘才有意义。
然后是判断chessboard_num,这个变量代表的是,上一个棋所下棋盘号,以免在一个棋盘上下两次。
movex,movey记录的是点击对于棋盘的相对位置,getpoints函数转换获得棋盘上的点坐标,例如(2,2);
然后判断现在游戏模式,mode==1代表是人和人对战,另一个代表是人机。差别是人人是就执行点击那个人的操作,人机增加了一个电脑下一个随机位置的操作。
$('#container').on('click',function(e){console.log('棋盘被点击了!');if(dice_already==0) return ;if(chessboard_num==0) return ;chessboard_num=0;e = e || window.event;//点击棋盘,返回canvas坐标if(e.pageX||e.pageY){movex = e.pageX - parseInt($("#container").css('marginLeft'))-10;movey = e.pageY - parseInt($("#container").css('marginTop'))-10;}//超出棋盘范围返回 if(movex>126.6*3||movex>126.6*3) return;console.log(game.getPoints(movex,movey),movex,movey)//人人模式if(mode==1){dice_already=0;//返回棋盘下的坐标,从(1,1)-(3,3)let arr=game.getPoints(movex,movey);//落子函数game.down(arr[0],arr[1],dice);//人机对战}else if(mode==2){//返回棋盘下的坐标,从(1,1)-(3,3)let arr=game.getPoints(movex,movey);//落子函数game.down(arr[0],arr[1],dice);dice=getRandomNum(1,6);player1();//落子图片$(".click_dice1").attr('src','images/1dice'+dice+'.gif'); chessboard_num=1;dice_already=1;//机器人的函数let arr2=game.computer();game.down(arr2[0],arr2[1],dice);dice_already=0;chessboard_num=1;}})
具体落子的函数
先输出音效,然后步数增加。
根据棋盘状态,确定是哪边棋盘下棋。
然后drawChess函数讲棋子图片显示到前端。
rule函数实现游戏规则,消棋子。
然后进入checkWin函数判断输赢,同时返回两者的分数,在前端更新。
根据函数返回值确定输赢弹出对应的提示框。
down : function(x,y){//落子声音player2()this.step++;let a=this.step+1;$('#step').html("步数: "+a)if(chessboard_num==0){this.points.push([x,y,dice,this.step]);nums+=1;}else if(chessboard_num==1){this.points1.push([x,y,dice,this.step]);nums1+=1;}//绘制第step个棋子 this.drawChess(this.step);this.rule(x,y);let win=this.CheckWin();console.log("here");$('#s1').text('分数:'+win[1]);$('#s2').text('分数:'+win[2]);console.log('win:',this.CheckWin());if(mode==2){ //人机模式if(win[0]==1){//人获胜$('#gameOverTitle').text('你获胜了!');$('#gameOverContent').text('耗时:'+$('#time').text()+' '+$('#step').text()+' ');$('#gameOverContent1').text('比分 '+win[1]+':'+win[2]);pageKF(['gameOver']);}else if(win[0]==2){$('#gameOverTitle').text('电脑获胜了!');$('#gameOverContent').text('耗时:'+$('#time').text()+' '+$('#step').text()+' ');$('#gameOverContent1').text('比分 '+win[1]+':'+win[2]);pageKF(['gameOver']);}else if(win[0]==3){$('#gameOverTitle').text('平局!');$('#gameOverContent').text('耗时:'+$('#time').text()+' '+$('#step').text()+' ');$('#gameOverContent1').text('比分 '+win[1]+':'+win[2]);pageKF(['gameOver']);}}else if(mode==1){//人人(本地)模式if(win[0]==1){//左方玩家获胜$('#gameOverTitle').text('左方玩家获胜了!');$('#gameOverContent').text('耗时:'+$('#time').text()+' '+$('#step').text());$('#gameOverContent1').text('比分 '+win[1]+':'+win[2]);pageKF(['gameOver']);}else if(win[0]==2){$('#gameOverTitle').text('右方玩家获胜了!');$('#gameOverContent').text('耗时:'+$('#time').text()+' '+$('#step').text()+' ');$('#gameOverContent1').text('比分 '+win[1]+':'+win[2]);pageKF(['gameOver']);}else if(win[0]==3){$('#gameOverTitle').text('平局!');$('#gameOverContent').text('耗时:'+$('#time').text()+' '+$('#step').text()+' ');$('#gameOverContent1').text('比分 '+win[1]+':'+win[2]);pageKF(['gameOver']);}} },
以下是我们ai代码(基于贪心)
实现思路是,cal函数执行的是,在t行下这个点数,双方变化的分值的差,我们用这个来评估下的好坏。
当点数大于等于3时,我们就下差值较大的行,为了尽可能消对面的,以及使自己一行尽可能多的一样的。
当时当点数小于三时,清空对面以及使得自己double之类不是最优的,所以我们在这个时候返回一个cal最小的位置,但是很有可能是全局更优的解。
from audioop import tomono
import random
from turtle import position
def cal(ownBoard,otherBoard,t,figure):cnt=0cnt2=0for i in range((t-1)*3,t*3):if(ownBoard[i]==figure):cnt+=1for i in range((t-1)*3,t*3):if(otherBoard[i]==figure):cnt2+=1if cnt==1:return figure*3if cnt==2:return figure*5if cnt2==1:return figure*2if cnt2==2:return figure*5if cnt2==3:return figure*10return figuredef nextStep(ownBoard,otherBoard,figure):ma=-400mi=1000t=0t2=0for i in range(1,4):flag=-1position=0for j in range((i-1)*3,i*3):if(ownBoard[j]==0) :flag=iposition=jif flag==-1:continuetmp=cal(ownBoard,otherBoard,i,figure)if tmp>ma:ma=tmpt=positionif tmp<mi:mi=tmpt2=positionif figure>=3:return telse :return t2
3.5 性能分析与改进(2分)
整体其实性能是很高效的,由于是纯前端没有找到合适的性能分析工具,但是我们的改进思路,原本电脑下棋的逻辑是随便找一个位置,在所有的操作中,有没有下过,其实效率比较低,可以优化实时记录还有哪些点能下,但是其实这种优化的意义不大,最坏情况下,也就是已经下了8个棋子的情况,仍有期望步数9次找到能下的地方,就算已经下过1000次,计算机也能很快跑完,对于小游戏来说其实没有什么优化的意义,但是确实存在优化空间。
3.6 单元测试(2分)
由于前端无法进行单元测试,所以这个部分主要在于ai代码的测试。简单写了一个ai对战的py代码,模拟双方进行对战,测试出胜率。
def main()://对战次数n=999999//算法参数nextStep(ownBoard,otherBoard,figure)//胜场数a_win=0b_win=0for l in range(1,n+1):if(test(x,y,z)==1):b_win+=1else:a_win+=1//a胜场数:b胜场数print("a:"+str(a_win/n))print("b:"+str(b_win/n))if __name__=='__main__':main()
3.7 贴出GitHub的代码签入记录,合理记录commit信息(2分)
四、总结反思(11分)
4.1 本次任务的PSP表格(2分)
PSP2.1 | Personal Software Process Stage | 预估耗时(分钟) | 实际耗时(分钟) |
---|---|---|---|
Planning | 计划 | 30 | 30 |
Estimate | 估计这个任务需要多少时间 | 30 | 50 |
Development | 开发 | 90 | 120 |
Analysis | 需求分析(包括学习新技术) | 1800 | 1000 |
Design Spec | 生成设计文档 | 80 | 30 |
Design Review | 设计复审 | 30 | 30 |
Coding Standard | 代码规范(为目前的开发制订合适的规范) | 45 | 60 |
Design | 具体设计 | 50 | 60 |
Coding | 具体编码 | 1800 | 1000 |
Code Review | 代码复审 | 300 | 300 |
Test | 测试(自我测试、修改代码、提交修改) | 300 | 120 |
Reporting | 报告 | 180 | 240 |
Test Report | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 45 | 30 |
Postmortem&Process Improvement | 事后总结,并提出过程改进计划 | 45 | 60 |
合计 | 4885 | 3190 |
4.2学习进度表(每周追加)(2分)
瞿林杰:
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 10 | 10 | 先了解了作业所需的要学习的知识,看b站视频熟悉了前端三件套(html、js、css)的使用与基本语法 |
2 | 100 | 100 | 10 | 20 | 通过b站开始学习小程序框架(vue)、了解了Cocos Creator的使用(虽然最后没用上) |
3 | 850 | 950 | 10 | 30 | 由于前端框架学习成本过大,放弃了vue,决定使用前端三件套手写web,更加熟悉的前端的语法,也明确了自己真的不喜欢前端 |
黄森:
第N周 | 新增代码(行) | 累计代码(行) | 本周学习耗时(小时) | 累计学习耗时(小时) | 重要成长 |
---|---|---|---|---|---|
1 | 0 | 0 | 10 | 10 | 首先了解作业所需要学习的知识,试着学flask来创建微信小程序项目,(虽然没有用上) |
2 | 100 | 100 | 10 | 20 | 通过b站学习小程序入门,虽然最后确实是没有用上 |
3 | 820 | 900 | 10 | 30 | 放弃了微信小程序开发,因为我们认为门槛太高了,没有足够的时间,选择花费时间更短的纯前端开发游戏。 |
4.3 最初想象中的产品形态、原型设计作品、软件开发成果三者的差距如何?(2分)(也就是谈一谈本次作品中理想与现实的差距,是哪些因素造成了这些差距?)
差距:
- 在最后的设计过程中,三者差距不大,我们在原型设计之处并没有设计太过于花哨的界面,所以我们还原了大部分的功能,但时还有些许的模块为实现,如在线对战与托管功能。
原因:
- 技术不行。我们俩都没有前端设计的基础,在作业布置之初我们就开始学习,直到最后一天才大概完成,花费了许多时间。在在线对战功能中需要用到服务器模块,难度系数过高,于是放弃。
- 时间不够。最明显的就是托管功能,在开始写之前认为逻辑比较简单,把托管功能接到人机对战中机器人的接口就行了。写过之后才发现与我们人机对战的逻辑相悖,需要重构人机逻辑才能实现,由于这周两份大作业ddl,下周还有两门考试,没时间完善,就暂且搁置。
4.4 评价你的队友(2分)(值得学习的地方,需要改进的地方)(本部分需要包含队伍内所有成员的心得体会,若缺少一人,则队伍总分减少2分,减满4分为止)
瞿林杰(评价黄森):
- 值得学习的地方:代码能力强,大部分是他在调试开发过程中的bug,思维反应很快,基本上遇见bug很快就能修改完成,他实现的相关模块也符合了我们的预期,在这次结对作业过程中功不可没~~(没他不行,我是菜鸡)~~!
- 改进的地方:鸽子怪,约定了一起修改代码,有时会晚来(经典吃宵夜),有时还会鸽掉。但是总体来说还是一次愉快的合作。
黄森(评价瞿林杰):
1.值得学习的地方是:对于任务十分上心,会特别注意ddl,不断地催促我跟上进度,学习应当学习的知识点,前端部分他水平高,我主要参与的是js的逻辑部分,分工合理。
2.改进的地方:无,总体我没有什么意见。
4.5 结对编程心得体会(3分)(可包含但不限于评价作业难度、完成后的感受、遇到的代码模块异常或结对困难及解决方法、对之后学习或软件开发的启发)(本部分需要包含队伍内所有成员的心得体会,若缺少一人,则队伍总分减少3分,减满6分为止)
瞿林杰:
- 起初看到这个任务时,第一反应是挺有意思的,可以完成一个小游戏的制作过程,但是由于没有前端的基础,所以我估计这次的结对作业又得嘎嘎学了。
- 这次的代码经历也是一波三折,因为看到使用小程序开发会有额外的加分,就毅然决然的确定了我们的开发方向。经过一周的学习,只学会了前端三件套的基本使用,于是不怕死的开始了书写小程序之旅。经过了一个晚上的痛苦折磨,最后放弃了小程序开发,转而准备web开发。
- 作业难度:个人认为这次作业对于我这种没有基础的人来说难度还是有点过大了。对知识框架不够的了解,也没有接触过软件的开发,导致我一开始在学习上走了很多的弯路。这些付出的时间成本与linux作业冲突都导致了最后完成的项目有点仓促。小程序开发也是我认为这次作业较难的一个原因。小程序的上手难度过高,学习成本过大,也耗费了许多时间与精力,就当作是还下大一、大二偷懒欠下的债吧。
- 通过本次的作业,了解到了结对编程的完整流程,也深刻明白了一个道理:人多力量大!很多时候一个人无法解决的问题在面对面交谈之中总能碰撞出思维的火花,产生许多奇妙的想法。很多问题只要你肯付出时间,就能解决。
- 合理分配时间,这次作业总的来说还是有点仓促,在第一周与第二周时没有充分利用时间,在比较晚的时间才修订了我们的大致方向,也导致最后的开发差强人意。
- 总体来说,这次的作业符合了自己的预期,也收获了很多的知识,最大的遗憾就是托管功能没有写出来吧,希望后续后时间的话能够把这个功能完成。
黄森:
- 第一次看到这个作业的时候,觉得是一个很庞大的工程,因为一开始想搞小程序,觉得要学的东西有很多,对于小程序也是完全没有了解。
- 由于开发时间的限制,以及我们俩都没有小程序的开发经验,导致小程序的启动门槛非常高,我们在中段的时候才了解到开发工具,以及其余课程的事情也非常的多,进一步压缩了时间,然后一致认定转为web开发。
- 作业难度:个人认为比第一次的作业难度提升很多,第一次作业其实难度已经很大了,在第一次个人编程后的总结中,我认为个人编程任务的小分支,例如爬虫,正则数据处理,数据可视化,ai分析在第一次编程任务中都不是简单的,就是都不属于该方面的入门,但是这次小程序的门槛太高了,我觉得老师要考虑到,一个计算机学生平常可用时间,要考虑到学生平常除了这门课以外要做的事情,懂得老师想要我们学习到很多新的知识,但是除了软工我们应该还有其他要学习的东西,希望老师可以考虑到。
- 通过这次作业,第一次接触和别人一起做项目,进行了很多的沟通,也学了一些结对编程的方式方法,
- 时间上面,我们确实有一些拖拉,但是主要是因为其他除软工以外的事情很多,但是确实是软工占用的时间太多了。
- 总体来说,这次的作业符合了自己的预期,也收获了很多的知识,最大的遗憾就是托管功能没有写出来吧,希望后续后时间的话能够把这个功能完成。
2022软件工程K班结对编程任务相关推荐
- 2022软工K班结对编程作业
逍遥骰GitHub链接 哔哩哔哩功能展示 学号 姓名 作业博客链接 具体分工 032002621 林灿彬 待填写 JavaScript编程.AI设计 032002623 林达锴 待填写 原型制作.ht ...
- 软件工程网络15结对编程作业
软件工程网络15结对编程作业 1.项目成员 学号:201521123014 博客地址:http://www.cnblogs.com/huangsh/ 学号: 201521123102 博客地址:htt ...
- 软件工程网络15结对编程作业(201521123062)
0.结对编程成员: 吴剑通博客地址:https://www.cnblogs.com/wjt960310/ 杨钧宇博客地址:http://www.cnblogs.com/GOB8023/ 码云地址:ht ...
- 2022K班结对编程任务
由于unity项目过于复杂已发送给测评组 Bilibili视频地址: 原型 游戏 一.结对探索 1.1 队伍基本信息 结对编号:32 队伍名称:Book私议队: 学号 姓名 作业博客链接 具体分工 0 ...
- 01组-2022软工K班现场编程任务
一.B站视频链接 哔哩哔哩 二.整体架构思维导图 三.任务分工与得分比例 姓名 任务 任务量占比 廖国均 项目统筹.发布任务 100% 林展 代码实现 120% 高浩楠 博客撰写 90% 程玉莹 代码 ...
- 【软件工程】第一次结对编程_作业
题目要求 (1). 首先在同学中找一个同伴,范围不限,可以在1~5班中随意组合,建议尽量不要找同组的成员,女同学尽量找男同学结对,但是不做强制要求: (2). 从以往个人完成的项目中选择一个作品,例如 ...
- 现代软件工程 作业 2 结对项目
这是现代软件工程课的作业 结对项目 Pair Project: 一对同学用结对编程的方法完成 结对编程课件: 现代软件工程讲义 3 结对编程和两人合作 软件工程讲义 3 两人合作(2) 要会做汉堡包 ...
- 北航2022软件工程第三次作业——结对编程(最长英语单词链)
软件工程第三次结对编程作业 项目 内容 这个作业属于哪个课程 北京航空航天大学2022春季软件工程(罗杰 任健) 这个作业的要求在哪里 结对编程项目-最长英语单词链 我在这个课程的目标是 学习软件工程 ...
- 2022秋软件工程第一次结对编程时作业
软件工程 FZUSDN社区 作业要求 2022秋软件工程第一次结对编程作业 作业目标 使用NABCD进行需求分析并进行原型设计 成员学号 032002217 成员学号 072003403 墨刀链接 墨 ...
最新文章
- 第三课时:PowerDesigner15基本操作
- Java数据保留小数
- Windows上的Java线程CPU分析
- 十行代码实现高仿Promise
- 从山顶透过云层看城市
- openai-gpt_GPT-3的不道德故事:OpenAI的百万美元模型
- 1050 String Subtraction (20 分)
- VB2010(17)_消息对话框MessageBox
- BaseTestCase system 1.0 体验版
- npm安装express-art-template报错:no such file or directory, open 'D:xx\xx\package.json解决办法
- 2021年要毕业了,有必要考研吗?工作经验重要还是学历重要 ?
- python测验6_测验6: 组合数据类型 (第6周)
- 【深度学习】深度学习模型
- 简简单单玩转CSS3(1)
- mysql易百_MySQL如何选择随机记录?
- [微软亚洲研究院]凌小宁教授给软件新人的演讲——选择的力量
- ERROR in Entry module not found: Error: Can‘t resolve ‘./src‘ in ‘D:\contract\ipfs\go-ipfs\react_app
- python屏幕取词getword_专业屏幕取词引擎-Getword
- micro和macro Fscore的区别
- python界面怎么改颜色_20行代码教你用python给证件照换底色