关于极大极小算法和alpha-beta剪枝可以参考文章的参考资料,这里仅对其进行代码实现。
其实这个算法单纯的理解并不容易,下面用代码进行实现。
说一下实现这个AI井字棋的思路:
简单的来说就是计算机希望估值函数值最大,而下棋人希望这个估值最小,因此在计算机决策是就用递归的向前看,这里的递归其实蛮不好理解的,但是可以宏观的去理解。
下面是代码的构成:
- 一个ChessBoard的类用来处理一些关于棋盘的事件。
- 一个TicTacToe的类用来实现游戏开始和计算机,玩家决策的事件
ChessBoard.h
//Author : yqtao
//Date :2016.10.30
#ifndef CHESS_BOARD_H
#define CHESS_BOARD_H
#include<vector>
#include<iostream>
#include<string>
using namespace std;
const int ChessBoard_Row = 13;
const int ChessBoard_Col = 26;
const int GridNuber = 9;
const char Comp_Char = 'X';
const char Human_Char = 'O';
const char Blank_Char = ' ';
class ChessBoard {
public:
ChessBoard();
bool isEmpty(int pos);
bool isFull();
bool canWin(char c);
bool immediateComWin(int& bestMove);
bool immediateHumanWin(int& bestMove);
void placeComp(int pos);
void placeHuman(int pos);
void unPlace(int pos);
void print();
private:
vector<char> boardInOneDimens;
vector<string> board;
};
#endif // !CHESS_BOARD_H
ChessBoard.cpp
#include"ChessBoard.h"
ChessBoard::ChessBoard() { //默认构造函数
boardInOneDimens.resize(GridNuber);
for (int i = 0; i < GridNuber; i++)
boardInOneDimens[i] = ' ';
vector<string>tmp = {
"- - - - - - - - - - - - -",
"| | | |",
"| | | |",
"| | | |",
"- - - - - - - - - - - - -",
"| | | |",
"| | | |",
"| | | |",
"- - - - - - - - - - - - -",
"| | | |",
"| | | |",
"| | | |",
"- - - - - - - - - - - - -"