优化该六子棋计算当前落子位置得分的函数,使其包含的情况更加丰富,下棋时不仅能堵对方,还能兼顾我方,使我方连成六子int calcScore(int x, int y) { // 给位置赋值,越往中间的分越高 int center = GRIDSIZE / 2;//棋盘中心点的位置 int score = max(abs(x-center), abs(y-center));//abs函数 对整数取绝对值 计算当前位置与棋盘中心点的距离 // 如果当前位置已经有棋子,则返回0分 if (gridInfo[x][y] != grid_blank) { return 0; } // 检测周围是否有对方的四连或五连,然后进行堵截 int oppoColor = -currBotColor; for(int i=0; i<8; i++) {//在上下左右以及斜方向分别寻找 int cnt = 0, bx = x+dx[i], by = y+dy[i]; while(inMap(bx, by) && gridInfo[bx][by] == oppoColor) { bx += dx[i]; by += dy[i]; cnt++; } if(cnt == 4) score += 500; else if(cnt == 3) score += 100; else if(cnt == 2) score += 20; else if(cnt == 1) score += 5; else if(cnt == 0) score += 1; } return score; }
时间: 2024-02-14 15:09:48 浏览: 97
为了使得计算当前落子位置得分的函数更加丰富,可以考虑增加以下情况:
1. 判断是否有我方的四连或五连,给予高分,以便下一步落子时能够延续或完成连珠。
2. 判断当前位置是否能够成为我方的三连,给予一定分数,以便下一步落子时能够延续三连。
3. 判断当前位置是否能够成为我方的二连,给予一定分数,以便下一步落子时能够延续二连。
4. 判断当前位置是否能够同时堵住对方的四连和我方的三连,给予较高分数,以达到兼顾我方和堵住对方的目的。
5. 判断当前位置是否能够同时堵住对方的四连和我方的二连,给予一定分数,以达到兼顾我方和堵住对方的目的。
修改后的代码如下:
int calcScore(int x, int y) {
int center = GRIDSIZE / 2;
int score = max(abs(x-center), abs(y-center));
if (gridInfo[x][y] != grid_blank) {
return 0;
}
int oppoColor = -currBotColor;
int myColor = currBotColor;
// 检测周围是否有对方的四连或五连,然后进行堵截
for(int i=0; i<8; i++) {
int cnt = 0, bx = x+dx[i], by = y+dy[i];
while(inMap(bx, by) && gridInfo[bx][by] == oppoColor) {
bx += dx[i];
by += dy[i];
cnt++;
}
if(cnt == 4) {
score += 500;
}
else if(cnt == 3) {
score += 100;
// 判断是否能够延续三连
int nx = bx+dx[i], ny = by+dy[i];
if(inMap(nx, ny) && gridInfo[nx][ny] == grid_blank) {
score += 50;
}
}
else if(cnt == 2) {
score += 20;
// 判断是否能够延续二连
int nx = bx+dx[i], ny = by+dy[i];
if(inMap(nx, ny) && gridInfo[nx][ny] == myColor) {
score += 10;
}
}
else if(cnt == 1) {
score += 5;
}
else if(cnt == 0) {
score += 1;
}
}
// 判断是否能够形成我方的四连或五连
for(int i=0; i<8; i++) {
int cnt = 0, bx = x+dx[i], by = y+dy[i];
while(inMap(bx, by) && gridInfo[bx][by] == myColor) {
bx += dx[i];
by += dy[i];
cnt++;
}
if(cnt == 4) {
score += 1000;
}
else if(cnt == 3) {
score += 200;
// 判断是否能够延续三连
int nx = bx+dx[i], ny = by+dy[i];
if(inMap(nx, ny) && gridInfo[nx][ny] == grid_blank) {
score += 50;
}
}
}
// 判断是否能够同时堵住对方的四连和我方的三连或二连
for(int i=0; i<8; i++) {
int cnt1 = 0, cnt2 = 0, bx = x+dx[i], by = y+dy[i];
while(inMap(bx, by) && gridInfo[bx][by] == oppoColor) {
bx += dx[i];
by += dy[i];
cnt1++;
}
bx += dx[i];
by += dy[i];
while(inMap(bx, by) && gridInfo[bx][by] == myColor) {
bx += dx[i];
by += dy[i];
cnt2++;
}
if(cnt1 == 4 && (cnt2 == 3 || cnt2 == 2)) {
score += 1000;
}
}
return score;
}
阅读全文