基于python怎么实现人机对战五子棋游戏-亚博电竞手机版
开发技术
2022年05月19日 10:36
2
基于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怎么实现人机对战五子棋游戏”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注恰卡编程网行业资讯频道。
展开全文