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

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

把正确的 playPrev(GoMove) 的方法给实现了。

注释见Github上的代码,正确的实现我写在了下面:

 public void playPrev(GoMove gm)
{
Point P=gm.Point; Grid[P.X, P.Y].removeStone();
m_gmLastMove = gameTree.peekPrev();
if (m_gmLastMove != null)
{
Grid[m_gmLastMove.Point.X, m_gmLastMove.Point.Y].setUpdated();
}
if (gm.DeadGroup != null)
{
System.Collections.IEnumerator myEnumerator =gm.DeadGroup.GetEnumerator();
while (myEnumerator.MoveNext())
{
Point p;
p = (Point)myEnumerator.Current;
Grid[p.X, p.Y].setStone(m_colorToPlay);
}
}
m_colorToPlay = nextTurn(m_colorToPlay);
optRepaint();
textBox1.Clear();
textBox1.AppendText(gm.Comment);
return;
}

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

编码风格,

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

编码风格方面:这个程序把所有的方法都写在了GoBoard类里面,没有写成几个高内聚性的类,因此读起来比较吃力。程序中也没有把控制器和视图分开,所有的控制器都写在了GoBoard这个Winform里面,不是标准的MVC设计模式。

3)程序的注释

注释详见Github,注释时主要有两方面不明白,因此注释就没有写。

1)label和mark分别是什么意思,这一点没有在程序中看明白。

2)从文件中读取棋谱后,一些文件处理操作的函数没有看明白。

4)功能上小问题的改进:

我改的地方是对于向后回退,即悔棋时,如果只在playprev中操作,而不更改其他地方的话,会发现对于棋谱中,这种已经既定后续操作的情况下可以适用,但是如果是用户自己去下棋的情况时,就会发现回退不能得到意想的效果。主要原因出在这里:

 public void addAMove(GoMove gm)
{
gm.Seq = m_total ++;
m_moves.Insert(m_seq,gm);
m_seq++;
//m_moves.Add(gm); }

被注释掉的是原来的代码。原来的代码的弊端在于它对于用户回退掉的棋子并没有在m_moves这个动态数组中delete掉,导致用户先回退,在添加,再回退,这种场景时就会出现选择棋子上的错误。因此我采用的解决方案是将m_moves.Add(gm);改为m_moves.Insert(m_seq,gm);,这样就可以覆盖掉先前的棋局中的棋子,而达到理想的回退效果。

5)我还想做一个功能上的改进,但是由于时间上的原因,就没有具体实现,下面把我的想法大致说明一下:

save功能的具体实现:

save功能我的设想就是把用户手动下的棋局保存为系统要求的sgf文件。

实现的方法是遍历gametree,因为gametree里面存储了所有的下棋步骤。再利用foreach从第一个遍历到最后一个,然后获取它的颜色和横纵坐标存储为类似B[A,B]的形式。可以先保存到txt文件,最后再将后缀名改为.sgf即可。这样就可以得到一个棋谱了。

6)其他改进及附加题

其他改进的话就是算气的那一部分可以改成压栈是非递归。

附加题2:改成联网的对战游戏。

这一问比较容易实现。

那么每次传递的就是对方的棋子位置和颜色即可。就是将每次换颜色的这部分改掉,改成接受对方传过来的参数,在棋盘上绘制棋子即可。

附加题1:AI接收的是当前棋盘的格局,然后返回的是下一个要下的棋子的点。

那么程序的架构就可以改为每当用户点击完成后,mouseuphandler方法执行完该用户下的棋子的绘制操作后,就将棋局的格局和要下的颜色传给AI,然后AI返回一个下棋的点的位置,在调用playnext函数将AI返回的棋子绘制在棋局上即可。伪代码如下所示:增加的语句为:

GoMove gmNextMove = AI(gameTree,m_colorToPlay);
playNext(gmNextMove);
gameTree.addMove(gmThisMove);                                                             

 private void MouseUpHandler(Object sender,MouseEventArgs e)
{
Point p;
GoMove gmThisMove; p = PointToGrid(e.X,e.Y);
if (!onBoard(p.X, p.Y) || !closeEnough(p,e.X, e.Y)|| Grid[p.X,p.Y].hasStone())
return; //如果鼠标的位置不在面板上或不在格点上或该点已经有了一颗棋子,那么就返回不绘制点 //ZZZZZ ZZZZ ZZ Z ZZZZZZ ZZZZ, ZZ ZZZZ ZZ ZZZ ZZZ ZZZZ ZZ ZZZ ZZZZ ZZZZ
//将这个点的信息添加到gameTree中
gmThisMove = new GoMove(p.X, p.Y, m_colorToPlay, );
playNext(ref gmThisMove);
gameTree.addMove(gmThisMove);
GoMove gmNextMove = AI(gameTree,m_colorToPlay);
playNext(gmNextMove);
gameTree.addMove(gmThisMove);
}

homework_06 围棋程序改进的更多相关文章

  1. Servlet笔记6--Servlet程序改进

    第一步改进,GenericServlet: 我们目前所有放入Servlet类直接实现了javax.servlet.Servlet接口,但是这个接口中有很多方法是目前不需要的,我们可能只需要编写serv ...

  2. C++ 11 智能指针 lamda 以及一个 围棋程序

    lamda表达式使用 char* p = "Hello world"; ,nl = ; for_each(p,p+, [&](char i){ if(i=='e') ne+ ...

  3. 世界围棋人机大战、顶峰对决第一盘:围棋世界冠军Lee Sedol(李世石,围棋职业九段)对战Google DeepMind AlphaGo围棋程序

    Match 1 - Google DeepMind Challenge Match: Lee Sedol vs AlphaGo 很多网站对世界围棋大战进行了现场直播,比如YouTube.新浪.乐视.腾 ...

  4. 世界围棋人机大战、顶峰对决第二战:围棋世界冠军Lee Sedol(李世石,围棋职业九段)对战Google DeepMind AlphaGo围棋程序,AlphaGo再次胜出!

    感觉在哔哩哔哩(bilibili)上看比赛直播比较好,一直可以看到比赛的直播画面,还能听到英文解说和中文主持人的解说.YouTube上是不错,但是一方面爬梯子比较卡,另一方面只能听到英文解说. 韩国著 ...

  5. 为何谷歌围棋AI AlphaGo可能会把李世石击溃

    /* 版权声明:可以随意转载,转载时请标明文章原始出处和作者信息 .*/ author: 张俊林 谷歌DeepMind开发的人工智能围棋程序AlphaGo以5:0的压倒性优势击败了欧洲围棋冠军.专业二 ...

  6. AlphaGo论文的译文,用深度神经网络和树搜索征服围棋:Mastering the game of Go with deep neural networks and tree search

    转载请声明 http://blog.csdn.net/u013390476/article/details/50925347 前言: 围棋的英文是 the game of Go,标题翻译为:<用 ...

  7. facebook darkforest围棋ai测试

    0.darkforest说明 darkforest是facebook田渊栋博士开发的深度学习围棋程序,2016的uec cup得了第二名(http://jsb.cs.uec.ac.jp/~igo/en ...

  8. .NET程序优化

    一.数据库操作 1. 用完马上关闭数据库连接 访问数据库资源需要创建连接.打开连接和关闭连接几个操作.这些过程需要多次与数据库交换信息以通过身份验证, 比较耗费服务器资 源.ASP.NET 中提供了连 ...

  9. c#操作Excel时,抛出异常:“未在本地计算机上注册“Microsoft.ACE.OLEDB.12.0”提供程序”

    我们开发环境下,使用excel导入数据到数据库中,编译的软件起初是x86 方式,起初并未发现什么问题,一切很正常: 程序该进的过程: 后来导入文件一次就要读取几百G的数据导入数据库中,使用编译的X86 ...

随机推荐

  1. Android开发之EventBus的简单使用

    参考: 1.http://blog.csdn.net/harvic880925/article/details/40660137 2.http://blog.csdn.net/harvic880925 ...

  2. fiddler for mac

    Fiddler 是一免费的web调试工具.并且兼容所有浏览器.系统和平台. Fiddler 是基于微软的 .Net 技术开发的,没办法直接在 Mac/Linux 下使用.本文介绍一些替代方案(这些方案 ...

  3. 1124. Mosaic(dfs)

    1124 需要想那么一点点吧 一个连通块中肯定不需要伸进手不拿的情况 不是一个肯定会需要这种情况 然后注意一点 sum=0的时候 就输出0就可以了 不要再减一了 #include <iostre ...

  4. [LeetCode#267] Palindrome Permutation II

    Problem: Given a string s, return all the palindromic permutations (without duplicates) of it. Retur ...

  5. HDU 1166 敌兵布阵 (线段树 单点更新)

    题目链接 线段树掌握的很差,打算从头从最简单的开始刷一波, 嗯..就从这个题开始吧! #include <iostream> #include <cstdio> #includ ...

  6. uva12716GCD XOR

    筛法,打表. 通过打表可知,但gcd(a,b)==a xor b时,a xor b = a-b. 就是求满足 c = a-b且c = a xor b 的c的个数. #include<cstdio ...

  7. Qt之进程间通信(共享内存)

    简述 上一节中,我们分享下如何利用Windows消息机制来进行不同进程间的通信.但是有很多局限性,比如:不能跨平台,而且必须两个进程同时存在才可以,要么进程A发了消息谁接收呢? 下面我们来分享另外一种 ...

  8. ios 编译openssl支持arm64(转)

    最近在编译支付宝 快捷支付(无线) ios 端的时候发现demo不支持arm64.在网上找了下,看到客服说是openssl的库文件不支持arm64,于是自己编译了支持arm64的库文件,发现还是不行, ...

  9. CMake实践(1)

    简介: 目录结构t1/main.cpp; t1/CMakeLists.txt 说明: main.cpp: #include <stdio.h> int main(){    printf( ...

  10. 20、内存溢出(Out of Memory)

     内存引用(释放强引用) Object obj=new Object(); obj = null;  内存引用(使用软引用) 软引用是主要用于内存敏感的高速缓存.在jvm报告内存不足之前会清 除所 ...