基于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=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怎么实现人机对战五子棋游戏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
Python 3.12 新特性解析:模式匹配增强与性能优化实战
-
Lightly IDE 深度评测:轻量级 Python 开发工具是否适合团队协作?
-
VS Code 自定义配置:JSON 文件修改、代码片段与任务自动化脚本
-
Python 虚拟环境选择:venv、conda、poetry 的适用场景对比
-
PyCharm+GitHub Copilot:Python 开发中 AI 辅助编码的最佳实践
-
PyCharm 无法识别虚拟环境?5 步排查 Python 解释器配置问题
-
数据科学工具链:Jupyter Notebook+RStudio+Python 的协同工作流
-
Python 3.12 新特性:模式匹配增强与性能改进实战
-
Lightly IDE 适合谁?轻量级 Python 开发工具深度评测
-
Python IDE 终极对比:PyCharm vs VS Code vs Jupyter Notebook