【五子棋】C++机器人算法核心 简单粗暴的评级方法

改进反思了上一次做的费事费力垃圾机器人之后,受朋友的启发 欺负 换上了一个简单 而 能秒杀之前的机器人的算法(并没有用DFS剪枝,适合新手),直接上代码(从下往上看)

int mx[8] = { 1, 0, 1, 1, -1, 0, -1, -1 };
int my[8] = { 0, 1, 1, -1, 0, -1, -1, 1 };
///
int Simple(int x, int y, int op, int eop) {
	int grade = 0;
	int point[6] = { 0, 20, 120, 720, 4320, 50000};
	for (int i = 0; i < 4; i++) { //检查机器人防御
		int tmp_grade = 0, check_array = 0;
		for (int j = 1; j < 6; j++) {
			int dx = x + mx[i] * j;
			int dy = y + my[i] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] != op) break;
			tmp_grade++;
		}
		for (int j = 1; j < 6; j++) {
			int dx = x + mx[i + 4] * j;
			int dy = y + my[i + 4] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] != op) break;
			tmp_grade++;
		}
		for (int j = 1; j < 8; j++) {
			int dx = x + mx[i] * j;
			int dy = y + my[i] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] == eop) break;
			check_array++;
		}
		for (int j = 1; j < 8; j++) {
			int dx = x + mx[i + 4] * j;
			int dy = y + my[i + 4] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] == eop) break;
			check_array++;
		}
		if (tmp_grade >= 5)	tmp_grade = 5;
		if (check_array >= 4)grade += point[tmp_grade];
	}

	for (int i = 0; i < 4; i++) { //检查机器人攻击
		int tmp_grade = 0, check_array = 0;
		for (int j = 1; j < 6; j++) {
			int dx = x + mx[i] * j;
			int dy = y + my[i] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] != eop) break;
			tmp_grade++;
		}
		for (int j = 1; j < 6; j++) {
			int dx = x + mx[i + 4] * j;
			int dy = y + my[i + 4] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] != eop) break;
			tmp_grade++;
		}
		for (int j = 1; j < 8; j++) {
			int dx = x + mx[i] * j;
			int dy = y + my[i] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] == op) break;
			check_array++;
		}
		for (int j = 1; j < 8; j++) {
			int dx = x + mx[i + 4] * j;
			int dy = y + my[i + 4] * j;
			if (dx < 0 || dy < 0 || dx > 14 || dy > 14 || Map[dx][dy] == op) break;
			check_array++;
		}
		if (tmp_grade >= 5)	tmp_grade = 5;
		if (check_array >= 4)grade += point[tmp_grade];
	}
	return grade;
}
///
int AddComplexGrade(int sum, int op1, int op2, int op3, int op4, int op5, int op6, int addgrade) {
	int grade = 0;
	if (sum == 5) {
		for (int i = 0; i < 15; i++) {
			for (int j = 0; j < 15; j++) {
				if (Map[i][j] != op1)	continue;
				if (i < 15 && j + 4 < 15 && Map[i][j] == op1 && Map[i][j + 1] == op2 && Map[i][j + 2] == op3 && Map[i][j + 3] == op4 && Map[i][j + 4] == op5) {
					grade += addgrade;
				}
				if (i + 4 < 15 && j < 15 && Map[i][j] == op1 && Map[i + 1][j] == op2 && Map[i + 2][j] == op3 && Map[i + 3][j] == op4 && Map[i + 4][j] == op5) {
					grade += addgrade;
				}
				if (i + 4 < 15 && j + 4 < 15 && Map[i][j] == op1 && Map[i + 1][j + 1] == op2 && Map[i + 2][j + 2] == op3 && Map[i + 3][j + 3] == op4 && Map[i + 4][j + 4] == op5) {
					grade += addgrade;
				}
				if (i - 4 >= 0 && j + 4 < 15 && Map[i][j] == op1 && Map[i - 1][j + 1] == op2 && Map[i - 2][j + 2] == op3 && Map[i - 3][j + 3] == op4 && Map[i - 4][j + 4] == op5) {
					grade += addgrade;
				}
			}
		}
	}
	else {
		for (int i = 0; i < 15; i++) {
			for (int j = 0; j < 15; j++) {
				if (Map[i][j] != op1)	continue;
				if (i < 15 && j + 5 < 15 && Map[i][j] == op1 && Map[i][j + 1] == op2 && Map[i][j + 2] == op3 && Map[i][j + 3] == op4 && Map[i][j + 4] == op5&&Map[i][j + 5] == op6) {
					grade += addgrade;
				}
				if (i + 5 < 15 && j < 15 && Map[i][j] == op1 && Map[i + 1][j] == op2 && Map[i + 2][j] == op3 && Map[i + 3][j] == op4 && Map[i + 4][j] == op5 && Map[i + 5][j] == op6) {
					grade += addgrade;
				}
				if (i + 5 < 15 && j + 4 < 15 && Map[i][j] == op1 && Map[i + 1][j + 1] == op2 && Map[i + 2][j + 2] == op3 && Map[i + 3][j + 3] == op4 && Map[i + 4][j + 4] == op5 && Map[i + 5][j + 5] == op6) {
					grade += addgrade;
				}
				if (i - 5 >= 0 && j + 5 < 15 && Map[i][j] == op1 && Map[i - 1][j + 1] == op2 && Map[i - 2][j + 2] == op3 && Map[i - 3][j + 3] == op4 && Map[i - 4][j + 4] == op5 && Map[i - 5][j + 5] == op6) {
					grade += addgrade;
				}
			}
		}
	}
	return grade;
}
///
int Complex(int x, int y, int op, int eop) {
	int grade = 0;
	Map[x][y] = op;
	/*
	https://blog.csdn.net/onezeros/article/details/5542379?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-5.nonecase
	参考山东师范大学董红安2005年的硕士毕业论文中使用的的评分表
	50000 4320 720 120 20
	*/
	grade += AddComplexGrade(5, op, op, op, op, op, -1, 50000);
	grade += AddComplexGrade(6, 0, op, op, op, op, 0, 4320);
	grade += AddComplexGrade(6, 0, op, op, op, 0, 0, 720);
	grade += AddComplexGrade(6, 0, 0, op, op, op, 0, 720);
	grade += AddComplexGrade(6, 0, op, op, 0, op, 0, 720);
	grade += AddComplexGrade(6, 0, op, 0, op, op, 0, 720);
	grade += AddComplexGrade(5, 0, op, op, op, op, -1, 720);
	grade += AddComplexGrade(5, op, op, op, op, 0, -1, 720);
	grade += AddComplexGrade(5, op, op, op, op, 0, -1, 720);
	grade += AddComplexGrade(5, 0, op, op, op, op, -1, 720);
	grade += AddComplexGrade(5, op, op, 0, op, op, -1, 720);
	grade += AddComplexGrade(6, 0, 0, op, op, 0, 0, 120);
	grade += AddComplexGrade(6, 0, 0, op, 0, op, 0, 120);
	grade += AddComplexGrade(6, 0, op, 0, op, 0, 0, 120);
	grade += AddComplexGrade(6, 0, 0, 0, op, 0, 0, 20);
	grade += AddComplexGrade(6, 0, 0, op, 0, 0, 0, 20);
	
	grade += AddComplexGrade(5, eop, eop, eop, eop, eop, -1, -50000);
	grade += AddComplexGrade(6, 0, eop, eop, eop, eop, 0, -4320);
	grade += AddComplexGrade(6, 0, eop, eop, eop, 0, 0, -720);
	grade += AddComplexGrade(6, 0, 0, eop, eop, eop, 0, -720);
	grade += AddComplexGrade(6, 0, eop, eop, 0, eop, 0, -720);
	grade += AddComplexGrade(6, 0, eop, 0, eop, eop, 0, -720);
	grade += AddComplexGrade(5, 0, eop, eop, eop, eop, -1, -720);
	grade += AddComplexGrade(5, eop, eop, eop, eop, 0, -1, -720);
	grade += AddComplexGrade(5, eop, eop, eop, eop, 0, -1, -720);
	grade += AddComplexGrade(5, 0, eop, eop, eop, eop, -1, -720);
	grade += AddComplexGrade(5, eop, eop, 0, eop, eop, -1, -720);
	grade += AddComplexGrade(6, 0, 0, eop, eop, 0, 0, -120);
	grade += AddComplexGrade(6, 0, 0, eop, 0, eop, 0, -120);
	grade += AddComplexGrade(6, 0, eop, 0, eop, 0, 0, -120);
	grade += AddComplexGrade(6, 0, 0, 0, eop, 0, 0, -20);
	grade += AddComplexGrade(6, 0, 0, eop, 0, 0, 0, -20);
	Map[x][y] = 0;
	return grade/diffcuity;
}
///
int GradeJudge(int x, int y, int op, int eop) {
	int grade = 0;
	grade += Simple(x, y, op, eop);
	grade += Complex(x, y, op, eop);
	return grade;
}
bool RobotPut(int op) {//机器人程序  贪心算法   评分优先   攻击与防御同等权重 
	int eop;//对手op 
	if (op == 1)	eop = 2;
	else	eop = 1;
	int x = 0, y = 0, max = 0;
	srand((unsigned)time(NULL));
	if(score < 150)	while (Map[x][y] != 0 || x <= 0 || y <= 0 || x >= 14 || y >= 14)	x = rand() % 15, y = rand() % 15;
	else while (Map[x][y] != 0 || x < 0 || y < 0 || x > 14 || y > 14)	x = rand() % 15, y = rand() % 15;
	for (int i = 0; i < 15; i++) {
		for (int j = 0; j < 15; j++) {
			if (Map[i][j] != 0)	continue;
			int Nowgrade = GradeJudge(i, j, op, eop);
			if (Nowgrade > max)	x = i, y = j, max = Nowgrade;
		}
	}
	if (max > 1000)	score += 1;
	else if (max > 500)	score += 2;
	else score += 3;
	while (x >= 15 || y >= 15 || x < 0 || y < 0 || Map[x][y] != 0) {
		srand((unsigned)time(NULL));
		if (masterop) { //检错程序
			TCHAR str100[100];
			if(op == 1)	_stprintf_s(str100, _T("当前执黑棋机器人错误下棋位置  x:%d    y:%d  "), x + 1, y + 1);
			else _stprintf_s(str100, _T("当前执白棋机器人错误下棋位置  x:%d    y:%d  "), x + 1, y + 1);
			outtextxy(0, 0, str100);
			while (1) {
				outtextxy(0, 680, _T("检错程序运行中 若影响游戏体验请关闭重启"));
				Sleep(100);
			}
		}
		x = rand() % 15, y = rand() % 15;
		outtextxy(0, 0, _T("机器人发生故障 请联系制作人"));
	}
	TCHAR str2[100];
	_stprintf_s(str2, _T("当前机器人下棋位置  x:%d    y:%d "), x + 1, y + 1);
	outtextxy(800, 280, str2);
	Map[x][y] = op;
	prey_x = x, prey_y = y;
	getimage(&imgprey, (int)(x * 45.7 + 30.0) - 17, (int)(y * 45.7 + 30.0) - 17, (int)(x * 45.7 + 30.0) + 17, (int)(y * 45.7 + 30.0) + 16);
	if(op == 1)	BlackPut((int)(x * 45.7 + 30.0), (int)(y * 45.7 + 30.0));
	else WhitePut((int)(x * 45.7 + 30.0), (int)(y * 45.7 + 30.0));
	if (CheckWin(x, y, op))	return true;
	return false;
}

在这里插入图片描述

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值