现代程序设计 作业6 - 简单而有意义的题目

这是这个课件的一部分:  现代程序设计 (课程设计中, 征求意见稿)

好多同学们都说题目难,这回我们来一个简单而很有意义的。  :)

写代码爽还是读代码爽? 往一堆乱麻中再加上一些线索,似乎比较容易;然而从这一团乱麻中理出头绪,还是比较难的。下图来自 知乎的一个讨论

image

 

我们练习了这么多作业,所有作业都是从头写程序,但是我们到了真正的项目组或公司里,通常我们会改进一个已经存在项目 (这个项目说不定已经存在好多年了),这个项目的文档也不多,编码规范也不是太完美。 这时候我们怎么办?  我们当然可以通过下面的办法:

  1. 理解程序
  2. 在不损害程序现有功能的情况下,修复bug 或增加新功能
  3. 同时有计划地通过重构或重写,改进这个程序,让它更好地被程序员理解,更好地能适应可能产生的变化。

这个作业就是这样一个例子。

假设有一组水平不高的程序员,或者一个水平不高的程序员(比如我),在很久以前为了学习Java, 就写了一个 Java 的围棋下棋程序 (不是人工智能,只是在屏幕上展现下棋的过程),  后来C# 出现之后,他又随意地把程序改写为C#,  经过简单测试之后,他就把程序放在一边了。

 

image

 

现在我们拿到了这个代码,程序还可以编译成功,但是不巧的是一个关键函数只有函数体,没有具体的实现了。例如:

int  GetLiberty(int x, int y, StoneColor c ) //判断当前的位置上的棋子和相连的一组棋子一共有多少气

这个程序原来总共有30行(算上空行和单字符行),但是由于种种原因, 这个函数只剩下了一句话

return 1;

现在请用递归和非递归两种方式把它实现出来。

 

关于个棋子或一组相连的棋子有多少气,有没有气, 十分简单。

详细的规则请看网上的许多教程。  举两个非常简单的例子:

image  如果此时该黑棋下,黑棋下在 (A,1) 的位置, 那么黑棋就把白棋 A2 的棋子吃掉了。如果此时该白旗下,白棋下在 C1 的位置,那么白棋就把两颗黑棋吃掉了。

image 此时,黑白双方谁能占据 O4 的位置, 就能够决定两个黑棋有没有气。

 

(上面的题目已经在课堂上搞定了,我们再扩展一下)

目前给同学们的程序能在下面两种情况下浏览棋局:

a) 直接在棋盘上面点击,程序就会按照黑白相间的次序走棋。

b) 用户可以用程序打开一个棋谱文件 (*.sgf),  然后按 “>” 按钮,程序就会按次序下棋。

大家注意到用户界面上还有一个 “<” 按钮,  这是让用户把下棋的步骤倒回去 (如果上一步一方吃掉了许多棋子, 那么我们还要把这些吃掉的棋子恢复好)

函数说明在这里:

image

这个函数的大部分都没有实现,现在我们要实现它。 (要求: 所有的修改都只在这一个函数体里面

我们的同学们学了《现代程序设计》,搞定下面的挑战应该不成问题:

1) 把程序编译通过, 跑起来。

    读懂程序,在你觉得比较难懂的地方加上一些注释,这样大家就能比较容易地了解这些程序在干什么。

     把正确的 playPrev(GoMove) 的方法给实现了。 如果大家不会下围棋,那就需要大家实地或者上网练习一下围棋的死活,提子是怎么回事。这个应该一个小时就能搞定。

2)根据你选择的教材 (三本之一或更多),点评一下这个程序设计方面的不足,例如:

     编码风格,

     程序架构,有哪些不符合良好的设计,这个程序的设计模式 (MVC等) 是高端大气国际化的么? 等等。 

     程序的错误处理,文件处理,UI 等等

     大家可能会想到,这个程序虽然说编译都过了,但说不定有很多基本的小问题没解决,VS 的强大的编译器和代码分析工具能把它们都找出来? 当然可以:

      image

     大家可以运行 VS 的代码分析工具,找到这个程序的这些问题,并改进。下面是报告的一部分:

image

这些改进可以是很小的,例如,把所有函数的命名都规范化,这算一个改进。同学们至少要把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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
本课程详细讲解了以下内容:    1.jsp环境搭建及入门、虚拟路径和虚拟主机、JSP执行流程    2.使用Eclipse快速开发JSP、编码问、JSP页面元素以及request对象、使用request对象实现注册示例    3.请求方式的编码问、response、请求转发和重定向、cookie、session执行机制、session共享问     4.session与cookie问及application、cookie补充说明及四种范围对象作用域     5.JDBC原理及使用Statement访问数据库、使用JDBC切换数据库以及PreparedStatement的使用、Statement与PreparedStatement的区别     6.JDBC调用存储过程和存储函数、JDBC处理大文本CLOB及二进制BLOB类型数据     7.JSP访问数据库、JavaBean(封装数据和封装业务逻辑)     8.MVC模式与Servlet执行流程、Servlet25与Servlet30的使用、ServletAPI详解与源码分析     9.MVC案例、三层架构详解、乱码问以及三层代码流程解析、完善Service和Dao、完善View、优化用户体验、优化三层(加入接口和DBUtil)    1 0.Web调试及bug修复、分页SQL(Oracle、MySQL、SQLSERVER)     11.分页业务逻辑层和数据访问层Service、Dao、分页表示层Jsp、Servlet     12.文件上传及注意问、控制文件上传类型和大小、下载、各浏览器下载乱码问     13.EL表达式语法、点操作符和中括号操作符、EL运算、隐式对象、JSTL基础及set、out、remove     14.过滤器、过滤器通配符、过滤器链、监听器     15.session绑定解绑、钝化活化     16.以及Ajax的各种应用     17. Idea环境下的Java Web开发

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值