#coding=utf-8
#Author: Yan
#Date: 2012/4/18
MAX_LINE = 15
EMPTY = '0'
MYSELF = '1'
RIVAL = '2'
INIT_MAX = 2147483647
#棋型
FIVE = 1
FOUR = 2
SLEEP_FOUR = 3
THREE = 4
SLEEP_THREE = 5
TWO = 6
SLEEP_TWO = 7
UNANALYSED = 0
ANALYSED = 10
WIN = 1
LOSE = -1
TIE = 0
#越往中心估值越大
NODE_VALUE = \
[ \
[ 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 ] \
]
#对每一种状态所对应的分数
STATE_SCORE = [ 0 , 100000 , 10000 , 5000 , 3000 , 500 , 100 , 50 ]
#记录走的一步
class Node( object ):
def __init__( self ):
self.x = -1
self.y = -1
self.value = 0
self.win = TIE
#评估值类
class Evaluate( object ):
def __init__( self ):
self.numOfState = [ [ 0 for i in range( 0 , 8 ) ] for j in range( 0 , 2 ) ]
def analyseLine( self , player , line ):
enemy = RIVAL if player == MYSELF else MYSELF
current_player = int( player ) - 1
line_size = len( line )
nodeStates = [ UNANALYSED for i in range( 0 , MAX_LINE ) ]
leftEdge = -1
rightEdge = -1
for i in range( 0 , line_size ):
if line[ i ] == player and nodeStates[ i ] == UNANALYSED:
leftEdge = rightEdge = i
#向左搜索
while( leftEdge >= 0 ):
if line[ leftEdge ] != player:
break
leftEdge -= 1
#向右搜索
while( rightEdge < line_size ):
if line[ rightEdge ] != player:
break
rightEdge += 1
leftEdge += 1
rightEdge -= 1
for index in range( leftEdge , rightEdge + 1 , 1 ):
nodeStates[ index ] = ANALYSED
if leftEdge == rightEdge:
nodeStates[ leftEdge ] = UNANALYSED
#如果是5连 xxxxx
if rightEdge - leftEdge > 3:
self.numOfState[ current_player ][ FIVE ] += 1
#如果是4连
elif rightEdge - leftEdge == 3:
#如果是活四
if ( leftEdge > 0 and rightEdge < line_size - 1 and line[ leftEdge - 1 ] == EMPTY and line[ rightEdge + 1 ] == EMPTY ):
self.numOfState[ current_player ][ FOUR ] += 1
#如果是冲四,则有且仅有一侧空,另一侧或者为边界或者为敌方棋子 _xxxxo或者oxxxx_
elif ( ( ( leftEdge == 0 or (leftEdge > 0 and line[ leftEdge - 1 ] == enemy ) ) and (rightEdge < line_size - 1 and line[ rightEdge + 1 ] == EMPTY) ) or ( (rightEdge == line_size - 1 or ( rightEdge < line_size - 1 and line[ rightEdge + 1 ] == enemy )) and ( leftEdge > 0 and line[ leftEdge - 1 ] == EMPTY) ) ):
self.numOfState[ current_player ][ SLEEP_FOUR ] += 1
#如果是3连
elif rightEdge - leftEdge == 2:
#如果是冲四 xxx_x或x_xxx
if ( (leftEdge > 1 and line[ leftEdge - 2 ] == player and nodeStates[ leftEdge - 2 ] == UNANALYSED and line[ leftEdge - 1 ] == EMPTY) or (rightEdge < line_size - 2 and line[ rightEdge + 1 ] == EMPTY and line[ rightEdge + 2 ] == player and nodeStates[ rightEdge + 2 ] == UNANALYSED ) ):
self.numOfState[ current_player ][ SLEEP_FOUR ] += 1
#如果是活三 _xxx__或__xxx_
elif ( leftEdge > 0 and rightEdge < line_size - 1 and line[ leftEdge - 1 ] == EMPTY and line[ rightEdge + 1 ] == EMPTY and ( (leftEdge > 1 and line[ leftEdge - 2 ] == EMPTY) or ( rightEdge < line_size - 2 and line[ rightEdge + 2 ] == EMPTY ) ) ):
self.numOfState[ current_player ][ THREE ] += 1
#如果是眠三
else:
#第一种形式 oxxx__或__xxxo
if( ((leftEdge == 0 or (leftEdge > 0 and line[ leftEdge - 1 ] == enemy)) and ( rightEdge < line_size - 2 and line[ rightEdge + 1 ] == EMPTY and line[ rightEdge + 2 ] == EMPTY )) or ( (leftEdge > 1 and line[ leftEdge - 1 ] == EMPTY and line[ leftEdge - 2 ] == EMPTY) and (rightEdge == line_size - 1 or (rightEdge < line_size - 1 and line[ rightEdge + 1 ] == enemy ) ) ) ):
self.numOfState[ current_player ][ SLEEP_THREE ] += 1
#第二种形式o_xxx_o
elif ( leftEdge > 0 and line[ leftEdge - 1 ] == EMPTY and rightEdge < line_size - 1 and line[ rightEdge + 1 ] == EMPTY and ( leftEdge == 1 or (leftEdge > 1 and line[ leftEdge - 2 ] == enemy)) and ( rightEdge == line_size - 2 or ( rightEdge < line_size - 2 and line[ rightEdge + 2 ] == enemy ))):
self.numOfState[ current_player ][ SLEEP_THREE ] += 1
#如果是2连
elif rightEdge - leftEdge == 1:
#冲四 oxx_xx或xx_xxo
if ( ((leftEdge == 0 or (leftEdge > 0 and line[ leftEdge - 1 ] == enemy )) and ( rightEdge < line_size - 3 and line[ rightEdge + 1 ] == EMPTY and line[ rightEdge + 2 ] == player and nodeStates[ rightEdge + 2 ] == UNANALYSED and line[ rightEdge + 3 ] == player and nodeStates[ rightEdge + 3 ] == UNANALYSED )) or ( (rightEdge == line_size - 1 or (rightEdge < line_size - 1 and line[ rightEdge + 1 ] == enemy )) and leftEdge > 2 and line[ leftEdge - 1 ] == EMPTY and line[ leftEdge - 2 ] == player and nodeStates[ leftEdge - 2 ] == UNANALYSED and line[ leftEdge - 3 ] == player and nodeStates[ leftEdge - 3 ] == UNANALYSED ) ):
self.numOfState[ current_player ][ SLEEP_FOUR ] += 1
#如果是跳活三 _xx_x_或_x_xx_
elif ( leftEdge > 0 and line[ leftEdge - 1 ] == EMPTY and rightEdge < line_size - 1 and line[ rightEdge + 1 ] == EMPTY and ( (rightEdge < line_size - 3 and line[ rightEdge + 2 ] == player and nodeStates[ rightEdge + 2 ] == UNANALYSED and line[ rightEdge + 3 ] == EMPTY ) or ( leftEdge > 2 and line[ leftEdge - 2 ] == player and nodeStates[ leftEdge - 2 ] == UNANALYSED and line[ leftEdge - 3 ] == EMPTY ) )):
self.numOfState[ current_player ][ THREE ] += 1
#如果是眠三 oxx_x_或_x_xxo
elif ( ( (leftEdge == 0 or (leftEdge > 0 and line[ leftEdge - 1 ] == enemy )) and rightEdge < line_size - 3 and line[ rightEdge + 1 ] == EMPTY and line[ rightEdge + 2 ] == player and nodeStates[ rightEdge + 2 ] == UNANALYSED and line[ rightEdge + 3 ] == EMPTY) or ( ( rightEdge == line_size - 1 or ( rightEdge < line_size - 1 and line[ rightEdge + 1 ] == enemy )) and leftEdge > 2 and line[ leftEdge - 1 ] == EMPTY and line[ leftEdge - 2 ] == player and nodeStates[ leftEdge - 2 ] == UNANALYSED an
chess_five.rar_Python五子棋_python fc_python智能_五子棋
版权申诉
15 浏览量
2022-07-15
10:03:31
上传
评论
收藏 3KB RAR 举报
我虽横行却不霸道
- 粉丝: 73
- 资源: 1万+
最新资源
- 基于pygame实现的烟花代码
- mcu-printf关于51单片机使用printf函数进行串口调试的方法
- MySQL和数据表操作
- 微信小程序面试题.pdf
- 基于matlab实现电力系统仿真计算软件包,包括潮流计算,最优潮流计算等.rar
- 基于matlab实现电力系统各种故障波形仿真,单相接地故障,两相间短路,两相接地短路,三相短路等.rar
- 基于matlab实现电动汽车动力性,爬坡性,续驶里程等性能仿真.rar
- Python动态烟花代码.pdf
- 基于matlab实现串口发送接收数据 可配置端口,波特率等 发送可选择ASCII方式或HEX方式
- matlab基于BP神经网络手写字母识别(单一).zip代码9
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈