,,python实现人机对战的五子棋游戏

,,python实现人机对战的五子棋游戏

这篇文章主要为大家详细介绍了大蟒实现人机对战的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了大蟒实现五子棋游戏的具体代码,供大家参考,具体内容如下

棋盘。巴拉圭

从集合导入命名元组

Chessman=namedtuple('Chessman ',' Name Value Color ')

Point=namedtuple('Point ',' X Y ')

BLACK_CHESSMAN=Chessman('黑子', 1, (45, 45, 45))

白色棋子=棋子('白子', 2, (219, 219, 219))

offset=[(1,0),(0,1),(1,1),(1,-1)]

类别棋盘:

def __init__(self,line_points):

自我。_线点=线点

自我棋盘=[[0]* line _ points for _ in range(line _ points)]

def _get_checkerboard(self):

回归自我。_棋盘

棋盘=属性(_ get _棋盘)

# 判断是否可落子

def can_drop(自身,点):

回归自我。_棋盘[点y][点. X]==0

定义下降(自己,棋子,点):

'''

落子

:参数棋子:

:参数点:落子位置

:返回:若该子落下之后即可获胜,则返回获胜方,否则返回没有人

'''

打印(f ' {棋子。姓名}({点. X},{点. Y})')

自我。_棋盘[点y][点. X]=棋子。价值

如果自我. win(点):

打印(f ' {棋子。姓名}获胜)

返回棋子

# 判断是否赢了

def _win(self,point):

当前值=自身。_棋盘[点y][点. X]

对于os in offset:

如果自我. get_count_on_direction(point,cur_value,os[0],os[1]):

返回真实的

定义_获取_计数_方向(自身,点,值,x_offset,y_offset):

计数=1

对于范围(1,5)中的步长:

x=点10 . x步长* x _偏移

y=点10 . y步长* y _偏移

如果0=x自我100 . 00 _行_点和0=y自我._line_points和自我._棋盘[y][x]==值:

计数=1

否则:

破裂

对于范围(1,5)中的步长:

x=点10 . x步* x _偏移

y=点10 . y步长* y _偏移

如果0=x自我100 . 00 _行_点和0=y自我._line_points和自我._棋盘[y][x]==值:

计数=1

否则:

破裂

返回计数=5

ManAndMachine.py

导入系统

随机导入

导入pygame

从pygame.locals导入*

导入pygame.gfxdraw

从棋盘导入棋盘,黑色棋子,白色棋子,偏移,点

尺寸=30 #棋盘每个点时间的间隔

Line_Points=19 #棋盘每行/每列点数

Outer_Width=20 #棋盘外宽度

Border_Width=4 #边框宽度

Inside_Width=4 #边框跟实际的棋盘之间的间隔

Border _ Length=SIZE *(Line _ Points-1)Inside _ Width * 2 Border _ Width #边框线的长度

Start _ X=Start _ Y=Outer _ Width int(Border _ Width/2)Inside _ Width #网格线起点(左上角)坐标

SCREEN _ HEIGHT=SIZE *(Line _ Points-1)Outer _ Width * 2 Border _ Width Inside _ Width * 2 #游戏屏幕的高

SCREEN_WIDTH=SCREEN_HEIGHT 200 #游戏屏幕的宽

Stone_Radius=SIZE //2 - 3 #棋子半径

Stone_Radius2=SIZE //2 3

Checkerboard_Color=(0xE3,0x92,0x65) #棋盘颜色

黑色_颜色=(0,0,0)

白色_颜色=(255,255,255)

红色=(200,30,30)

BLUE_COLOR=(30,30,200)

RIGHT _ INFO _ POS _ X=SCREEN _ HEIGHT Stone _ radius 2 * 2 10

def print_text(screen,font,x,y,text,fcolor=(255,255,255)):

imgText=font.render(text,True,fcolor)

screen.blit(imgText,(x,y))

def main():

pygame.init()

屏幕=py游戏。展示。set _ mode((屏幕_宽度,屏幕_高度))

pygame.display.set_caption('五子棋)

font 1=py游戏。字体。系统字体(“sim hei”,32)

font 2=py游戏。字体。系统字体(“sim hei”,72)

fwidth,FH height=font 2。大小('黑方获胜)

棋盘=棋盘(线点)

cur_runner=黑色_棋子

获胜者=无

电脑=AI(线_点,白_棋子)

black _ win _计数=0

怀特赢数=0

虽然正确:

对于pygame.event.get()中的事件:

如果event.type==退出:

sys.exit()

elif event.type==KEYDOWN:

if event.key==K_RETURN:

如果获胜者不是无:

获胜者=无

cur_runner=黑色_棋子

棋盘=棋盘(线点)

电脑=AI(线_点,白_棋子)

elif事件。type==按下鼠标按钮:

如果获胜者是无:

pressed _ array=py游戏。老鼠。get _ pressed()

如果按下_array[0]:

mouse_pos=pygame.mouse.get_pos()

click_point=_get_clickpoint(鼠标位置)

如果点击_点不为无:

如果棋盘。can _ drop(点击_点):

赢家=棋盘。drop(cur _ runner,click_point)

如果获胜者是无:

cur _ runner=_ get _ next(cur _ runner)

电脑。get _ opposite _ drop(点击_点)

AI_point=电脑. AI_drop()

赢家=棋盘。drop(cur _ runner,AI_point)

如果获胜者不是无:

怀特赢数=1

cur _ runner=_ get _ next(cur _ runner)

否则:

black _ win _计数=1

否则:

打印('超出棋盘区域)

# 画棋盘

_绘制_棋盘(屏幕)

# 画棋盘上已有的棋子

对于我,枚举中的行(棋盘.棋盘):

对于j,枚举中的单元格(行):

如果cell==BLACK_CHESSMAN .价值:

_绘制_棋子(屏幕,点(j,I),黑色_棋子。颜色)

elif单元格==白棋_棋子。价值:

_绘制_棋子(屏幕,点(j,I),白色_棋子。颜色)

_draw_left_info(screen,font1,cur_runner,black_win_count,white_win_count)

如果获胜者:

print_text(screen,font2,(SCREEN_WIDTH - fwidth)//2,(SCREEN _ HEIGHT-FH HEIGHT)//2,胜者。'名称'获胜红色)

pygame.display.flip()

def _get_next(cur_runner):

如果cur_runner==BLACK_CHESSMAN:

返回白色棋子

否则:

返回黑色_棋子

# 画棋盘

def _draw_checkerboard(屏幕):

# 填充棋盘背景色

屏幕填充(棋盘颜色)

# 画棋盘网格线外的边框

pygame.draw.rect(screen,BLACK_COLOR,(Outer_Width,Outer_Width,Border_Length,Border_Length),Border_Width)

# 画网格线

对于范围内的我(线点):

pygame.draw.line(屏幕,黑色_彩色,

(Start_Y,Start_Y SIZE * i),

(Start_Y SIZE * (Line_Points - 1),Start_Y SIZE * i),

1)

对于范围内的j(线点):

pygame.draw.line(屏幕,黑色_彩色,

(Start_X SIZE * j,Start_X),

(Start_X SIZE * j,Start_X SIZE * (Line_Points - 1)),

1)

# 画星位和天元

对于(3,9,15)中的我:

对于(3,9,15)中的j:

如果i==j==9:

半径=5

否则:

半径=3

# pygame.draw.circle(屏幕,黑色、(Start_X SIZE * i,Start_Y SIZE * j),半径)

pygame.gfxdraw.aacircle(screen,Start_X SIZE * i,Start_Y SIZE * j,radius,BLACK_COLOR)

pygame。gfx抽奖。填充圆(屏幕,开始X尺寸* i,开始Y尺寸* j,半径,黑色)

# 画棋子

def _draw_chessman(屏幕、点、石头_颜色):

# pygame.draw.circle(screen,stone_color,(Start_X SIZE * point .x,Start_Y SIZE * point .y),石头_半径)

pygame.gfxdraw.aacircle(屏幕,Start_X大小*点x,Start_Y SIZE * point .y,石头半径,石头颜色)

pygame.gfxdraw.filled_circle(屏幕,Start_X大小*点x,Start_Y SIZE * point .y,石头半径,石头颜色)

# 画左侧信息显示

定义_绘制_左侧_信息(屏幕、字体、cur_runner、black_win_count、white_win_count):

_draw_chessman_pos(screen,(SCREEN_HEIGHT Stone_Radius2,Start_X Stone_Radius2),BLACK_CHESSMAN .颜色)

_draw_chessman_pos(screen,(SCREEN_HEIGHT Stone_Radius2,Start_X Stone_Radius2 * 4),WHITE_CHESSMAN .颜色)

print_text(screen,font,RIGHT_INFO_POS_X,Start_X 3,’玩家蓝色)

print_text(screen,font,RIGHT_INFO_POS_X,Start_X Stone_Radius2 * 3 3,’电脑蓝色)

print_text(screen,font,SCREEN_HEIGHT,SCREEN_HEIGHT - Stone_Radius2 * 8,'战况:',蓝色)

_draw_chessman_pos(screen,(SCREEN_HEIGHT Stone_Radius2,SCREEN _ HEIGHT-int(Stone _ radius 2 * 4.5)),BLACK_CHESSMAN .颜色)

_draw_chessman_pos(screen,(SCREEN_HEIGHT Stone_Radius2,SCREEN_HEIGHT - Stone_Radius2 * 2),WHITE_CHESSMAN .颜色)

print_text(screen,font,RIGHT_INFO_POS_X,SCREEN _ HEIGHT-int(Stone _ radius 2 * 5.5)3,f'{black_win_count}胜蓝色)

print_text(screen,font,RIGHT_INFO_POS_X,SCREEN_HEIGHT - Stone_Radius2 * 3 3,f'{white_win_count}胜蓝色)

def _draw_chessman_pos(屏幕、位置、石头_颜色):

pygame.gfxdraw.aacircle(screen,pos[0],pos[1],Stone_Radius2,stone_color)

py游戏。gfx抽奖。实心圆(屏幕,位置[0],位置[1],石头半径2,石头颜色)

# 根据鼠标点击位置,返回游戏区坐标

def _get_clickpoint(click_pos):

pos_x=click_pos[0] - Start_X

pos_y=click_pos[1] - Start_Y

如果位置x-内部宽度或位置你-内部宽度:

不返回

x=pos_x //SIZE

y=pos_y //SIZE

如果pos_x %大小石头_半径:

x=1

如果pos_y %大小石头_半径:

y=1

如果x=线点或y=线点:

不返回

返回点(x,y)

人工智能类:

def __init__(self,line_points,chessman):

自我。_线点=线点

自我. my=棋子

自我。_对手=黑_棋子如果棋子==白_棋子否则白_棋子

自我棋盘=[[0]* line _ points for _ in range(line _ points)]

def get _对手_drop(自己,点):

自我。_棋盘[点y][点. X]=自我。_对手。价值

def AI_drop(self):

点=无

分数=0

因为我在范围内(自我.行_点):

对于范围内的j(自我.行_点):

如果自我。_棋盘[j][i]==0:

_分数=自我. get_point_score(Point(i,j))

如果得分分数:

分数=_分数

点=点(我,j)

elif _score==score and _score 0:

r=random.randint(0,100)

如果r % 2==0:

点=点(我,j)

自我。_棋盘[点y][点. X]=自我。_我的。价值

返回点

def _get_point_score(self,point):

分数=0

对于os in offset:

分数=自我. get_direction_score(point,os[0],os[1])

返回分数

定义_获取_方向_得分(自身,点,x_offset,y_offset):

计数=0 #落子处我方连续子数

_count=0 #落子处对方连续子数

空格=无#我方连续子中有无空格

_space=无#对方连续子中有无空格

两者=0 #我方连续子两端有无阻挡

_both=0 #对方连续子两端有无阻挡

# 如果是一表示是边上是我方子,2 表示敌方子

旗帜=自我. get_stone_color(点x_offset,y_offset,True)

如果旗!=0:

对于范围(1,6)中的步长:

x=点10 . x步长* x _偏移

y=点10 . y步长* y _偏移

如果0=x自我100 . 00 _行_点和0=y自我._line_points:

如果flag==1:

如果自我。_棋盘[y][x]==自身。_我的。价值:

计数=1

如果空格为假:

空格=真

elif self ._棋盘[y][x]==自身。_对手。价值:

_both=1

破裂

否则:

如果空间为空:

空格=假

否则:

break #遇到第二个空格退出

否则如果标志==2:

如果自我。_棋盘[y][x]==自身。_我的。价值:

_both=1

破裂

elif self ._棋盘[y][x]==自身。_对手。价值:

_count=1

如果_space为假:

_space=True

否则:

如果_space为无:

_space=False

否则:

破裂

否则:

# 遇到边也就是阻挡

如果flag==1:

两者=1

否则如果标志==2:

_both=1

如果空格为假:

空格=无

如果_space为假:

_space=无

_flag=self ._get_stone_color(point,-x_offset,-y_offset,True)

if _flag!=0:

对于范围(1,6)中的步长:

x=点10 . x步* x _偏移

y=点10 . y步长* y _偏移

如果0=x自我100 . 00 _行_点和0=y自我._line_points:

if _flag==1:

如果自我。_棋盘[y][x]==自身。_我的。价值:

计数=1

如果空格为假:

空格=真

elif self ._棋盘[y][x]==自身。_对手。价值:

_both=1

破裂

否则:

如果空间为空:

空格=假

否则:

break #遇到第二个空格退出

elif _flag==2:

如果自我。_棋盘[y][x]==自身。_我的。价值:

_both=1

破裂

elif self ._棋盘[y][x]==自身。_对手。价值:

_count=1

如果_space为假:

_space=True

否则:

如果_space为无:

_space=False

否则:

破裂

否则:

# 遇到边也就是阻挡

if _flag==1:

两者=1

elif _flag==2:

_both=1

分数=0

如果计数==4:

分数=10000

elif _count==4:

分数=9000

否则如果计数==3:

如果两者都==0:

分数=1000

elif both==1:

分数=100

否则:

分数=0

elif _count==3:

if _both==0:

分数=900

elif _both==1:

得分=90

否则:

分数=0

否则如果计数==2:

如果两者都==0:

分数=100

elif both==1:

得分=10

否则:

分数=0

elif _count==2:

if _both==0:

得分=90

elif _both==1:

得分=9

否则:

分数=0

否则如果计数==1:

得分=10

elif _count==1:

得分=9

否则:

分数=0

如果空格或_空格:

得分/=2

返回分数

# 判断指定位置处在指定方向上是我方子、对方子、空

定义_获取_石头_颜色(自身,点,x_offset,y_offset,next):

x=点X x _偏移量

y=点Y y _偏移

如果0=x自我100 . 00 _行_点和0=y自我._line_points:

如果自我。_棋盘[y][x]==自身。_我的。价值:

返回一

elif self ._棋盘[y][x]==自身。_对手。价值:

返回2

否则:

如果接下来:

回归自我. get_stone_color(点(x,y),x _偏移,y _偏移,False)

否则:

返回0

否则:

返回0

if __name__=='__main__ ':

主()

效果图:

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: