国产成人精品久久免费动漫-国产成人精品天堂-国产成人精品区在线观看-国产成人精品日本-a级毛片无码免费真人-a级毛片毛片免费观看久潮喷

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化

瀏覽:3日期:2022-06-20 14:10:11
一、前言

先說(shuō)一下本期的目標(biāo)。首先我們?cè)谂袛喑鲚斱A、平局的時(shí)候,只有一個(gè)控制臺(tái)輸出,很明顯不符合我們游戲的排面(doge另外,之前的邏輯有一個(gè)漏洞,就是玩家一定是先手(就是第一個(gè)下棋的人,這個(gè)也需要修改)。還有,有一個(gè)短暫的彈窗顯示到誰(shuí)了,游戲的可玩性就會(huì)有提高。最后一個(gè)就是,如果點(diǎn)擊位置有問(wèn)題,我們需要顯示。

二、渲染問(wèn)題

翻車(chē)了,之前的邏輯是將九宮格背景顏色寫(xiě)死,而且之前都是直接在之前的基礎(chǔ)上渲染,但是我們的彈窗需要在結(jié)束后及時(shí)撤下來(lái),所以需要我們不斷的重新渲染界面。

得,改吧。

首先,我們就不需要使用draw.rect方法創(chuàng)建矩形了,而是使用另外一個(gè)pygame.Rect函數(shù)。同時(shí),為了省去九行基本相同的代碼,我創(chuàng)建了一個(gè)元組來(lái)存儲(chǔ)。格子創(chuàng)建最新版:

# 表示九個(gè)格子rect = [0]*9rect_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函數(shù):傳入x、y坐標(biāo)以及高度寬度,就能創(chuàng)建一個(gè)rect對(duì)象。這里需要解釋的是*rect_wh[i],后面的部分就是在元組列表中找到一個(gè)指定的元素,而星號(hào)的作用是將元組進(jìn)行解封裝。

三、封裝和解封裝

a, b = 1, 2首先,我們將后面的兩個(gè)變量封裝成一個(gè)元組,從而賦值給等號(hào)前面的部分;而前面為兩個(gè)變量,所以我們還需要進(jìn)行解封裝,也就是將一個(gè)元組拆分成一個(gè)個(gè)的變量。

當(dāng)時(shí)記錄的筆記:

pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化

回到之前的格子問(wèn)題,還有一個(gè)細(xì)節(jié)就是我們應(yīng)該怎么顯示格子周?chē)姆指罹€,之前采用的是繪制矩形時(shí)自帶的,現(xiàn)在因?yàn)樗⑿碌膯?wèn)題,不能再使用了(不然每刷新一次創(chuàng)建9個(gè)矩形并繪制,這誰(shuí)頂?shù)米。N业霓k法是:減小了single的大小:

single = width/3 - 1

應(yīng)該會(huì)注意到的,元組列表中我修改了(x,y)的值,這樣我們就能繪制出這樣的一個(gè)圖形:

pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化

(原創(chuàng)不易,整這個(gè)眼睛都快要瞎了,還是沒(méi)有很完美 -_-||)bg_color = (0, 0, 0), 黑色。我們還有個(gè)draw.rect方法,傳入screen,(255, 255, 255),rect對(duì)象,我們就可以顯示一個(gè)白色的矩形了。因?yàn)閷捀咝×艘稽c(diǎn),所以我們就能看到很棒的邊界(比我自己畫(huà)的好多了)

pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化

(啊,為什么是黃色的啊,因?yàn)槲野裝g_color改了……,問(wèn)題不大)

當(dāng)前的update方法:

def update(): screen.fill((255,228,181)) for i in rect:pygame.draw.rect(screen,(255, 255, 255),i.rect)i.draw()四、彈窗顯示

添加的彈窗:輸贏、平局彈窗,3s后退出程序;哪方下棋、下棋的位置有問(wèn)題,0.3s后自己退出。

看過(guò)我大戰(zhàn)外星人系列應(yīng)該知道,有一個(gè)很大的遺憾就是給定的button類(lèi)有一點(diǎn)專(zhuān)用,導(dǎo)致我后來(lái)只能自己添加按鈕類(lèi)。這次,我自己寫(xiě)的彈窗類(lèi)的適用性會(huì)更高一些。

popup.py

'''在游戲過(guò)程中,添加各種彈窗'''import pygameclass Popup(): def __init__(self, screen,msg):self.msg = msgself.screen = screenself.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.centerself.screen.blit(self.msg_image,self.msg_rect)

傳入一個(gè)要顯示的信息,然后就可以渲染到屏幕上了。方法都是之前的,看這篇博客。(所以適用性高是不是因?yàn)榛旧蠜](méi)什么內(nèi)容……)

第一種情況(以平局為例):

Popup(screen,'draw')pygame.display.flip()time.sleep(3)exit()

調(diào)用類(lèi)(調(diào)用一次就完了,不需要再使用實(shí)例)顯示屏幕掛起三秒退出程序

第二種情況下,我選擇'computer choice”作為案例,也就是輪到電腦操作:

Popup(srceeen,'computer choice”)pygame.display.filp()time.sleep(0.3)

但這樣,彈窗是不會(huì)自己消失的,所以我們還需要在后面跟一個(gè)update方法。

哦對(duì)了,還有一個(gè)沒(méi)有講怎么實(shí)現(xiàn)

五、實(shí)現(xiàn)判斷點(diǎn)擊是否有效

elif event.type == pygame.MOUSEBUTTONDOWN: mouse_x, mouse_y = pygame.mouse.get_pos() # 判斷玩家是否點(diǎn)擊成功 success = 0 for i in rect:if not i.stats and i.rect.collidepoint(mouse_x,mouse_y):# 如果點(diǎn)擊有效,將變量置為1 if not success:update(0.3,'you can’t choose here!')六、update優(yōu)化

看了一下,基本上只有兩種情況,一個(gè)是正常的update,另一個(gè)是需要跟彈窗和延時(shí)。

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)

對(duì)于正常的刷新,只需要調(diào)用update(),如果是需要彈窗和延時(shí)的,就自己加變量來(lái)處理。

主循環(huán)部分:

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() # 判斷玩家是否點(diǎn)擊成功 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函數(shù)部分:

def computer(): '''電腦的回合,隨機(jī)生成一個(gè)位置''' global judge random_num = [i for i in range(len(rect)) if not rect[i].stats] # 沒(méi)位子下了,平局 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()七、先手問(wèn)題

這個(gè),還是交給隨機(jī)數(shù)。使用random.randint(0,1)產(chǎn)生一個(gè)0/1,來(lái)判斷先手,如果先手是電腦,使用(0,8)選擇一個(gè)將其stats置為1代碼:

def first_hand(): '''判斷先手,如果隨機(jī)數(shù)為1,則電腦先手''' x = random.randint(0,1) if x:x = random.randint(0,8)rect[x].stats = 1

循環(huán)開(kāi)始前調(diào)用一下就行了。

八、結(jié)語(yǔ)

整體的游戲就實(shí)現(xiàn)了,很簡(jiǎn)單的一個(gè),卻能加深對(duì)pygame模塊的使用。

往期博客:pygame實(shí)現(xiàn)井字棋——1.繪制九宮格pygame實(shí)現(xiàn)井字棋——2.邏輯實(shí)現(xiàn)

到此這篇關(guān)于pygame實(shí)現(xiàn)井字棋之第三步邏輯優(yōu)化的文章就介紹到這了,更多相關(guān)pygame井字棋游戲內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: pygame
相關(guān)文章:
主站蜘蛛池模板: 福利云 | 欧美亚洲综合另类在线观看 | 久久黄色片 | 中国一级特黄真人毛片 | 日本高清一本二本三本如色坊 | 女人张开腿给男人桶爽免费 | 亚洲免费在线观看 | 2022国产91精品久久久久久 | 波多野结衣在线观看高清免费资源 | 殴美一级视频 | 亚洲在线观看 | 91精品国产美女福到在线不卡 | 亚洲精品久久久久久久福利 | 综合中文字幕 | 欧美另类在线视频 | 日韩成人毛片高清视频免费看 | 亚洲欧美精品一区 | 久久精品免费观看 | 久久国产精品-国产精品 | 久久综合九九 | 欧美三级网| 国产成人精品福利网站在线 | 亚洲黄色三级网站 | 日本a级三级三级三级久久 日本a级特黄三级三级三级 | 久久精品国产在爱久久 | 日韩欧美中文字幕在线视频 | 国产精品久久久香蕉 | 国产亚洲欧美日韩在线观看不卡 | 色毛片| 麻豆国产96在线 | 中国 | wwww.黄| 日韩一区二区天海翼 | 精品久久久久久无码中文字幕 | 99久久精品无码一区二区毛片 | 国产精品私人玩物在线观看 | 男女男精品视频网站在线观看 | 男人av的天堂 | 老司机深夜影院入口aaaa | 伊大人香蕉久久网 | 日本精品高清一区二区2021 | 色青青草原桃花久久综合 |