人工智能作业 - 井字棋游戏(alpha-beta剪枝)

思路

alpha-beta剪枝思路:
https://blog.csdn.net/tangchenyi/article/details/22925957

伪代码:

1.选择先手后手
2.初始化棋局。
3.人类输入位置或者机器根据alpha-beta剪枝选择下一个位置。
4.如果棋局未结束返回步骤3,否则打印结果。

其中alpha算法的思路是:

(对于每一个可走点根据alpha-beta算法计算出结果,选择结果最乐观的那种情况。)
alpha剪枝:
1.检查当前局面是否已分胜负。如果已分,返回结果,否则进入步骤22.如果本层是max层,搜索下一层可能的局面,根据可能的值更新本层的alpha,并且返回本层的beta给上层。否则更新本层的beta,并且把本层的alpha返回上一层。

代码

#include
using namespace std;
const int COMPUTER = -1;
const int HUMAN = 1;
char MAP[10]; //存储1-9,九个位置的状态
int endStatus[][3] = { 1,2,3,4,5,6,7,8,9,1,4,7,2,5,8,3,6,9,1,5,9,3,5,7 };
int firstMove, nextMove;
void printMap() {
	cout << "___________棋盘_____________" << endl;
	cout << MAP[1] << ' ' << MAP[2] << ' ' << MAP[3] << endl;
	cout << MAP[4] << ' ' << MAP[5] << ' ' << MAP[6] << endl;
	cout << MAP[7] << ' ' << MAP[8] << ' ' << MAP[9] << endl;
}
bool dotNums() {
	int emptyFlag = 0;
	for (int i = 1; i <= 9; i++) {
		if (MAP[i] == '.') emptyFlag++;
	}
	return emptyFlag;
}
int gameResult() {
	for (int i = 0; i < 8; i++) {
		if (MAP[endStatus[i][0]] == MAP[endStatus[i][1]] && MAP[endStatus[i][1]] == MAP[endStatus[i][2]]) {
			if (MAP[endStatus[i][0]] == 'O') {
				return -1; //电脑获胜 
			}
			if (MAP[endStatus[i][0]] == 'X') {
				return 1; //人获胜 
			}
		}
	}
	if (dotNums() == 0) { //函数名忘加括号
		return -2;
	}
	return 0;
}
int alpha_beta(int moveNow, int moveNext, int alpha, int beta) {
	// 判断是否结束   
	int gr = gameResult();
	if (gr != 0) {
		return gr;
	}
	//开始下一层
	for (int i = 1; i <= 9; i++) {
		if (MAP[i] == '.') {
			if (moveNow == -1)
				MAP[i] = 'O';
			else if (moveNow == 1)
				MAP[i] = 'X'; 
			int tem = alpha_beta(moveNext, moveNow, alpha, beta);  
			MAP[i] = '.';
			if (moveNow == HUMAN) {  //max层,更新alpha,返回beta 
				if (tem > alpha) {
					alpha = tem;
				}
				if (alpha >= beta) {
					return beta;
				}
			}
			else {  //min层,更新beta,返回alpha
				if (tem < beta) {
					beta = tem;
				}
				if (alpha >= beta) {
					return alpha;
				}
			}
		}
	}
	//cout << "当下:" << alpha << ' ' << beta << endl;
	if (moveNow == HUMAN) {  //max层,更新alpha,返回beta 
		return alpha;
	}
	return beta;
}
int calNext() {  //电脑总想要小的结果 
	int i = 0;
	int bestValue = 1000, besti = 0;
	while (++i <= 9) {
		if (MAP[i] == '.') {
			//如果说这个点可以走
			MAP[i] = 'O';
			int tem = alpha_beta(HUMAN, COMPUTER, -100, 100);
			//cout << i << " " << tem << endl;
			MAP[i] = '.';
			if (tem < bestValue) {
				bestValue = tem;
				besti = i;
			}
		}
	}
	return besti;
}
int main() {
	 
	cout << "请选择哪一方先下,输入0表示玩家先下,输入1表示电脑先下" << endl;
	cin >> firstMove;
	nextMove = firstMove ? COMPUTER : HUMAN;
	//初始化 
	for (int i = 1; i < 10; i++)
		MAP[i] = '.';
	while (gameResult() == 0) {
		//只要游戏不结束
		printMap();
		if (nextMove == COMPUTER) {
			int tempos = calNext();
			cout << "电脑选择位置:" << tempos << endl;
			MAP[tempos] = 'O';
		}
		else {
			cout << "请输入落子位置(1-9):" << endl;
			int pos;
			cin >> pos;
			if (MAP[pos] != '.') {
				cout << "请重新输入正确的位置" << endl;
				continue;
			}
			else {
				MAP[pos] = 'X';
			}
		}
		nextMove = -nextMove;
	}
	int res = gameResult();
	if (res == 1) {
		cout << "玩家获胜!" << endl;
	}
	else if (res == 0 || res == -2) {
		cout << "平局!" << endl;
	}
	else if (res == -1) {
		cout << "电脑获胜!" << endl;
	}
	printMap(); 
	return 0;
}

你可能感兴趣的:(人工智能)