int chessscore(int x, int y, int worb)//棋盘权值函数
{
int sumscore = 0;
char u, d, l, r, lu, ld, ru, rd;//u上 d下 l左 r右 lu左上 ld左下 ru右上 rd右下
int row, col, count1, count2, count3, count4; //1横 2竖 3斜上 4斜下
count1 = count2 = count3 = count4 = 1;
l = r = u = d = lu = ld = ru = rd = 0;
chess[x][y] = worb; //模拟下棋
//横向
row = x, col = y + 1;
while (chess[row][col] == worb && scorejudge(row,col))
{
count1++;
col++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
r++;
col++;
}
row = x, col = y - 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count1++;
col--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
l++;
col--;
}
//竖向
row = x + 1, col = y;
while (chess[row][col] == worb && scorejudge(row, col))
{
count2++;
row++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
d++;
row++;
}
row = x - 1, col = y;
while (chess[row][col] == worb && scorejudge(row, col))
{
count2++;
row--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
u++;
row--;
}
//斜上
row = x - 1, col = y + 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count3++;
col++;
row--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
ru++;
col++;
row--;
}
row = x + 1, col = y - 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count3++;
col--;
row++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
ld++;
col--;
row++;
}
//斜下
row = x + 1, col = y + 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count4++;
col++;
row++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
rd++;
col++;
row++;
}
row = x - 1, col = y - 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count4++;
col--;
row--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
lu++;
col--;
row--;
}
chess[x][y] = Nochess;
if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5)//成五
{
return sumscore = 5000000;
}
if ((count1 == 4 && count2 == 4 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 4 && count3 == 4 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 4 && count4 == 4 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 4 && count3 == 4 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 4 && count4 == 4 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 4 && count4 == 4 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))
//双活四
{
return sumscore = 4000000;
}
if ((count1 == 4 && l >= 1 && r >= 1) || (count2 == 4 && u >= 1 && d >= 1) ||
(count3 == 4 && ru >= 1 && ld >= 1) || (count4 == 4 && lu >= 1 && rd >= 1))
//活四
{
return sumscore = 800000;
}
if ((count1 == 4 && ((l == 0 && r >= 1) || (l >= 1 && r == 0)))
|| (count2 == 4 && ((u == 0 && d >= 1) || (u >= 1 && d == 0)))
||(count3 == 4 && ((ld == 0 && ru >= 1) || (ld >= 1 && ru == 0)))
|| (count4 == 4 && ((lu == 0 && rd >= 1) || (lu >= 1 && rd == 0))))
{
sumscore = sumscore + 35000; //成四
}
if ((count1 == 3 && count2 == 3 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 3 && count3 == 3 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 3 && count4 == 3 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 3 && count3 == 3 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 3 && count4 == 3 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 3 && count4 == 3 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))
//双活三
{
return sumscore + 400000;
}
if ((count1 == 3 && l >= 1 && r >= 1) || (count2 == 3 && u >= 1 && d >= 1) ||
(count3 == 3 && ru >= 1 && ld >= 1) || (count4 == 3 && lu >= 1 && rd >= 1))
//活三
{
sumscore = sumscore + 60000;
return sumscore;
}
if ((count1 == 2 && count2 == 2 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 2 && count3 == 2 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 2 && count4 == 2 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 2 && count3 == 2 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 2 && count4 == 2 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 2 && count4 == 2 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))
//双活二
{
sumscore = sumscore + 20000;
}
if ((count1 == 2 && l >= 1 && r >= 1) || (count2 == 2 && u >= 1 && d >= 1) ||
(count3 == 2 && ru >= 1 && ld >= 1) || (count4 == 2 && lu >= 1 && rd >= 1))
//单活二
{
sumscore = sumscore + 10000;
}
if ((count1 == 3 && ((l == 0 && r >= 1) || (l >= 1 && r == 0)))
|| (count2 == 3 && ((u == 0 && d >= 1) || (u >= 1 && d == 0)))
|| (count3 == 3 && ((ld == 0 && ru >= 1) || (ld >= 1 && ru == 0)))
|| (count4 == 3 && ((lu == 0 && rd >= 1) || (lu >= 1 && rd == 0))))
{
sumscore = sumscore + 5000; //成三
}
return sumscore;
}
void chesscomputer()//机器落子
{
int i, j, cscore, cscorel, pscore, pscorel, row1, col1, row2, col2;
cscore = pscore = 0; row1 = row2 = col1 = col2 = -1;
//寻找最优落子位置
if (chess_num <= 1)
{
row1 = 7;
col1 = 7;
do
{
row1++;
col1++;
} while (!judge(row1, col1));
Chess_piece(row1, col1);
}
else
{
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (judge(i, j))
{
cscorel = chessscore(i, j, p1);
if (cscorel > cscore)
{
cscore = cscorel;
row1 = i;
col1 = j;
}
pscorel = chessscore(i, j, p2);
if (pscorel > pscore)
{
pscore = pscorel;
row2 = i;
col2 = j;
}
}
}
}
if (row1 == -1 && col1 == -1 && row2 == -1 && col2 == -1)//没找到最优解 平局
{
Restart(2,player);
}
else
{
if (chess_num == 3)
{
Chess_piece(row2, col2);
}
else
{
if (cscore > pscore)
{
Chess_piece(row1, col1);
}
else
{
Chess_piece(row2, col2);
}
}
}
}
}
int chessscore(int x, int y, int worb)//棋盘权值函数
{
int sumscore = 0;
char u, d, l, r, lu, ld, ru, rd;//u上 d下 l左 r右 lu左上 ld左下 ru右上 rd右下
int row, col, count1, count2, count3, count4; //1横 2竖 3斜上 4斜下
count1 = count2 = count3 = count4 = 1;
l = r = u = d = lu = ld = ru = rd = 0;
chess[x][y] = worb; //模拟下棋
//横向
row = x, col = y + 1;
while (chess[row][col] == worb && scorejudge(row,col))
{
count1++;
col++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
r++;
col++;
}
row = x, col = y - 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count1++;
col--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
l++;
col--;
}
//竖向
row = x + 1, col = y;
while (chess[row][col] == worb && scorejudge(row, col))
{
count2++;
row++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
d++;
row++;
}
row = x - 1, col = y;
while (chess[row][col] == worb && scorejudge(row, col))
{
count2++;
row--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
u++;
row--;
}
//斜上
row = x - 1, col = y + 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count3++;
col++;
row--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
ru++;
col++;
row--;
}
row = x + 1, col = y - 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count3++;
col--;
row++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
ld++;
col--;
row++;
}
//斜下
row = x + 1, col = y + 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count4++;
col++;
row++;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
rd++;
col++;
row++;
}
row = x - 1, col = y - 1;
while (chess[row][col] == worb && scorejudge(row, col))
{
count4++;
col--;
row--;
}
while (chess[row][col] == 0 && scorejudge(row, col))
{
lu++;
col--;
row--;
}
chess[x][y] = Nochess;
if (count1 >= 5 || count2 >= 5 || count3 >= 5 || count4 >= 5)//成五
{
return sumscore = 5000000;
}
if ((count1 == 4 && count2 == 4 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 4 && count3 == 4 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 4 && count4 == 4 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 4 && count3 == 4 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 4 && count4 == 4 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 4 && count4 == 4 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))
//双活四
{
return sumscore = 4000000;
}
if ((count1 == 4 && l >= 1 && r >= 1) || (count2 == 4 && u >= 1 && d >= 1) ||
(count3 == 4 && ru >= 1 && ld >= 1) || (count4 == 4 && lu >= 1 && rd >= 1))
//活四
{
return sumscore = 800000;
}
if ((count1 == 4 && ((l == 0 && r >= 1) || (l >= 1 && r == 0)))
|| (count2 == 4 && ((u == 0 && d >= 1) || (u >= 1 && d == 0)))
||(count3 == 4 && ((ld == 0 && ru >= 1) || (ld >= 1 && ru == 0)))
|| (count4 == 4 && ((lu == 0 && rd >= 1) || (lu >= 1 && rd == 0))))
{
sumscore = sumscore + 35000; //成四
}
if ((count1 == 3 && count2 == 3 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 3 && count3 == 3 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 3 && count4 == 3 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 3 && count3 == 3 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 3 && count4 == 3 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 3 && count4 == 3 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))
//双活三
{
return sumscore + 400000;
}
if ((count1 == 3 && l >= 1 && r >= 1) || (count2 == 3 && u >= 1 && d >= 1) ||
(count3 == 3 && ru >= 1 && ld >= 1) || (count4 == 3 && lu >= 1 && rd >= 1))
//活三
{
sumscore = sumscore + 60000;
return sumscore;
}
if ((count1 == 2 && count2 == 2 && l >= 1 && r >= 1 && u >= 1 && d >= 1) ||
(count1 == 2 && count3 == 2 && l >= 1 && r >= 1 && ru >= 1 && ld >= 1) ||
(count1 == 2 && count4 == 2 && l >= 1 && r >= 1 && rd >= 1 && lu >= 1) ||
(count2 == 2 && count3 == 2 && u >= 1 && d >= 1 && ru >= 1 && ld >= 1) ||
(count2 == 2 && count4 == 2 && u >= 1 && d >= 1 && lu >= 1 && rd >= 1) ||
(count3 == 2 && count4 == 2 && ru >= 1 && ld >= 1 && lu >= 1 && rd >= 1))
//双活二
{
sumscore = sumscore + 20000;
}
if ((count1 == 2 && l >= 1 && r >= 1) || (count2 == 2 && u >= 1 && d >= 1) ||
(count3 == 2 && ru >= 1 && ld >= 1) || (count4 == 2 && lu >= 1 && rd >= 1))
//单活二
{
sumscore = sumscore + 10000;
}
if ((count1 == 3 && ((l == 0 && r >= 1) || (l >= 1 && r == 0)))
|| (count2 == 3 && ((u == 0 && d >= 1) || (u >= 1 && d == 0)))
|| (count3 == 3 && ((ld == 0 && ru >= 1) || (ld >= 1 && ru == 0)))
|| (count4 == 3 && ((lu == 0 && rd >= 1) || (lu >= 1 && rd == 0))))
{
sumscore = sumscore + 5000; //成三
}
return sumscore;
}
void chesscomputer()//机器落子
{
int i, j, cscore, cscorel, pscore, pscorel, row1, col1, row2, col2;
cscore = pscore = 0; row1 = row2 = col1 = col2 = -1;
//寻找最优落子位置
if (chess_num <= 1)
{
row1 = 7;
col1 = 7;
do
{
row1++;
col1++;
} while (!judge(row1, col1));
Chess_piece(row1, col1);
}
else
{
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
if (judge(i, j))
{
cscorel = chessscore(i, j, p1);
if (cscorel > cscore)
{
cscore = cscorel;
row1 = i;
col1 = j;
}
pscorel = chessscore(i, j, p2);
if (pscorel > pscore)
{
pscore = pscorel;
row2 = i;
col2 = j;
}
}
}
}
if (row1 == -1 && col1 == -1 && row2 == -1 && col2 == -1)//没找到最优解 平局
{
Restart(2,player);
}
else
{
if (chess_num == 3)
{
Chess_piece(row2, col2);
}
else
{
if (cscore > pscore)
{
Chess_piece(row1, col1);
}
else
{
Chess_piece(row2, col2);
}
}
}
}
}
举报