结对编程 第二阶段

实验二 结对编程第二阶段

 

一、实验目标
 1)体验敏捷开发中的两人合作。

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

 

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

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

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

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

 三、实验过程

1、代码规范

   1.1 语法规范
  (1)用两个空格来代替制表符(tab) -- 这是唯一能保证在所有环境下获得一致展现的方法。


  (2)嵌套元素应当缩进一次(即两个空格)。

  (3)对于属性的定义,确保全部使用双引号,绝不要使用单引号。
  1.2命名规

  (1)所有的标示符都只能用ASCⅡ字母(A-Z或a-z)、数字(0-9)和下划线“_”。

  (2)一个唯一包名的前缀总是全部小写的字母。

  (3)类名是一个名词,采用大小写混合的方式,每个单词的首字母大写。

  (4)接口的大小写规则与类名相似。


  1.3.注释规范

  (1)注释尽可能使用“//”;

  (2)所有的源文件都应该在开头有一个注释,其中列出文件名、日期和类的功能概述。

  (3)每个方法必须添加文档注释。

  (4)每个属性必须添加注释。

  1.4.文件名规范

  (1)一个Java源文件只能存储一个Java类。

  (2)文件名与Java类名相同。

2、程序的总体设计

  算法描述:在主函数中我们选定了一个4*4的矩阵,并将矩阵中邻居状态进行初始化,然后引用methods类中的三个方法进行变换。

  其中Methods类存放三个方法:

  check方法,用来检测存放着所有邻居状态的二维矩阵的所有位置,并用point数组,记录对应位置下一轮的状态,用代表1下一代死,2下一代继续活,3下一代复活。
  getNext方法,用来将二维矩阵存储的邻居状态,根据point数组更新到下一代的状态,并将矩阵返回。
  printLifeMap方法,用来将二维矩阵中的所有邻居,按照图示的状态打印出来。

  

  算法流程图:

 

  结对编程 第二阶段_第1张图片


3、程序结对编程过程及功能实现情况

编程过程:实验代码的bug修复,以及对实验结果的优化进一步修改

结对编程 第二阶段_第2张图片

 

mero-moon完成pull request,进行merge成功

结对编程 第二阶段_第3张图片

 

功能实现:完成实验要求,运行成功。

代码界面:LifeGame.java和Methods.java运行。

结对编程 第二阶段_第4张图片

 

 

结对编程 第二阶段_第5张图片

 

运行结果:输入0继续,输入其他数字退出。

结对编程 第二阶段_第6张图片

 

结对编程 第二阶段_第7张图片


4、项目github地址

项目地址: https://github.com/jinminxin/-

 

结对编程 第二阶段_第8张图片

 

java代码压缩打包,修改无误后上传

 

 LifeGame.java:

package lifegame;

import java.lang.reflect.Method;
import java.util.Random;
import java.util.Scanner;

    /*
        (1)生命小游戏的邻居为上下左右和斜对角一共八个位置
        (2)默认选择4*4的格子
        (3)将默认的格子初始化,并打印输出
        (4)使用Methods中的方法生成下一轮的状态,并打印
     */

public class LifeGame {
      public static void main(String[] args) {

            //设置一个二维数组存储所有的格子
            String[][] lifeMap = new String[4][4];

            Methods me = new Methods();

            //将所有格子进行初始化输入,死为0,活为1
            //随机生成各个位置的邻居情况
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {

                    int num = new Random().nextInt(2);
                    if (num == 1)
                        lifeMap[i][j] = "●";
                    else if (num == 0)
                        lifeMap[i][j] = "○";
                }
            }

            //打印格子初始状态
            System.out.println("初始状态为:");
            me.printLifeMap(lifeMap);
            System.out.println("===========");

            int n = 0;
            int num = 0;//记录变化的次数
            while (n == 0) {

                //用point数组,记录对应位置下一轮的状态,1下一代死,2下一代继续活,3下一代复活
                int[] point = me.check(lifeMap, new int[16]);

                //将获得下一次变化后的图形
                lifeMap = me.getNext(lifeMap, point).clone();

                System.out.println("第" + (++num) + "次变化:");

                //打印出来
                me.printLifeMap(lifeMap);
                System.out.println("===========");

                System.out.println("输入0继续进行下一步,输入其他数字退出。");
                n = new Scanner(System.in).nextInt();
            }
        }
}

 

 Methods.java:

package lifegame;




public class Methods {
     public Methods() {
        }

        //该方法检测所有位置,并返回对应位置的point数组
        //用point数组,记录对应位置下一轮的状态,1下一代死,2下一代继续活,3下一代复活
        public int[] check(String[][] lifeMap, int[] point) {

            int n = 0;
            //统计周围邻居的情况
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {

                    /*
                    规则如下,进行判断
                                      ( 1)一个人可以有8个邻居;
                                      ( 2)一个人若只有一个邻居,在下一代会孤独的死去;
                            (3)若有2或3个邻居,在下一代依然活着;
                            (4)若有4个或以上邻居,在下一代会因拥挤而死;
                            (5)死去的人若有3个邻居,在下一代会复活;
                            (6)所有的死去或复活都在下一代变化时同时发生。
                    */

                    //用life变量记录周围活着的邻居个数
                    int life = 0;

                    //1.判断正下方的位置
                    if (i + 1 < 4 && lifeMap[i + 1][j].equals("●")) {
                        life++;
                    }

                    //2.判断右下位置
                    if (i + 1 < 4 && j + 1 < 4 && lifeMap[i + 1][j + 1].equals("●")) {
                        life++;
                    }

                    //3.判断左下位置
                    if (i + 1 < 4 && j - 1 >= 0 && lifeMap[i + 1][j - 1].equals("●")) {
                        life++;
                    }

                    //4.判断右侧位置
                    if (j + 1 < 4 && lifeMap[i][j + 1].equals("●")) {
                        life++;
                    }

                    //5.判断左侧位置
                    if (j - 1 >= 0 && lifeMap[i][j - 1].equals("●")) {
                        life++;
                    }

                    //6.判断正上方位置
                    if (i - 1 >= 0 && lifeMap[i - 1][j].equals("●")) {
                        life++;
                    }

                    //7.判断右上位置
                    if (i - 1 >= 0 && j + 1 < 4 && lifeMap[i - 1][j + 1].equals("●")) {
                        life++;
                    }

                    //8.判断左上位置
                    if (i - 1 >= 0 && j - 1 >= 0 && lifeMap[i - 1][j - 1].equals("●")) {
                        life++;
                    }

                    //用一个数组,记录对应位置下一轮的状态,1下一代死,2下一代继续活,3下一代复活
                    if (lifeMap[i][j].equals("●")) {
                        if (life == 1)
                            point[n] = 1;
                        else if (life == 2 || life == 3)
                            point[n] = 2;
                        else if (life >= 4)
                            point[n] = 1;
                    } else {
                        if (life == 3)
                            point[n] = 3;
                    }
                    n++;
                }
            }
            return point;
        }

        public String[][] getNext(String[][] lifeMap, int[] point) {

            int n = 0;
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {

                    //变更状态
                    if (point[n] == 1)
                        lifeMap[i][j] = "○";
                    if (point[n] == 3)
                        lifeMap[i][j] = "●";

                    n++;
                }
            }
            return lifeMap;
        }

        public void printLifeMap(String[][] lifeMap){
            for (int i = 0; i < 4; i++) {
                for (int j = 0; j < 4; j++) {
                    if (j == 3)
                        System.out.println(lifeMap[i][j] + " ");
                    else
                        System.out.print(lifeMap[i][j] + " ");
                }
            }
        }
}

 


5、实验总结

  此次实验为结对编程实验,顾名思义,是合作实验,这不仅仅让我学习到队友在编程是采用的技巧和思路,学习他的编程风格和特点,吸取精华,也在一定程度上提高了自己的综合编程能力,这很好地体验在以后的开发中,如何与队友合作,如何在无法面对面交流的情况下进行实验,既要相信自己,更要相信队友,这样才能一致解决困难。其次,我们零零七小队选去生命游戏为课题,在确定用什么样的结构,什么样的算法,什么样的接口,什么样的函数等,都需要两人共同交流完成,虽然过程繁琐,但程序的准确性提高了。而且一些容易犯的编写错误,经过两个人的检查,也更容易被发现和指出。虽然看似效率不如以前一个人编写时高,但是实际上代码结构更加清晰,出现bug的几率也更小了,提高了自己的编程效率。在以后的学习生活中,又为自己的编程领域打开了一片天。

你可能感兴趣的:(结对编程 第二阶段)