一般的双人游戏程序

上一篇博客的中的代码对Nim的解释非常具体。例如,play方法直接负责设置nCoins变量,并在每个play移动后对硬币数量进行更新。然而,双人游戏的总体结构应用的更为普遍。即使不同的游戏需要不同的实现细节,但是使用相同的整体策略可以解决许多游戏。
抽象编程中的一个关键概念是抽象概念(notion of abstraction),它是将问题的一般方面分离出来的过程,使其不再被特定领域的细节遮蔽。你可能不会Nim程序感兴趣; 毕竟,一旦你弄清楚,Nim看起来就是是无聊的。你可能会喜欢更多的是一个普遍的程序,适合玩Nim,tic-tac-toe或任何其他双人策略游戏。
创造这种一般性的可能性源自大多数游戏共享几个基本概念的。
- 第一个这样的概念是事件的概念。 对于任何游戏,都有数据值准确地定义了在任何时间点发生了什么。例如,在Nim游戏中,状态由其两个实例变量nCoins和whichTurn的值组成。对于像国际象棋这样的游戏,事件将需要包括当前放置在哪个方块上的棋子,尽管它可能会继续包含whoTurn变量,或者是满足相同功能的东西。然而,对于任何游戏,应该可以将相关数据存储在实现游戏的类的实例变量中。
- 第二个重要的概念就是移动。 在Nim中,一个移动包含一个代表被丢弃的硬币数量的整数。在国际象棋中,举动可能包含一对指示正在移动的棋子的开始和结束坐标,尽管这种方法实际上由于需要代表诸如城堡或销毁棋子这样的深奥动作而变得复杂化。然而,对于任何游戏,可以定义一个Move类,它封装了代表该游戏中的移动所需的任何信息。

然而,当我们实现Nim游戏时,以最简单的方式(下面的代码)定义Move类并不十分有效

class Move {int nTaken;
}

这里的问题是类中条目的默认可见性是私有的(private),这意味着实现游戏的类将无法访问实例变量nTaken。
但是我们同样可以采取几种策略来解决这个问题。
1. 一个策略是将nTaken变量公开(即设置为public),或者等效地通过传统的C风格的struct来替换类定义。(因为结构体的访问权限默认为public) 然而,这样做显然将Move类的详细信息提供给整个程序,该策略违反了基本的封装原则
2. 第二种方法是在类中介绍定义的getter和setter方法。该方法遵循现代面向对象编程的风格,范式这样以使Move类更难使用(每使用一次都要调用一次方法)。这个额外的复杂性似乎是一个没有必要的,唯一的客户可能是实现游戏的类。
3. 第三个策略就是我们之前提到过的将Move类声明为游戏类的朋友(friend)

一旦你有一个Move类,就可以定义一些额外的帮助方法,让你重写这样的play方法:

void play() {initGame();while (!gameIsOver()) {displayGame();if (getCurrentPlayerType() == HUMAN) {makeMove(getUserMove());} else {Move move = getComputerMove();displayMove(move);makeMove(move);}}
announceResult();
}

注意到play方法的实现最重要的是,该代码没有指示正在运行的游戏。 这可能是Nim也可能是其他的双人游戏,但是它也可以很容易地变得简单或其他策略游戏。每个游戏都需要自己定义的Move类,以及各种游戏特定的方法,如initGame和makeMove。 即使如此,play方法的结构也足以适用于许多不同的双人游戏。
如果你将play的一般化实现与Nim中的play代码进行比较,还将注意到,在此级别的实现中不再包含切换转换的代码。在程序的一般版本中,将游戏的这个方面嵌入到initGame,makeMove和getCurrentPlayerType的方法中。进行此更改意味着play方法不再直接引用到实例变量,而是调用方法来完成此工作。该策略允许在底层实现中有更多的灵活性。
这个play方法和轮流机制,却不是游戏的最令人兴奋的方面。**算法有趣的部分嵌入到方
法getComputerMove中,该方法负责为计算机选择最佳方式。**我们所写的Nim版本使用相互递归的方法findGoodMove和isBadPosition来实现这个策略,它搜索所有可能的选择,让每个玩家在当前位置找到一个获胜的动作。作为策略,该想法也独立于任何特定游戏的细节,因此应该以更一般的方式编写这些方法,将使其适合更广泛的游戏。

C++抽象编程——回溯算法(6)——设计一般的双人游戏相关推荐

  1. C++抽象编程——回溯算法(1)——迷宫问题

    这部分内容其实是递归策略的一部分,但是里面涉及到了一些面向对象的知识,所以我就先总结了面向对象那一部分.这部分内容不得不说还是很有意思的. ##迷宫问题 曾经在希腊神话时代,地中海的克里特岛被一个名叫 ...

  2. Java 设计模式 Day3 之面向抽象原则:什么是面向抽象编程?面向抽象编程如何应用?

    文章目录 前言 一.什么是面向抽象编程? 二.传统场景的类设计 2.1.项目场景设计 2.2.传统类设计存在的问题 三.采用面向抽象编程的类设计 3.1.设计一个抽象类/接口 3.2.采用上转型对象/ ...

  3. c++矩阵连乘的动态规划算法并输出_「Javascript算法设计」× 动态规划与回溯算法...

    目录: 分而治之算法 动态规划 回溯算法 分而治之算法 分而治之算法是算法设计的一种方式,它将一个问题分成多个和原问题相似的小问题,递归解决小问题,再将解决方式合并以解决原来的问题(例如快速排序,二分 ...

  4. 用栈、回溯算法设计迷宫程序

    目录 1.走迷宫与回溯算法 2.迷宫设计栈扮演的角色 3.Python实现走迷宫 栈的应用有许多,本篇博文着重将栈与回溯(Backtracking)算法结合,设计走迷宫程序.其实回溯算法也是人工智能的 ...

  5. 大型Web前端架构设计:面向抽象编程入门

    面向抽象编程,是构建一个大型系统非常重要的参考原则. 但对于许多前端同学来说,对面向抽象编程的理解说不上很深刻.大部分同学的习惯是 拿到需求单和设计稿之后就开始编写UI界面,UI里哪个按钮需要调哪些方 ...

  6. (十五)算法设计思想之“回溯算法”

    算法设计思想之"回溯算法" 回溯算法是什么? 什么问题适合用回溯算法解决? 适合回溯算法解决的问题 全排列 LeetCode:46.全排列 LeetCode:78.子集 思考题 回 ...

  7. JAVA算法:走迷宫回溯算法设计(JAVA版本)

    JAVA算法:走迷宫回溯算法设计(JAVA版本) 迷宫数组 int[][] maze = {                 {0, 1, 0, 0, 0},                 {0, ...

  8. 大型 web 前端架构设计-面向抽象编程入门

    作者:svenzeng,腾讯 PCG 前端开发工程师 面向抽象编程,是构建一个大型系统非常重要的参考原则.但对于许多前端同学来说,对面向抽象编程的理解说不上很深刻.大部分同学的习惯是 拿到需求单和设计 ...

  9. 《数据结构与算法分析》回溯算法之博弈——三连棋(tic tac toe)人机对战AI设计(αβ枝减)

    前言: 这次的回溯算法实在是太有意思了,不过刚刚接触的时候确实不容理解,极小极大策略,αβ枝减看了好几遍才明白整个过程.实现的时候又发现还有细节不明白,想明白之后对于整体的认识又加深了一步. 编码的过 ...

最新文章

  1. 某程序员感叹:本是家族边缘人,但亲戚得知自己年入二百万后,都上来巴结!...
  2. linux之telnet命令使用
  3. android7.0uri,整理: 解决Android7.0以上文件报FileUriExposedException问题
  4. 斗地主综合案例之有序版本
  5. android设置wifiip地址,android Wifi 设置静态ip地址的方法
  6. php mysql查询出来二叉树的数据_tp框架怎么实现二叉树查询 如图,查询数据库中小明下面的所有人。到底下面多少人,不清楚。 代码如何实现...
  7. Linux基础----gcc工具的使用
  8. 可控硅的基本工作原理及应用
  9. 《C++面向对象程序设计》✍千处细节、万字总结(建议收藏)
  10. 苹果“教主”乔布斯:一个人的世界
  11. 标签体系下的用户画像建设小指南
  12. 彻底删除的文件怎么恢复,恢复删除文件的方法
  13. 英语测试题库软件,英语考试app哪个好 英语考试题库app推荐_96u手游网
  14. iOS企业版分发关于plist和证书的那些事
  15. Oracle分区简介
  16. 计算机辅助设计软件应用答案,专科《计算机辅助设计软件地应用》_试卷_答案.docx...
  17. docker容器访问宿主机mysql数据库
  18. 宝塔搭建TY博客附好看模板
  19. c语言error 1075,fatal error C1075
  20. 慧静51单片机软件_MCS-51单片机程序求极值

热门文章

  1. 介绍linux上两种rootkits检测工具: Rootkit Hunter和Chkrootkit
  2. 基于51单片机智能窗帘控制模型设计(毕设课设)
  3. 基于Python+redis实现的简单推特实现
  4. php遍历关联数组详解,php遍历关联数组
  5. MySQL 两张表取差集
  6. mysql执行存储过程exec_mysql 执行存储过程 exec
  7. 项目四 WWW服务器配置
  8. java爬虫黑马百度云,Java爬虫小Demo java爬取百度风云榜数据
  9. Dell PowerEdge R720 装机实录
  10. 【期权、期货及其衍生产品】期权