#include "WuZiQiAI.h"
using namespace std;
vector<TupleStruct> g_findAllTupleResults;
const int g_emptyTupleScore = 7;
const int g_mixtureTupleScore =0;
const int g_ownTupleScore[5] = {0, 35, 800, 15000, 800000};
const int g_rivalTupleScore[5] = {0, 15, 400, 1800, 100000};
int WuZiQiAI::thinkingByAI(const int side, const int board[HORIZONTAL_GRID_NUM][VERTICAL_GRID_NUM])
{
BestPos bestPos;
for (int i = 0; i < HORIZONTAL_GRID_NUM; i++)
{
for (int j =0; j < VERTICAL_GRID_NUM; j++)
{
if (board[i][j] == 0)
{
int iScore = calculateScoreForPos(side, i, j, board);
if (iScore == bestPos.iScore)
{
//当分数一样的时候,产生随机数,50%的几率最佳点换位置
int randNum = rand()%10;
if (randNum >4)
{
bestPos.iScore = iScore;
bestPos.x = i;
bestPos.y = j;
}
continue;
}else if (iScore > bestPos.iScore){
bestPos.iScore = iScore;
bestPos.x = i;
bestPos.y = j;
continue;
}
}
}
}
return bestPos.x * 100 + bestPos.y;
}
int WuZiQiAI::calculateScoreForPos(const int side, const int x, const int y, const int board[HORIZONTAL_GRID_NUM][VERTICAL_GRID_NUM])
{
//先得到点(x,y)的所有单元集合
findAllTupleByPos(x, y);
//计算该点得分
int iScore = 0;
int size = g_findAllTupleResults.size();
for (int i = 0; i< size; i++)
{
int iEmptyGrid = 0;
int iWhiteChess = 0;
int iBlackChess =0;
for (int k =0; k< 5; k++)
{
int iValue = board[g_findAllTupleResults.at(i).x[k]][g_findAllTupleResults.at(i).y[k]];
if (iValue ==0)
{
iEmptyGrid++;
}else if (iValue ==1){
iWhiteChess++;
}else if (iValue ==2){
iBlackChess++;
}
}
//根据本单元内的棋子计算该单元分数
if (iEmptyGrid == 5)
{
iScore += g_emptyTupleScore;
}else if (iBlackChess != 0 && iWhiteChess !=0){
iScore += g_mixtureTupleScore;
}else{
if ((iWhiteChess != 0 && side ==1) ||(iBlackChess != 0 && side ==2))
{
iScore += g_ownTupleScore[5 - iEmptyGrid];
}else{
iScore += g_rivalTupleScore[5 - iEmptyGrid];
}
}
}
return iScore;
}
void WuZiQiAI::findAllTupleByPos(const int x,const int y)
{
g_findAllTupleResults.clear();
//寻找水平方向的单元组合;从左到右
for (int i = x -4; i <= x; i++)
{
if(i >10)
{
int a =10;
}
if (i < 0 || i+4 >= HORIZONTAL_GRID_NUM)
{
continue;
}else{
TupleStruct tuple;
for (int k =0; k< 5; k++)
{
tuple.x[k] = i+k;
tuple.y[k] = y;
}
g_findAllTupleResults.push_back(tuple);
}
}
//寻找竖直方向的单元组合,从下到上
for (int j = y -4; j <=y; j++)
{
if (j <0 || j+4 >= VERTICAL_GRID_NUM)
{
continue;
}else{
TupleStruct tuple;
for (int k =0; k< 5; k++)
{
tuple.x[k] = x;
tuple.y[k] = j+k;
}
g_findAllTupleResults.push_back(tuple);
}
}
//寻找斜着的单元组合
//1:↗
int i = x-4;
int j = y-4;
while (i <=x && j<=y)
{
if (i < 0 || i+4 >= HORIZONTAL_GRID_NUM
||j <0 || j+4 >= VERTICAL_GRID_NUM)
{
i++;
j++;
continue;
}else{
TupleStruct tuple;
for (int k =0; k< 5; k++)
{
tuple.x[k] = i+k;
tuple.y[k] = j+k;
}
g_findAllTupleResults.push_back(tuple);
}
i++;
j++;
}
//2:↖
i = x+4;
j = y-4;
while (i >=x && j<=y)
{
if (i-4 < 0 || i>= HORIZONTAL_GRID_NUM
||j <0 || j+4 >= VERTICAL_GRID_NUM)
{
i--;
j++;
continue;
}else{
TupleStruct tuple;
for (int k =0; k< 5; k++)
{
tuple.x[k] = i-k;
tuple.y[k] = j+k;
}
g_findAllTupleResults.push_back(tuple);
}
i--;
j++;
}
}