双人游戏常规程序设计——程序设计抽象思想笔记

来源:互联网 发布:阿里云 域名交易 编辑:程序博客网 时间:2024/04/27 09:42

1.游戏中的重要概念:

  1)状态:对于任何游戏而言,都会有一些数据来记录在某一时间点上发生了什么。无论什么游戏都可以把所有相关的数据合并到一个记录结构中,然后再用一个变量指向它。

  2)走子:在任何情况下,一步棋都可以由一个单一结构来表示,该结构包含了特定游戏所需要的各种信息。

2.示例:

 

开始,程序发出指令,然后调用NewGame初始化一个新游戏,用变量state来存储结果。然后进入一个循环,双方轮流走棋直到游戏结束。当轮到人类玩家时,它用函数GetUserMove来记录玩家的走法。轮到电脑时,主程序会用ChooseComputerMove函数来找到特定状态下的最佳走法,一旦走法被这两个函数决定,那么主程序会访问MakeMove,它会更新游戏状态,显示这步棋已经走完又轮到对方了。最后程序显示游戏的结果并退出。

3.在一个游戏中,主程序并不是最有趣的。我们更关心的是给Computer提供一个有效的策略。在双人对战游戏中,计算机的核心策略是函数FindBestMove,该函数被主程序中的ChooseComputerMove函数调用,在游戏状态已知的情况下,返回最佳走法。

4.这种应用于双人游戏中的有效策略一般是最小最大策略。最佳走法(FindBestMove)就是让您的对手在最坏的局势之中(EvaluatePosition),最坏的局势就是使得对手只能走出最弱的好棋。这样通过递归回溯总能找到一条取胜的策略,把对手取胜的机会减少到最小。

  最大最小策略包含两个相互递归的函数:一个是寻找最好的下一步棋,另一个用来分析局势的优劣。且满足如下要求:

Ø 必须可以限制递归搜索的深度。

Ø 必须可以为每步棋和每个局势评定一个分数。评分方案为每步棋和每个局势分配一个整数,以0为界限向正负两个方向延伸。一个玩家处于+5的优势时,表示另一个玩家处于-5的劣势。用常量WinningPosition来记录最高分数,它出现则表示该玩家一定会赢。与之对应的参数是LosingPosition,在该局势下,玩家总是输。

当进行如上考虑时,对实现最大最小策略的递归函数FindBestMoveEvaluatePosition的设计进行一些改进。每个函数都以游戏的状态为参数,但是也需要提供递归的深度以便必要时可以终止递归搜索。另外让FindBestMove返回最佳走法和评分,这样可以避免大量的荣誉计算。再返回评分的算法实现中,是用引用调用法去获得一个分值,调用者传递一个整数变量指针,在返回值之前,FindBestMove把一步棋的分数存储在指针指向的位置。函数原型如下:

 1moveT FindBestMove(stateT state,int depth,int *prating);

 2int evaluatePosition(stateT state,int depth)

 

GenerateMoveList(state moveArray)根据具体游戏策略实现,作用是将当前局势下合法的走法填充到moveArray的元素中,该函数的执行结果就是可以走的棋的个数。

EvaluatePosition函数,当游戏结束或已经达到最大递归深度时,简单情景就会出现,这些简单情景允许递归终止。在这些情景中,程序不做进一步的递归,而是必须评估当前所处的状态EvaluateStaticPosition

 

0 0
原创粉丝点击