Python 五子棋,python五子棋人机对战
简介实现过程结语使用简介大蟒实现简介及安装版五子棋游戏;
环境:Windows系统python3.8.0
游戏规则:
1 .分两个棋手对战,默认黑手先打;单击国际象棋棋盘上的左键,在该位置绘制黑将棋;
2 .自动切换到国际象棋,在国际象棋棋盘上单击左键,在该位置绘制国际象棋;
3 )交替切换将棋,先连接5子的一方获胜(也可以是横、纵、斜、逆斜四个方向)。
游戏的效果如下。
实现定义必需基本属性和初始值的过程的新文件settings.py类设置(3360 def _ _ init _ ) self):" "初始化的游戏配置""#屏幕宽度高度self.width=700self.height=554#文字的颜色和大小自我。字体大小=14 self。font type= simsun nsimsun #棋盘格数self.number=15#棋盘格的左边界、上边距和间隔自我BD_left=30self .确定游戏是否结束(默认开始)self.game_active=True#)判断下哪一步棋)默认黑子先写)自我。chess _ player=1个自己。prompt _ info=因为当前棋手:黑手 #开始胜负检查已经有一边5步了(self.chess _ player=1self)白手图片路径checker board _ BG= images/checker board _ BG.png BG= images/checker board _ png self .血糖血糖
新文件棋盘. py主要用于绘制背景图和国际象棋格线;importsysimportpygameclass棋盘(:def _ init _(self,ck_settings,screen,position (: self .CK _设置=CK _设置自我。屏幕=屏幕自我。位置=位置#颜色和坐标大小自我。text _ cooon 0)自我。font=py游戏。字体。系统字体(CK _设置。字体类型,CK _设置。fontsize ) #打印保存棋子坐标棋盘=的错误,结束游戏(试:自我BG _ image=pygame.image.load (CK _设置。棋盘)#convert_alpha背景透明自我。white _ image=py游戏。形象。加载(CK _设置。白_棋)。自我。chess _ rect=rror:),e)sys。退出(def draw _ board)self):#)用于存储棋子坐标foriinrange (self .CK设置。号):自己。跳棋.追加自我定位自我.CK品牌自我设定106 . CK设置BD _ topj * self .CK品牌设置. BD _ space)要绘制自我CK _设置。空的儿童健康研究(儿童健康研究的缩写)还必须包含字符x _ text=self。字体。render(chr(ord)a)I)、True、返回自我。text _ color)a-oy _ text=self。字体)自我。text _ color(# 1-15)绘制正常男性染色体组型轴坐标(在棋盘的背景图中绘制)自我. BG _ BG _ font
e.blit(y_text,(self.checkerboard[0][i].x - 20,自我.棋盘[0][i].y - y_text.get_height()/2))#绘制横竖线(在棋盘背景图绘制)pygame.draw.line(self.bg_image,self.text_color,self.checkerboard[0][i],self。棋盘[自我。CK设置。排名第一的游戏。画吧。行(自我。BG _ image,self.text_color,self.checkerboard[i][0],self。棋盘[我][自我。CK设置。数字-1])#绘制棋盘背景图self.screen.blit(self.bg_image,(0,0))
新建文件infopanel.py主要用来绘制棋盘右边提示信息(暂时只有显示下棋方和获胜信息);进口py游戏。font class info panel():def _ _ init _ _(self,ck_settings,screen): 初始化属性 自我。设置=CK _自我设置。屏幕=屏幕自我。screen _ rect=屏幕。get _ rect()#设置文字颜色和字体大小self.info_color=(217,8,10)self。font=py游戏。字体。系统字体(CK _设置。字体类型,16)def draw_info(self,info): 将文字渲染为图像,并定位到右边水平居中 自我。info _ image=self。字体。渲染(信息,真实,自我。info _ color)self。info _ image _ rect=self信息_图像。get _ rect()self。信息_图像_矩形。右=自我。屏幕_矩形。对-(自我。屏幕_矩形。宽度-536-自身。信息_图像_矩形。宽度)/2自我。信息_图像_矩形。top=50 #绘制到屏幕自我。屏幕。blit(自我。info _ image,self.info_image_rect)
新建文件" game_functions.py ",存放跟游戏有关的所有业务逻辑函数;导入系统导入pygame #棋定义更新板(ck设置,cb,索引坐标,位置):更新棋盘信息# 判断棋手(黑棋或白棋)如果CK设置。chess _ player==1:CK设置。prompt _ info=当前棋手:白棋img=CB。black _ image chess _ type= black else:CK设置。prompt _ info=当前棋手:黑棋img=CB。white _ image chess _ type= white 落棋 dropState=check_at(ck_settings,index _ coordinates)if drop state:I,j=index _ coordinate schess _ x=CB。棋盘[j][I].x-CB。chess _ rect。width/2 chess _ y=CB。棋盘[j][I].y - cb.chess_rect.height/2#累计步数(两边合计)ck_settings.win_number=1#落子并转换棋手CK设置。move _ chess。append({ type :chess _ type, coord: position(i,j)})cb.bg_image.blit(img,(chess_x,chess _ y))CK _设置。棋手*=-1 #合计9步开始校验输赢如果CK设置。win _ number=9:check _ stats(CK _设置,(I,j))else:CK _设置。prompt _ info=已经有其他棋子# 检查(我,j)位置是否已占用定义check_at(ck_settings,index _ coordinates):用于ck设置中的项目。move _ chess:if index _ coordinates==item[ coord ]:return false return True def check _ stats(CK设置,位置): 校验四个方向,是否有了输赢 pos_i,pos _ j=pos directes=[(1,0),(0,1),(1,1),(1,-1)]#横、竖、斜、反斜四个方向检查对于direct in directs:line _ checkerboard=[]d _ x,d _ y=direct last=CK设置。move _ chess[-1]line _ ball=[]#存放在一条线上的棋子对于ck_settings.move_chess中的球:#跟最后落子判断if ball[ type ]==last[ type ]:x=ball[ coord ].x - last[coord].x y=球[坐标]。y - last[coord].yif d _ x==0:如果x==0:line _ ball。append(ball[ coord ])if d _ y==0:if y==0:line _ ball。append(ball[ coord ])if x * d _ y==y * d _ x:line _ ball。append(ball[ coord ])if len(line _ ball)=5:#只有5子及以上才继续判断sorted _ line=sorted(line _ ball)for I,item in enumerate(sorted _ line):index=I 4 if index len(sorted _ line):if d _ x==0:y1=item。yy2=sorted _ line[index].y#此点和第5个点比较y值,如相差为四则连成5子如果ABS(y1-y2)==4:CK设置。prompt _ info=黑棋获胜if last[ type ]= black else 白棋获胜否则:x1=项目。xx2=sorted _ line[index].x#此点和第5个点比较x值,如相差为四则连成5子如果ABS(x1-x2)==4:CK设置。prompt _ info=黑棋获胜if last[ type ]= black else 白棋获胜else:break#事件定义检查事件(ck设置,cb,位置):监听事件“”用于py游戏中的事件。事件。get():if事件。type==py游戏.退出:sys。exit()elif事件。type==py游戏.MOUSEBUTTONDOWN:#点击左键如果事件。button==1:pos=py游戏。老鼠。getpos()#获取点击实际坐标# 判断是否溢出x_first=cb.checkerboard[0][0].xx _ last=CB。棋盘[CK _设置。数字-1][CK _设置。数字-1].xy_first=cb.checkerboard[0][0].YY最后=CB。棋盘[CK _设置。数字-1][CK _设置。数字-1].如果pos[0] x_first或pos[0] x_last或pos[1] y_first或y _ last:CK _设置。prompt _ info=落子位置不正确!else:index_coordinates=to _ index(CK _设置,位置)update _ board(CK _设置,cb,index _ coordinates,位置)def to _ index(CK _设置,位置): 实际坐标转换为棋盘下标 I=round((pos[1]-CK _设置。BD _ top)/CK _设置。BD _ space)j=round((pos[0]-CK _设置。BD _ left)/CK _设置。BD _ space)返回(I,j)
新建一个文件gobang.py,主要函数用来初始化程序,同步更新程序的信息;导入pygamefrom settings导入Settingsfrom checkerboard导入Checkerboardfrom collections导入name duple import Game _ functions as gf from info pa Nel infopanel def Run _ Game(): 运行游戏 #初始化游戏屏幕pygame.init()# settimer对象(可以控制游戏循环频率)clock=pygame.time.Clock()#配置实例化CK _ Settings=Settings()Screen=py Game . display . set _ mode((CK _ Settings . width))py Game . display . set _ caption(五子棋游戏)# name 除了可以通过索引访问和迭代外,还可以访问数据position=named tuple (position ,[x , y )#创建实例CB=checker board (CK _设置,屏幕,位置)#实例化面板信息infopanel=infopanel (CK _设置Screen)而ck _ settings.game _ active: #绘制棋盘cb.draw_board()#绘制面板信息info panel . draw _ info(CK _ settings . prompt _ info)#检查玩家事件并更新棋盘gf.check _ events (CK _ settings,cb,position) #使最近绘制的屏幕可见pygame.display.flip()#指定循环频率clock.tick (60)通过时钟对象#循环每秒60次run_game()
在文件gobang.py的目录路径下,执行命令“python gobang.py”弹出窗口,就可以玩了。结论游戏只实现了基本功能,还有很多功能可以优化:
1.添加更详细的面板信息(如倒计时等。)根据实际情况;
2.添加开始游戏按钮,参考前面的python例子;
3.输赢单等。可以参考前面的python例子。
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。