这是这个课件的一部分: 现代程序设计 (课程设计中, 征求意见稿)html
好多同窗们都说题目难,这回咱们来一个简单而颇有意义的。 :) 程序员
写代码爽仍是读代码爽? 往一堆乱麻中再加上一些线索,彷佛比较容易;然而从这一团乱麻中理出头绪,仍是比较难的。下图来自 知乎的一个讨论。编程
咱们练习了这么多做业,全部做业都是从头写程序,可是咱们到了真正的项目组或公司里,一般咱们会改进一个已经存在项目 (这个项目说不定已经存在好多年了),这个项目的文档也很少,编码规范也不是太完美。 这时候咱们怎么办? 咱们固然能够经过下面的办法:设计模式
这个做业就是这样一个例子。 网络
假设有一组水平不高的程序员,或者一个水平不高的程序员(好比我),在好久之前为了学习Java, 就写了一个 Java 的围棋下棋程序 (不是人工智能,只是在屏幕上展示下棋的过程), 后来C# 出现以后,他又随意地把程序改写为C#, 通过简单测试以后,他就把程序放在一边了。 架构
如今咱们拿到了这个代码,程序还能够编译成功,可是不巧的是一个关键函数只有函数体,没有具体的实现了。例如:函数
int GetLiberty(int x, int y, StoneColor c ) //判断当前的位置上的棋子和相连的一组棋子一共有多少气工具
这个程序原来总共有30行(算上空行和单字符行),可是因为种种缘由, 这个函数只剩下了一句话学习
return 1; 测试
如今请用递归和非递归两种方式把它实现出来。
关于个棋子或一组相连的棋子有多少气,有没有气, 十分简单。
详细的规则请看网上的许多教程。 举两个很是简单的例子:
若是此时该黑棋下,黑棋下在 (A,1) 的位置, 那么黑棋就把白棋 A2 的棋子吃掉了。若是此时该白旗下,白棋下在 C1 的位置,那么白棋就把两颗黑棋吃掉了。
此时,黑白双方谁能占据 O4 的位置, 就可以决定两个黑棋有没有气。
(上面的题目已经在课堂上搞定了,咱们再扩展一下)
目前给同窗们的程序能在下面两种状况下浏览棋局:
a) 直接在棋盘上面点击,程序就会按照黑白相间的次序走棋。
b) 用户能够用程序打开一个棋谱文件 (*.sgf), 而后按 “>” 按钮,程序就会按次序下棋。
你们注意到用户界面上还有一个 “<” 按钮, 这是让用户把下棋的步骤倒回去 (若是上一步一方吃掉了许多棋子, 那么咱们还要把这些吃掉的棋子恢复好)
函数说明在这里:
这个函数的大部分都没有实现,如今咱们要实现它。 (要求: 全部的修改都只在这一个函数体里面)
咱们的同窗们学了《现代程序设计》,搞定下面的挑战应该不成问题:
1) 把程序编译经过, 跑起来。
读懂程序,在你以为比较难懂的地方加上一些注释,这样你们就能比较容易地了解这些程序在干什么。
把正确的 playPrev(GoMove) 的方法给实现了。 若是你们不会下围棋,那就须要你们实地或者上网练习一下围棋的死活,提子是怎么回事。这个应该一个小时就能搞定。
2)根据你选择的教材 (三本之一或更多),点评一下这个程序设计方面的不足,例如:
编码风格,
程序架构,有哪些不符合良好的设计,这个程序的设计模式 (MVC等) 是高端大气国际化的么? 等等。
程序的错误处理,文件处理,UI 等等
你们可能会想到,这个程序虽说编译都过了,但说不定有不少基本的小问题没解决,VS 的强大的编译器和代码分析工具能把它们都找出来? 固然能够:
你们能够运行 VS 的代码分析工具,找到这个程序的这些问题,并改进。下面是报告的一部分:
这些改进能够是很小的,例如,把全部函数的命名都规范化,这算一个改进。同窗们至少要把Code Analysis 报告的全部问题给解决了。
关于Code Analysis 的更多信息:
http://msdn.microsoft.com/en-us/library/ee1hzekz.aspx
http://msdn.microsoft.com/zh-cn/library/vstudio/ms182278.aspx
3) 程序的注释
全部人都以为注释很重要,写程序不写注释的同窗真是RP 比较低。。。
那么,就请把这个程序中被标成 “zzzz” 的注释都恢复过来。 固然,你能够用中文写注释。
4) 选择题: (提示: 这个题目另外算分,满分10分,须要挣分的同窗就能够考虑这个选择题)
对于功能上的小问题, 那么你怎么改进呢? 请选出 1-2个你想作的改进,而后运用你的各类编程技术和能力把这些改进给实现了(必须明确指出改进/增长了哪个功能)。
把全部的改进都实现以后,把代码签入 GitHub, 经历了这一番改动,你的程序和别的同窗的程序就很不同了。
若是你们有时间并有兴趣,能够作一些大的改进:
a) 若是我要把这个程序变成一个能够人机对战的小游戏 (假设你的AI 模块已经写好,这里咱们就可让一个函数返回一个合法的位置就能够), 那这个程序的架构应该怎么变化? 请把这个功能写出来。
b) 若是我想让这个程序变成两个用户能够经过网络对战,这个程序的架构要怎么变化?
另: 你们在读程序的时候能够测试一下本身的会发什么样的脑电波。 :) 看看下面的论文:
http://wwwiti.cs.uni-magdeburg.de/~feigensp/experiments/fMRI/fse_fMRI-Poster.pdf