博弈问题 tic-tac-toe(井字棋) 人机对战 C++

本文通过C++实现了井字棋的人机对战,采用极小极大算法来决定机器的每一步棋。核心是设定评价机制和相反比较机制,递归遍历所有可能的棋局,找到对当前玩家最有利的位置。文章包含代码解析和关键函数讲解。
摘要由CSDN通过智能技术生成

难得今天校园活动日,学校放假一天,可以好好做近期计划做但一直没有时间做的事了~比如写博客 【斜眼笑
最近好忙,好多ddl,下周还有三门考试,下下周还有英语pre。。。但是窝真的很想记录一下近期的学习成果,要不然以后可能就忘了。

P.S.这学期的数据结构课真是深得朕心,肥肠喜欢这种用上课学的知识成功解决实际问题的感觉٩(๑❛ᴗ❛๑)۶

C++ 极小极大算法 实现井字棋人机对战

概述:

因为本题的核心是博弈的实现,所以在这里对如何下棋,如何判断游戏是否结束之类的问题不做赘述。

本题中博弈的实现思路如下:

  1. 设置一个评价机制,为当前局势赋值
    设置两个相反的比较机制,比较两个局势的评价值,决定哪个当前方最有利
  2. 遍历——试放,评价
  3. 比较,返回最有利位置

解释一下:

  1. 因为就客观而言,博弈双方面临同一盘棋,所以设置一个评价机制为当前局势赋值。
    但对于任一方而言,对对手最有利的情况就是对自己最不利的。所以设置两个相反的比较机制。
  2. 使用递归,在每一层,遍历所有可以放棋的位置,评估对当前放棋方而言这个位置放棋之后的局势。
  3. 在同层进行比较,返回对当前放棋方最有利的位置。

具体代码&讲解:

  1. 头文件 =_=
#include<iostream>
#include<stdio.h>
#include"windows.h"
#define Stack_entry Move
#define maxstack 100
#define success true
#define underflow false
#define overflow false

using namespace std;
  1. Move类的定义(每一步都是一个Move)
class Move{
   
public:
    Move();
    Move(int r,int c);
    int row;
    int col;
};
Move::Move()
{
   
    row=3;
    col=3;
}
Move::Move(int r,int c)
{
   
    row=r;
    col=c;
}

  1. 栈的定义(用来存储所有可行的步(Move))
class Stack{
   
public:
    Stack();
    bool empty()const;
    bool pop();
    bool top(Stack_entry &item);
    bool push(const Stack_entry &item);
private:
    int count;
    Stack_entry entry[maxstack];
};
Stack::Stack()
{
   
    count=0;
}
bool Stack::push(const Stack_entry &item)
{
   
    bool outcome=success;
    if(count>=maxstack)
        return overflow;
    else
        entry[count++]=item;
    return outcome;
}
bool Stack::pop()
{
   
    bool outcome=success;
    if(count==0)
        outcome=underflow;
    else --count;
    return outcome;
}
bool Stack::top(Stack_entry &item)
{
   
    bool outcome=success;
    if(count==0)
        return underflow;
    else
        item=entry[count-1];
    return outcome;
}
bool Stack::empty()const
{
   
    bool outcome=true;
    if(count>0)
        outcome=false;
    return outcome;
}

  1. Board类的定义(定义棋盘和对棋盘的操作)
    重点是better函数,worst_case函数evaluate函数。
class Board{
   
public:
    Board();
    bool done()const;
    bool is_ok(Move try_it);
    void print()const;
    bool better(int value,int old_value)const;
    void play(Move try_it);
    int 
  • 13
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值