这篇文章主要为大家详细介绍了大蟒实现人机对战的五子棋游戏,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
本文实例为大家分享了大蟒实现五子棋游戏的具体代码,供大家参考,具体内容如下
棋盘。巴拉圭
从集合导入命名元组
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的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。