C++ 面向对象 五子棋编程代码 人机对战 大作业(内附资源、可直接运行)

C++ 面向对象 五子棋编程代码 人机对战 大作业(内附资源、可直接运行)

能实现以下功能:

1)电脑自动下棋
2)图形界面化
3)自动判断胜负

尚未实现的功能

1)悔棋
2)和棋

不确定是否正确的功能的功能

1)禁手规则

用到的核心算法

1)博弈树
2)ab剪枝

实现效果如下图所示:
莫得描述

面向对象设计

针对本次解决的问题,面向对象一共设计7个类

Chess类(棋子类)

  • 私有成员:
    位置(x,y)
    颜色(color)

  • 公有成员
    Chess():构造函数
    getColor():返回棋子颜色
    getPosition(): 返回棋子位置

ChessBoard类(棋盘类)

  • 私有成员:
    scal(棋盘规格):ROW、COL(行列)
    board_state(棋子记录):存放棋盘棋子的摆放位置(int 类型)
    chess_symbol:定义棋子的样式(“●”,“○”,“▲”,“△” )
    board_symbol:字符型棋盘状态,由board_state转化而来
    last_chess:最后一颗棋子的位置
    records:记录棋谱,用于悔棋等操作

  • 公有成员
    ChessBoard(int row,int col):构造函数
    set_size(int row,int col):设置棋盘规格
    addChess(Chess chess):添加棋子 {在所下棋子合法后,在棋盘上放置棋子}
    takebackChess(int num): 悔棋N个
    Chess get_lastchess():获取最后一个棋子位置
    board_Init():初始化棋盘
    getBoardSymbol(): 给出棋谱摆放形式(可以用作输出棋盘结果)
    getBoardState():获得详细棋谱
    getRecords():获得下棋记录
    getChessScal():获得棋盘规格

Judge类(裁判类)

  • 公有成员
    checkWin(ChessBoard chess_state):判断是否获胜
    isLegal(Chess chess, ChessBoard board):判断下棋是否合法,包含对黑棋的禁手判断;
    ban_patterns:用于禁手棋型判断

Player类(玩家类)

  • 私有成员:
    name:名字
    color:下棋颜色
  • 公有成员:
    Player(string name, int color):构造函数
    getcolor():得到下棋颜色
    setcolor(int color):设置棋子颜色
    getname():得到玩家姓名
    setName(string name):设置玩家姓名
    Chess play_chess():下棋(虚函数)

Human类 (继承Player类获得)

  • 公有成员:
    play_chess():下棋,为虚函数。

AI类(机器人) 继承Player类获得

  • 私有成员:
    posible_position:存放下一步可能的下棋位置,只需要考虑现有棋子旁边的点,即与现有棋子相差一格且没有棋子的点(八个方向)。红色位置时需要考虑的下棋位置,如图所示:
    在这里插入图片描述
    scores:保存棋局分数(2个角色:标准棋局(72行),包括横竖撇捺)
    allScore:局面总评分(2个角色) allScore[0] 电脑 allScore[1] 敌人
    searchResult:下一步下棋位置
  • 公有成员:
    play_chess():下棋,为虚函数
    evaluate(Role role):获得role角色的分数
    find_posible_position(vector<vector > boardstate):找到可能的下棋位置
    evaluatePoint(vector<vector > boardstate, Position p):对可能下棋位置进行评分
    updateScore(vector<vector > boardstate, Position p):更新棋盘分数
    Rollback(Position):删除增加的点位
    abSearch(vector<vector > boardstate, int depth, int alpha, int beta, Role currentSearchRole):ab剪枝算法
    getMove(ChessBoard board):得到下一步下棋的位置

Display类(显示类)

  • 公有成员
    showBoard(ChessBoard board):在命令行输出棋盘
    showMessage(string msg):输出字符串信息

游戏类

  • 私有成员:
    ai:机器人
    Player:玩家
    judge:裁判
    board:棋盘
    display:显示成员
    mode:对弈模式
  • 公有成员:
    Mode():对弈模式初始化
    initPlayer():初始化参赛对象
    decideOrder():决定先后手 随机
    initGame():初始化游戏:模式、对象、先后手
    startGame():开始游戏

ACMatcher类

该类为辅助类,用于AC搜索算法,与评价棋盘分数配合使用。

关于AI的设计思路

在这里我就不进行多余的描述了,建议参考如何设计一个还可以的五子棋AI,我的代码完全是基于该文章进行编写,有些地方做了简化,更加容易理解。
网盘链接:https://pan.baidu.com/s/1gfcdfHeyTKYOBVvaIUGZiw?pwd=1234
提取码:1234

参考链接

基于博弈树的五子棋 AI 算法及其 C++ 实现
c++ 五子棋AI 算法及实现 详细解析
基于 alpha-beta 剪枝技术的五子棋
如何设计一个还可以的五子棋AI

  • 20
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值