五子棋人工智能算法中权值和级别划分的规则????
cbxhd 2003-06-22 08:53:29 CPoint CPenteDlg::UrgentPoint(BYTE byColor)//判断棋盘上哪一点最为紧迫,即适合下子**智能算法**核心
{
int i, i0, j, j0;
BeginWaitCursor();//处理一冗长的过程,等待光标
CPoint ptUrgent[2025], ptInit(-1,-1);
for (i=0; i<2025; ++i)
ptUrgent[i] = ptInit;
// Seed the random-number generator with current time so that
// the numbers will be different every time we run.
//
srand((unsigned)time(NULL));//利用时钟,产生随机数
CPoint ptCurrent;
i0=(rand()%2) ? 0:BOARD_LINE_NUMBER-1;
int nGrade1, nGrade2;
int nUrgent1, nUrgent2, nUrgent;
//从棋盘上搜索,位置随即
for (i=i0; !i0 ? i<BOARD_LINE_NUMBER:i>=0; !i0 ? ++i:--i)//
{
srand((unsigned)time(NULL));
j0=(rand()%2) ? 0:BOARD_LINE_NUMBER-1;
for (j=j0; !j0 ? j<BOARD_LINE_NUMBER:j>=0; !j0 ? ++j:--j)
{
if (m_Board[i][j]==0)
{
ptCurrent.x = i;
ptCurrent.y = j;
//获取己方紧迫度
nGrade1 = Judge(i, j, (char)(byColor+1));
//获取对方紧迫度
nGrade2 = Judge(i, j, (char)(!byColor+1));
//不同紧迫度,赋予不同度权值
if (g_nSkill == 3) //专家级处理
{
switch (nGrade1)
{
case 0 : nUrgent1 = 0; break;
case 1 : nUrgent1 = 2; break;
case 2 : nUrgent1 = 4; break;
case 3 : nUrgent1 = 5; break;
case 4 : nUrgent1 = 8; break;
case 5 : nUrgent1 = 10; break;
case 6 : nUrgent1 = 11; break;
case 7 : nUrgent1 = 12; break;
case 8 : nUrgent1 = 13; break;
case 9 : nUrgent1 = 14; break;
case 10 : nUrgent1 = 15; break;
case 11 : nUrgent1 = 16; break;
case 12 : nUrgent1 = 17; break;
case 13 : nUrgent1 = 18; break;
case 14 : nUrgent1 = 19; break;
case 15 : nUrgent1 = 20; break;
case 16 : nUrgent1 = 32; break;
case 17 : nUrgent1 = 34; break;
case 18 : nUrgent1 = 36; break;
case 19 : nUrgent1 = 38; break;
case 20 : nUrgent1 = 40; break;
default : nUrgent1 = 40; break;
}
switch (nGrade2)
{
case 0 : nUrgent2 = 1; break;
case 1 : nUrgent2 = 3; break;
case 2 : nUrgent2 = 6; break;
case 3 : nUrgent2 = 7; break;
case 4 : nUrgent2 = 9; break;
case 5 : nUrgent2 = 21; break;
case 6 : nUrgent2 = 22; break;
case 7 : nUrgent2 = 23; break;
case 8 : nUrgent2 = 24; break;
case 9 : nUrgent2 = 25; break;
case 10 : nUrgent2 = 26; break;
case 11 : nUrgent2 = 27; break;
case 12 : nUrgent2 = 28; break;
case 13 : nUrgent2 = 29; break;
case 14 : nUrgent2 = 30; break;
case 15 : nUrgent2 = 31; break;
case 16 : nUrgent2 = 33; break;
case 17 : nUrgent2 = 35; break;
case 18 : nUrgent2 = 37; break;
case 19 : nUrgent2 = 39; break;
case 20 : nUrgent2 = 41; break;
default : nUrgent2 = 41; break;
}
}
if (g_nSkill == 2)//中级处理
{
switch (nGrade1)
{
case 0 : nUrgent1 = 0; break;
case 1 : nUrgent1 = 2; break;
case 2 : nUrgent1 = 4; break;
case 3 : nUrgent1 = 5; break;
case 4 : nUrgent1 = 8; break;
case 5 :
case 6 :
case 7 : nUrgent1 = 10; break;
case 8 :
case 9 :
case 10 : nUrgent1 = 11; break;
case 11 : nUrgent1 = 12; break;
case 12 : nUrgent1 = 13; break;
case 13 :
case 14 :
case 15 : nUrgent1 = 14; break;
case 16 : nUrgent1 = 20; break;
case 17 : nUrgent1 = 22; break;
case 18 : nUrgent1 = 24; break;
case 19 : nUrgent1 = 26; break;
case 20 : nUrgent1 = 28; break;
default : nUrgent1 = 28; break;
}
switch (nGrade2)
{
case 0 : nUrgent2 = 1; break;
case 1 : nUrgent2 = 3; break;
case 2 : nUrgent2 = 6; break;
case 3 : nUrgent2 = 7; break;
case 4 : nUrgent2 = 9; break;
case 5 :
case 6 :
case 7 : nUrgent2 = 15; break;
case 8 :
case 9 :
case 10 : nUrgent2 = 16; break;
case 11 : nUrgent2 = 17; break;
case 12 : nUrgent2 = 18; break;
case 13 :
case 14 :
case 15 : nUrgent2 = 19; break;
case 16 : nUrgent2 = 21; break;
case 17 : nUrgent2 = 23; break;
case 18 : nUrgent2 = 25; break;
case 19 : nUrgent2 = 27; break;
case 20 : nUrgent2 = 29; break;
default : nUrgent2 = 29; break;
}
}
if (g_nSkill == 1)//处级处理
{
switch (nGrade1)
{
case 0 : nUrgent1 = 0; break;
case 1 : nUrgent1 = 2; break;
case 2 : nUrgent1 = 4; break;
case 3 : nUrgent1 = 5; break;
case 4 : nUrgent1 = 8; break;
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 : nUrgent1 = 10; break;
case 11 :
case 12 :
case 13 :
case 14 :
case 15 : nUrgent1 = 11; break;
case 16 : nUrgent1 = 14; break;
case 17 : nUrgent1 = 16; break;
case 18 : nUrgent1 = 18; break;
case 19 : nUrgent1 = 20; break;
case 20 : nUrgent1 = 22; break;
default : nUrgent1 = 22; break;
}
switch (nGrade2)
{
case 0 : nUrgent2 = 1; break;
case 1 : nUrgent2 = 3; break;
case 2 : nUrgent2 = 6; break;
case 3 : nUrgent2 = 7; break;
case 4 : nUrgent2 = 9; break;
case 5 :
case 6 :
case 7 :
case 8 :
case 9 :
case 10 : nUrgent2 = 12; break;
case 11 :
case 12 :
case 13 :
case 14 :
case 15 : nUrgent2 = 13; break;
case 16 : nUrgent2 = 15; break;
case 17 : nUrgent2 = 17; break;
case 18 : nUrgent2 = 19; break;
case 19 : nUrgent2 = 21; break;
case 20 : nUrgent2 = 23; break;
default : nUrgent2 = 23; break;
}
}
nUrgent = min(nUrgent1,nUrgent2)*45 + max(nUrgent1, nUrgent2);
ptUrgent[nUrgent] = ptCurrent;
}
}
}
//获取具有最小紧迫度的点
for (i=0; i<2025; ++i)
if (ptUrgent[i] != ptInit)
break;
EndWaitCursor();//结束等待光标
if (ptUrgent[i] == ptInit)
{
CString str1, str2;
str1.LoadString(IDS_DRAW_CHINESE);
str2.LoadString(IDS_TITLE_CHINESE);
MessageBox(str1, str2); //平局
}
return ptUrgent[i];//返回最小的点
}