Upgrade to Pro — share decks privately, control downloads, hide ads and more …

pygame_B0129018_張智堯

johneyking
June 19, 2014
67

 pygame_B0129018_張智堯

python期末報告

johneyking

June 19, 2014
Tweet

Transcript

  1. 長庚大學 資工系 機率統計 Python 課程 期末作業(Cgu Csie Python Class 2014

    Final Python project) 學號:B0129018 姓名:張智堯 參考書籍:invent with python 翻譯程式碼:fourinarow.py(http://inventwithpython.com/fourinarow.py)
  2. Pygame 函式翻譯 """ 啟動= pygame.init 鐘類= pygame.time.Clock 幕設大小= pygame.display.set_mode 幕設標題=

    pygame.display.set_caption 字型類= pygame.font.Font 影像下載= pygame.image.load 轉換平滑尺度= pygame.transform.smoothscale 事件取得= pygame.event.get 結束= pygame.quit 隨機選擇= random.choice 畫方形= pygame.draw.rect 深層複製= copy.deepcopy 幕更新= pygame.display.update 系統離開= sys.exit 事件張貼= pygame.event.post 方塊類= pygame.Rect 時間等待= pygame.time.wait """
  3. 解釋程式 (紅色字為解釋) 寬空格 = 7 (幕寬是幾格) 高空格 = 6 (幕寬是幾格)

    assert 寬空格 >= 4 and 高空格 >= 4, 'Board must be at least 4x4.' 難度 = 2 (難易程度,和電腦下的位置有關) 大小空格 = 50 (幕空格大小 單位:像素) 更新速度 = 30 (更新速度) 寬螢幕 = 640 (視窗寬大小 ) 高螢幕 = 480 (視窗高大小)
  4. 甲邊界 = int((寬螢幕 - 寬空格 * 大小空格) / 2) 乙邊界

    = int((高螢幕 - 高空格* 大小空格) / 2) 亮藍 = (0, 50, 255) 白 = (255, 255, 255) 背景顏色 = 亮藍 文字顏色 = 白 紅 = 'red' 黑 = 'black' 空 = None 人 = 'human' 電腦 = ‘computer’ (變數設定)
  5. def 主函式(): global 更新時間, 顯示, 紅形狀, 黑形狀, 紅圖形 global 黑圖形,

    圖形, 指示圖形, 指示形狀, 人圖形 global 電腦圖形, 贏家形狀, 平手圖形 (宣告變數) pygame.init() 更新時間 = pygame.time.Clock() 顯示 = pygame.display.set_mode((寬螢幕, 高螢幕)) pygame.display.set_caption('Four in a Row')(導入圖檔) 紅形狀 = pygame.Rect(int(大小空格 / 2), 高螢幕 - int(3 * 大小空格 / 2), 大小空格, 大小空格) 黑形狀 = pygame.Rect(寬螢幕 - int(3 * 大小空格 / 2), 高螢幕 - int(3 * 大小空格 / 2), 大小空格, 大小空格) 紅圖形 = pygame.image.load('4row_red.png') (導入圖檔) 紅圖形 = pygame.transform.smoothscale(紅圖形, (大小空格, 大小空格)) 黑圖形 = pygame.image.load('4row_black.png') (導入圖檔) 黑圖形 = pygame.transform.smoothscale(黑圖形, (大小空格, 大小空格)) 圖形 = pygame.image.load('4row_board.png') (導入圖檔) 圖形 = pygame.transform.smoothscale(圖形, (大小空格, 大小空格))
  6. 人圖形 = pygame.image.load('4row_humanwinner.png') (導入圖檔) 電腦圖形 = pygame.image.load('4row_computerwinner.png') (導入圖檔) 平手圖形 =

    pygame.image.load('4row_tie.png') (導入圖檔) 贏家形狀 = 人圖形.get_rect()(取得方塊) 贏家形狀.center = (int(寬螢幕 / 2), int(高螢幕 / 2)) 指示圖形 = pygame.image.load('4row_arrow.png') (導入圖檔) 指示形狀 = 指示圖形.get_rect() (取得方塊) 指示形狀.left = 紅形狀.right + 10 指示形狀.centery = 紅形狀.centery 第一次遊戲 = True while True: 遊戲開始(第一次遊戲)(遊戲開始) 第一次遊戲 = False
  7. def 遊戲開始(第一次遊戲): if 第一次遊戲:(電腦先手,讓玩家看到棋子如何移動) 換 = 電腦 幫助 = True

    else: (隨機選擇誰先走) if random.randint(0, 1) == 0: 換 = 電腦 else: 換 = 人 幫助 = False (建一個新的資料結構) 主畫布 = 新畫布() while True: (遊戲開始) if 換 == 人: (玩家) 玩家移動(主畫布, 幫助) if 幫助: (關閉幫助訊息) 幫助 = False if 贏家(主畫布, 紅): 贏家圖片 = 人圖形 break
  8. 換 = 電腦 (電腦) else: (電腦) 行 = 電腦移動(主畫布) 賦予電腦移動(主畫布,

    行) 移動(主畫布, 黑, 行) if 贏家(主畫布, 黑): 贏家圖片 = 電腦圖形 break 換 = 人 (玩家) if 空間判斷(主畫布): 贏家圖片 = 平手圖形 break while True: (保持循環直到玩家點擊鼠標或者退出) 畫布(主畫布) 顯示.blit(贏家圖片, 贏家形狀) pygame.display.update() 更新時間.tick() for event in pygame.event.get(): # event handling loop if event.type == QUIT or (event.type == KEYUP and event.key == K_ESCAPE): pygame.quit() sys.exit() elif event.type == MOUSEBUTTONUP: return
  9. def 畫布(幕, 例外=None): 顯示.fill(背景顏色) (畫格子) 空格形狀 = pygame.Rect(0, 0, 大小空格,

    大小空格) for x in range(寬空格): for y in range(高空格): 空格形狀.topleft = (甲邊界 + (x * 大小空格), 乙邊界 + (y * 大小空格)) if 幕[x][y] == 紅: 顯示.blit(紅圖形, 空格形狀) elif 幕[x][y] == 黑: 顯示.blit(黑圖形, 空格形狀) (畫而外的格子) if 例外 != None: if 例外['color'] == 紅: 顯示.blit(紅圖形, (例外['x'], 例外['y'], 大小空格, 大小空格)) elif 例外['color'] == 黑: 顯示.blit(黑圖形, (例外['x'], 例外['y'], 大小空格, 大小空格)) (畫背景) for x in range(寬空格): for y in range(高空格): 空格形狀.topleft = (甲邊界 + (x * 大小空格), 乙邊界 + (y * 大小空格)) 顯示.blit(圖形, 空格形狀) (畫黑色和紅色的格子) 顯示.blit(紅圖形, 紅形狀) 顯示.blit(黑圖形, 黑形狀)
  10. def 玩家移動(幕, 第一次移動): (開始拖動紅色棋子) 拖動記號 = True 記號甲, 記號乙 =

    event.pos elif event.type == MOUSEMOTION and 拖動記號: (更新拖動紅色棋子位子) 記號甲, 記號乙 = event.pos elif event.type == MOUSEBUTTONUP and 拖動記號: (結束拖動) if 記號乙 < 乙邊界 and 記號甲 > 甲邊界 and 記號甲 < 寬螢幕 - 甲邊界: (放開在屏幕頂部) 行 = int((記號甲 - 甲邊界) / 大小空格) if 空區域(幕, 行): 賦予落子生命(幕, 行, 紅) 幕[行][空行(幕, 行)] = 紅 畫布(幕) pygame.display.update() return 記號甲, 記號乙 = None, None 拖動記號 = False if 第一次移動: (顯示幫助圖像) 顯示.blit(指示圖形, 指示形狀) pygame.display.update() 更新時間.tick()
  11. def 賦予電腦移動(幕, 行): (移動黑子磚) while y > (乙邊界 - 大小空格):

    y -= int(速度) 速度 += 0.5 畫布(幕, {'x':x, 'y':y, 'color':黑}) pygame.display.update() 更新時間.tick() y = 乙邊界 - 大小空格 速度 = 1.0 while x > (甲邊界 + 行 * 大小空格): x -= int(速度) 速度 += 0.5
  12. (去除黑子磚) 賦予落子生命(幕, 行, 黑) def 電腦移動(幕): 潛在移動 = 得點移動(幕, 黑,

    難度) (得到最好的移動方式) 最適移動 = -1 for i in range(寬空格): if 潛在移動[i] > 最適移動 and 空區域(幕, i): 最適移動 = 潛在移動[i] 好的移動 = [] for i in range(len(潛在移動)): if 潛在移動[i] == 最適移動 and 空區域(幕, i): 好的移動.append(i) return random.choice(好的移動)
  13. def 得點移動(幕, 標題, 預知): if 預知 == 0 or 空間判斷(幕):

    return [0] * 寬空格 if 標題 == 紅: 空格標題 = 黑 else: 空格標題 = 紅 (做出最棒的動作) 潛在移動 = [0] * 寬空格 for 第一次移動 in range(寬空格): 欺騙幕 = copy.deepcopy(幕) if not 空區域(欺騙幕, 第一次移動): continue 移動(欺騙幕, 標題, 第一次移動) if 贏家(欺騙幕, 標題): (成功的移動) 潛在移動[第一次移動] = 1 break
  14. (不打擾其他計算動作) else: (玩家計數器) if 空間判斷(欺騙幕): 潛在移動[第一次移動] = 0 else: for

    計數移動 in range(寬空格): 欺騙幕2 = copy.deepcopy(欺騙幕) if not 空區域(欺騙幕2, 計數移動): continue 移動(欺騙幕2, 空格標題, 計數移動) if 贏家(欺騙幕2, 空格標題): 潛在移動[第一次移動] = -1 break else: (遞迴得點移動()) results = 得點移動(欺騙幕2, 標題, 預知 - 1) 潛在移動[第一次移動] += (sum(results) / 寬空格) / 寬空格 return 潛在移動
  15. def 空行(幕, 行): (回傳最低空行) for y in range(高空格-1, -1, -1):

    if 幕[行][y] == 空: return y return -1 def 空區域(幕, 行): (回傳TURE如果是空白值 反之回傳FALSE) if 行 < 0 or 行 >= (寬空格) or 幕[行][0] != 空: return False return True def 空間判斷(幕): (如果沒有任何空格在幕上,則返回True) for x in range(寬空格): for y in range(高空格): if 幕[x][y] == 空: return False return True
  16. def 贏家(幕, 標題): (檢查水平空間) for x in range(寬空格 - 3):

    for y in range(高空格): if 幕[x][y] == 標題 and 幕[x+1][y] == 標題 and 幕[x+2][y] == 標題 and 幕[x+3][y] == 標題: return True (檢查垂直空間) for x in range(寬空格): for y in range(高空格 - 3): if 幕[x][y] == 標題 and 幕[x][y+1] == 標題 and 幕[x][y+2] == 標題 and 幕[x][y+3] == 標題: return True (檢查對角線空間) for x in range(寬空格 - 3): for y in range(3, 高空格): if 幕[x][y] == 標題 and 幕[x+1][y-1] == 標題 and 幕[x+2][y-2] == 標題 and 幕[x+3][y-3] == 標題: return True for x in range(寬空格 - 3): for y in range(高空格 - 3): if 幕[x][y] == 標題 and 幕[x+1][y+1] == 標題 and 幕[x+2][y+2] == 標題 and 幕[x+3][y+3] == 標題: return True