iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 27
1

Python turtle 是一個練習圖形化界面的繪圖函式庫,藉由一些簡單的方法可以模擬程式設計師拿著筆刷在螢幕上畫烏龜,還記得我剛接觸 Python 時老師就有介紹個函式庫,實在有些懷念,今天我就用這個函式庫來當 GUI 系列的第一篇,用一個小小的烏龜比賽程式來決定晚餐要吃甚麼之類的XD

這個小烏龜比賽是我在 youtube 上找靈感的時候在這影片上 https://youtu.be/OXi4T58PwdM 看到的,程式碼直接從他的 github 下載來修改 https://github.com/techwithtim/Turtle-Race ,改成我們想要的形式,感謝這位大大的無私奉獻!


main.py

Turtle 是一個很簡單的函式庫,常用的函式用法可以看這邊 http://yltang.net/tutorial/python/5/ ,下面我就直接把修改好的 main.py 放上來,並把程式碼講解寫在註解中。

import math
import random
import turtle
from config import * #引入我們自訂的 config.py

# 設定畫布大小為 500 x 500
win_length = 500
win_height = 500

#設定有八隻烏龜
turtles = 8

#創建新畫布
turtle.screensize(win_length, win_height)

#宣告config class
config = Config()

# 宣告比賽烏龜的型別,有位置、顏色、形狀、名稱等等的參數
class racer(object):
    def __init__(self, color, pos, name):
        self.pos = pos
        self.color = color
        self.turt = turtle.Turtle()
        self.turt.shape('turtle')
        self.turt.color(color)
        self.turt.penup()
        self.turt.setpos(pos)
        self.turt.setheading(90)
        self.name = name
        
    #定義賽龜的運動行為,透過 pos + r 來前進
    def move(self):
        r = random.randrange(1, 20)
        self.pos = (self.pos[0], self.pos[1] + r)
        self.turt.pendown()
        self.turt.forward(r)
        
    #讓賽龜們回到初始位置
    def reset(self):
        self.turt.penup()
        self.turt.setpos(self.pos)


def startGame():
    tList = []
    turtle.clearscreen() #清空畫布
    turtle.hideturtle() 
    data = config.load() #讀取設定的資料

    #將賽龜資料處理並加入 tList[] 中
    start = -(win_length/2) + 20
    for t in range(turtles):
        newPosX = start + t*(win_length)//turtles
        tList.append(racer(data[t]["color"],(newPosX, -230), data[t]["name"]))
        tList[t].turt.showturtle()

    #開始比賽
    run = True
    while run:
        for t in tList:
            t.move()

        maxColor = []
        maxDis = 0
        for t in tList:
            if t.pos[1] > 230 and t.pos[1] > maxDis:
                maxDis = t.pos[1]
                maxColor = []
                maxColor.append(t.name)
            elif t.pos[1] > 230 and t.pos[1] == maxDis:
                maxDis = t.pos[1]
                maxColor.append(t.name)

        #比賽結束後將第一名的以 console 方式輸出
        ShowWinText = ""
        if len(maxColor) > 0:
            run = False
            print('The winner is: ')
            for win in maxColor:
                print(win) 
                ShowWinText= win

    #再宣告一隻烏龜用來顯示結果
    pen = turtle.Turtle()
    pen.penup()
    pen.goto(0,-270)
    
    #到畫布下方寫下第一名的烏龜名稱
    pen.write(ShowWinText,False,"center",('Arial', 16, 'normal'))
    pen.showturtle()

startGame()

while True:
    print('-----------------------------------')
    start = input('Would you like to play again')
    startGame()


Config.py

這邊只要修改 name,改成你想要決定的項目,像這邊填入了很多晚餐的選項,可以讓烏龜來幫我們決定XD

class Config():
    def load(self):
        return [
            {"color": "red", "name": "滷肉飯"},
            {"color": "green", "name": "乾麵"},
            {"color": "blue", "name": "披薩"},
            {"color": "yellow", "name": "炒飯"},
            {"color": "pink", "name": "小火鍋"},
            {"color": "orange", "name": "鐵板燒"},
            {"color": "purple", "name": "水餃"},
            {"color": "black", "name": "夜市"}
        ]

程式結果

https://ithelp.ithome.com.tw/upload/images/20191013/20120282QBid2HAlXh.jpg

看來烏龜幫我們決定要吃乾麵呢~
https://ithelp.ithome.com.tw/upload/images/20191013/20120282cFGNpPghD1.jpg

大致上是這樣,其實 turtle 也可以拿來畫各種美麗的圖,因為他就像是程式設計師在畫畫嘛,不過剛好看到烏龜比賽覺得有趣就介紹給他大家,希望大家對圖形化介面程式有最初始的認識~


參考資料
http://yltang.net/tutorial/python/5/
https://github.com/techwithtim/Turtle-Race


上一篇
Day26-聽過 OCR 嗎? 實作看看吧 -- pytesseract
下一篇
Day28-Build python GUI using tkinter
系列文
原來電腦可以這樣用!? 果蠅也懂的程式語言教學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言