zoukankan      html  css  js  c++  java
  • 结对编程第二阶段

    实验二  结对编程

    一、实验目标:

    1)体验敏捷开发中的两人合作。

    2)进一步提高个人编程技巧与实践。

    二 、实验内容:

    1)根据以下问题描述,练习结对编程(pair programming)实践;

    2)要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求。

    3)要求在结对编程工作期间,两人的角色至少切换 4 次;

    4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。

    三、问题描述

    1)生命游戏

        生命游戏是英国数学家约翰·何顿·康威在 1970 年发明的细胞自动机,它包括一个二维矩形世界,这个世界中的每个方格居住着一个活着的或死亡的细胞。一个细胞在下一个时刻生死取决于相邻八个方格中活着的或死了的细胞的数量。如果相邻方格活着的细胞数量过多,这个细胞会因为资源匮乏而在下一个时刻死去;相反,如果周围活细胞过少,这个细胞会因太孤单而死去。

        游戏在一个类似于围棋棋盘一样的,可以无限延伸的二维方格网中进行。例如,设想每个方格中都可放置一个生命细胞,生命细胞只有两种状态:“生”或“死”。图中,用黑色的方格表示该细胞为“死”, 其它颜色表示该细胞为“生” 。

        游戏开始时, 每个细胞可以随机地(或给定地)被设定为“生”或“死”之一的某个状态, 然后,再根据如下生存定律计算下一代每个细胞的状态:

    • 每个细胞的状态由该细胞及周围 8 个细胞上一次的状态所决定;

    • 如果一个细胞周围有 3 个细胞为生,则该细胞为生,即该细胞若原先为死则转为生,若原先为生则保持不变;

    • 如果一个细胞周围有 2 个细胞为生,则该细胞的生死状态保持不变;

    • 在其它情况下,该细胞为死,即该细胞若原先为生则转为死,若原先为死则保持不变。

    四、实验过程

    1)队伍名称、成员博客地址以及仓库地址:

      队伍名称:写的都队

      王尹凡:https://www.cnblogs.com/grandrat/

      乔克祥:https://www.cnblogs.com/jsjqkx/

      仓库地址:https://github.com/programmingsky/Coop_Program

    2)对课题的理解:经过查阅相关资料,我们对于“生命游戏”这个课题的理解如下:

      我们可以把计算机中的宇宙想象成是一堆方格子构成的封闭空间,尺寸为N的空间就有N*N个格子。而每一个格子都可以看成是一个生命体,每个生命都有生和死两种状态,如果该格子生就显示蓝色,死则显示白色。每一个格子旁边都有邻居格子存在,如果我们把3*3的9个格子构成的正方形看成一个基本单位的话,那么这个正方形中心的格子的邻居就是它旁边的8个格子。
    每个格子的生死遵循下面的原则:
      1. 如果一个细胞周围有3个细胞为生(一个细胞周围共有8个细胞),则该细胞为生(即该细胞若原先为死,则转为生,若原先为生,则保持不变) 。
      2. 如果一个细胞周围有2个细胞为生,则该细胞的生死状态保持不变;
      3. 在其它情况下,该细胞为死(即该细胞若原先为生,则转为死,若原先为死,则保持不变)
      设定图像中每个像素的初始状态后依据上述的游戏规则演绎生命的变化,由于初始状态和迭代次数不同,将会得到令人叹服的优美图案。

    3)开发平台和编译工具:

      小组成员经过讨论,决定使用JAVA语音,并以Eclipse作为开发编译工具,在之前的课程中我们已经了解和学习过Eclipse这款软件,使用起来比较熟悉,方便上手。

    4)结对编程方案:

      小组成员采用腾讯QQ的“屏幕共享”和“远程控制”功能,与另一名成员交流课题,查看与干预另一名成员的开发过程,并使用Git进行版本管理,以完成结对编程。

    5)设计思路:

      通过数组来确定细胞的位置以及其旁边细胞的死活,编写count函数来计算细胞周围其他细胞的数量,进而确定该细胞的下一状态。

    6)第一次编写代码:

      首先由王尹凡担任驾驶员,乔克祥为领航员,之后由乔克祥担任驾驶员,王尹凡担任领航员,中途角色共计切换3次。

      编程设计过程中遇到的第一个问题是不知道如何确定细胞周围其他细胞的数量,通过在网络上查阅其他范例,我们最终确决定用坐标法来解决这个问题,先分别计算细胞上下左右的细胞数量,之后求和得到周围细胞总数。下图是第一次编写的程序代码以及提交GitHub的截图。下一阶段解决窗口的问题。

    第一次提交hub截图:

     

    7)第二次编写,修改程序:

      我们遇到的第二个讨论点,是关于如何决定细胞的下一个状态的问题,通过讨论和查阅其他范例后,我们决定添加一个辅助数组chess[i],[j],用来确定细胞的下一状态。但是运行之后报错,经过查证后发现是没有添加windows.h头文件,之后我们还添加了初始条件,确定初始时细胞的状态。下图为部分有关代码和Git提交记录。

    {
    s=Count(i,j);
    if(chess[i][j]==1)
    {
    if(s<2)
    chess0[i][j]=0; //如果一个生命周围的生命少于2个,它在回合结束后死亡。
    else if(s>3)
    chess0[i][j]=0; //如果一个生命周围的生命超过3个,它在回合结束后死亡。
    else if(s==2||s==3)
    chess0[i][j]=1; //如果一个生命周围有2或3个生命,它在回合结束时保持原样。
    }
    else if(chess[i][j]==0)
    {
    if(s==3)
    chess0[i][j]=1; //如果一个死格周围有3个生命,它在回合结束时获得生命。
    }
    }

     五、实验结果

      1)程序初始界面:

       2)开始运行:

       3)最终结果:

     六、实验小结

       这次结对编程实验对于我们来说并不是一个简单的课题,之前写程序都是自己琢磨,这次通过两个人结对编程的实验,不仅锻炼了我对于Java语言和Git命令的实际应用能力,更重要的是通过和另一个小组成员的合作,大大降低了编程过程中的出错率,效率也更高,虽然QQ远程操作存在信号不稳定、延迟高等问题,但是并不妨碍我们理解结对编程的便捷性和重要性。

  • 相关阅读:
    <s:property>的用法(jsp获取action中的值或者方法)
    struts2 Action获取表单数据
    form标签中id和name属性的区别
    button和submit区别
    hibernate could not resolve property
    Error setting property values; nested exception is org.springframework.beans.NotWritablePropertyExce
    宏定义#define和内联函数inline的区别
    线程绑定cpu
    posix系统线程调度-设置线程优先级
    std::lock_guard和std::unique_lock的区别
  • 原文地址:https://www.cnblogs.com/grandrat/p/12538920.html
Copyright © 2011-2022 走看看