# 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 出現以下文字

## 作業內容
- 透過方向鍵控制貪吃蛇移動,吃到食物長度會變長,吃到毒藥長度會變短,碰到邊界、牆壁、自己就遊戲結束。
- 碰到食物或毒藥後要生出新的對應物件。
- 移動的時間間隔會隨著蛇的長度而變短
一共有 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.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裡面,不能與現有牆壁或玩家重疊
無回傳值
"""
# 隨機選一個座標
# 跟每個物件一一比對有沒有重疊
# 如果重疊就重新選座標
```