⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ai.cpp

📁 用Microsoft .net编的游戏
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// 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 + -