c++语言设计实现五子棋

  

本文为大家分享了c++五子棋的设计思路和设计实现,供大家参考,具体内容如下

  

<强>算法思路:

  

在结束了对c++的学习之后,准备自己编制一些简单的练习程序。目前初步设想是编制一个人机对战的简易五子棋软件。以下为个人设计思考的过程。

  

首先,进行问题分析与设计。计划实现的功能,为开局选择人机或双人对战,确定之后比赛开始。比赛结束后初始化棋盘,询问是否继续比赛或退出。后续可加入复盘,悔棋等功能。整个过程中,涉及到了棋子和棋盘两种对象,同时要加上人机对弈时的AI对象,即涉及到三个对象。

  

  

五子棋棋盘为15 * 15的网格结构,即一共有225个节点,每个节点有横竖坐标各一,同时每个节点状态有3种,黑,白,或者为空。可考虑采用二维数组来存储。每个节点三种状态,适合采用枚举(枚举)类型。
  * - *实现功能:1。棋盘对象应负责实时更新棋盘状态并对外显示,因此需要接收棋子对象的输入,同时需要对外输出。而棋盘对象不需要对棋子对象发送信息,所以可以设计棋盘类中更新棋盘状态的函数接收棋子对象作为形参。2。同时,在每次走棋之后,棋盘对象都要及时更新棋盘信息,即输出棋盘状态。3。而且,每次走棋之后更新输出之前,应该对棋子走棋是否符合规则以及输赢进行判定。若将规则判定单独封装为一个对象,则不方便调用棋盘信息,故将规则判定设计为棋盘类的成员函数,接收两个形参,一个是棋盘当前的状态,一个是即将走的下一步棋,即一个棋子对象。
  

  

棋子对象应包含两种信息。一是棋子颜色,二是当前要走的棋子的位置坐标,并保留对外输出的接口。

  

接下来细化<强>规则判定函数。

  
      <李>首先进行。接收当前棋子位置信息后,判定该位置是否越界或为空,若非空或者越界,则判定违规,抛掷异常,交付上级调用处理。   <李>然后进行。按照一定顺序对当前落子位置的相邻元素进行同色判定并计数。当发现某条直线上同色棋子超过四枚,则判定当前走棋方获胜。判定过程中同样需要注意是否越界。若均未构成五星连珠,则进入平局判定。   <李>遍历棋盘,统计空位,若空位为0,即棋盘已满,判定为平局。
      李   
  

接下来设计下棋AI。设计为一个棋子类型的函数,即接收当前棋盘状态和对方最后一次落棋,返回棋子对象类型。

  

  
      <李>首先进行若棋盘为空则直接落子(8、8),正中开局。   <李>然后进行针对对方上次落棋进行活棋检测,在横,竖,左斜,右斜四条直线上依次进行检测。在任意方向检测到四或活三,即可进行封堵操作,给出所有可行的封堵位置。若未检测到四或活三,则统计活二并给出所有可能的封堵位置,然后针对所有可能的封堵位置进行评分,选取分数最高的位置进行落子。若上述检测均未找到防守点,则转入进攻算法。   <李>采用枚举,即暴力破解的方法,遍历整个棋盘的所有空位,并给出每个空位的评分,选取最高分进行落子。   <李>给定参照棋子,在四个方向上分别检测。以横向检测为例,设参照棋子坐标为(x, y),设定同色计数器数=1(计算同色棋子数目),设定封锁端统计量锁=0,设定已判断的方向统计=0,对x - 1,法官判断节点状态,若同色计数器加1,继续判断x - 2;若异色,则锁+ 1,+ 1,法官若法官=2,终止判断,若judge<2,反向判断x + 1;若空白,法官+ 1,若判断=2,终止判断,若judge<2,反向判断。最后得到被封堵的端口数锁和同色数计数。若锁=0,数=3或2,判定为活3或活2。若锁=1=4,判定为4,若锁=1,数=3,判定为半3。但是在这种算法中,关于空白的判定存在着一些问题,用0代表空白,用+代表同色,——代表异色,则当出现下列情况时:0 + + 0 -,- + + + 0,事实上是死棋,而+ 0 + + 0 + 0 + + + -,实际上相当于活3或半4。为此,需要对活2和3的半情况进行进一步筛选,即空白端应保证连续两个空白。在活棋检测过程中,如果遇到活3或者半4,则立即终止检测,返回落子的可能位置。若没有则记录活2半3的防守位置,换方向检测。最后返回一个棋子类的数组,包含所有建议的落子位置。若均无,则遍历棋盘,统计所有空白位置,返回。   <李>对活棋检测返回数组中的每个位置进行评分,即以该点为己方参照点,进行活棋检测,若有数量=5,直接返回该落子位置。有活三或者半4分数加20,有活2分数加5,对角线有相邻同色,分数+ 2,有异色,分数2,横竖有同色,分数+ 1,有异色,分数1。最后排序,取最高分对应的落子,返回该落子。

    c++语言设计实现五子棋