//UCAS Muradil 2016K009929061 2017-2018 first term's assignment FiveInRow
#include <stdio.h>
#include "data.h"
extern int mode; // 人机对战 = 1 OR 人人对战 = 2
extern int whofirst; // 人先手 = 1 OR 电脑先手 = 2
extern int count;
extern int ci,cj;
int judge(int,int);
void AI(void)
{
int i,j;
int k,x,_x,y,_y; // k用于循环,x,y;_x,_y 用于横纵坐标的扫描,其中前者仅记录 5单元的起始位置,而后者随循环遍历5元组内部
int opposite = 0,mine = 0,empty = 0,record = 0; // 为得分小计准备的
int sco[6] = {0}; // 五个单元得分小计
int score[SIZE][SIZE] = {0}; //对应点的总分
int bestx = 0,besty = 0,bestscore = 0;
int assume; //为判断禁手准备
printf("\nAI思考中...\n");
if(whofirst == 1)//AI执白
{
for(j = 0;j < 15;j++)
{
for(i = 0;i < 15;i++)
{
if(Board[j][i] < 10) // empty
{
// ←→***************************************************************************************************************************
if(i < 4)//左边不满5元组
{
for(x = i + 4;x >= 4;x--)
{
for(_x = x,k = 0;k < 5;k++,_x--)
{
if(Board[j][_x] == WHITEtem || Board[j][_x] == WHITE)
mine++;
if(Board[j][_x] < 10)
empty++;
if(Board[j][_x] == BLACKtem|| Board[j][_x] == BLACK)
opposite++;
}
if (mine + empty == 5)
{
switch (mine)
{
case 1:sco[record++] = 35;break;
case 2:sco[record++] = 800;break;
case 3:sco[record++] = 15000;break;
case 4:sco[record++] = 800000;break;
}
}
if (empty + opposite == 5)
{
switch (opposite)
{
case 1:sco[record++] = 30;break;
case 2:sco[record++] = 795;break;
case 3:sco[record++] = 14995;break;
case 4:sco[record++] = 799995;break;
}
}
empty = 0,mine = 0;opposite = 0;//统计清零
}
}
else if(i > 10)
{
for(x = i - 4;x <= 10;x++)
{
for(_x = x,k = 0;k < 5;k++,_x++)
{
if(Board[j][_x] == WHITEtem || Board[j][_x] == WHITE)
mine++;
if(Board[j][_x] < 10)
empty++;
if(Board[j][_x] == BLACKtem|| Board[j][_x] == BLACK)
opposite++;
}
if (mine + empty == 5)
{
switch (mine)
{
case 1:sco[record++] = 35;break;
case 2:sco[record++] = 800;break;
case 3:sco[record++] = 15000;break;
case 4:sco[record++] = 800000;break;
}
}
if (empty + opposite == 5)
{
switch (opposite)
{
case 1:sco[record++] = 30;break;
case 2:sco[record++] = 795;break;
case 3:sco[record++] = 14995;break;
case 4:sco[record++] = 799995;break;
}
}
empty = 0,mine = 0;opposite = 0;//统计清零
}
}
else
{
for(x = i + 4;x >= i;x--)
{
for(_x = x,k = 0;k < 5;k++,_x--)
{
if(Board[j][_x] == WHITEtem || Board[j][_x] == WHITE)
mine++;
if(Board[j][_x] < 10)
empty++;
if(Board[j][_x] == BLACKtem|| Board[j][_x] == BLACK)
opposite++;
}
if (mine + empty == 5)
{
switch (mine)
{
case 1:sco[record++] = 35;break;
case 2:sco[record++] = 800;break;
case 3:sco[record++] = 15000;break;
case 4:sco[record++] = 800000;break;
}
}
if (empty + opposite == 5)
{
switch (opposite)
{
case 1:sco[record++] = 30;break;
case 2:sco[record++] = 795;break;
case 3:sco[record++] = 14995;break;
case 4:sco[record++] = 799995;break;
}
}
empty = 0,mine = 0;opposite = 0;//统计清零
}
}
for(k = 0; k < record;k++)
score[j][i] += sco[k];
record = 0; //统计清零
//↑↓**********************************************************************************************************
if(j < 4)
{
for(y = j + 4;y >= 4;y--)
{
for(_y = y,k = 0;k < 5 ;k++,_y--)
{
if(Board[_y][i] == WHITEtem || Board[_y][i] == WHITE)
mine++;
if(Board[_y][i] < 10)
empty++;
if(Board[_y][i] == BLACKtem|| Board[_y][i] == BLACK)
opposite++;
}
if (mine + empty == 5)
{
switch (mine)
{
case 1:sco[record++] = 35;break;
case 2:sco[record++] = 800;break;
case 3:sco[record++] = 15000;break;
case 4:sco[record++] = 800000;break;
}
}
if (empty + opposite == 5)
{
switch (opposite)
{
case 1:sco[record++] = 30;break;
case 2:sco[record++] = 795;break;
case 3:sco[record++] = 14995;break;
case 4:sco[record++] = 799995;break;
}
}
empty = 0,mine = 0;opposite = 0;//统计清零
}
}
else if(j > 10)
{
for(y = j - 4;y <= 10;y++)
{
for(_y = y,k = 0;k < 5 ;k++,_y++)
{
if(Board[_y][i] == WHITEtem || Board[_y][i] == WHITE)
mine++;
if(Board[_y][i] < 10)
empty++;
if(Board[_y][i] == BLACKtem|| Board[_y][i] == BLACK)
opposite++;
}
if (mine + empty == 5)
{
switch (mine)
{
case 1:sco[record++] = 35;break;
case 2:sco[record++] = 800;break;
case 3:sco[record++] = 15000;break;
case 4:sco[record++] = 800000;break;
}
}
if (empty + opposite == 5)
{
switch (opposite)
{
case 1:sco[record++] = 30;break;
case 2:sco[record++] = 795;break;
case 3:sco[record++] = 14995;break;
case 4:sco[record++] = 799995;break;
}
}
empty = 0,mine = 0;opposite = 0;//统计清零
}
}
else
{
for(y = j - 4;y <= j;y++)
{
for(_y = y,k = 0;k < 5 ;k++,_y++)
{
if(Board[_y][i] == WHITEtem || Board[_y][i] == WHITE)
mine++;
if(Board[_y][i] < 10)
empty++;
if(Board[_y][i] == BLACKtem|| Board[_y][i] == BLACK)
opposite++;
}
if (mine + empty == 5)
{
switch (mine)
{
case 1:sco[record++] = 35;break;
case 2:sco[record++] = 800;break;
case 3:sco[record++] = 15000;break;
case 4:sco[record++] = 800000;break;
}
}
if (empty + opposite == 5)
{
switch (opposite)
{
case 1:sco[record++] = 30;break;
case 2:sco[record++] = 795;break;
case 3:sco[record++] = 14995;break;
case 4:sco[record++] = 799995;break;
}
}
empty = 0,mine = 0;opposite = 0;//统计清零
}
}
for(k = 0; k < record;k++)
score[j][i] += sco[k];
record = 0; //统计清零
//↗↙**************************************************************************************************************
if((i < 4 && j >= 4) || (j > 10 && i <= 10))
{
for(x = i + 4,y = j - 4;x - 4 >= 0 && y + 4 <= 14;x--,y++)
{
for(_x = x, _y = y,k = 0;k < 5 ;k++,_x--, _y++)
{
if(Board[_y][_x] == WHITEtem || Board[_y][_x] == WHITE)
mine++;
if(Board[_y][_x] < 10)
empty++;
if(Board[_y][_x] == BLACKtem|| Board[_y][_x] == BLACK)
opposite++;
}
if (mine + empty == 5)
{
switch (mine)
{
case 1:sco[record++] = 35;break;
case 2:sco[record++] = 800;break;
case 3:sco[record++] = 15000;bre