基于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怎么实现人机对战五子棋游戏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。
推荐阅读
-
python(中无效的十进制怎么解决 python怎么转换进制)
python怎么转换进制?Python执行二进制转换:1.十进制到二进制(bin)首先,让让我们看看如何将十进制转换成二进制。我...
-
python怎么清除完全相同的行(python splte如何分隔有多个相同符号的str)
pythonsplte如何分隔有多个相同符号的str?str你的string内容str_(相同的符号)执行完了以后再在相同符号的...
-
python(编程控制电脑关机 如何控制电脑关机)
如何控制电脑关机?可以在电脑的运行窗口中输入输入公式,给电脑可以设置自动关机。1.按开快捷键winr然后打开运行窗口。2.在运行窗...
-
python中的特殊标识符(python 中 标识符中可以有逗号吗)
python中标识符中可以有逗号吗?在python语言中合法的标识符是字母、数字以及_,所以我合法的标识符中肯定不能有逗号if...
-
python(excel 提取数据写入新表 python导入excel数据找不到工作簿)
python导入excel数据找不到工作簿?我可以导入数据后找不到工作,不是因为他的工作没有被转移。什么软件可提取并合并Exce...
-
python中字典定义的四种方法(python global关键字的用法详解)
pythonglobal关键字的用法详解?global标志实际上是目的是提示python讲解器,说被其修饰的变量是全局变量。这样...
-
python(array用法 python如何对两个数组做差处理)
python如何对两个数组做差处理?Python中的列表中的元素肯定不能真接相加,减。t最佳的位置的是将列表装换成Python中的...
-
python多行注释符号怎么表示
python多行注释符号怎么表示这篇文章主要介绍“python多行...
-
python支持的操作系统是什么
python支持的操作系统是什么这篇文章主要介绍“python支持...
-
python如何判断列表为空
python如何判断列表为空这篇文章主要介绍“python如何判断...