一、实验目标
1、体验敏捷开发中的两人合作。
2、进一步提高个人编程技巧与实践。
二 、实验内容
1、根据以下问题描述,练习结对编程(pair programming)实践;
2、要求学生两人一组,自由组合。每组使用一台计算机,二人共同编码,完成实验要求。
3、要求在结对编程工作期间,两人的角色至少切换 4 次;
4、编程语言不限,版本不限。建议使用 Python 或 JAVA 进行编程。
三、实验过程
在上一阶段中,我们小组最初选定的是使用python语言实现生命游戏,但在后来的实践中,我们遇到了很多问题,或者是熟悉度的问题之类,最终我们商定放弃pyhon写法,采用c语言进行实验的完成。
1.代码规范
1-1:程序块要采用缩进风格编写,缩进的空格数为4个。
1-2:相对独立的程序块之间、变量说明之后必须加空行。
1-3:较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
1-4:不允许把多个短语句写在一行中,即一行只写一条语句。
2.命名规范
2.1.变量名的开头必须是字母或下划线,不能是数字。实际编程中最常用的是以字母开头,而以下划线开头的变量名是系统专用的。
2.2. 变量名中的字母是区分大小写的。比如 a 和 A 是不同的变量名,num 和 Num 也是不同的变量名
2.3.变量名绝对不可以是C语言关键字
在确认好代码相关的规范之后,我们开始进行我们的实验。
3.编写尝试
3.1.首先,我们组所想的是 这个生命游戏有一个初始态,我们将整个游戏用个二维数组进行实现和展示,所以最开始我们可以将所有值赋真或者假表示生存或者死亡(这里我们用0和1)代替。
当然,通过random函数对数组进行随机的赋0或者1的值也是可行的,只不过为了简化,我们偷懒的对所有值赋1;
3.2接着我们需要一个打印函数,用于输出这个数组,也就是这个游戏的状态,在代码中就是show() 这个函数,通过两个for遍历,输出所有的状态,这里我们用“■”“□”来表示生存和死亡。
3.3然后,就是最重要的实现函数。很显然,二维数组中的每一个元素都有一个下标,那么他们的周围的元素是不是很容易用下标的形式表现出来?由于我们已经对每个元素的值赋了1,他周围
有多少生存的元素就很容易计算(只需要相加即可),接着我们将计算的数值进行判断,在按照生命游戏的规则进行更新。整个生命游戏就已经完成了。这里的更新用的是updateWithoutInput()。
这样整个游戏就被分成了初始化,更新状态,打印 三个状态。我们按照各自的功能进行代码的编写即可。
4.过程
4.1 本次实验代码部分刚开始是由我进行编写,后由吴雨亭同学负责完善和调试的。
git上commit的操作忘记截图了。。
4.2.代码部分
初始化函数 starup()
void startup() // 数据初始化
{
int i,j;
for (i=0;i
更新函数updateWithoutInput()
void updateWithoutInput() // 与用户输入无关的更新
{
int NewCells[High][Width]; // 下一帧的细胞情况
int NeibourNumber; //统计邻居的个数
int i,j;
for (i=1;i<=High-1;i++)
{
for (j=1;j<=Width-1;j++)
{
NeibourNumber = cells[i-1][j-1] + cells[i-1][j] + cells[i-1][j+1]
+ cells[i][j-1] + cells[i][j+1] + cells[i+1][j-1] + cells[i+1][j] + cells[i+1][j+1];
if (NeibourNumber==3)
NewCells[i][j] = 1;
else if (NeibourNumber==2)
NewCells[i][j] = cells[i][j];
else
NewCells[i][j] = 0;
}
}
for (i=1;i<=High-1;i++)
for (j=1;j<=Width-1;j++)
cells[i][j] = NewCells[i][j];
}
打印函数show()
void show() // 显示画面
{
clean(0,0); // 清屏
for (i=1;i<=High-1;i++)
{
for (j=1;j<=Width-1;j++)
{
if (cells[i][j]==1)
printf("□"); // 输出活的细胞
else
printf("■"); // 输出空格
}
printf("\n");
}
Sleep(50);
}
调用sleep函数来控制一下刷新速度
main函数
void main()
{
startup(); // 数据初始化
// 游戏循环执行
while(1){
show(); // 显示画面
updateWithoutInput(); // 与用户输入无关的更新
// updateWithInput(); // 与用户输入有关的更新
}
}
4.3 运行截图
4.4.项目地址
(https://github.com/Liovee/life-game-)
四.实验总结
当初pull的时候出现了错误,提示了```
hint: Updates were rejected because the remote contains work that you do
hint: not have locally. This is usually caused by another repository pushing
hint: to the same ref. You may want to first integrate the remote changes
hint: (e.g., 'git pull ...') before pushing again.
hint: See the 'Note about fast-forwards' in 'git push --help' for details.
究其原因,是当初本宝宝在创建远程仓库的时候勾选了initialize this repository README.MD选项
只需要 git pull --rebase origin master
git push -u origin master
还有就是,忘得差不多了,这次实验恰逢其时,在复习的时候更加深刻地掌握相关知识。
###总结:
这次实验既帮我和我的队友加深了git的熟练度
结对编程过程中,明显感觉效率不高,但是能深刻体会到别人的编程思想,有利于子自己以后的变成开发实践。
其次,即使两个人完成的依旧欠缺很多功能,并不完善,希望接下来能继续完善相关功能。