# 2023 資訊之芽 Python 語法班第一階段大作業 貪吃蛇 ## Deadline: 4/30 ## 新 Deadline : 5/3 23:59 ## Announcement - 4/14: 因為有些人還是不太清楚一些function的實作方法,所以在 [提示](#提示) 裡面簡單介紹 `generate_food, detect_food_collision` 可以嘗試的方向 - 4/15: `Controller.py` 的 `generate_poison` 的註解有誤。 原本註解為 ``` 在隨機位置生成一個 `Poison` 的物件並回傳,不能與現有其他物件或玩家重疊 無回傳值 ``` 應更正成 ``` 在隨機位置生成一個 `Poison` 的物件並回傳,不能與現有其他物件或玩家重疊 ``` - 5/1: 因為繳交數比我們預期中的少,所以我們將這次大作業延長3天到5/3 23:59,但是遲交的分數會打6折。改作業時依舊會照最晚交的那份為主。時間戳記依據google表單。 ## Links [作業程式連結](https://drive.google.com/file/d/1YrwB7ykygJAjRtRGN6UvgBSgt__f2TPa/view?usp=sharing) [作業繳交連結](https://docs.google.com/forms/d/e/1FAIpQLSfmsMORgSIgVNw3sZoovcAquAyNC5TuhEaXzIdRitIq3GYzfw/viewform) ## 事前準備 ### 安裝 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](#Links) 下載作業連結。解壓縮後應該會有這些檔案 - `main.py` - `Models.py` - `Controllers.py` - `Config.py` ### 執行 打開 cmd 或 terminal 輸入以下指令,`python` 還是 `python3` 是根據 [安裝](#安裝-pygame) ``` $ cd 程式資料夾 $ python main.py (或是) $ python3 main.py ``` 如果一切都沒有問題的話應該會跳出一個視窗,然後在 terminal 出現以下文字 ![](https://i.imgur.com/8ofN0u3.png) ## 作業內容 - 透過方向鍵控制貪吃蛇移動,吃到食物長度會變長,吃到毒藥長度會變短,碰到邊界、牆壁、自己就遊戲結束。 - 碰到食物或毒藥後要生出新的對應物件。 - 移動的時間間隔會隨著蛇的長度而變短 一共有 4 個 `.py` 檔案 - 主要的遊戲迴圈在 `main.py` 裡面 - `Config.py` 裡面定義一些會用到的常數及設定 - `Model.py` 裡面定義遊戲物件,如食物、牆壁、蛇等 - `Controller.py` 裡面是一些關於偵測和操控物件的函式 交作業的時候請只把所有必要的檔案,外加`README.txt/README.md`加到壓縮檔 `姓名_X區.zip` 內 解壓縮 `王小明_北區.zip`後,資料夾的內容應該要長這樣 ![](https://i.imgur.com/MDxkq0E.png) ## 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.py` 的 `calculate_time_interval`) - *10pt* ### 其他 - [ ] 畫蛇添足(`Player.draw_snake`) - *5pt* - [ ] coding style - *5pt(bonus)* - [ ] 檔案結構 - *5pt* - [ ] README.md or README.txt,裡面記錄你加了什麼功能 - [ ] Controller.py - [ ] Model.py - [ ] Config.py - [ ] main.py - [ ] 其他可能會用到的檔案(圖片、模組等) - [ ] 用 zip 格式壓縮,檔名格式為 `王小明_北區.zip` - [ ] 發揮你的創意(加了甚麼記得寫在README裡面,沒寫此項目不予給分) - *0~10pt(bonus)* --- ## 提示 這邊只是給不知道怎麼寫的人一個大概的方向,如果你的做法跟這邊不一樣也沒關係 ```python def detect_food_collision(self, foods): """ 判斷蛇的頭是否碰到食物 有碰到就回傳 True 沒有碰到回傳 False """ # 定義第一塊的位置 # 把 foods 裡面每一項抓出來比對 # 如果 x 或 y 的座標差比蛇的寬高小就算碰撞 ``` ```python def generate_food(foods, walls, player): """ 在隨機位置生成一個Food的物件並加到foods裡面,不能與現有牆壁或玩家重疊 無回傳值 """ # 隨機選一個座標 # 跟每個物件一一比對有沒有重疊 # 如果重疊就重新選座標 ```