pygame实现井字棋游戏过程怎么做好优化
Admin 2022-06-16 群英技术资�
先说一下本期的目标�
首先我们在判断出输赢、平局的时候,只有一个控制台输出,很明显不符合我们游戏的排面(doge
另外,之前的逻辑有一个漏洞,就是玩家一定是先手(就是第一个下棋的人,这个也需要修改)�
还有,有一个短暂的弹窗显示到谁了,游戏的可玩性就会有提高�
最后一个就是,如果点击位置有问题,我们需要显示�
翻车了,之前的逻辑是将九宫��背景颜色写死,而且之前都是直接在之前的基础上渲染,但是我们的弹窗需要在结束后及时撤下来,所以需要我们不断的重新渲染界面�
得,改吧�
首先,我们就不需要使用draw.rect方法创建矩形了,而是使用另外一个pygame.Rect函数�
同时,为了省去九行基本相同的代码,我创建了一个元组来存储�
格子创建最新版�
# 表示九个格子 rect = [0]*9 rect_wh = [ (1,1), (single+3,1), (single*2+5,1), (1,single+3), (single+3,single+3), (single*2+5,single+3), (1,single*2+5), (single+3,single*2+5), (single*2+5,single*2+5) ] for i in range(len(rect)): rect[i] = pygame.Rect(*rect_wh[i],single,single) rect[i] = Lattice(rect[i],screen)
Rect函数�
传入x、y坐标以及高度宽度,就能创建一个rect对象�
这里需要解释的�*rect_wh[i],后面的部分就是在元组列表中找到一个指定的元素,而星号的作用是将元组进行解封装�
a, b = 1, 2
首先,我们将后面的两个变量封装成一个元组,从而赋值给等号前面的部分;
而前面为两个变量,所以我们还需要进行解封装,也就是将一个元组拆分成一个个的变量�
当时记录的笔记:
回到之前的格子问题,还有一个细节就是我们应该怎么显示格子周围的分割线,之前采用的是绘制矩形时自带的,现在因为刷新的问题,不能再使用了(不然每刷新一次创�9个矩形并绘制,这谁顶得住)�
我的办法是:减小了single的大小:
single = width/3 - 1
应该会注意到的,元组列表中我修改�(x,y)的值,这样我们就能绘制出这样的一个图形:
(原创不易,整这个眼睛都快要瞎了,还是没有很完美 -_-||�
bg_color = (0, 0, 0), 黑色�
我们还有个draw.rect方法,传入screen�(255, 255, 255),rect对象,我们就可以显示一个白色的矩形了�
因为宽高小了一点,所以我们就能看到很棒的边界(比我自己画的好多了�
(啊,为什么是黄色的啊,因为我把bg_color改了……,问题不大�
当前的update方法�
def update(): screen.fill((255,228,181)) for i in rect: pygame.draw.rect(screen,(255, 255, 255),i.rect) i.draw()
添加的弹窗:
输赢、平局弹窗�3s后退出程序;
哪方下棋、下棋的位置有问题,0.3s后自己退出�
看过我大战外星人系列应该知道,有一个很大的遗憾就是给定的button类有一点专用,导致我后来只能自己添加按钮类�
这次,我自己写的弹窗类的适用性会更高一些�
popup.py
"""在游戏过程中,添加各种弹�""" import pygame class Popup(): def __init__(self, screen,msg): self.msg = msg self.screen = screen self.bg_color = (0, 0, 0) self.text_color = (230, 230, 230) self.font = pygame.font.SysFont(None,48) self.msg_image = self.font.render(msg,True,self.text_color,self.bg_color) self.msg_rect = self.msg_image.get_rect() self.screen_rect = self.screen.get_rect() self.msg_rect.center = self.screen_rect.center self.screen.blit(self.msg_image,self.msg_rect)
传入一个要显示的信息,然后就可以渲染到屏幕上了�
方法都是之前的,看这篇博宀�
(所以适用性高是不是因为基本上没什么内容……)
第一种情况(以平局为例):
Popup(screen,"draw") pygame.display.flip() time.sleep(3) exit()
调用类(调用一次就完了,不需要再使用实例�
显示屏幕
挂起三秒
退出程�
第二种情况下,我选择"computer choice”作为案例,也就是轮到电脑操作:
Popup(srceeen,"computer choice�) pygame.display.filp() time.sleep(0.3)
但这样,弹窗是不会自己消失的,所以我们还需要在后面跟一个update方法�
哦对了,还有一个没有讲怎么实现
elif event.type == pygame.MOUSEBUTTONDOWN: mouse_x, mouse_y = pygame.mouse.get_pos() # 判断玩家是否点击成功 success = 0 for i in rect: if not i.stats and i.rect.collidepoint(mouse_x,mouse_y): # 如果点击有效,将变量置为1 if not success: update(0.3,"you can't choose here!")
看了一下,基本上只有两种情况,一个是正常的update,另一个是需要跟弹窗和延时�
def update(time_sleep=0,msg=""): screen.fill((255,228,181)) for i in rect: pygame.draw.rect(screen,(255, 255, 255),i.rect) i.draw() if msg: Popup(screen,msg) pygame.display.flip() if time_sleep: time.sleep(time_sleep)
对于正常的刷新,只需要调用update(),如果是需要弹窗和延时的,就自己加变量来处理�
主循环部分:
while not judge: update() for event in pygame.event.get(): if event.type == pygame.QUIT: sys.exit() elif event.type == pygame.MOUSEBUTTONDOWN: mouse_x, mouse_y = pygame.mouse.get_pos() # 判断玩家是否点击成功 success = 0 for i in rect: # 确定玩家下了一� if not i.stats and i.rect.collidepoint(mouse_x,mouse_y): success = 1 # 玩家下棋 i.stats = -1 update() win_or_lose() # 电脑下棋 update(0.3,"Computer choice!") computer() update() win_or_lose() update(0.3,"your choice!") if not success: update(0.3,"you can't choose here!")
computer函数部分�
def computer(): """电脑的回合,随机生成一个位�""" global judge random_num = [i for i in range(len(rect)) if not rect[i].stats] # 没位子下了,平局 if not random_num: update(3,"draw") exit() rect[random.choice(random_num)].stats = 1
判断输赢部分�
def win_or_lose(): global judge stats1 = [i for i in range(len(rect)) if rect[i].stats == 1] stats2 = [i for i in range(len(rect)) if rect[i].stats == -1] win_list = [ [0, 1, 2], [3, 4, 5], [6, 7, 8], [0, 3, 6], [1, 4, 7], [2, 5, 8], [0, 4, 8], [2, 4, 6] ] for i in win_list: if i == [j for j in i if j in stats1]: update(3,"Computer win!") exit() elif i == [j for j in i if j in stats2]: update(3,"You win!") exit()
这个,还是交给随机数�
使用random.randint(0,1)产生一�0/1,来判断先手�
如果先手是电脑,使用(0,8)选择一个将其stats置为1
代码�
def first_hand(): """判断先手,如果随机数�1,则电脑先手""" x = random.randint(0,1) if x: x = random.randint(0,8) rect[x].stats = 1
循环开始前调用一下就行了�
整体的游戏就实现了,很简单的一个,却能加深对pygame模块的使用�
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:[email protected]进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容�
猜你喜欢
这篇文章主要介绍Python绘图库Matplotlib的用法,下文有绘制线型图、子图、散点图等等示例,有这方面学习需求的朋友可以参考学习,希望大家阅读完这篇文章能有所收获,下面就跟随小编来学习一下吧�
本文主要介绍了OpenCV中的分水岭算法、图像金字塔对图像进行分割的方法。文中的示例代码讲解详细,对我们学习OpenCV有一定的帮助,需要的可以参考一�
这篇文章主要介绍了Python自然语言处理之切分算法详�,文中有非常详细的代码示例,对正在学习python的小伙伴们有非常好的帮助,需要的朋友可以参考下
我们在做开发的时候,常会使用进度条效果,这能方便我们在对一些耗时操作的进度观察。那么如何使用python实现进度条效果呢?我们知道Python第三方库很丰富,因此python实现进度条的方式多样,下面我们就一起来了解一下�
程序中与数据相关的操作分为数据的存储与读写。下面将对如何存储与读写不同维度的数据进行讲解�1.数据存储数据通常存储在文件之中,为了方便后续的读写操作,数据通常需要按照约定的组织方式进行存储。一维数据呈线性排列,一般用特殊字符分隔,具体示例如下�
推荐内容
联系我们
24小时售后 � 24小时售后TEL�0668-2555666 售前咨询TEL�400-678-4567 投诉建议TEL�0668-2555999 投诉建议邮箱:t[email protected] 信息安全TEL�0668-2555118 域名空间客服 � 公司总机�0668-2555555 公司传真�0668-2555000Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所� 茂名市群英网络有限公�
增值电信经营许可证 : B1.B2-20140078