改进反思了上一次做的费事费力垃圾机器人之后,受朋友的启发 欺负 换上了一个简单 而 能秒杀之前的机器人的算法(并没有用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;
}