I Love Python. I Learn Python. I Teach Python. I Am a Python.

2014/06/20

CguPython2014: Chang Gung University Python Course 2014 ( Python/ Pygame Programs in Chinese)


2014 年春天開始,我在 機率與統計 課程中,加入 Python 程式設計的簡介,算是輔助機率與統計課程的學習。

到期末時,我帶學生們用 Pygame 來寫一個有聲光效果的遊戲,我以     Al Sweigart 
 的2本著作當參考,請學生們「仿作」,這群可愛且用功的學生在一學期之內,成功的改寫、翻譯出以下的一批有趣的遊戲程式。

這批程式,最大的特色是:



由 英文 翻譯成 中文

這將使得程式設計的語言障礙可以打破,
進而利於 普及程式教育


ryCopy: 92 則留言:
    1. 資工二 B0129031 何育萱
      http://little-hsuan.blogspot.tw/
      回覆 very good. could be a sample to show.


    2. #---原版作者---
      '''
      Gemgem (a Bejeweled clone)
      By Al Sweigart al@inventwithpython.com
      http://inventwithpython.com/pygame
      Released under a "Simplified BSD" license
      '''
      #--改版作者---
      """
      遊戲名稱:消糖果遊戲
      學號:b0129031
      """
      
      import random, time, pygame, sys, copy
      from pygame.locals import *
      from pygame_tc import *
      
      畫面更新率 = 30 #FPS
      視窗寬度 = 600  # 程式視窗寬度(單位為像素)
      視窗高度 = 600 
      
      版面總欄位數 = 8 
      版面總列數 = 8 
      糖果圖片大小 = 64 # 每個空間的高度和寬度(單位為像素)
      
      糖果圖片總數 = 7
      assert 糖果圖片總數 >= 5 # 遊戲需要至少五種以上的糖果才能運作
      
      配對成功的音效總數 = 6
      
      移動速率 = 25 #範圍是1~100 , 數字越大移動越快
      扣除速度 = 1 # 分數是以每秒的速度遞減2分
      
      #三原色光模式 R    G    B
      紫色      = (255,   0, 255)
      愛麗絲藍  = (130, 206, 250)
      皇藍色    = ( 30, 144, 255)
      黃色      = (255, 255,   0)
      黑色      = (  0,   0,   0)
      紅色      = (255,   0,   0)
      選取邊的顏色 = 紫色 
      視窗背景顏色 = 愛麗絲藍 
      版面顏色 = 皇藍色 
      遊戲結束字體顏色 = 黃色 
      遊戲結束背景顏色 = 黑色 
      分數的顏色 = 紅色 
      
      X軸剩餘邊界 = int((視窗寬度 - 糖果圖片大小 * 版面總欄位數) / 2)
      Y軸剩餘邊界 = int((視窗高度 - 糖果圖片大小 * 版面總列數) / 2)
      
      # 表示方向的定量
      上 = 'up'
      下 = 'down'
      左 = 'left'
      右 = 'right'
      
      空的空間 = -1 # 一個任意非正數來判斷空的空間
      面板上方的列 = 'row above 面版' # 一個任意非整數的值
      
      def 主函式():
          global 畫面更新時鐘, 版面展示, 糖果圖片, 糖果音效, 預設字體, 矩形版面
      
          # 初始化設置
          遊戲開始()
          畫面更新時鐘 = 時鐘物件()
          版面展示 = 設螢幕大小((視窗寬度, 視窗高度))
          設螢幕標題('消糖果遊戲') 
          預設字體 = 字型物件('freesansbold.ttf', 36)
      
          # 載入圖片
          糖果圖片 = []
          for i in 範圍(1, 糖果圖片總數+1):
              圖片 = 圖片載入('candy%s.png' % i)
              if 圖片.get_size() != (糖果圖片大小, 糖果圖片大小):
                  圖片 = 轉換任意平滑版面(圖片, (糖果圖片大小, 糖果圖片大小))
              糖果圖片.append(圖片)
      
          # 載入音效
          糖果音效 = {}
          糖果音效['bad swap'] = 聲音物件('badswap.wav')
          糖果音效['match'] = []
          for i in 範圍(配對成功的音效總數):
              糖果音效['match'].append(聲音物件('match%s.wav' % i))
              
          # 為每個面板空間創造矩形物件,並做面板座標到像素座標的轉換
          矩形版面 = []
          for x in 範圍(版面總欄位數):
              矩形版面.append([])
              for y in 範圍(版面總列數):
                  r = 矩形物件((X軸剩餘邊界 + (x * 糖果圖片大小),
                                   Y軸剩餘邊界 + (y * 糖果圖片大小),
                                   糖果圖片大小,
                                   糖果圖片大小))
                  矩形版面[x].append(r)
      
          while True:
              開始遊戲()
      
  1. 資工二 B0129003 宋承恩
    http://b0129003.blogspot.tw/
    回覆活潑的旁白解釋,還有配角幫襯,可看性高



  • 資工二 B0129033 曹祐
    http://b0129033.blogspot.tw/
    回覆Good demo, and music is also good, video effect is simple and beautiful.
    very Good





  • import pygame, sys, random
    from pygame.locals import *
     
    # Create the constants (go ahead and experiment with different values)
    行數 = 4 
    列數 = 4 
    方塊尺寸 = 80
    視窗寬度 = 640
    視窗高度 = 480
    畫面更新率 = 30
    空白 = None
    #         R    G    B
    黑色 = (  0,   0,   0)
    白色 = (255, 255, 255)
    亮藍 = (  0,  50, 255)
    墨綠 = (  3,  54,  73)
    綠色 = (  0, 204,   0)
    背景顏色 = 墨綠
    方塊顏色 = 綠色
    文字顏色 = 白色
    邊框顏色 = 亮藍
    基本字體大小 = 20
    按鈕顏色 = 白色
    按鈕文字顏色 = 黑色
    訊息顏色 = 白色
    邊框X座標 = int((視窗寬度 - (方塊尺寸 * 行數 + (行數 - 1))) / 2)
    邊框Y座標 = int((視窗高度 - (方塊尺寸 * 列數 + (列數 - 1))) / 2)
    上 = '上'
    下 = '下'
    左 = '左'
    右 = '右'
     
    def 主函式():
        global 畫面更新控制器, 顯示介面, 基本字型, 重置介面, 重置方塊, 新介面, 新方塊, 解答畫面, 解答方塊
        pygame.init()
        畫面更新控制器 = pygame.time.Clock()
        顯示介面 = pygame.display.set_mode((視窗寬度, 視窗高度))
        pygame.display.set_caption('Slide Puzzle')
        基本字型 = pygame.font.Font('freesansbold.ttf', 基本字體大小)
     
        # Store the option buttons and their rectangles in OPTIONS.
        重置介面, 重置方塊 = 製造文字('ReSet',文字顏色,方塊顏色,視窗寬度 - 120,視窗高度 - 90)
        新介面, 新方塊   = 製造文字('New Game', 文字顏色, 方塊顏色, 視窗寬度 - 120, 視窗高度 - 60)
     
        解答畫面, 解答方塊 = 製造文字('Solve',文字顏色, 方塊顏色, 視窗寬度 - 120, 視窗高度 - 30)
     
        主要區塊, 解答順序 = 產生新題目(80)
        解答區塊 = 區塊初始化()
        移動記錄 = [] # list of 移動s made from the solved configuration
     
        while True: # main game loop
            滑向 = None # the 方向, if any, a tile should slide
            訊息 = '' 
            if 主要區塊 == 解答區塊:
                 訊息 = 'Solved!'
     
            繪製畫面(主要區塊, 訊息)
     
            結束檢查()
            for event in pygame.event.get(): # event handling loop
                 if event.type == MOUSEBUTTONUP:
                    點擊橫座標, 點擊縱座標 = 取得點擊座標(主要區塊, event.pos[0], event.pos[1])
     
                    if (點擊橫座標, 點擊縱座標) == (None, None):
                        # check if the user clicked on an option button
                         if 重置方塊.collidepoint(event.pos):
                             重置動畫(主要區塊, 移動記錄) # clicked on Reset button
                             移動記錄 = []
                         elif 新方塊.collidepoint(event.pos):
                             主要區塊, 解答順序 = 產生新題目(80) # clicked on New Game button
                             移動記錄 = []
                         elif 解答方塊.collidepoint(event.pos):
                             重置動畫(主要區塊, 解答順序 + 移動記錄) # clicked on Solve button
                             移動記錄 = []
                    else:
                        
                         空位橫座標, 空位縱座標 = 取得空位置(主要區塊)
                         if 點擊橫座標 == 空位橫座標 + 1 and 點擊縱座標 == 空位縱座標:
                             滑向 = 左
                         elif 點擊橫座標 == 空位橫座標 - 1 and 點擊縱座標 == 空位縱座標:
                             滑向 = 右
                         elif 點擊橫座標 == 空位橫座標 and 點擊縱座標 == 空位縱座標 + 1:
                             滑向 = 上
                         elif 點擊橫座標 == 空位橫座標 and 點擊縱座標 == 空位縱座標 - 1:
                             滑向 = 下
     
                 elif event.type == KEYUP:
                    # check if the user pressed a key to slide a tile
                    if event.key in (K_LEFT, K_a) and 有效移動(主要區塊, 左):
                        滑向 = 左
                    elif event.key in (K_RIGHT, K_d) and 有效移動(主要區塊, 右):
                        滑向 = 右
                    elif event.key in (K_UP, K_w) and 有效移動(主要區塊, 上):
                        滑向 = 上
                    elif event.key in (K_DOWN, K_s) and 有效移動(主要區塊, 下):
                        滑向 = 下
     
            if 滑向:
                移動動畫(主要區塊, 滑向, 'Click tile or press arrow keys to slide.', 8) # show slide on screen
                移動函式(主要區塊, 滑向)
                移動記錄.append(滑向) # record the slide
            pygame.display.update()
            畫面更新控制器.tick(畫面更新率)
      
    if __name__ == '__main__':
        主函式()
    
    
    















    1. 回覆very good, music is good, 解釋很自然。



    1. 資工二 B0129015 黃建華
      http://20140619pygame.blogspot.tw/
      回覆 Good, 我喜歡這遊戲。小而美。






    1. 資工二 B0129063 陳立崇
      http://b0129063pythonhw.blogspot.tw/
      回覆Very good, 若影片有聲音會更好。




    2. 資工三 B0029058 林宏翰
      http://b0029058.blogspot.com/
      回覆OK, 程式碼中文可再多一點。

    3. 資工二 B0129058 戴君儒
      http://b0129058.blogspot.tw/
      回覆good, Nebula Wars
    4. 資工二 B0129001 張家寧
      http://b0129001.blogspot.tw/
      回覆程式碼貼在 blog 有點冗長。沒看到影片。



          1. 你的程式碼太特別了,

            變數1, 2, 3, ......
            函式甲、乙、丙、丁、、、
            串列1,2,3,4....

            完全不具任何語意上的意義!

            改成中文是為了增加可讀性,
            你這樣改似乎沒有達到目的,
            甚至是反其道而行!







    1. ryCopy 8 則留言:

    13 則留言:

    1. 資工二 B0129061 蘇世真
      http://f1593570.blogspot.tw/

      回覆刪除
    2. 資工二 B0129013 陳威伶
      http://encore7122.blogspot.tw/

      回覆刪除
    3. 資工二 B0129010 陳家羽
      http://ginab0129010.blogspot.tw/2014/06/1_19.html

      回覆刪除
    4. 資工二 B0129034 方湛恩

      http://samuelfang083826.blogspot.tw/

      回覆刪除
    5. b0129006_張皓翔
      http://stevelove296.blogspot.tw/

      回覆刪除
    6. 資工二 B0129005 趙千嫣
      http://b0129005.blogspot.tw/

      回覆刪除
    7. 資工二 B0129040 余丞鈞
      http://dfsadfsg3435.blogspot.tw/2014/06/1.html

      回覆刪除
    8. B0129023 周敬庭
      整合到blogger http://sgbserynstrytrdn.blogspot.tw/

      回覆刪除
    9. 資工二 B0129004 黃晨睿

      http://qscxzaqwedsaz.blogspot.tw/

      成功上傳到部落格了 之前的連結校外不能連

      回覆刪除
    10. 指導老師:呂仁園

      http://ryResearch.blogspot.com

      ryResearch

      回覆刪除
    11. 作者已經移除這則留言。

      回覆刪除
    12. 資工二
      B0129026
      黃致穎

      youtobe影片:
      https://www.youtube.com/watch?v=wwpzttAU2R4&feature=youtu.be

      程式碼及圖片(壓縮檔):
      https://www.dropbox.com/s/m6cndiuvu2azo9y/inkspill.rar

      投影片(編碼有問題 要下載才能看):
      https://www.dropbox.com/s/dtet5nela9b222r/PythonGame%E6%9C%9F%E6%9C%AB%E4%BD%9C%E6%A5%AD.pptx

      回覆刪除
    13. 資工二 B0129026 黃致穎

      http://b0129026pythongame.blogspot.tw/2014/06/youtube-httpswww.html

      抱歉這麼晚才上傳

      回覆刪除