📄 1234.c
字号:
if (x1 < 450) {
if (y1 > 30)
line(x1 + 7, y1 - 15, x1 + 15, y1 - 15);
if (y1 > 30)
line(x1 + 15, y1 - 15, x1 + 15, y1 - 7);
if (y1 < 450)
line(x1 + 15, y1 + 7, x1 + 15, y1 + 15);
if (y1 < 450)
line(x1 + 15, y1 + 15, x1 + 7, y1 + 15);
}
if (x1 > 30) {
if (y1 < 450)
line(x1 - 7, y1 + 15, x1 - 15, y1 + 15);
if (y1 < 450)
line(x1 - 15, y1 + 15, x1 - 15, y1 + 7);
if (y1 > 30)
line(x1 - 15, y1 - 7, x1 - 15, y1 - 15);
if (y1 > 30)
line(x1 - 15, y1 - 15, x1 - 7, y1 - 15);
}
oldx = x1;
oldy = y1;
}
void
set_chessman()
{
/*
* 棋子有三种状态,0是未初始状态,1是控制方棋子,2是对方棋子
*/
int i,
j;
for (i = 0; i < 15; i++)
for (j = 0; j < 15; j++)
chessman[i][j] = 0;
}
/*
* 0表示没有赢,1表示p1胜利,2表示p2胜利,3表示平局
*/
int
win_or_not(int x0, int y0, int who, int chessman[LENGTH][LENGTH], int a)
{
int i = x0 / 30 - 1,
j = y0 / 30 - 1;
int who_run = who;
int line_sum = -1;
int tmp_i = i,
tmp_j = j;
int c;
if (a == 1) {
/*
* 测试第一层扩展是否满足赢的条件
*/
c = chessman[i][j];
chessman[i][j] = who_run;
}
while (1) { /* 查找共行的棋子是否连接了五个 */
while (tmp_i >= 0 && line_sum != 4) {
if (chessman[tmp_i--][j] == who_run)
line_sum++;
else
break;
}
if (line_sum == 4)
line_sum++;
tmp_i = i;
while (tmp_i <= 15 && line_sum != 5) {
if (chessman[tmp_i++][j] == who_run)
line_sum++;
else
break;
}
if (line_sum == 5) {
if (a == 1)
chessman[i][j] = c;
return who_run;
}
line_sum = -1;
tmp_i = i;
break;
}
while (1) { /* 查找共列的棋子是否连接了五个 */
while (tmp_j >= 0 && line_sum != 4) {
if (chessman[i][tmp_j--] == who_run)
line_sum++;
else
break;
}
if (line_sum == 4)
line_sum++;
tmp_j = j;
while (tmp_j <= 15 && line_sum != 5) {
if (chessman[i][tmp_j++] == who_run)
line_sum++;
else
break;
}
if (line_sum == 5) {
if (a == 1)
chessman[i][j] = c;
return who_run;
}
line_sum = -1;
tmp_j = j;
break;
}
while (1) { /* 查找上对角线上是否连接了五个 */
while (line_sum != 4 && tmp_i <= 15 && tmp_j >= 0) {
if (chessman[tmp_i++][tmp_j--] == who_run)
line_sum++;
else
break;
}
tmp_i = i;
tmp_j = j;
if (line_sum == 4)
line_sum++;
while (line_sum != 5 && tmp_i >= 0 && tmp_j <= 15) {
if (chessman[tmp_i--][tmp_j++] == who_run)
line_sum++;
else
break;
}
if (line_sum == 5) {
if (a == 1)
chessman[i][j] = c;
return who_run;
}
tmp_i = i;
tmp_j = j;
line_sum = -1;
break;
}
while (1) { /* 查找下对角线上是否连接了五个 */
while (line_sum != 4 && tmp_i >= 0 && tmp_j >= 0) {
if (chessman[tmp_i--][tmp_j--] == who_run)
line_sum++;
else
break;
}
tmp_i = i;
tmp_j = j;
if (line_sum == 4)
line_sum++;
while (line_sum != 5 && tmp_i <= 15 && tmp_j <= 15) {
if (chessman[tmp_i++][tmp_j++] == who_run)
line_sum++;
else
break;
}
if (line_sum == 5) {
if (a == 1)
chessman[i][j] = c;
return who_run;
}
break;
}
if (step_sum == 225) {
if (a == 1)
chessman[i][j] = c;
return 3;
}
if (a == 1)
chessman[i][j] = c;
return 0;
}
double
score_row(int i, int j, int chessman[LENGTH][LENGTH])
{
int sum_chessmen = 0;
double score = 0;
int mid_j;
int who_running = chessman[i][j];
if (j == LENGTH) {
while (chessman[i][j] == who_running) {
j--;
sum_chessmen++;
}
if (sum_chessmen >= 5)
score = 200000;
else {
if (chessman[i][j] == 0) /* 没有下子,活的情况 */
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0; /* 死的情况 */
}
} else {
while (chessman[i][j] == who_running && j != LENGTH) {
j++;
sum_chessmen++;
}
mid_j = j;
j = j - sum_chessmen - 1;
while (chessman[i][j] == who_running && j != -1) {
j--;
sum_chessmen++;
}
if (j >= 0 && mid_j < LENGTH) {
if (chessman[i][j] == 0 && chessman[i][mid_j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
else if ((chessman[i][j] != 0 && chessman[i][mid_j] == 0)
|| (chessman[i][j] == 0 && chessman[i][mid_j] != 0))
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
if (j < 0 && mid_j < LENGTH) {
if (chessman[i][mid_j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
if (j >= 0 && mid_j >= LENGTH) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
if (j < 0 && mid_j >= LENGTH)
score = 0;
}
return score;
}
double
score_col(int i, int j, int chessman[LENGTH][LENGTH])
{
int sum_chessmen = 0,
mid_i;
double score = 0;
int who_running = chessman[i][j];
if (i == LENGTH) {
while (chessman[i][j] == who_running) {
i--;
sum_chessmen++;
}
if (sum_chessmen >= 5)
score = 200000;
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
} else {
while (chessman[i][j] == who_running) {
i++;
sum_chessmen++;
}
mid_i = i;
if (i == LENGTH || chessman[i][j] != who_running) {
i = i - sum_chessmen;
while (chessman[i - 1][j] == who_running) {
i--;
sum_chessmen++;
}
if (i >= 0) {
if (chessman[i][j] == 0 && chessman[mid_i][j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
else if ((chessman[i][j] != 0 && chessman[mid_i][j]) == 0
|| (chessman[i][j] == 0
&& chessman[mid_i][j] != 0))
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
if (i < 0 && mid_i < LENGTH) {
if (chessman[mid_i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
if (i < 0 && mid_i < LENGTH) {
if (chessman[mid_i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
if (i >= 0 && mid_i >= LENGTH) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
}
}
return score;
}
double
score_diag_45(int i, int j, int chessman[LENGTH][LENGTH])
{
int sum_chessmen = 0;
double score = 0;
int mid_i,
mid_j;
int who_running = chessman[i][j];
if (i == LENGTH || j == LENGTH) {
while (chessman[i][j] == who_running && i > 1 && j > 1) {
i--;
j--;
sum_chessmen++;
}
if (sum_chessmen >= 5)
score = 200000;
else {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
} else {
while (chessman[i][j] == who_running && i <= LENGTH && j <= LENGTH) {
i++;
j++;
sum_chessmen++;
}
mid_i = i;
mid_j = j;
i = i - sum_chessmen;
j = j - sum_chessmen;
while (chessman[i - 1][j - 1] == who_running) {
i--;
j--;
sum_chessmen++;
}
if (sum_chessmen >= 5)
score = 200000;
if (i >= 0 && j >= 0 && mid_i < LENGTH && mid_j < LENGTH) {
if (chessman[mid_i][mid_j] == 0 && chessman[i][j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
else if ((chessman[mid_i][mid_j] == 0 && chessman[i][j] != 0)
|| (chessman[mid_i][mid_j] != 0
&& chessman[i][j] == 0))
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
} else {
if (i >= 0 && j >= 0) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
} else if (mid_i < LENGTH && mid_j < LENGTH) {
if (chessman[mid_i][mid_j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
} else
score = 0;
}
}
return score;
}
double
score_diag_135(int i, int j, int chessman[LENGTH][LENGTH])
{
int sum_chessmen = 0;
double score = 0;
int mid_i,
mid_j;
int who_running = chessman[i][j];
while (chessman[i][j] == who_running && j != -1 && i < LENGTH) {
i++;
j--;
sum_chessmen++;
}
mid_i = i;
mid_j = j;
j += sum_chessmen;
i -= sum_chessmen;
j++;
i--;
while (chessman[i][j] == who_running && j != LENGTH) {
i--;
j++;
sum_chessmen++;
}
if (sum_chessmen >= 5)
score = 200000;
else {
if (i >= 0 && j < LENGTH && mid_j >= 0 && mid_i < LENGTH) {
if (chessman[i][j] == 0 && chessman[mid_i][mid_j] == 0)
score = 18000 / POW(50, 4 - sum_chessmen);
else {
if ((chessman[i][j] == 0 && chessman[mid_i][mid_j] != 0)
|| (chessman[i][j] != 0
&& chessman[mid_i][mid_j] == 0))
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
} else {
if (i >= 0 && j < LENGTH) {
if (chessman[i][j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
if (mid_j >= 0 && mid_i < LENGTH) {
if (chessman[mid_i][mid_j] == 0)
score = 2000 / POW(10, 4 - sum_chessmen);
else
score = 0;
}
}
}
return score;
}
double
total_score(int who_running, int chessman[LENGTH][LENGTH])
{
/*
* 统计出在该点上的得分,who_running=1表示人的棋子,2为电脑的棋子
*/
int i,
j;
double score = 0;
for (i = 0; i < LENGTH; i++)
for (j = 0; j < LENGTH; j++) {
if (chessman[i][j] == who_running) {
score += score_row(i, j, chessman);
score += score_col(i, j, chessman);
score += score_diag_45(i, j, chessman);
score += score_diag_135(i, j, chessman);
}
}
return score;
}
double
score(int chessman[LENGTH][LENGTH])
{
/*
* 计算最终的得分数,分别考虑了在这个位置放对方棋子跟自己棋子的综合
*/
double sum1,
sum2;
sum1 = total_score(COMPUTER, chessman);
sum2 = total_score(PLAYER1, chessman);
return sum1 - sum2;
}
/*
* 扩展-----剪枝过程
*/
int
rowdt(int i, int j, int chessman[LENGTH][LENGTH]) /*在树直方向*/
{
int k;
int midjl = j - STEP, /*当前棋子的上方*/
midjr = j + STEP + 1; /*当前棋子的下方棋子的下方??????*/
if (midjl < 0)
midjl = 0;
if (midjr > LENGTH)
midjr = LENGTH;
for (k = midjl; k < midjr; k++) /**/
if (chessman[i][k] != 0) /*如果有棋子*/
return 1;
return 0;
}
int
coldt(int i, int j, int chessman[LENGTH][LENGTH]) /*水平方向*/
{
int k;
int midil = i + STEP + 1, /*当前的右边棋子的右一个*/
midiu = i - STEP; /*当前棋子的左一个*/
if (midiu < 0)
midiu = 0;
if (midil > LENGTH)
midil = LENGTH;
for (k = midiu; k < midil; k++)
if (chessman[k][j] != 0)
return 1;
return 0;
}
int
diadt(int i, int j, int chessman[LENGTH][LENGTH]) /*右上到左下方向*/
{
int k,
midi,
midj;
midi = i;
midj = j;
for (k = 0; k < STEP; k++) {
midi++;
midj--;
if (midj < 0 || midi >= LENGTH)
break;
if (chessman[midi][midj] != 0)
return 1;
}
for (k = 0; k < STEP; k++) {
i--;
j++;
if (i < 0 || j >= LENGTH)
break;
if (chessman[i][j] != 0)
return 1;
}
return 0;
}
int
vdiadt(int i, int j, int chessman[LENGTH][LENGTH]) /*左上到右下方向*/
{
int k,
midi,
midj;
midi = i;
midj = j;
for (k = 0; k < STEP; k++) {
midi--;
midj--;
if (midi < 0 || midj < 0)
break;
if (chessman[midi][midj] != 0)
return 1;
}
for (k = 0; k < STEP; k++) {
i++;
j++;
if (j >= LENGTH || i >= LENGTH)
break;
if (chessman[i][j] != 0)
return 1;
}
return 0;
}
int
can_expand(int i, int j, int chessman[LENGTH][LENGTH])
{
if (rowdt(i, j, chessman))
return 1;
if (coldt(i, j, chessman))
return 1;
if (diadt(i, j, chessman))
return 1;
if (vdiadt(i, j, chessman))
return 1;
/*
* 如果不能扩展,返回0
*/
return 0;
}
/************************************************************/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -