软件工程 实验二
结对编程 第一阶段报告
一、实验目标:
1)体验敏捷开发中的两人合作。
2)进一步提高个人编程技巧与实践。
二 、实验内容:
1)根据以下问题描述,练习结对编程(pair programming)实践;
2)要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求。
3)要求在结对编程工作期间,两人的角色至少切换 4 次;
4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。
三、问题描述(二选一)
1)生命游戏
生命游戏是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死亡的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。
游戏在一个类似于围棋棋盘一样的,可以无限延伸的二维方格网中进行。例如,设想每个方格中都可放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。图中,用黑色的方格表示该细胞为“死”, 其它颜色表示该细胞为“生” 。
游戏开始时, 每个细胞可以随机地(或给定地)被设定为“生”或“死”之一的某个状态, 然后,再根据如下生存定律计算下一代每个细胞的状态:
-
每个细胞的状态由该细胞及周围 8 个细胞上一次的状态所决定;
-
如果一个细胞周围有 3 个细胞为生,则该细胞为生,即该细胞若原先为死则转为生,若原先为生则保持不变;
-
如果一个细胞周围有 2 个细胞为生,则该细胞的生死状态保持不变;
-
在其它情况下,该细胞为死,即该细胞若原先为生则转为死,若原先为死则保持不变。
2)
开发一个自动生成小学四则运算题目的命令行 “软件”。实现 输入你要出题的个数,随机产生四则运算,然后用户回答,并且进行打分。
规则:用随机数实现100以内的加、减、乘、除运算,其中和与积不能超过100,差不为负(即须大减小),商不为小数或分数(即必须整除)。要求总计输出10个运算式,每输出一个运算式,等待输入结果,然后进行对错判断并输出。最后输出统计答对的题数与分
四、实验过程
1)查阅相关资料加深对敏捷开发和结对编程的理解
通过对老师发放的资料的阅读和网上的查阅我对敏捷开发和结对编程有了更深刻的理解。
首先敏捷开发是一种以人为核心、迭代、循序渐进的开发方法。在敏捷开发中,软件项目的构建被切分成多个子项目,各个子项目的成果都经过测试,具备集成和可运行的特征。换言之,就是把一个大项目分为多个相互联系,但也可独立运行的小项目,并分别完成,在此过程中软件一直处于可使用状态。敏捷最大的特色是迭代式开发。
而结队编程是敏捷开发实践中的一种,Kent Beck是结对编程定义者,他的定义大致可以理解为两个人共享一套开发设备,一个叫Driver 一个叫Observer, 说白了就是一个动手写一个在旁边看着,如果遇到问题两个人一起讨论,可以扩宽思路避免思维僵化。在此之前我所做过的实验基本都是自己闭门造车,相比于结对编程的效率,在代码能力上的进步与突破不是很大,遇到问题首先想的就是搜索引擎,解决不了的就抱抱大腿,严格来说不是自己解决了问题。而结对编程中两个人合作产生的内驱力和效率是从未体验过的。在频繁交换角色的过程中,另一个人既是加油站,又是对bug的放大镜,能够相互学习,也是在想要放弃的时候鞭策自己继续下去的动力。
2)组队情况,队伍博客地址,github仓库地址,所选择的课题
- 组队情况:已经在学习通中完成组队,成员如下:队长:何梦雅; 组员:沈磊
- 博客地址:沈磊(
https://www.cnblogs.com/cnsl/) 何梦雅(
https://www.cnblogs.com/blog-address/)
- github仓库地址:https://github.com/super-sweet8/-
- 所选择的课题:生命游戏
3)查阅相关资料
在通过初步的查阅资料我了解到了,生命游戏其实是一个零玩家游戏,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死了的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。实际中,你可以设定周围活细胞的数目怎样时才适宜该细胞的生存。如果这个数目设定过低,世界中的大部分细胞会因为找不到太多的活的邻居而死去,直到整个世界都没有生命;如果这个数目设定过高,世界中又会被生命充满而没有什么变化。实际中,这个数目一般选取2或者3;这样整个生命世界才不至于太过荒凉或拥挤,而是一种动态的平衡。这样的话,游戏的规则就是:当一个方格周围有2或3个活细胞时,方格中的活细胞在下一个时刻继续存活;即使这个时刻方格中没有活细胞,在下一个时刻也会“诞生”活细胞。在这个游戏中,还可以设定一些更加复杂的规则,例如当前方格的状况不仅由父一代决定,而且还考虑祖父一代的情况。你还可以作为这个世界的上帝,随意设定某个方格细胞的死活,以观察对世界的影响。在游戏的进行中,杂乱无序的细胞会逐渐演化出各种精致、有形的结构;这些结构往往有很好的对称性,而且每一代都在变化形状。一些形状已经锁定,不会逐代变化。有时,一些已经成形的结构会因为一些无序细胞的“入侵”而被破坏。但是形状和秩序经常能从杂乱中产生出来。
其原理是将计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。每个格子的生死遵循下面的原则: 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变; 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。细胞自动机有一个通用的形式化的模型,每个格子(或细胞)的状态可以在一个有限的状态集合S中取值,格子的邻居范围是一个半径r,也就是以这个格子为中心,在距离它r远的所有格子构成了这个格子的邻居集合,还要有一套演化规则,可以看成是一个与该格子当前状态以及邻居状态相关的一个函数,可以写成f:S*S^((2r)^N-1)->S。这就是细胞自动机的一般数学模型。
下面是我通过查阅所了解到的有关图形类型:
- 不动点(fixed points):变化终结于恒定图像
- 交替态(alternation):图像出现周期性变化
- 随机态(randomness):图像变化近乎随机
- 复杂态(complexity):图像存在某种复杂规律
参考文章如下:https://blog.csdn.net/qq_24663135/article/details/100888558
https://www.jb51.net/article/166745.htm
https://www.jianshu.com/p/4e0e64d981c7
https://blog.csdn.net/weixin_33836223/article/details/85611670
4)采用开发平台和技术工具
通过小组之间的讨论与交流,最终我们选择了用eclipse软件通过java来实现该程序的运行,因为相比之前我们所常用的VC++6.0,通过eclipse来实现的话,GUI界面相比VC++6.0的黑色界面更舒服。
5)其他
现阶段暂时只是讨论了实验有关的初步选择和理解,多数是围绕着课题的选择,软件开发的选择,对课题的理解以及初步的思路。以及为实验的实施进行初步的尝试和探讨,具体详细的有关代码的展开和具体操作在下次的实验报告中提出,敬请期待。