一、实验目标
1)体验敏捷开发中的两人合作。
2)进一步提高个人编程技巧与实践。
二 、实验内容
1)根据以下问题描述,练习结对编程(pair programming)实践;
2)要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求。
3)要求在结对编程工作期间,两人的角色至少切换 4 次;
4)编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。
三、实验过程
1)代码规范
变量的命名需要有望文生义的效果,方便团队内的其他成员使用。
标识符的长度应该符合“min-length&max-information”原则。如果标识符采用的英文单词或拼音长度太长,应该采取通用合理的缩写。
缩进正确,要求代码简洁规范,有可读性。
注释合理规范,要让程序员可以充分了解到函数的作用。
2)程序的总体设计
3)结对编程过程
在结对编程过程中,我们两个人通过QQ进行互动,商量模块的划分和算法原理。在远程仓库的操作方面,我们使用了我的私人仓库,对方使用fork命令克隆到其本地机器上,我再在仓库中接受Pull Request。
第一次交互我负责完成程序的大体框架,对方负责细分;
第二次交互我们两个一起对第一次交互的成果进行优化改良,提出自己的观点甚至喜好;
第三次交互我负责对整体的结果进行总结测试,对方最后进行评估。
4)功能实现情况
1.初始化矩阵
这个模块我们使用srand和sand函数,在0和1的之间内随机选择数字,设定细胞的初始状态。
void Date() { int i,j; srand((unsigned)time(NULL)); for(i=0;i){ for(j=0;j ) map[i][j]=rand()%2; } }
2.游戏规则
这个模块我们设定细胞的存活条件,来判断下一迭代细胞的存活情况。
void cells_state(int i,int j) { int living_cellsnumber=0; living_cellsnumber=count_cellsNumber(i,j); if(chess[i][j]==1){ if(living_cellsnumber<2) chess0[i][j]=0;//如果一个生命周围的生命少于2个,它在回合结束后死亡。 else if(living_cellsnumber>3) chess0[i][j]=0;//如果一个生命周围的生命超过3个,它在回合结束后死亡。 else if(living_cellsnumber==2||living_cellsnumber==3) chess0[i][j]=1;//如果一个生命周围有2或3个生命,它在回合结束时保持原样。 } else if(chess[i][j]==0){ if(living_cellsnumber==3) chess0[i][j]=1;//如果一个死格周围有3个生命,它在回合结束时获得生命。 } }
3.更新并打印地图
count_cellsNumber()函数统计当前细胞周围8个细胞的存活情况,把统计的数据交给cells_state()来判断下一迭代细胞的存活情况,并交给run_game()函数来打印输出。
int count_cellsNumber(int xline,int yline) { int living_cellsnumber=0,i,j; for(i=-1;i<=1;i++){ for(j=-1;j<=1;j++){ if(!(i==0&&j==0)&&chess[xline+i][yline+j]==1) living_cellsnumber++; } }return living_cellsnumber; }
void run_game() { int i,j,flag=0; while(1){ system("cls"); for(j=1;j){ for(i=1;i ){ if(chess[i][j]==1) printf("█"); else printf(" "); }
printf("\n"); } for(j=1;j){ for(i=1;i ){ cells_state(i,j); } } Sleep(10);
if(flag==0){
getchar();
flag=1;
} } }
这是结果预览图:
5)github地址
https://github.com/dss-nnh/my-travel-plans
6)实验小结
在第一阶段时,我认为初始化细胞矩阵时应该自己设定每个细胞的存活状态,但后来证明这样非常耗费时间精力,所以采取随机生成状态的方案。
在合并branch时,我们遇到了问题,导致合并始终不成功,最终通过网上询问查找相关资料后才找到问题所在。