2021年7月6日 星期二

模組化的設計-善用函數

學習目標:
  • 了解 Python 函式的定義與對程式運作的好處!

自訂函式的用法實作:
  1. 自訂函式方式,範例 carMove.py :
    def move():
        print("汽車移動中....")
    
    def stop():
        print("汽車停止")
    
    def start():
        print("汽車啟動")
    
    
    if __name__ == "__main__":
        # 啟動汽車
        start()
        # 移動汽車
        move()
        # 汽車停止
        stop()
    
  2. 在自訂函式內增加參數,例如:carMove.py
    def move():
        print("汽車移動中....")
    
    def stop():
        print("汽車停止")
    
    def start():
        print("汽車啟動")
    
    def maintance(color,engine,battery):
        print("更換顏色:",color)
        print("更換引擎:",engine)
        print("更換電瓶:",battery)
        print("維護完成.....")
    
    if __name__ == "__main__":
        # 汽車維護中
        print("汽車維護中....")
        maintance("red","300","12W")
        # 啟動汽車
        start()
        # 移動汽車
        move()
        # 汽車停止
        stop() 
    

修改遊戲的主要流程:
  1. 將遊戲流程步驟,分出函數:
    # 引用 random 類別中的 randrange() 函數
    from random import randrange
    
    # 引用 Player 物件
    import Player
    
    # 常用函式、參數設定區域
    ## 遊戲方格總數
    areas = 24
    
    ## 處理玩家是否有經過「開始」
    def playerPo(steps):
        if (steps >= areas):
            return (steps % areas)
        else:
            return steps
    
    # 程式流程開始
    # 使用 if __name__
    if __name__ == "__main__":
    
        # 要求玩家要輸入遊戲人數
        players_num = eval(input("請輸入玩家人數:"))
    
        # 建立玩家物件
        players = []
    
        # 按照遊戲人數,使用 Player 類別
        # 逐次產生玩家名稱、玩家代號、玩家初始遊戲幣、玩家初始位置等物件內容
        for i in range(players_num):
            players.append(Player.Player())
            # 要求玩家輸入玩家名稱
            players[i].setName(input("請輸入玩家名稱:"))
            
        # 輸出資料
        for i in range(players_num):
            print(players[i].getName())
            print(players[i].getPo())
            print(players[i].getMoney())
    
        # 設定玩家順序值
        i = 0
    
        # 開始進行遊戲
        while True:    
        ##### a.)
        ##### b.) 擲骰子
            newstep = randrange(1,6)
            print(players[i].getName() + "擲骰子:" + str(newstep) + " 點")
            print(players[i].getName() + "前進中...")
            # 設定玩家新的位置
            players[i].setPo(newstep)
    
        ##### c.) 移動到骰子點數的框格
            newpo = players[i].getPo()
            # I. 可能經過起點
            if newpo >= areas:
                newpo = playerPo(newpo)
                if newpo == 0:
                    print("玩家回到「開始」位置:", newpo)
                elif newpo < (areas/4):
                    print("玩家越過「開始」位置:", newpo)
            #  II. 可能落在邊角框格
            if ((newpo / (areas /4)) == 1):
                print("玩家休息一天")
            if ((newpo / (areas /4)) == 3):
                print("玩家再玩一次")
            #  III. 可能是在機會與命運框格
            #  IV. 可能是在地產框格
            print("玩家在新位置:",newpo)   
        ##### e.)
            # 輪至下一位玩家
            i = i + 1
            if (i >= players_num):
                i = i - players_num         
    
        ## 測試 while 迴圈用
        #    players_num = players_num - 1 
        #    print(players_num)
            
        ##### f.) 結束遊戲條件
            ends = input("是否結束遊戲?Y:是 N:繼續")
            if ((ends == "Y") or (ends == "y")):
                break
            #elif (players_num <= 1):
            #    print("遊戲結束")
            #    break