基于Python怎么实现人机对战五子棋游戏

基于Python怎么实现人机对战五子棋游戏

本文小编为大家详细介绍“基于Python怎么实现人机对战五子棋游戏”,内容详细,步骤清晰,细节处理妥当,希望这篇“基于Python怎么实现人机对战五子棋游戏”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

人人对战

游戏规则:p1为黑子,p2为白子,黑子先手,一方达到五子相连即为获胜。

动态演示

源码分享

cheackboard.py

定义黑白子,落子位置以及获胜规则。

fromcollectionsimportnamedtupleChessman=namedtuple('Chessman','NameValueColor')Point=namedtuple('Point','XY')BLACK_CHESSMAN=Chessman('黑子',1,(45,45,45))WHITE_CHESSMAN=Chessman('白子',2,(219,219,219))offset=[(1,0),(0,1),(1,1),(1,-1)]classCheckerboard:def__init__(self,line_points):self._line_points=line_pointsself._checkerboard=[[0]*line_pointsfor_inrange(line_points)]def_get_checkerboard(self):returnself._checkerboardcheckerboard=property(_get_checkerboard)#判断是否可落子defcan_drop(self,point):returnself._checkerboard[point.Y][point.X]==0defdrop(self,chessman,point):"""落子:paramchessman::parampoint:落子位置:return:若该子落下之后即可获胜,则返回获胜方,否则返回None"""print(f'{chessman.Name}({point.X},{point.Y})')self._checkerboard[point.Y][point.X]=chessman.Valueifself._win(point):print(f'{chessman.Name}获胜')returnchessman#判断是否赢了def_win(self,point):cur_value=self._checkerboard[point.Y][point.X]forosinoffset:ifself._get_count_on_direction(point,cur_value,os[0],os[1]):returnTruedef_get_count_on_direction(self,point,value,x_offset,y_offset):count=1forstepinrange(1,5):x=point.X+step*x_offsety=point.Y+step*y_offsetif0<=x<self._line_pointsand0<=y<self._line_pointsandself._checkerboard[y][x]==value:count+=1else:breakforstepinrange(1,5):x=point.X-step*x_offsety=point.Y-step*y_offsetif0<=x<self._line_pointsand0<=y<self._line_pointsandself._checkerboard[y][x]==value:count+=1else:breakreturncount>=5

人人对战.py

导入模块

如出现模块的错误,在pycharm终端输入如下指令。

pip install 相应模块 -i https://pypi.douban.com/simple

importsysimportpygamefrompygame.localsimport*importpygame.gfxdrawfrom小游戏.五子棋.checkerboardimportCheckerboard,BLACK_CHESSMAN,WHITE_CHESSMAN,Point

设置棋盘和棋子参数

SIZE=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+3Checkerboard_Color=(0xE3,0x92,0x65)#棋盘颜色BLACK_COLOR=(0,0,0)WHITE_COLOR=(255,255,255)RED_COLOR=(200,30,30)BLUE_COLOR=(30,30,200)RIGHT_INFO_POS_X=SCREEN_HEIGHT+Stone_Radius2*2+10

局内字体设置

defprint_text(screen,font,x,y,text,fcolor=(255,255,255)):imgText=font.render(text,True,fcolor)screen.blit(imgText,(x,y))defmain():pygame.init()screen=pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))pygame.display.set_caption('五子棋')font1=pygame.font.SysFont('SimHei',32)font2=pygame.font.SysFont('SimHei',72)fwidth,fheight=font2.size('黑方获胜')checkerboard=Checkerboard(Line_Points)cur_runner=BLACK_CHESSMANwinner=Nonecomputer=AI(Line_Points,WHITE_CHESSMAN)black_win_count=0white_win_count=0

落子循坏体

whileTrue:foreventinpygame.event.get():ifevent.type==QUIT:sys.exit()elifevent.type==KEYDOWN:ifevent.key==K_RETURN:ifwinnerisnotNone:winner=Nonecur_runner=BLACK_CHESSMANcheckerboard=Checkerboard(Line_Points)computer=AI(Line_Points,WHITE_CHESSMAN)elifevent.type==MOUSEBUTTONDOWN:ifwinnerisNone:pressed_array=pygame.mouse.get_pressed()ifpressed_array[0]:mouse_pos=pygame.mouse.get_pos()click_point=_get_clickpoint(mouse_pos)ifclick_pointisnotNone:ifcheckerboard.can_drop(click_point):winner=checkerboard.drop(cur_runner,click_point)ifwinnerisNone:cur_runner=_get_next(cur_runner)computer.get_opponent_drop(click_point)AI_point=computer.AI_drop()winner=checkerboard.drop(cur_runner,AI_point)ifwinnerisnotNone:white_win_count+=1cur_runner=_get_next(cur_runner)else:black_win_count+=1else:print('超出棋盘区域')

画棋盘

def_draw_checkerboard(screen):#填充棋盘背景色screen.fill(Checkerboard_Color)#画棋盘网格线外的边框pygame.draw.rect(screen,BLACK_COLOR,(Outer_Width,Outer_Width,Border_Length,Border_Length),Border_Width)#画网格线foriinrange(Line_Points):pygame.draw.line(screen,BLACK_COLOR,(Start_Y,Start_Y+SIZE*i),(Start_Y+SIZE*(Line_Points-1),Start_Y+SIZE*i),1)forjinrange(Line_Points):pygame.draw.line(screen,BLACK_COLOR,(Start_X+SIZE*j,Start_X),(Start_X+SIZE*j,Start_X+SIZE*(Line_Points-1)),1)#画星位和天元foriin(3,9,15):forjin(3,9,15):ifi==j==9:radius=5else:radius=3#pygame.draw.circle(screen,BLACK,(Start_X+SIZE*i,Start_Y+SIZE*j),radius)pygame.gfxdraw.aacircle(screen,Start_X+SIZE*i,Start_Y+SIZE*j,radius,BLACK_COLOR)pygame.gfxdraw.filled_circle(screen,Start_X+SIZE*i,Start_Y+SIZE*j,radius,BLACK_COLOR)

运行框返回落子坐标

def_get_clickpoint(click_pos):pos_x=click_pos[0]-Start_Xpos_y=click_pos[1]-Start_Yifpos_x<-Inside_Widthorpos_y<-Inside_Width:returnNonex=pos_x//SIZEy=pos_y//SIZEifpos_x%SIZE>Stone_Radius:x+=1ifpos_y%SIZE>Stone_Radius:y+=1ifx>=Line_Pointsory>=Line_Points:returnNonereturnPoint(x,y)

执行文件

if__name__=='__main__':main()

人机对战

动态演示

读到这里,这篇“基于Python怎么实现人机对战五子棋游戏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。

发布于 2022-05-19 10:36:03
收藏
分享
海报
0 条评论
29
上一篇:C++怎么实现softmax函数 下一篇:android怎么实现简单的矩形裁剪框
目录

    推荐阅读

    0 条评论

    本站已关闭游客评论,请登录或者注册后再评论吧~

    忘记密码?

    图形验证码