科技行者

行者学院 转型私董会 科技行者专题报道 网红大战科技行者

知识库

知识库 安全导航

至顶网软件频道基础软件利用Visual C#实现Reversi游戏开发

利用Visual C#实现Reversi游戏开发

  • 扫一扫
    分享文章到微信

  • 扫一扫
    关注官方公众号
    至顶头条

本文将细致地介绍用C#来实现游戏Reversi的完整过程。

作者:朱先忠 来源:天极开发 2007年11月13日

关键字:

  • 评论
  • 分享微博
  • 分享邮件
(四) 玩游戏

  下列变量用于控制一次游戏过程:

//游戏参数
private GameState gameState;
private int currentColor;
private int moveNumber;

  moveNumber应该是显然的。currentColor显示现在轮着哪一个玩家移动(黑色或白色)。gameState被设置为下列枚举值之一:

//定义游戏的状态
private enum GameState{
 GameOver, //游戏完了(也适合于起始的状态)
 InMoveAnimation, //产生一次移动并且该动画是活动的
 InPlayerMove, //等待用户移动
 InComputerMove, //等待计算机移动
 MoveCompleted //一次移动完成
 //(包括动画,如果是活动的)
}

  大多数游戏都是在事件驱动下玩的,因此gameState的使用允许各种事件处理器来决定要采取的适当行动。例如,当用户点击平板方格,SquareControl_Click()被调用。如果游戏状态是InPlayerMove,则在那个方格上作一次移动。但是如果游戏在其它状态,则说明还没轮到用户移动,所以这次点击将被忽略。

  同样,如果用户点击工具条"Undo Move"按钮,我们想要检查该游戏状态来看一下是否需要做任何事情,在把游戏复位到前一次移动之前。例如,如果状态是InMoveAnimation,那么动画定时器需要停下来,而该方格控制需要它们的计时器并且显示重置。如果状态是InComputerMove,那么该程序现在在用一个独立的线程进行一次向前搜索(见下面)-它将需要停下来。

  1. 程序流程

  下图说明了在一个游戏过程中的通用程序流程:


  StartTurn()在每次游戏的开始当任何一个玩家做一次移动后以及无论何时执行一次撤消/重做之后被调用。它负责评估游戏状况并且为下次移动作准备。

  它首先检查是否当前玩家能够作一合法的移动。如果不能,它切换到其它玩家并且检查是否那个玩家有任何合法的移动。当两个玩家都不能移动时,根据规则,游戏结束并且它将结束该游戏。

  否则,该函数将为当前玩家作出移动作好准备。如果当前玩家在用户控制下,它简单地退出。然后用户通过在一个有效的方形上点按鼠标指针或通过输入一个有效的列字母和行数字可以作一次移动。这将导致一次对MakePlayerMove()的调用-它完成一些清理工作,然后调用MakeMove()来实现移动。如果当前玩家在计算机控制下,它就启动向前搜索以找到最佳移动。

  2. 使用一个工作者线程

  因为向前搜索是深度优先计算的,所以它被用一个工作者线程来专门实现;否则,主表单屏幕将被冻结并且在计算最佳移动时响应滞后。因此,StartTurn()创建一个工作者线程来执行CalculateComputerMove()方法并且启动它。

  锁机制被用在主游戏平板对象上以防止不满足游戏条件。作为一个例子,MakeComputerMove()和UndoMove()方法都因游戏平板而改变。这两个方法首先试图把一个锁放在它上面。因此,如果一个方法碰巧被调用,而另一个正在更新该平板时,它将被强迫等待,直到那些变化完成并且该锁被释放为止。

  一旦发现一个移动,CalculateComputerMove()方法完成一次回调以在主表单屏幕上运行MakeComputerMove()。这个方法锁定平板并调用MakeMove()来实现移动。

  3. 实现移动

  MakeMove()完成实际的平板更新,把新的圆盘放置到指定的位置。它也实现一些维护如撤消/重做移动历史和高亮搬迁任何方形等。
然后,如果移动动画选项置为Off状态,它简单地调用EndMove()-它将切换当前颜色并以一个对StartTurn()的调用启动下一个回合。
但是如果动画选项置为On状态,它将代之来初始化圆盘-使其动起来并且启动动画定时器。如以前所讨论的,该定时器将会使AnimateMove()每几个毫秒运行一次,更新显示并且相应地每次减少动画计数器。最后,该计数器将到点,而AnimateMove()将调用EndMove()来完成移动。

  (五) 未来的增强

  在玩家AI方面还有很大的改进余地。向前搜索算法可以被扩充-用打开的移动或一系列被预先定级别的角和边模式。可以使用选择性深度,这样查找深度可以针对对游戏有较强影响的移动(例如在角落附近)而加以扩展。另外的改进将是存储向前搜索树。这将使它被搜索到一个更深的层次,因为该程序不会在每次重新生成相同的移动。

查看本文来源

    • 评论
    • 分享微博
    • 分享邮件
    邮件订阅

    如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。

    重磅专题
    往期文章
    最新文章