65.9K
CodeProject 正在变化。 阅读更多。
Home

Reversi (Othello) 游戏 C# 实现, 适用于 PocketPC 和 Windows

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.75/5 (12投票s)

2004年8月5日

3分钟阅读

viewsIcon

94658

downloadIcon

4423

一个用 C# 实现的黑白棋(奥赛罗)游戏,适用于 PocketPC 和 Windows。

Sample Image - PocketReversi.jpg

引言

我的最初目标是将 BrainJar 编写的 C# 黑白棋 程序移植到 Pocket PC。 经过一段时间后,我意识到,如果不理解发生了什么以及如何发生,就无法利用现有的程序。 所以,我亲自编写了它。 我试图让它尽可能简单。

整个游戏功能都集中在独立的程序集 gma.Reversi.dll 中。 有两个不同的表示层使用相同的程序集;gma.Windows.Reversi 用于 Windows .NET,gam.Mobile.Reversi 用于 PocketPC CF。

Board 类用于存储游戏信息,维护评估所需的统计数据,并保证游戏规则。 VirtualPlayer 类是 Player 类的派生类,包括评估和搜索算法。 这是一个为该程序实现“智能”的类。 GUIPlayer 类也是 Player 的派生类,实现了与表示层的交互。 两个玩家都使用相同的方法和事件与棋盘交互,因此对于 Board 来说,连接了哪个 Player 并没有什么区别。

博弈论

要理解黑白棋游戏的编程,一个很好的页面是 Gunnar Andersson 撰写的“编写奥赛罗程序”。 仅当您熟悉战略游戏编程的基础知识时,以下信息才会有趣。

搜索

游戏的核心是 alpha-beta 剪枝算法。 我的实现相对通用,因此也可以用于其他一些棋盘游戏。 我目前正在开发的围棋游戏中也会使用它。 最初,我实现了粗暴的 minimax 搜索,在将其重写为 alpha-beta 之后,我的性能提高了 70%。 启发式方法仅在 VirtualPlayerComplex 类中实现,用于执行 浅层 搜索,这基本上是 VirtualPlayerVirtualPlayerComplex 类之间的唯一区别。 它仅用于 Windows 版本,并且不会带来任何实际的性能改进。

位置评估

此描述仅向您提供了其工作原理的构想;在某些情况下,它会稍微复杂一些。 我的评估函数 (Score) 基于以下标准

  1. 优势。 拥有对手的方块是好的。
  2. 机动性。 当您有更多可供选择的走法时,这是好的。
  3. 棋盘格表。 角是好的,角旁边的方块是坏的。
  4. 稳定性。 捕获无法转换的方块是好的。

我为这些标准分配了一些权重,但我确信验证它们可以提高程序的“智能性”。

为了提高性能(从而提高搜索深度),有很多事情要做,但随后您需要在性能和代码透明度之间做出权衡。 编写此程序的目的不是为了赢得奥赛罗世界冠军,因此有很多方法可以改进它。 例如,后台分析(一个线程,当程序等待来自人类玩家的输入时计算下一步走法)、游戏开局的知识库和模式评估。

© . All rights reserved.