changed 2 years ago
Linked with GitHub

2023 資訊之芽 Python 語法班第一階段大作業 貪吃蛇

Deadline: 4/30

新 Deadline : 5/3 23:59

Announcement

  • 4/14: 因為有些人還是不太清楚一些function的實作方法,所以在 提示 裡面簡單介紹 generate_food, detect_food_collision 可以嘗試的方向
  • 4/15: Controller.pygenerate_poison 的註解有誤。
    原本註解為
在隨機位置生成一個 `Poison` 的物件並回傳,不能與現有其他物件或玩家重疊
無回傳值

應更正成

在隨機位置生成一個 `Poison` 的物件並回傳,不能與現有其他物件或玩家重疊
  • 5/1: 因為繳交數比我們預期中的少,所以我們將這次大作業延長3天到5/3 23:59,但是遲交的分數會打6折。改作業時依舊會照最晚交的那份為主。時間戳記依據google表單。

作業程式連結
作業繳交連結

事前準備

安裝 python3

  • 理論上大家應該都裝好了(?)

安裝 pygame

注意:指令都只要複製 $ 後面的字就好,$ 是表示指令之前的提示符號

Windows

按下 Win+R,輸入 cmd 開啟命令提示字元
輸入以下指令安裝 pygame 的遊戲套件

$ python -m pip install pygame --user

或是

$ python3 -m pip install pygame --user

MacOS/Linux

打開 terminal,輸入以下指令

$ python3 -m pip install pygame --user

下載作業

Links 下載作業連結。解壓縮後應該會有這些檔案

  • main.py
  • Models.py
  • Controllers.py
  • Config.py

執行

打開 cmd 或 terminal 輸入以下指令,python 還是 python3 是根據 安裝

$ cd 程式資料夾
$ python main.py
(或是)
$ python3 main.py

如果一切都沒有問題的話應該會跳出一個視窗,然後在 terminal 出現以下文字

作業內容

  • 透過方向鍵控制貪吃蛇移動,吃到食物長度會變長,吃到毒藥長度會變短,碰到邊界、牆壁、自己就遊戲結束。
  • 碰到食物或毒藥後要生出新的對應物件。
  • 移動的時間間隔會隨著蛇的長度而變短

一共有 4 個 .py 檔案

  • 主要的遊戲迴圈在 main.py 裡面
  • Config.py 裡面定義一些會用到的常數及設定
  • Model.py 裡面定義遊戲物件,如食物、牆壁、蛇等
  • Controller.py 裡面是一些關於偵測和操控物件的函式

交作業的時候請只把所有必要的檔案,外加README.txt/README.md加到壓縮檔 姓名_X區.zip

解壓縮 王小明_北區.zip後,資料夾的內容應該要長這樣

Tasks

底下依照類別或功能做了分類,沒有說一定要按照這個順序 (但有些還是要,例如要先做生成再做碰撞)
括號中的是跟該功能相關的 function 名稱

另外,每個你要完成的 function 中都有註解告訴你細節,你只需要把中文理解之後轉換成 Python 程式碼即可

移動

  • 玩家移動(Player.move) - 10pt

生成物件

  • 生成牆壁(Controller.py generate_wall) - 10pt
    • 新牆壁生在現有牆壁周圍 - 10pt (bonus)
  • 生成食物(Controller.py generate_food) - 5pt
  • 生成毒藥(Controller.py generate_poison) - 5pt
  • 生成蛇(Player.new_block) - 5pt

碰撞

  • 邊界碰撞(Player.check_border) - 5pt
  • 蛇碰撞(Player.detect_player_collision) - 15pt
  • 牆壁碰撞(Player.detect_wall_collision) - 5pt
  • 食物碰撞(Player.detect_food_collision) - 10pt
  • 毒藥碰撞(Player.detect_poison_collision) - 10pt

遊戲機制

  • 根據蛇長度調整移動間格(Controller.pycalculate_time_interval) - 10pt

其他

  • 畫蛇添足(Player.draw_snake) - 5pt
  • coding style - 5pt(bonus)
  • 檔案結構 - 5pt
  • 發揮你的創意(加了甚麼記得寫在README裡面,沒寫此項目不予給分) - 0~10pt(bonus)

提示

這邊只是給不知道怎麼寫的人一個大概的方向,如果你的做法跟這邊不一樣也沒關係

def detect_food_collision(self, foods):
    """
    判斷蛇的頭是否碰到食物
    有碰到就回傳 True
    沒有碰到回傳 False
    """
    # 定義第一塊的位置
    # 把 foods 裡面每一項抓出來比對
    # 如果 x 或 y 的座標差比蛇的寬高小就算碰撞
def generate_food(foods, walls, player):
    """
    在隨機位置生成一個Food的物件並加到foods裡面,不能與現有牆壁或玩家重疊
    無回傳值
    """
    # 隨機選一個座標
    # 跟每個物件一一比對有沒有重疊
    # 如果重疊就重新選座標
Select a repo