双人游戏常规程序设计——程序设计抽象思想笔记
来源:互联网 发布:阿里云 域名交易 编辑:程序博客网 时间: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,在该局势下,玩家总是输。
当进行如上考虑时,对实现最大最小策略的递归函数FindBestMove和EvaluatePosition的设计进行一些改进。每个函数都以游戏的状态为参数,但是也需要提供递归的深度以便必要时可以终止递归搜索。另外让FindBestMove返回最佳走法和评分,这样可以避免大量的荣誉计算。再返回评分的算法实现中,是用引用调用法去获得一个分值,调用者传递一个整数变量指针,在返回值之前,FindBestMove把一步棋的分数存储在指针指向的位置。函数原型如下:
1moveT FindBestMove(stateT state,int depth,int *prating);
2int evaluatePosition(stateT state,int depth)
GenerateMoveList(state moveArray)根据具体游戏策略实现,作用是将当前局势下合法的走法填充到moveArray的元素中,该函数的执行结果就是可以走的棋的个数。
EvaluatePosition函数,当游戏结束或已经达到最大递归深度时,简单情景就会出现,这些简单情景允许递归终止。在这些情景中,程序不做进一步的递归,而是必须评估当前所处的状态EvaluateStaticPosition。
- 双人游戏常规程序设计——程序设计抽象思想笔记
- 编程思想——程序设计
- 程序设计基础——面向对象程序设计思想
- C++抽象编程——回溯算法(6)——设计一般的双人游戏
- PHP高级程序设计——抽象类
- 《JAVA程序设计》第一次——《猜猜看》游戏
- 《JAVA程序设计》第二次——《猜猜看》游戏
- 《JAVA程序设计》第三次——《猜猜看》游戏
- 程序设计-游戏
- 《Linux程序设计》学习笔记02——Shell程序设计
- C程序设计笔记——第一章 程序设计和C语言
- 程序设计的非常规总结
- 高内聚低耦合的程序设计思想——个人浅见
- windows程序设计——飞机大战笔记(数据库记录游戏得分)
- Light Cycle —— 动作类双人游戏
- 创意!平板的创意——双人游戏
- 面向对象程序设计思想
- bs程序设计基本思想
- boot.img的解包、root、打包
- 2014——迈出从5K到1W+的重要一步——掌握设计模式
- 正则表达式学习笔记004--连字符和范围描述符的认识与应用
- QKingbase的部署
- 浅谈C++引用与指针
- 双人游戏常规程序设计——程序设计抽象思想笔记
- socket获取信息函数
- 2013年第四届蓝桥杯C/C++程序设计本科B组省赛 错误票据(编程大题)
- 机器视觉开源代码集合
- Linux15_Shell实例(翻译_1)
- 喝酒不骑马的Android自学日记(15)-ScrollView
- Android获取Bitmap的大小
- 正则表达式学习笔记005--脱字符和美元符的认识与应用
- java的字典序排序