电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術文章
文章詳情頁

pygame實現井字棋之第二步邏輯實現

瀏覽:3日期:2022-06-20 14:15:54
一、前言

我們在上一篇博客中實現了九宮格的繪制,為我們打下了基礎。這次我們來實現基本的邏輯,比如判斷輸贏、玩家和電腦分別下棋的邏輯。

二、下棋2.1 玩家

我們之前在Lattice類中,有一個stats變量來表示格子的狀態,

# 0表示初始,1表示個人-1表示電腦self.stats = 0

所以下棋本質上就是修改這個變量。首先,我們是用鼠標點擊的方式來實現下棋的,所以應當修改事件響應部分:

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() for i in rect:# 確定玩家下了一步if not i.stats and i.rect.collidepoint(mouse_x,mouse_y):i.stats = -1

pygame.event模塊主要是負責游戲中的事件。第一個事件表示點擊界面的右上角關閉鍵,退出程序;第二個事件是鼠標點擊,可以使用pygame.mouse.get_pos得到點擊位置。因為之前的格子(Lattice類)中有一個rect類的實例,我們可以使用collidepoint函數,傳入坐標判斷是在哪個格子中。隨后我們需要判斷格子有沒有被占用,沒被占用,那么我們就可以修改stats。

2.2 電腦

對于電腦來說,實際情況差不多,不過我們選擇了隨機生成的方式:

def computer(): '''電腦的回合,隨機生成一個位置''' global judge random_num = [i for i in range(len(rect)) if not rect[i].stats] # 沒位子下了,平局 if not random_num:judge = 1print('draw')exit() rect[random.choice(random_num)].stats = 1 return #result = Button('your choice')

我們先給出了所有沒有被占用的格子,使用列表解析形成列表。如果列表為空,沒位子下了,就說明平局(在每一次落子之后,都會有輸贏的判斷,后面再說);反之,我們就用random.choice函數,在列表中選擇一個元素(這個元素為Lattice類的實例),將其stats修改為1。

judge這個,是判斷是否結束游戲的標志,初始為0。

三、輸贏判斷

這個可能會麻煩一點。這里,我的想法是每一個格子都有一個下標,將所有可能贏的格子組合的下標都寫出來。

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] ]

pygame實現井字棋之第二步邏輯實現

隨后,我們同樣使用列表解析,將所有stats為1和-1的組成兩個列表:

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]

那么問題來了,stats1、2中,可能只有部分元素在win_list中,瞬間找到了被leecode支配的恐懼。

for i in win_list: # 取出每一個可能獲勝的條件if i == [j for j in i if j in stats1]: judge = 1 print('Computer win!') exit()elif i == [j for j in i if j in stats2]: judge = 1 print('You win!') exit()

我們的邏輯是對每一個獲勝可能組合,分別取出每一個元素,并在stats列表中查找,如果都能找到,列表解析式的結果就一定和原先的獲勝組合相同,此時我們就可以判斷一方獲勝。

四、一人一子

井字棋和五子棋的玩法差不多,所以必須做到在玩家下子后,電腦能下子。(正常電腦的反應,可是比玩家快多了。

當然可以設置一個變量,0、1分別表示誰該下子了,但是我有更好的選擇——在玩家下子后進行輸出。

if not i.stats and i.rect.collidepoint(mouse_x,mouse_y):# 玩家下棋i.stats = -1win_or_lose()# 電腦下棋computer()win_or_lose()

還有一個問題,就是不管哪方下子了,我們都需要對輸贏進行判斷。

五、顯示問題

當你完成了上述操作,會發現,其實屏幕上什么都看不到。因為我們還沒有顯示格子的圖標。這里我選擇使用經典的’x’、‘o’,用渲染文字的方式實現。(這部分也可以自己找圖貼上去)

渲染文字的步驟:

self.font = pygame.font.SysFont設置字體 self.font.render函數,生成一個含有文本信息的圖像 將圖像使用get_rect方法處理成矩形,進行對齊 使用blit方法渲染

lattice.py文件:

import pygameclass Lattice(): def __init__(self,rect,screen):self.rect = rectself.screen = screen# 0表示初始,1表示個人-1表示電腦self.stats = 0# 文本顏色self.text_color = (30, 30, 30)# 背景顏色,也就是我們screen渲染的顏色self.bg_color = (255, 255, 255)# 設置字體self.font = pygame.font.SysFont(None,48) def draw(self):# 按照狀態賦值文本信息msg = ''if self.stats == -1: msg = 'x'elif self.stats == 1: msg = 'o'if msg: self.msg_image = self.font.render(msg,True,self.text_color,self.bg_color) self.msg_rect = self.msg_image.get_rect() self.msg_rect.center = self.rect.center self.screen.blit(self.msg_image,self.msg_rect)

render函數:傳入參數:文本信息,Boolean(控制曲線是否光滑,沒試過),文本顏色,背景顏色(也就是我們screen渲染的顏色)返回一個圖片類型。

get_rect()方法:將圖片處理成矩形,pygame有一點很好,就是不管什么樣的圖形都能當成矩形處理

rect對象,有centerx、centery、x、y等一系列屬性,方便我們進行對齊操作,在這里不展開說了。

blit方法:輸入圖片和矩形(這里的矩形實質上是給方法指明顯示的坐標),在screen上顯示。

在主模塊中:

def update(): for i in rect:i.draw() # 將界面顯示 pygame.display.flip()

如果只是在while循環的開始寫一個update,會發現實際上我們是不能及時看到結果的,這樣很明顯有影響,所以在每一次落子之后,我們都會進行一次刷新,然后再判斷輸贏。

if not i.stats and i.rect.collidepoint(mouse_x,mouse_y):# 玩家下棋i.stats = -1update()win_or_lose()# 電腦下棋computer()update()win_or_lose()六、結語

這樣,我們這個井字棋基本上就可以玩了,但是我們還是需要進行一些修改。下一篇博客,我將對細節進行整改。

下一篇:pygame實現井字棋——3.邏輯優化上一篇:pygame實現井字棋——1.繪制九宮格

到此這篇關于pygame實現井字棋之第二步邏輯實現的文章就介紹到這了,更多相關pygame井字棋游戲內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: pygame
相關文章:
主站蜘蛛池模板: 联系我们老街华纳娱乐公司官网19989979996(客服) | 台湾阳明固态继电器-奥托尼克斯光电传感器-接近开关-温控器-光纤传感器-编码器一级代理商江苏用之宜电气 | 郑州墨香品牌设计公司|品牌全案VI设计公司 | 板框压滤机-隔膜压滤机-厢式压滤机生产厂家-禹州市君工机械设备有限公司 | 诺冠气动元件,诺冠电磁阀,海隆防爆阀,norgren气缸-山东锦隆自动化科技有限公司 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 自动检重秤-动态称重机-重量分选秤-苏州金钻称重设备系统开发有限公司 | 农业四情_农业气象站_田间小型气象站_智慧农业气象站-山东风途物联网 | 订做不锈钢_不锈钢定做加工厂_不锈钢非标定制-重庆侨峰金属加工厂 | 聚氨酯催化剂K15,延迟催化剂SA-1,叔胺延迟催化剂,DBU,二甲基哌嗪,催化剂TMR-2,-聚氨酯催化剂生产厂家 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 济南保安公司加盟挂靠-亮剑国际安保服务集团总部-山东保安公司|济南保安培训学校 | 快速门厂家-快速卷帘门-工业快速门-硬质快速门-西朗门业 | 光栅尺厂家_数显表维修-苏州泽升精密机械 | 北京晚会活动策划|北京节目录制后期剪辑|北京演播厅出租租赁-北京龙视星光文化传媒有限公司 | 蓄电池在线监测系统|SF6在线监控泄露报警系统-武汉中电通电力设备有限公司 | 亿立分板机_曲线_锯片式_走刀_在线式全自动_铣刀_在线V槽分板机-杭州亿协智能装备有限公司 | 防火门-专业生产甲级不锈钢钢质防火门厂家资质齐全-广东恒磊安防设备有限公司 | 重庆监控_电子围栏设备安装公司_门禁停车场管理系统-劲浪科技公司 | 槽钢冲孔机,槽钢三面冲,带钢冲孔机-山东兴田阳光智能装备股份有限公司 | 线材成型机,线材折弯机,线材成型机厂家,贝朗自动化设备有限公司1 | 氧化铁红厂家-淄博宗昂化工| 轴承振动测量仪电箱-轴承测振动仪器-测试仪厂家-杭州居易电气 | 上海宿田自动化设备有限公司-双面/平面/单面贴标机 | 超声骨密度仪,双能X射线骨密度仪【起草单位】,骨密度检测仪厂家 - 品源医疗(江苏)有限公司 | 电子巡更系统-巡检管理系统-智能巡检【金万码】 | 缠绕机|缠绕膜包装机|缠绕包装机-上海晏陵智能设备有限公司 | 线粒体膜电位荧光探针-细胞膜-标记二抗-上海复申生物科技有限公司 | 青州开防盗门锁-配汽车芯片钥匙-保险箱钥匙-吉祥修锁店 | loft装修,上海嘉定酒店式公寓装修公司—曼城装饰 | 防渗土工膜|污水处理防渗膜|垃圾填埋场防渗膜-泰安佳路通工程材料有限公司 | 武汉画册印刷厂家-企业画册印刷-画册设计印刷制作-宣传画册印刷公司 - 武汉泽雅印刷厂 | 液压扳手-高品质液压扳手供应商 - 液压扳手, 液压扳手供应商, 德国进口液压拉马 | 2025福建平潭岛旅游攻略|蓝眼泪,景点,住宿攻略-趣平潭网 | 阿里巴巴诚信通温州、台州、宁波、嘉兴授权渠道商-浙江联欣科技提供阿里会员办理 | 粉末冶金注射成型厂家|MIM厂家|粉末冶金齿轮|MIM零件-深圳市新泰兴精密科技 | 液压升降货梯_导轨式升降货梯厂家_升降货梯厂家-河南东圣升降设备有限公司 | 学叉车培训|叉车证报名|叉车查询|叉车证怎么考-工程机械培训网 | 建筑资质代办-建筑资质转让找上海国信启航 | 实战IT培训机构_IT培训班选大学生IT技术培训中心_中公优就业 | 深圳3D打印服务-3D打印加工-手板模型加工厂-悟空打印坊 |