欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2021年05月06日 16:46:08   作者:筱羊冰冰  
這篇文章主要介紹了pygame實現(xiàn)井字棋之第三步邏輯優(yōu)化,文中有非常詳細的代碼示例,對正在學(xué)習(xí)python的小伙伴們也有非常好的幫助,需要的朋友可以參考下

一、前言

先說一下本期的目標(biāo)。
首先我們在判斷出輸贏、平局的時候,只有一個控制臺輸出,很明顯不符合我們游戲的排面(doge
另外,之前的邏輯有一個漏洞,就是玩家一定是先手(就是第一個下棋的人,這個也需要修改)。
還有,有一個短暫的彈窗顯示到誰了,游戲的可玩性就會有提高。
最后一個就是,如果點擊位置有問題,我們需要顯示。

二、渲染問題

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

得,改吧。

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

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

三、封裝和解封裝

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

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

在這里插入圖片描述

回到之前的格子問題,還有一個細節(jié)就是我們應(yīng)該怎么顯示格子周圍的分割線,之前采用的是繪制矩形時自帶的,現(xiàn)在因為刷新的問題,不能再使用了(不然每刷新一次創(chuàng)建9個矩形并繪制,這誰頂?shù)米。?br /> 我的辦法是:減小了single的大?。?/p>

single = width/3 - 1

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

在這里插入圖片描述

(原創(chuàng)不易,整這個眼睛都快要瞎了,還是沒有很完美 -_-||)
bg_color = (0, 0, 0), 黑色。
我們還有個draw.rect方法,傳入screen,(255, 255, 255),rect對象,我們就可以顯示一個白色的矩形了。
因為寬高小了一點,所以我們就能看到很棒的邊界(比我自己畫的好多了)

在這里插入圖片描述

(啊,為什么是黃色的啊,因為我把bg_color改了……,問題不大)

當(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后退出程序;
哪方下棋、下棋的位置有問題,0.3s后自己退出。

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

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)

傳入一個要顯示的信息,然后就可以渲染到屏幕上了。
方法都是之前的,看這篇博客。
(所以適用性高是不是因為基本上沒什么內(nèi)容……)

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

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

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

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

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

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

哦對了,還有一個沒有講怎么實現(xiàn)

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

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優(yōu)化

看了一下,基本上只有兩種情況,一個是正常的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)

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

主循環(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()
            # 判斷玩家是否點擊成功
            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():
    """電腦的回合,隨機生成一個位置"""
    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()

七、先手問題

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

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

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

八、結(jié)語

整體的游戲就實現(xiàn)了,很簡單的一個,卻能加深對pygame模塊的使用。

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

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

相關(guān)文章

  • pytorch中常用的乘法運算及相關(guān)的運算符(@和*)

    pytorch中常用的乘法運算及相關(guān)的運算符(@和*)

    pytorch是深度學(xué)習(xí)框架,而深度學(xué)習(xí)其實本質(zhì)就是一大堆矩陣乘法,最后用來模擬一個高維擬合函數(shù),下面這篇文章主要給大家介紹了關(guān)于pytorch中常用的乘法運算及相關(guān)的運算符(@和*)的相關(guān)資料,需要的朋友可以參考下
    2022-01-01
  • Tensorflow實現(xiàn)多GPU并行方式

    Tensorflow實現(xiàn)多GPU并行方式

    今天小編就為大家分享一篇Tensorflow實現(xiàn)多GPU并行方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-02-02
  • Pycharm下載pyinstaller報錯:You?should?consider?upgrading?via?the?'python?-m?pip?install?--upgrade?pip'?command的解決方法

    Pycharm下載pyinstaller報錯:You?should?consider?upgrading?via

    這篇文章主要給大家介紹了關(guān)于Pycharm下載pyinstaller報錯:You?should?consider?upgrading?via?the?'python?-m?pip?install?--upgrade?pip'?command的解決方法,需要的朋友可以參考下
    2022-02-02
  • django restframework serializer 增加自定義字段操作

    django restframework serializer 增加自定義字段操作

    這篇文章主要介紹了django restframework serializer 增加自定義字段操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-07-07
  • Python刪除windows垃圾文件的方法

    Python刪除windows垃圾文件的方法

    這篇文章主要介紹了Python刪除windows垃圾文件的方法,涉及Python針對系統(tǒng)垃圾文件的查找與清理技巧,具有一定參考借鑒價值,需要的朋友可以參考下
    2015-07-07
  • 放棄 Python 轉(zhuǎn)向 Go語言有人給出了 9 大理由

    放棄 Python 轉(zhuǎn)向 Go語言有人給出了 9 大理由

    今年 Stream 團隊的主要編程語言從 Python 轉(zhuǎn)向了 Go。本文解釋了其背后的九大原因以及如何做好這一轉(zhuǎn)換。下面小編給大家分享放棄 Python 轉(zhuǎn)向 Go語言有人給出了 9 大理由,一起看看吧
    2017-10-10
  • Python利用PyAutoGUI輕松搞定圖片上傳

    Python利用PyAutoGUI輕松搞定圖片上傳

    PyAutoGUI作為一個GUI操作的神器,我們看到了它的操作都很簡單,非常通俗易懂,基本上看到函數(shù)就能知道它的功效。本文將用它實現(xiàn)圖片上傳功能,感興趣的可以了解一下
    2022-09-09
  • Python循環(huán)語句之break與continue的用法

    Python循環(huán)語句之break與continue的用法

    這篇文章主要介紹了Python循環(huán)語句之break與continue的用法,是Python入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下
    2015-10-10
  • python數(shù)據(jù)處理67個pandas函數(shù)總結(jié)看完就用

    python數(shù)據(jù)處理67個pandas函數(shù)總結(jié)看完就用

    這篇文章主要介紹了python數(shù)據(jù)處理67個pandas函數(shù)的梳理總結(jié),看完就可以去用了,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2021-11-11
  • NumPy?與?Python?內(nèi)置列表計算標(biāo)準差區(qū)別詳析

    NumPy?與?Python?內(nèi)置列表計算標(biāo)準差區(qū)別詳析

    這篇文章主要介紹了NumPy與Python內(nèi)置列表計算標(biāo)準差區(qū)別詳析,NumPy,是Numerical?Python的簡稱,用于高性能科學(xué)計算和數(shù)據(jù)分析的基礎(chǔ)包,更多相關(guān)內(nèi)容需要的朋友可以參考一下
    2022-07-07

最新評論