一、实验目标
1)体验敏捷开发中的两人合作。
2)进一步提高个人编程技巧与实践。
二 、实验内容
1)根据以下问题描述,练习结对编程(pair programming)实践;
2)要求学生两人一组,*组合。每组使用一台计算机,二人共同编码,完成实验要求。
3)要求在结对编程工作期间,两人的角色至少切换 4 次;
4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。
三、实验要求
1、代码规范
2、程序的总体设计(附图说明模块之间的关系)
(1)为了体现软件工程的分层思想,把结构分为data层、service层和应用层
- data层存放细胞数组类
- service层存放算法逻辑
- lifeGame应用层主要是界面的实现和启动
(2)算法函数模块图
3、程序结对编程过程(附图)及功能实现情况(附代码和图)
(1)结对编程过程
实际操作我们使用的是QQ远程结对,为了方便统计我们使用issue来记录具体进度
(2)功能实现情况
- 矩阵初始化
1 public static CellArray initMap(int row,int col ) { 2 CellArray cells=new CellArray(row,col); 3 for(int i=0;i<row;i++) { 4 for(int j=0;j<col;j++) { 5 Random r=new Random(); 6 int a=r.nextInt(4); //在0-3之间随机选一个数 7 if(a==1) { 8 cells.setCell(i,j,CellState.LIVE.getValue()); 9 } 10 else { 11 cells.setCell(i,j,CellState.DEAD.getValue()); 12 13 } 14 } 15 } 16 return cells; 17 }
- 下一代细胞
1 //判断细胞下一代的生死 2 public static CellArray generate(CellArray cells) { 3 CellArray nextCells=new CellArray(cells.getRow(),cells.getCol()); 4 for(int i=0;i<nextCells.getRow();i++) 5 for(int j=0;j<nextCells.getCol();j++) { 6 7 int count=countNumber(cells,i,j); 8 if(count==3) { 9 nextCells.setCell(i, j, CellState.LIVE.getValue()); //活邻居为三 活 10 } 11 else if(count==2&&cells.getCell(i, j)==CellState.LIVE.getValue()) { //活邻居为二且自己本来就活着 活 12 nextCells.setCell(i, j, CellState.LIVE.getValue()); 13 } 14 else { 15 nextCells.setCell(i, j, CellState.DEAD.getValue()); //其他情况 死 16 } 17 } 18 19 return nextCells; 20 21 }
- 细胞生命周期
1 //细胞生命周期 2 Timer timer = new Timer(); 3 timer.schedule(new TimerTask() { 4 @Override 5 public void run() { 6 cells = GameService.generate(cells); 7 ++generation; 8 label2.setText("繁衍代数:" + generation); 9 for (int i = 0; i < row; i++) { 10 for (int j = 0; j < col; j++) { 11 if (cells.getCell(i, j) == CellState.LIVE.getValue()) { 12 btns[i][j].setBackground(Color.black); 13 14 } else { 15 btns[i][j].setBackground(Color.white); 16 } 17 } 18 } 19 } 20 }, 0, 500); 21 setVisible(true); 22 }
- 统计活邻居数
1 //统计边界中细胞活邻居的个数 2 public static int countNumber(CellArray cells,int x,int y) { 3 int count = 0; 4 for (int i = 0; i < 3; ++i) { 5 for (int j = 0; j < 3; ++j) { 6 if (CellState.LIVE.getValue() == cells.getCell(x + temp[i], y + temp[j])) {//判断矩阵中活的细胞数目和给出的细胞及周边细胞的数目是否相同 7 ++count; 8 } 9 } 10 } 11 if (CellState.LIVE.getValue() == cells.getCell(x, y)) {//如果矩阵中活的细胞数和给出的位置细胞数相同 12 --count; 13 } 14 15 return count; 16 }
- 效果展示
4、项目github地址(附图)
地址:https://github.com/super-sweet8/-
补充一点:第四次交换时,队友检查代码无误不再推送信息,所以README上没有记录,但是issues上是可以体现的
5、实验总结
本来效果展示那一块想上传视频的,查了很多资料,网上的教程都是上传类似优酷B站之类的视频,链接视频平台会生成,本地的视频没有找到解决办法。尝试过使用百度网盘创造链接,发现展示页面是密码输入,笔者不想借助B站转这个链接,因为B站UP主的视频都是提供大家学习,我这个对别人没有任何帮助,纯属为了个人,觉得放上去挺不好意思的,于是我放弃了。或许有别的办法,知道的朋友欢迎留言。
本次实验到此结束,过程中遇到的问题真的是层出不穷,没有别的办法就是得有耐心然后不停的重复重复重复,百度是一个很好的学习工具,不懂多多查阅总有收获。组队编程是一个很大的挑战,交流是最最重要的,包容理解也占了很多,实验完成的那一刻双方即使隔着屏幕也能从那字里行间察觉对方的激动心情。
关于实验中关于github的操作在此省略,已在前几篇文中做过详细描述。