/*
*Copyright (C) 2011 @HIT FooToo Lab
*Author: 时彦辉
*Create Date: 2011-4-15
*/
#include "evaluate.h"
//每个位置所占用的分值,越往外越小
int nodeValue[ MAX_LINE ][ MAX_LINE ] =
{
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 } ,
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 } ,
{ 0 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 4 , 5 , 5 , 5 , 5 , 5 , 4 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 6 , 6 , 5 , 4 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 7 , 6 , 5 , 4 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 4 , 5 , 6 , 6 , 6 , 5 , 4 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 4 , 5 , 5 , 5 , 5 , 5 , 4 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 4 , 4 , 4 , 4 , 4 , 4 , 4 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 2 , 1 , 0 } ,
{ 0 , 1 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 2 , 1 , 0 } ,
{ 0 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 0 } ,
{ 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 , 0 }
} ;
//对每一种状态所对应的分数
int stateScore[ 8 ] = { 0 , 100000 , 10000 , 5000 , 3000 , 500 , 100 , 50 } ;
Evaluate::Evaluate()
{
memset( numOfState , 0 , sizeof( numOfState ) ) ;//初始化为0
}
//对单独的一行进行分析,line表示一行的棋子情况
void Evaluate::analyseLine( char player , string line )
{
char enemy = ( player == MYSELF ) ? RIVAL : MYSELF ;//对手
int current_player = player - '1' ;//将字符转换成int,以利于计算当前选手各种状态的个数
int line_size = line.size() ;//一行总共的个数
int nodeStates[ MAX_LINE ] ;//记录各个点时候被分析过
int leftEdge , rightEdge ;//标志一下搜索的过程中连续的左右边界
memset( nodeStates , UNANALYSED , sizeof( nodeStates ) ) ;//初始化为未被分析过
for ( int i = 0 ; i < line_size ; ++ i )
{
if ( line[ i ] == player && nodeStates[ i ] == UNANALYSED )
{
leftEdge = rightEdge = i ;
//向左搜索
while( leftEdge >= 0 )
{
if ( line[ leftEdge ] != player )
{
break ;
}
leftEdge -- ;
}
//向右搜索
while( rightEdge < line_size )
{
if ( line[ rightEdge ] != player )
{
break ;
}
rightEdge ++ ;
}
++ leftEdge , --rightEdge ;
for( int index = leftEdge ; index <= rightEdge ; ++ index )
{
nodeStates[ index ] = ANALYSED ;
}
if ( leftEdge == rightEdge )
{
nodeStates[ leftEdge ] = UNANALYSED ;
}
//如果是五连 xxxxx
if ( rightEdge - leftEdge > 3 )
{
numOfState[ current_player ][ FIVE ] ++ ;
}
//如果是4连
if ( rightEdge - leftEdge == 3 )
{
//如果是活四 _xxxx_
if ( leftEdge > 0 && rightEdge < line_size - 1 && line[ leftEdge - 1 ] == EMPTY && line[ rightEdge + 1 ] == EMPTY)
{
numOfState[ current_player ][ FOUR ] ++ ;
}
//如果是冲四,则有且仅有一侧空,另一侧或者为边界或者为敌方棋子 _xxxxo或者oxxxx_
else if ( ( ( leftEdge == 0 || (leftEdge > 0 && line[ leftEdge - 1 ] == enemy ) ) && (rightEdge < line_size - 1 && line[ rightEdge + 1 ] == EMPTY) ) || ( (rightEdge == line_size - 1 || ( rightEdge < line_size - 1 && line[ rightEdge + 1 ] == enemy )) && ( leftEdge > 0 && line[ leftEdge - 1 ] == EMPTY) ))
{
numOfState[ current_player ][ SLEEP_FOUR ] ++ ;
}
}
//如果是3连
else if ( rightEdge - leftEdge == 2 )
{
//如果是冲四 xxx_x或x_xxx
if ( (leftEdge > 1 && line[ leftEdge - 2 ] == player && nodeStates[ leftEdge - 2 ] == UNANALYSED && line[ leftEdge - 1 ] == EMPTY) || (rightEdge < line_size - 2 && line[ rightEdge + 1 ] == EMPTY && line[ rightEdge + 2 ] == player && nodeStates[ rightEdge + 2 ] == UNANALYSED ) )
{
numOfState[ current_player ][ SLEEP_FOUR ] ++ ;
}
//如果是活三 _xxx__或__xxx_
else if ( leftEdge > 0 && rightEdge < line_size - 1 && line[ leftEdge - 1 ] == EMPTY && line[ rightEdge + 1 ] == EMPTY && ( (leftEdge > 1 && line[ leftEdge - 2 ] == EMPTY) || ( rightEdge < line_size - 2 && line[ rightEdge + 2 ] == EMPTY ) ) )
{
numOfState[ current_player ][ THREE ] ++ ;
}
//如果是眠三
else
{
//第一种形式 oxxx__或__xxxo
if( ((leftEdge == 0 || (leftEdge > 0 && line[ leftEdge - 1 ] == enemy)) && ( rightEdge < line_size - 2 && line[ rightEdge + 1 ] == EMPTY && line[ rightEdge + 2 ] == EMPTY )) || ( (leftEdge > 1 && line[ leftEdge - 1 ] == EMPTY && line[ leftEdge - 2 ] == EMPTY) && (rightEdge == line_size - 1 || (rightEdge < line_size - 1 && line[ rightEdge + 1 ] == enemy ) ) ) )
{
numOfState[ current_player ][ SLEEP_THREE ] ++ ;
}
//第二种形式o_xxx_o
else if ( leftEdge > 0 && line[ leftEdge - 1 ] == EMPTY && rightEdge < line_size - 1 && line[ rightEdge + 1 ] == EMPTY && ( leftEdge == 1 || (leftEdge > 1 && line[ leftEdge - 2 ] == enemy)) && ( rightEdge == line_size - 2 || ( rightEdge < line_size - 2 && line[ rightEdge + 2 ] == enemy )))
{
numOfState[ current_player ][ SLEEP_THREE ] ++ ;
}
}
}
//如果是二连
else if ( rightEdge - leftEdge == 1 )
{
//冲四 oxx_xx或xx_xxo
if ( ((leftEdge == 0 || (leftEdge > 0 && line[ leftEdge - 1 ] == enemy )) && ( rightEdge < line_size - 3 && line[ rightEdge + 1 ] == EMPTY && line[ rightEdge + 2 ] == player && nodeStates[ rightEdge + 2 ] == UNANALYSED && line[ rightEdge + 3 ] == player && nodeStates[ rightEdge + 3 ] == UNANALYSED ))
|| ( (rightEdge == line_size - 1 || (rightEdge < line_size - 1 && line[ rightEdge + 1 ] == enemy )) && leftEdge > 2 && line[ leftEdge - 1 ] == EMPTY && line[ leftEdge - 2 ] == player && nodeStates[ leftEdge - 2 ] == UNANALYSED && line[ leftEdge - 3 ] == player && nodeStates[ leftEdge - 3 ] == UNANALYSED ) )
{
numOfState[ current_player ][ SLEEP_FOUR ] ++ ;
}
//如果是跳活三 _xx_x_或_x_xx_
else if ( leftEdge > 0 && line[ leftEdge - 1 ] == EMPTY && rightEdge < line_size - 1 && line[ rightEdge + 1 ] == EMPTY && ( (rightEdge < line_size - 3 && line[ rightEdge + 2 ] == player && nodeStates[ rightEdge + 2 ] == UNANALYSED && line[ rightEdge + 3 ] == EMPTY ) || ( leftEdge > 2 && line[ leftEdge - 2 ] == player && nodeStates[ leftEdge - 2 ] == UNANALYSED && line[ leftEdge - 3 ] == EMPTY ) ))
{
numOfState[ current_player ][ THREE ] ++ ;
}
//如果是眠三 oxx_x_或_x_xxo
else if ( ( (leftEdge == 0 || (leftEdge > 0 && line[ leftEdge - 1 ] == enemy )) && rightEdge < line_size - 3 && line[ rightEdge + 1 ] == EMPTY && line[ rightEdge + 2 ]
没有合适的资源?快使用搜索试试~ 我知道了~
资源推荐
资源详情
资源评论
收起资源包目录
C五子棋.zip (34个子文件)
Renju-master
peopvscomp.h 2KB
buildserver.cpp 4KB
tcpserver.cpp 667B
image.qrc 256B
search.h 1KB
peopvspeop.cpp 10KB
widget.h 617B
configuration.h 1KB
peopvscomp.cpp 8KB
findserver.cpp 4KB
widget.ui 441B
buildserver.h 1024B
evaluate.h 1KB
Renju.pro 719B
my_stl.h 5KB
resource
image
dota_background.bmp 3.52MB
white.bmp 2KB
black.bmp 2KB
chessboard.bmp 1.35MB
sound
choose.wav 2KB
lose.wav 8KB
win.wav 11KB
move.wav 2KB
sound.qrc 238B
evaluate.cpp 14KB
main.cpp 254B
configuration.cpp 3KB
findserver.h 956B
search.cpp 5KB
peopvspeop.h 2KB
tcpserver.h 402B
readme 121B
Renju.pro.user 14KB
widget.cpp 2KB
共 34 条
- 1
资源评论
huangyueranbbc
- 粉丝: 587
- 资源: 214
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功