📄 ai.cpp
字号:
// AI.cpp: implementation of the AI class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "AI.h"
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
AI::AI()
{ // 0 - 4
// 0 5 15000 15000 15000
// 5 - 8
// 100 3000 5000 100
// 9 - 12
// 500 1500 500 100
// 13 - 17
// 5000 500 100 30 6
m_pParentWnd=NULL;
for (int i=0; i<FIVE_Y; i++)
for (int j=0; j<FIVE_X; j++)
m_nboard[i][j] = FIVE_NULL;
}
AI::~AI()
{
}
BOOL AI::IfWin(char nSide)
{
int x, y;
// -
for(y=0; y<FIVE_Y; y++)
for(x=0; x<FIVE_X-4; x++)
if( m_nboard[x ][y] == nSide &&
m_nboard[x+1][y] == nSide &&
m_nboard[x+2][y] == nSide &&
m_nboard[x+3][y] == nSide &&
m_nboard[x+4][y] == nSide )
return TRUE;
// |
for(y=0; y<FIVE_Y-4; y++)
for(x=0; x<FIVE_X; x++)
if( m_nboard[x][y ] == nSide &&
m_nboard[x][y+1] == nSide &&
m_nboard[x][y+2] == nSide &&
m_nboard[x][y+3] == nSide &&
m_nboard[x][y+4] == nSide )
return TRUE;
// /
for(y=4; y<FIVE_Y; y++)
for(x=0; x<FIVE_X-4; x++)
if( m_nboard[x ][y ] == nSide &&
m_nboard[x+1][y-1] == nSide &&
m_nboard[x+2][y-2] == nSide &&
m_nboard[x+3][y-3] == nSide &&
m_nboard[x+4][y-4] == nSide )
return TRUE;
/* \ */
for(y=0; y<FIVE_Y-4; y++)
for(x=0; x<FIVE_X-4; x++)
if( m_nboard[x ][y ] == nSide &&
m_nboard[x+1][y+1] == nSide &&
m_nboard[x+2][y+2] == nSide &&
m_nboard[x+3][y+3] == nSide &&
m_nboard[x+4][y+4] == nSide )
return TRUE;
return FALSE;
}
void AI::Think(int nSteps, char nSide)
{
int x,y;
int nx, ny;
/*
nSteps--;
if(nSteps==0) return;//the last step
for(int j=0; j<FIVE_X; j++)
for(int k=0; k<FIVE_Y; k++)
if(m_nboard[j][k]==FIVE_NULL){
m_nboard[j][k]=nSide;
Think(0, nSide);
m_nboard[j][k]=FIVE_NULL;
}
*/
//set normal region
for(x=0; x<FIVE_X; x++)
for(y=0; y<FIVE_Y; y++)
m_nVals[x][y]=2;
//set weak region
for(x=0; x<FIVE_X; x++){
m_nVals[x][0]=m_nValuesSetting[0];
m_nVals[x][FIVE_Y-1]=m_nValuesSetting[0];
}
for(y=0; y<FIVE_Y; y++){
m_nVals[0][y]=m_nValuesSetting[0];
m_nVals[FIVE_X-1][y]=m_nValuesSetting[0];
}
//set strong point
nx=(FIVE_X-1)/3;
ny=(FIVE_Y-1)/3;
for(x=nx; x<FIVE_X-3; x+=nx)
for(y=ny; y<FIVE_Y-3; y+=ny){
m_nVals[x][y]=m_nValuesSetting[1];
}
//attack * 3
for(x=0; x<3; x++){
Think00(nSide); Think01(nSide);
Think02(nSide); Think03(nSide);
Think04(nSide); Think05(nSide);
Think06(nSide); Think07(nSide);
Think08(nSide); Think09(nSide);
Think10(nSide); Think11(nSide);
}
nSide = nSide==FIVE_WHITE?FIVE_BLACK:FIVE_WHITE;
//defend * 2
for(x=0; x<2; x++){
Think00(nSide); Think01(nSide);
Think02(nSide); Think03(nSide);
Think04(nSide); Think05(nSide);
Think06(nSide); Think07(nSide);
Think08(nSide); Think09(nSide);
Think10(nSide); Think11(nSide);
}
}
void AI::SetParentWnd(CWnd *pWnd)
{
m_pParentWnd=pWnd;
}
void AI::BestPos(int &x, int &y)
{
int nx,ny;
int i,j;
for(i=0; i<FIVE_X; i++)
for(j=0; j<FIVE_Y; j++)
if(m_nboard[i][j]==FIVE_NULL){
nx=i; ny=j;
i=FIVE_X;//exit right now
j=FIVE_Y;
}
for(i=0; i<FIVE_X; i++)
for(j=0; j<FIVE_Y; j++){
if(m_nVals[i][j]>m_nVals[nx][ny] && m_nboard[i][j]==FIVE_NULL)
{nx=i; ny=j;}
else if (m_nVals[i][j]==m_nVals[nx][ny] && m_nboard[i][j]==FIVE_NULL && rand()%2)
{nx=i; ny=j;}
}
x=nx;
y=ny;
}
void AI::Play(int &x, int &y, int nCurSide)
{
Think(2, nCurSide);
BestPos(x,y);
//m_nboard[x][y]=nCurSide;
}
void AI::Think01(char nSide)
{
/* LPARAM lp = 50;
WPARAM wp = 0;
::SendMessage(m_pParentWnd->m_hWnd , USER_MESSAGE_PROGRESS, wp, lp);*/
int x,y;
//*@***15000 | value2
for(x=0; x<FIVE_X; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x][y ]==nSide &&
m_nboard[x][y+1]==FIVE_NULL &&
m_nboard[x][y+2]==nSide &&
m_nboard[x][y+3]==nSide &&
m_nboard[x][y+4]==nSide )
m_nVals[x][y+1]+=m_nValuesSetting[2];
if( m_nboard[x][y ]==nSide &&
m_nboard[x][y+1]==nSide &&
m_nboard[x][y+2]==nSide &&
m_nboard[x][y+3]==FIVE_NULL &&
m_nboard[x][y+4]==nSide )
m_nVals[x][y+3]+=m_nValuesSetting[2];
}
//*@***15000 --
for(y=0; y<FIVE_Y; y++)
for(x=0; x<FIVE_X-4; x++){
if( m_nboard[x ][y]==nSide &&
m_nboard[x+1][y]==FIVE_NULL &&
m_nboard[x+2][y]==nSide &&
m_nboard[x+3][y]==nSide &&
m_nboard[x+4][y]==nSide )
m_nVals[x+1][y]+=m_nValuesSetting[2];
if( m_nboard[x ][y]==nSide &&
m_nboard[x+1][y]==nSide &&
m_nboard[x+2][y]==nSide &&
m_nboard[x+3][y]==FIVE_NULL &&
m_nboard[x+4][y]==nSide )
m_nVals[x+3][y]+=m_nValuesSetting[2];
}
//*@***15000 /
for(x=0; x<FIVE_X-4; x++)
for(y=4; y<FIVE_Y; y++){
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y-1]==FIVE_NULL &&
m_nboard[x+2][y-2]==nSide &&
m_nboard[x+3][y-3]==nSide &&
m_nboard[x+4][y-4]==nSide )
m_nVals[x+1][y-1]+=m_nValuesSetting[2];
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y-1]==nSide &&
m_nboard[x+2][y-2]==nSide &&
m_nboard[x+3][y-3]==FIVE_NULL &&
m_nboard[x+4][y-4]==nSide )
m_nVals[x+3][y-3]+=m_nValuesSetting[2];
}
//*@***15000 \
for(x=0; x<FIVE_X-4; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y+1]==FIVE_NULL &&
m_nboard[x+2][y+2]==nSide &&
m_nboard[x+3][y+3]==nSide &&
m_nboard[x+4][y+4]==nSide )
m_nVals[x+1][y+1]+=m_nValuesSetting[2];
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y+1]==nSide &&
m_nboard[x+2][y+2]==nSide &&
m_nboard[x+3][y+3]==FIVE_NULL &&
m_nboard[x+4][y+4]==nSide )
m_nVals[x+3][y+3]+=m_nValuesSetting[2];
}
}
void AI::Think02(char nSide)
{
int x,y;
//@****15000 | value3
for(x=0; x<FIVE_X; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x][y ]==FIVE_NULL &&
m_nboard[x][y+1]==nSide &&
m_nboard[x][y+2]==nSide &&
m_nboard[x][y+3]==nSide &&
m_nboard[x][y+4]==nSide )
m_nVals[x][y]+=m_nValuesSetting[3];
if( m_nboard[x][y ]==nSide &&
m_nboard[x][y+1]==nSide &&
m_nboard[x][y+2]==nSide &&
m_nboard[x][y+3]==nSide &&
m_nboard[x][y+4]==FIVE_NULL )
m_nVals[x][y+4]+=m_nValuesSetting[3];
}
//@****15000 --
for(y=0; y<FIVE_Y; y++)
for(x=0; x<FIVE_X-4;x++){
if( m_nboard[x ][y]==FIVE_NULL &&
m_nboard[x+1][y]==nSide &&
m_nboard[x+2][y]==nSide &&
m_nboard[x+3][y]==nSide &&
m_nboard[x+4][y]==nSide )
m_nVals[x][y]+=m_nValuesSetting[3];
if( m_nboard[x ][y]==nSide &&
m_nboard[x+1][y]==nSide &&
m_nboard[x+2][y]==nSide &&
m_nboard[x+3][y]==nSide &&
m_nboard[x+4][y]==FIVE_NULL )
m_nVals[x+4][y]+=m_nValuesSetting[3];
}
//@****15000 /
for(x=0; x<FIVE_X-4; x++)
for(y=4; y<FIVE_Y; y++){
if( m_nboard[x ][y ]==FIVE_NULL &&
m_nboard[x+1][y-1]==nSide &&
m_nboard[x+2][y-2]==nSide &&
m_nboard[x+3][y-3]==nSide &&
m_nboard[x+4][y-4]==nSide )
m_nVals[x][y]+=m_nValuesSetting[3];
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y-1]==nSide &&
m_nboard[x+2][y-2]==nSide &&
m_nboard[x+3][y-3]==nSide &&
m_nboard[x+4][y-4]==FIVE_NULL )
m_nVals[x+4][y-4]+=m_nValuesSetting[3];
}
//@****15000 \
for(x=0; x<FIVE_X-4; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x ][y ]==FIVE_NULL &&
m_nboard[x+1][y+1]==nSide &&
m_nboard[x+2][y+2]==nSide &&
m_nboard[x+3][y+3]==nSide &&
m_nboard[x+4][y+4]==nSide )
m_nVals[x][y]+=m_nValuesSetting[3];
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y+1]==nSide &&
m_nboard[x+2][y+2]==nSide &&
m_nboard[x+3][y+3]==nSide &&
m_nboard[x+4][y+4]==FIVE_NULL )
m_nVals[x+4][y+4]+=m_nValuesSetting[3];
}
}
void AI::Think03(char nSide)
{//**@**15000
int x,y;
//**_**15000 | value4
for(x=0; x<FIVE_X; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x][y ]==nSide &&
m_nboard[x][y+1]==nSide &&
m_nboard[x][y+2]==FIVE_NULL &&
m_nboard[x][y+3]==nSide &&
m_nboard[x][y+4]==nSide )
m_nVals[x][y+2]+=m_nValuesSetting[4];
}
//**_**15000 --
for(y=0; y<FIVE_Y; y++)
for(x=0; x<FIVE_X-4; x++){
if( m_nboard[x ][y]==nSide &&
m_nboard[x+1][y]==nSide &&
m_nboard[x+2][y]==FIVE_NULL &&
m_nboard[x+3][y]==nSide &&
m_nboard[x+4][y]==nSide )
m_nVals[x+2][y]+=m_nValuesSetting[4];
}
//**_**15000 /
for(x=0; x<FIVE_X-4; x++)
for(y=4; y<FIVE_Y; y++){
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y-1]==nSide &&
m_nboard[x+2][y-2]==FIVE_NULL &&
m_nboard[x+3][y-3]==nSide &&
m_nboard[x+4][y-4]==nSide )
m_nVals[x+2][y-2]+=m_nValuesSetting[4];
}
//**_**15000 \
for(x=0; x<FIVE_X-4; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x ][y ]==nSide &&
m_nboard[x+1][y+1]==nSide &&
m_nboard[x+2][y+2]==FIVE_NULL &&
m_nboard[x+3][y+3]==nSide &&
m_nboard[x+4][y+4]==nSide )
m_nVals[x+2][y+2]+=m_nValuesSetting[4];
}
}
void AI::Think04(char nSide)
{//?***? 100 value5
//@***@ 3000 value6
int x,y;
//_***? 100 _***_ 3000 |
for(x=0; x<FIVE_X; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x][y+1]==nSide &&
m_nboard[x][y+2]==nSide &&
m_nboard[x][y+3]==nSide){//?***?
m_nVals[x][y ]+=m_nValuesSetting[5];
m_nVals[x][y+4]+=m_nValuesSetting[5];
if(m_nboard[x][y ]==FIVE_NULL && m_nboard[x][y+4]==FIVE_NULL){
m_nVals[x][y ]+=m_nValuesSetting[6];
m_nVals[x][y+4]+=m_nValuesSetting[6];
}
}
}
//_***? 100 _***_ 3000 --
for(x=0; x<FIVE_X-4; x++)
for(y=0; y<FIVE_Y; y++){
if( m_nboard[x+1][y]==nSide &&
m_nboard[x+2][y]==nSide &&
m_nboard[x+3][y]==nSide){//?***?
m_nVals[x ][y]+=m_nValuesSetting[5];
m_nVals[x+4][y]+=m_nValuesSetting[5];
if(m_nboard[x ][y]==FIVE_NULL && m_nboard[x+4][y]==FIVE_NULL){
m_nVals[x ][y]+=m_nValuesSetting[6];
m_nVals[x+4][y]+=m_nValuesSetting[6];
}
}
}
//_***? 100 _***_ 3000 /
for(x=0; x<FIVE_X-4; x++)
for(y=4; y<FIVE_Y; y++){
if( m_nboard[x+1][y-1]==nSide &&
m_nboard[x+2][y-2]==nSide &&
m_nboard[x+3][y-3]==nSide){//?***?
m_nVals[x ][y ]+=m_nValuesSetting[5];
m_nVals[x+4][y-4]+=m_nValuesSetting[5];
if(m_nboard[x ][y ]==FIVE_NULL && m_nboard[x+4][y-4]==FIVE_NULL){
m_nVals[x ][y ]+=m_nValuesSetting[6];
m_nVals[x+4][y-4]+=m_nValuesSetting[6];
}
}
}
// \
//_***?100 _***_3000
for(x=0; x<FIVE_X-4; x++)
for(y=0; y<FIVE_Y-4; y++){
if( m_nboard[x+1][y+1]==nSide &&
m_nboard[x+2][y+2]==nSide &&
m_nboard[x+3][y+3]==nSide){//?***?
m_nVals[x ][y ]+=m_nValuesSetting[5];
m_nVals[x+4][y+4]+=m_nValuesSetting[5];
if(m_nboard[x ][y ]==FIVE_NULL && m_nboard[x+4][y+4]==FIVE_NULL){
m_nVals[x ][y ]+=m_nValuesSetting[6];
m_nVals[x+4][y+4]+=m_nValuesSetting[6];
}
}
}
}
void AI::Think05(char nSide)
{//_*@**_ 5000 value7
//@*_**@ 100 value8
int x,y;
//_*_**_ 5000/1300 |
for(x=0; x<FIVE_X; x++)
for(y=0; y<FIVE_Y-5; y++){
if( m_nboard[x][y ]==FIVE_NULL &&
m_nboard[x][y+1]==nSide &&
m_nboard[x][y+2]==FIVE_NULL &&
m_nboard[x][y+3]==nSide &&
m_nboard[x][y+4]==nSide &&
m_nboard[x][y+5]==FIVE_NULL){
m_nVals[x][y+2]+=m_nValuesSetting[7];
m_nVals[x][y ]+=m_nValuesSetting[8];
m_nVals[x][y+5]+=m_nValuesSetting[8];
}
if( m_nboard[x][y ]==FIVE_NULL &&
m_nboard[x][y+1]==nSide &&
m_nboard[x][y+2]==nSide &&
m_nboard[x][y+3]==FIVE_NULL &&
m_nboard[x][y+4]==nSide &&
m_nboard[x][y+5]==FIVE_NULL){
m_nVals[x][y+3]+=m_nValuesSetting[7];
m_nVals[x][y ]+=m_nValuesSetting[8];
m_nVals[x][y+5]+=m_nValuesSetting[8];
}
}
//_*_**_ 5000/3000 --
for(y=0; y<FIVE_Y; y++)
for(x=0; x<FIVE_X-5; x++){
if( m_nboard[x ][y]==FIVE_NULL &&
m_nboard[x+1][y]==nSide &&
m_nboard[x+2][y]==FIVE_NULL &&
m_nboard[x+3][y]==nSide &&
m_nboard[x+4][y]==nSide &&
m_nboard[x+5][y]==FIVE_NULL ){
m_nVals[x+2][y]+=m_nValuesSetting[7];
m_nVals[x ][y]+=m_nValuesSetting[8];
m_nVals[x+5][y]+=m_nValuesSetting[8];
}
if( m_nboard[x ][y]==FIVE_NULL &&
m_nboard[x+1][y]==nSide &&
m_nboard[x+2][y]==nSide &&
m_nboard[x+3][y]==FIVE_NULL &&
m_nboard[x+4][y]==nSide &&
m_nboard[x+5][y]==FIVE_NULL){
m_nVals[x+3][y]+=m_nValuesSetting[7];
m_nVals[x ][y]+=m_nValuesSetting[8];
m_nVals[x+5][y]+=m_nValuesSetting[8];
}
}
//_*_**_ 5000/3000 /
for(x=0; x<FIVE_X-5; x++)
for(y=5; y<FIVE_Y; y++){
if( m_nboard[x ][y ]==FIVE_NULL &&
m_nboard[x+1][y-1]==nSide &&
m_nboard[x+2][y-2]==FIVE_NULL &&
m_nboard[x+3][y-3]==nSide &&
m_nboard[x+4][y-4]==nSide &&
m_nboard[x+5][y-5]==FIVE_NULL){
m_nVals[x+2][y-2]+=m_nValuesSetting[7];
m_nVals[x ][y ]+=m_nValuesSetting[8];
m_nVals[x+5][y-5]+=m_nValuesSetting[8];
}
if( m_nboard[x ][y ]==FIVE_NULL &&
m_nboard[x+1][y-1]==nSide &&
m_nboard[x+2][y-2]==nSide &&
m_nboard[x+3][y-3]==FIVE_NULL &&
m_nboard[x+4][y-4]==nSide &&
m_nboard[x+5][y-5]==FIVE_NULL){
m_nVals[x+3][y-3]+=m_nValuesSetting[7];
m_nVals[x ][y ]+=m_nValuesSetting[8];
m_nVals[x+5][y-5]+=m_nValuesSetting[8];
}
}
//_*_**_ 5000/3000 \
for(x=0; x<FIVE_X-5; x++)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -