決鬥吧!TensorFlow剪刀石頭布進階Python應用:猜拳遊戲!

在這次的教程中,我們會教你如何運用威盛 Pixetto 製作「猜拳遊戲」教程。透過人工智慧與威盛 Pixetto 「神經網路辨識」功能,我們利用上一個「辨別剪刀石頭布」教程的Tflite,撰寫 Python 程式碼並且完成剪刀、石頭、布的對決遊戲。

這次的教程是運用Python程式撰寫,製作客製化的「剪刀石頭布-猜拳遊戲」,你也可以依據自己的需求撰寫改變遊戲中的設定。那我們就開始吧!

步驟:

  1. 連結威盛 Pixetto 至電腦
  2. 上傳Tflite至威盛 Pixetto
  3. Python 程式碼撰寫

步驟 1

首先,我們要將威盛 Pixetto 連結至電腦。

使用Micro USB 2.0傳輸線將威盛Pixetto連至個人電腦。當看到綠色、藍色、紅色LED燈點亮時,代表威盛Pixetto已成功連結。

別忘記將鏡頭蓋子取下!

步驟 2

上傳Tflite至威盛 Pixetto 的步驟和先前幾次的教程大同小異,只不過這次我們將會使用「神經網路辨識」功能,上傳「判別剪刀石頭布」的Tflite檔案。
首先,打開威盛 Utility,在功能區選擇「神經網路辨識」。

接下來,選擇下方「模型路徑」,上傳quant_model.tflite。完成後記得點選確認鍵。

上傳完成後記得點選套用,當確認威盛 Pixetto可以辨別剪刀、石頭、布就可以進入下一步了!

由於之後不會使用威盛 Utility作為顯示器,所以改變標籤屬於非強制性步驟,下圖示範改變後的標籤,此步驟是為了確認0、1、2分別是石頭、布、剪刀。

步驟 3

接下來,我們要進行最辛苦的一部分「撰寫Python程式碼」,共可分為以下步驟:

  1. 匯入套件
  2. 倒數計時函式
  3. 剪刀石頭布遊戲函式
  4. 決定勝負函式
  5. 公告勝負函式

首先,先開啟jupyter notebook,於電腦上的python3-pixetto-0.0.1資料夾新增
IPython檔,如果尚未進行Python 環境設置,歡迎觀看「Python 環境設置」教程進行安裝的動作。

1. 匯入套件

我們這次會使用到的套件包含:

  • pixetto
  • random
  • time

如果還尚未安裝 Pixetto 套件,歡迎觀看「Python 環境設置」教程進行安裝的動作。由於Pixetto 套件需要使用到 pyserial 套件,我們也會預先使用進行下載。

!pip install pyserial

from pixetto import Pixetto
import random
import time

2. 倒數計時函式

首先,我們要做一個倒數計時函式count(),讓我們可以準備出拳。這邊會先顯示『Ready?』然後進行倒數,並出現『Rock! Paper! Scissors!』

def countdown(self):
    print('ready?')
    time.sleep(2)
    print('Count down from {:d}'.format(self.sec))
    time.sleep(2)
    print('#' * 50)
    for i in range(self.sec, 0, -1):
        print('#{:s}#'.format(str(i).center(48)))
        time.sleep(1)
    print('#{:s}#'.format('Rock! Paper! Scissors!'.center(48)))
    print('#' * 50)

3. 剪刀石頭布遊戲函式

再來我們要製作整個遊戲的流程,製作一個剪刀石頭布遊戲函式startgame()。

我們採用的方法是運用 Pixetto Class 開啟威盛 Pixetto,這邊要注意的是序號一定要是”COM3″。讓威盛 Pixetto 讀取玩家的出拳,並輸出結果 『final_choice』,並運用random函式使電腦隨機出拳,儲存在rand_choice。

startgame()將回傳一個包含final_choice和rand_choice的list,能夠進入下一個決定勝負函式。

def startgame(self)->list:
    pix = Pixetto()
    pix.open("COM3")

    count = 0
    labels = {0: 'rock', 1: 'paper', 2:'scissors'}
    result = {'rock': 0, 'paper': 0, 'scissors': 0}
    while count < 100: 
        if pix.is_detected() == True:
            gesture = pix.get_data_list()
            choice = labels.get(gesture[2][0].get('type'))
            result[choice]+=1
            count+=1

    pix.close()

    print(result)
    final_choice = max(result, key=result.get)
    rand_choice = random.choice(['rock', 'paper', 'scissors'])
    return [final_choice, rand_choice]

4. 決定勝負函式

我們將製作決定勝負函式whowin()來判斷到底是電腦獲勝還是玩家獲勝,決定勝負的方法是運用依據很簡單的if else判斷式。

  • 如果兩者出拳相同,就回傳Draw!
  • 如果玩家贏了,就回傳You Win!
  • 如果玩家輸了,就回傳You Lose!

注意!!因為我們之後要把這些函式製作成一個剪刀石頭布遊戲Class,所以我們把whowin()加上了@staticmethod。

@staticmethod
def whowin(test: list)->str:
    if ((test == ['rock','rock']) or (test == ['paper','paper']) or (test == ['scissors','scissors'])):
        return 'Draw!!!'
    elif ((test == ['rock','scissors']) or (test == ['paper','rock']) or (test == ['scissors','paper'])):
        return 'You Win!!!'
    elif ((test == ['rock','paper']) or (test == ['paper','scissors']) or (test == ['scissors','rock'])):
        return 'You Lose!!!'

5. 公告勝負函式

知道勝負後,我們用print簡單製作一個公告勝負函式printchoice(),包含三個元素:

  • 玩家選擇
  • 電腦選擇
  • 遊戲結果
@staticmethod
def printchoice(test: list):
    print('\nYou threw {:s}'.format(test[0]))
    print('I threw {:s}\n'.format(test[1]))
    print('#' * 50)
    print('#{:s}#'.format(rpsgame.whowin(test).center(48)))
    print('#' * 50)
    print('\n')

最後一個步驟是將所有函式包在我們的rpsgame Class當中。

class rpsgame: 
    def __init__(self, sec: int):
        self.sec = sec
        self.gcond = 'Draw!!!'
    
    def countdown(self):
        print('ready?')
        time.sleep(2)
        print('Count down from {:d}'.format(self.sec))
        time.sleep(2)
        print('#' * 50)
        for i in range(self.sec, 0, -1):
            print('#{:s}#'.format(str(i).center(48)))
            time.sleep(1)
        print('#{:s}#'.format('Rock! Paper! Scissors!'.center(48)))
        print('#' * 50)

    def startgame(self)->list:
        pix = Pixetto()
        pix.open("COM3")

        count = 0
        labels = {0: 'rock', 1: 'paper', 2:'scissors'}
        result = {'rock': 0, 'paper': 0, 'scissors': 0}
        while count < 100: 
            if pix.is_detected() == True:
                gesture = pix.get_data_list()
                choice = labels.get(gesture[2][0].get('type'))
                result[choice]+=1
                count+=1

        pix.close()

        print(result)
        final_choice = max(result, key=result.get)
        rand_choice = random.choice(['rock', 'paper', 'scissors'])
        return [final_choice, rand_choice]

    @staticmethod
    def whowin(test: list)->str:
        if ((test == ['rock','rock']) or (test == ['paper','paper']) or (test == ['scissors','scissors'])):
            return 'Draw!!!'
        elif ((test == ['rock','scissors']) or (test == ['paper','rock']) or (test == ['scissors','paper'])):
            return 'You Win!!!'
        elif ((test == ['rock','paper']) or (test == ['paper','scissors']) or (test == ['scissors','rock'])):
            return 'You Lose!!!'

    @staticmethod
    def printchoice(test: list):
        print('\nYou threw {:s}'.format(test[0]))
        print('I threw {:s}\n'.format(test[1]))
        print('#' * 50)
        print('#{:s}#'.format(rpsgame.whowin(test).center(48)))
        print('#' * 50)
        print('\n')
        
if __name__ == '__main__':
    g = rpsgame(3)
    while g.gcond=='Draw!!!':
        g.countdown()
        test = g.startgame()
        g.gcond=g.whowin(test)
        g.printchoice(test)

這樣就完成Python程式設計的部分囉!

實際操作:

當完成以上步驟,就是開始玩「剪刀石頭布猜拳遊戲」的時候!

將威盛Pixetto對準自己的手,開始出拳吧!你也可以將這項「猜拳遊戲」增加計分的功能,快和親朋好友進行一場對決吧!

祝你玩得愉快,別忘了分享自己的創作至社群上並標註 #VIAPixetto!

你也可以關注威盛Pixetto粉絲專頁獲得更多第一手資訊!

分享貼文!

Share on linkedin
Share on twitter
Share on facebook

Leave a Reply