案例二十三 人机下棋问题.pptVIP

  • 28
  • 0
  • 约1.57千字
  • 约 28页
  • 2017-09-23 发布于河南
  • 举报
案例二十三 人机下棋问题.ppt

案例二十三 人机下棋问题 本案例知识要点 数组的使用 类的设计及使用 人工智能问题的量化思想 一、案例需求 案例描述 设计一个简单的下棋游戏,游戏的规则是:在3?3的棋盘上,计算机为一方,人为一方,交替标记叉(X)和圆圈(O)。在行、列、对角线的方向上,先连成一条直线的一方为胜者。计算机可以动态地显示棋盘,给出提示信息和胜负判断,并允许用户选择是先手还是后手。 案例效果图 人机下棋案例效果如图所示。 人机下棋案例效果图 功能说明 显示棋盘,给出提示信息和胜负结果判断标准,允许用户选择是先手还是后手。 每一步都用图形化方式顺序输出。 直观地表示胜负结果。 二、案例分析 设计算机标记“X”,人标记“O”。计算机下时,应该考虑所有的空位置,并按照行、列和对角线计算每个空位的分值。在某行(列、对角线)上,按以下规则计分(其中“_”表示空格): 若已有“XX”,则加50分。 若已有“OO”,则加25分。 若已有“X_”,则加10分。 若已有“O_”,则加8分。 若已有“_ _”,则加4分。 根据上述的计分规则,计算机每次下棋时算出每个空位置的分数,从中选择最高分的位置画‘X’。如果某条行、列、对角线上画满了3个“X”,则计算机胜,否则人继续下棋。 人每走一步即判断行、列、对角线上是否画满了3个“O”,如画满了3个“O”,则人胜,否则计算机继续下棋。 如果棋盘布满了棋也未分出胜负,则和棋。 需要定义一个字符数组保存棋盘每次下完棋的状态。其中,“X”表示计算机下的棋,“O”表示人下的棋,数字“1”~“9”表示空位置。 还需要定义一个整型数组记录计算机下棋时每个空位置的分值。即如上所述的50、25、10、8、4分。 三、案例设计 1.类的设计 基于上述分析,本案例定义一个类CGame,用来处理相关的计算、打印等功能。主程序只是简单调用。 CGame类的设计如图所示。 (1)数据成员 char status[9]; 记录棋盘状态。 int score[9]; 记录空位置的分值。 int fail; fail为胜败标志,其中0表示和棋,1表示人赢,2 表示计算机赢。 counter; counter为步数。 (2)函数成员 Game(); 构造函数,初始化相关变量。 Print(); 打印棋盘。 int Cal(int i,int j); 计算某行的得分。 bool Judge(int i,int j,int k); 判断某条直线是否全为“O”。 Play(); 启动游戏运行。 2.主程序设计 主程序主要是调用了CGame类的成员函数Play()来实现游戏的,CGame.Play()函数的流程如图所示。 CGame.Play()函数的流程 四、案例实现 五、案例总结与提高 案例总结 该案例新颖的地方是巧妙地将智能判断的思考过程抽象出来,加以量化,这样计算机才能够进行处理。关于这种智能过程,读者可以参考人工智能方面的书籍。 案例提高 在全面理解的基础上,读者可以对本案例进行一些改动与提高。 改变棋盘的尺寸。改变后,计算机下棋时能够选择的空位置就更加多了。可以通过改进算法来达到计算机选择最优位置的目的。 改变下棋的规则。当棋盘变大时,胜利的规则不一定非要连成一条线的棋子个数等于棋盘尺寸,可以比棋盘的尺寸小。这样,设计分值时就需要考虑多种因素,除了计算机要将棋子尽量连成一条线外,还要考虑封住人的棋子连线。 第*页 共28页 目录 退出 目录 * 第*页 共28页 目录 退出 目录

文档评论(0)

1亿VIP精品文档

相关文档