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

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

 更新時間:2021年05月06日 16:47:20   作者:筱羊冰冰  
這篇文章主要介紹了pygame實現井字棋之第二步邏輯實現,文中有非常詳細的代碼示例,對正在學習python的小伙伴們有非常好的幫助,需要的朋友可以參考下

一、前言

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

二、下棋

2.1 玩家

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

# 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 = 1
        print("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]
    ]

在這里插入圖片描述

隨后,我們同樣使用列表解析,將所有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 = -1
win_or_lose()
# 電腦下棋
computer()
win_or_lose()

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

五、顯示問題

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

渲染文字的步驟:

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

lattice.py文件:

import pygame
class Lattice():
    def __init__(self,rect,screen):
        self.rect = rect
        self.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):
        # 按照狀態(tài)賦值文本信息
        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循環(huán)的開始寫一個update,會發(fā)現實際上我們是不能及時看到結果的,這樣很明顯有影響,所以在每一次落子之后,我們都會進行一次刷新,然后再判斷輸贏。

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

六、結語

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

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

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

相關文章

  • python深度學習tensorflow安裝調試教程

    python深度學習tensorflow安裝調試教程

    這篇文章主要為大家介紹了python深度學習tensorflow安裝調試教程示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-06-06
  • pyhton Sanic框架的文件上傳功能開發(fā)實戰(zhàn)示例教程

    pyhton Sanic框架的文件上傳功能開發(fā)實戰(zhàn)示例教程

    Sanic是一個Python 3.5+的異步Web框架,它的設計理念與Flask相似,但采用了更高效的異步I/O處理,在處理文件上傳時,Sanic同樣提供了方便、高效的方法,本教程將結合實際案例,詳細介紹如何在Sanic框架中實現文件上傳的功能,感興趣的朋友跟隨小編一起看看吧
    2024-08-08
  • PyTorch實現FedProx聯邦學習算法

    PyTorch實現FedProx聯邦學習算法

    這篇文章主要為大家介紹了PyTorch實現FedProx的聯邦學習算法,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-05-05
  • numpy中的transpose函數中具體使用方法

    numpy中的transpose函數中具體使用方法

    本文主要介紹了numpy中的transpose函數中具體使用方法,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-02-02
  • python 監(jiān)控某個進程內存的情況問題

    python 監(jiān)控某個進程內存的情況問題

    這篇文章主要介紹了python 監(jiān)控某個進程內存的情況問題,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 一篇文章帶你了解python標準庫--sys模塊

    一篇文章帶你了解python標準庫--sys模塊

    這篇文章主要介紹了Python標準庫之Sys模塊使用詳解,本文講解了使用sys模塊獲得腳本的參數、處理模塊、使用sys模塊操作模塊搜索路徑、使用sys模塊查找內建模塊、使用sys模塊查找已導入的模塊等使用案例,需要的朋友可以參考下
    2021-08-08
  • Python 遍歷列表里面序號和值的方法(三種)

    Python 遍歷列表里面序號和值的方法(三種)

    本文主要介紹了Python 列表(List)的三種遍歷(序號和值)方法。具有很好的參考價值,下面跟著小編一起來看下吧
    2017-02-02
  • Python中sort函數正則表達式的使用

    Python中sort函數正則表達式的使用

    在python中,sort是列表排序的一種方法,本文就來介紹一下sort函數正則表達式的使用以及與sorted的區(qū)別,具有一定的參考價值,感興趣的可以了解一下
    2024-03-03
  • Python字典的概念及常見應用實例詳解

    Python字典的概念及常見應用實例詳解

    這篇文章主要介紹了Python字典的概念及常見應用,結合實例形式詳細的分析了Python字典的概念、原理、創(chuàng)建、常見操作函數與使用注意事項,需要的朋友可以參考下
    2019-10-10
  • 使用python將請求的requests headers參數格式化方法

    使用python將請求的requests headers參數格式化方法

    今天小編就為大家分享一篇使用python將請求的requests headers參數格式化方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-01-01

最新評論