双人游戏常规程序设计——程序设计抽象思想笔记
2016-01-25 00:01
148 查看
1.游戏中的重要概念:
1)状态:对于任何游戏而言,都会有一些数据来记录在某一时间点上发生了什么。无论什么游戏都可以把所有相关的数据合并到一个记录结构中,然后再用一个变量指向它。
2)走子:在任何情况下,一步棋都可以由一个单一结构来表示,该结构包含了特定游戏所需要的各种信息。
2.示例:
开始,程序发出指令,然后调用NewGame初始化一个新游戏,用变量state来存储结果。然后进入一个循环,双方轮流走棋直到游戏结束。当轮到人类玩家时,它用函数GetUserMove来记录玩家的走法。轮到电脑时,主程序会用ChooseComputerMove函数来找到特定状态下的最佳走法,一旦走法被这两个函数决定,那么主程序会访问MakeMove,它会更新游戏状态,显示这步棋已经走完又轮到对方了。最后程序显示游戏的结果并退出。
3.在一个游戏中,主程序并不是最有趣的。我们更关心的是给Computer提供一个有效的策略。在双人对战游戏中,计算机的核心策略是函数FindBestMove,该函数被主程序中的ChooseComputerMove函数调用,在游戏状态已知的情况下,返回最佳走法。
4.这种应用于双人游戏中的有效策略一般是最小最大策略。最佳走法(FindBestMove)就是让您的对手在最坏的局势之中(EvaluatePosition),最坏的局势就是使得对手只能走出最弱的好棋。这样通过递归回溯总能找到一条取胜的策略,把对手取胜的机会减少到最小。
最大最小策略包含两个相互递归的函数:一个是寻找最好的下一步棋,另一个用来分析局势的优劣。且满足如下要求:
Ø 必须可以限制递归搜索的深度。
Ø 必须可以为每步棋和每个局势评定一个分数。评分方案为每步棋和每个局势分配一个整数,以0为界限向正负两个方向延伸。一个玩家处于+5的优势时,表示另一个玩家处于-5的劣势。用常量WinningPosition来记录最高分数,它出现则表示该玩家一定会赢。与之对应的参数是LosingPosition,在该局势下,玩家总是输。
当进行如上考虑时,对实现最大最小策略的递归函数FindBestMove和EvaluatePosition的设计进行一些改进。每个函数都以游戏的状态为参数,但是也需要提供递归的深度以便必要时可以终止递归搜索。另外让FindBestMove返回最佳走法和评分,这样可以避免大量的荣誉计算。再返回评分的算法实现中,是用引用调用法去获得一个分值,调用者传递一个整数变量指针,在返回值之前,FindBestMove把一步棋的分数存储在指针指向的位置。函数原型如下:
1moveT FindBestMove(stateT state,int depth,int *prating);
2int evaluatePosition(stateT state,int depth)
GenerateMoveList(state moveArray)根据具体游戏策略实现,作用是将当前局势下合法的走法填充到moveArray的元素中,该函数的执行结果就是可以走的棋的个数。
EvaluatePosition函数,当游戏结束或已经达到最大递归深度时,简单情景就会出现,这些简单情景允许递归终止。在这些情景中,程序不做进一步的递归,而是必须评估当前所处的状态EvaluateStaticPosition。
1)状态:对于任何游戏而言,都会有一些数据来记录在某一时间点上发生了什么。无论什么游戏都可以把所有相关的数据合并到一个记录结构中,然后再用一个变量指向它。
2)走子:在任何情况下,一步棋都可以由一个单一结构来表示,该结构包含了特定游戏所需要的各种信息。
2.示例:
开始,程序发出指令,然后调用NewGame初始化一个新游戏,用变量state来存储结果。然后进入一个循环,双方轮流走棋直到游戏结束。当轮到人类玩家时,它用函数GetUserMove来记录玩家的走法。轮到电脑时,主程序会用ChooseComputerMove函数来找到特定状态下的最佳走法,一旦走法被这两个函数决定,那么主程序会访问MakeMove,它会更新游戏状态,显示这步棋已经走完又轮到对方了。最后程序显示游戏的结果并退出。
3.在一个游戏中,主程序并不是最有趣的。我们更关心的是给Computer提供一个有效的策略。在双人对战游戏中,计算机的核心策略是函数FindBestMove,该函数被主程序中的ChooseComputerMove函数调用,在游戏状态已知的情况下,返回最佳走法。
4.这种应用于双人游戏中的有效策略一般是最小最大策略。最佳走法(FindBestMove)就是让您的对手在最坏的局势之中(EvaluatePosition),最坏的局势就是使得对手只能走出最弱的好棋。这样通过递归回溯总能找到一条取胜的策略,把对手取胜的机会减少到最小。
最大最小策略包含两个相互递归的函数:一个是寻找最好的下一步棋,另一个用来分析局势的优劣。且满足如下要求:
Ø 必须可以限制递归搜索的深度。
Ø 必须可以为每步棋和每个局势评定一个分数。评分方案为每步棋和每个局势分配一个整数,以0为界限向正负两个方向延伸。一个玩家处于+5的优势时,表示另一个玩家处于-5的劣势。用常量WinningPosition来记录最高分数,它出现则表示该玩家一定会赢。与之对应的参数是LosingPosition,在该局势下,玩家总是输。
当进行如上考虑时,对实现最大最小策略的递归函数FindBestMove和EvaluatePosition的设计进行一些改进。每个函数都以游戏的状态为参数,但是也需要提供递归的深度以便必要时可以终止递归搜索。另外让FindBestMove返回最佳走法和评分,这样可以避免大量的荣誉计算。再返回评分的算法实现中,是用引用调用法去获得一个分值,调用者传递一个整数变量指针,在返回值之前,FindBestMove把一步棋的分数存储在指针指向的位置。函数原型如下:
1moveT FindBestMove(stateT state,int depth,int *prating);
2int evaluatePosition(stateT state,int depth)
GenerateMoveList(state moveArray)根据具体游戏策略实现,作用是将当前局势下合法的走法填充到moveArray的元素中,该函数的执行结果就是可以走的棋的个数。
EvaluatePosition函数,当游戏结束或已经达到最大递归深度时,简单情景就会出现,这些简单情景允许递归终止。在这些情景中,程序不做进一步的递归,而是必须评估当前所处的状态EvaluateStaticPosition。
相关文章推荐
- 如何用R来定制个性化PPT
- Spark MLlib实现的广告点击预测–Gradient-Boosted Trees
- 驾照题库api 根据输入参数返回相关题目
- 程序员遇到BUG后,最好的方法是?
- 三个迹象是时候升级你的最新KVM切换器
- java导出数据到word(一)
- spring的事物管理配置
- spring4 学习4 spring MVC+mybatis+Mysql
- MySQL实现统计数据并插入数据的存储过程
- objective-c UIAlertController 提示框应用
- objective-c 图片处理机制
- objective-c 选项卡翻页效果
- objective-c 拨打电话(NSString扩展类)
- IOS sqlite3
- objective-c 加密 MD5 解密MD5
- sh文件运行
- redis和memcached区别
- 做了个方便看godoc的chrome扩展,要的拿走
- check form判定非空
- maven插件启动tomcat和jetty