难得今天校园活动日,学校放假一天,可以好好做近期计划做但一直没有时间做的事了~比如写博客 【斜眼笑
最近好忙,好多ddl,下周还有三门考试,下下周还有英语pre。。。但是窝真的很想记录一下近期的学习成果,要不然以后可能就忘了。
P.S.这学期的数据结构课真是深得朕心,肥肠喜欢这种用上课学的知识成功解决实际问题的感觉٩(๑❛ᴗ❛๑)۶
C++ 极小极大算法 实现井字棋人机对战
概述:
因为本题的核心是博弈的实现,所以在这里对如何下棋,如何判断游戏是否结束之类的问题不做赘述。
本题中博弈的实现思路如下:
- 设置一个评价机制,为当前局势赋值
设置两个相反的比较机制,比较两个局势的评价值,决定哪个当前方最有利 - 遍历——试放,评价
- 比较,返回最有利位置
解释一下:
- 因为就客观而言,博弈双方面临同一盘棋,所以设置一个评价机制为当前局势赋值。
但对于任一方而言,对对手最有利的情况就是对自己最不利的。所以设置两个相反的比较机制。 - 使用递归,在每一层,遍历所有可以放棋的位置,评估对当前放棋方而言这个位置放棋之后的局势。
- 在同层进行比较,返回对当前放棋方最有利的位置。
具体代码&讲解:
- 头文件 =_=
#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;
- 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;
}
- 栈的定义(用来存储所有可行的步(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;
}
- 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