# Homework 1
**siriuskoan & yjrubixcube**
---
## Outline
- 相關資訊
- 事前準備
- 作業內容
- 相關教學
---
## 相關資訊
- 截止日期為 4/30
- 請用 Python3 (最好是用 3.11 但應該差別不大) 寫作業
- [作業資訊](https://hackmd.io/yichzSHkRRinQDgxykF4VQ)
- [繳交表單](https://forms.gle/FYbjVT5ThfmQNX4a6)
---
## 事前準備
----
### 安裝 Python3
但大家應該都裝好了
----
### 安裝 pygame
```
$ python3 -m pip install pygame --user
```
----
### 下載作業
[連結](https://drive.google.com/file/d/1YrwB7ykygJAjRtRGN6UvgBSgt__f2TPa/view?usp=sharing)
載下來之後解壓縮會看到
- `main.py`
- `Models.py`
- `Controllers.py`
- `Config.py`
----
### 嘗試跑跑看
```
$ python main.py
```
----
### 嘗試跑跑看
成功的話會跳出一個視窗然後馬上消失,同時 terminal 會出現

---
## 作業內容
反正就是寫個貪吃蛇
但沒那麼狠,有模板

----
### 遊戲規則
- 透過方向鍵控制貪吃蛇移動,並且
- 吃到食物長度會變長
- 吃到毒藥長度會變短
- 碰到邊界、牆壁、自己就遊戲結束
- 碰到食物或毒藥後要生出新的對應物件
- 移動的時間間隔會隨著蛇的長度而變短
----
### 你們要做的事
詳細內容及配分請見上述的文件,總分 125 分
- 移動
- 生成物件
- 碰撞
- 遊戲機制
- 其他
----
### 繳交
交作業的時候請繳交全部的 `.py` 檔案,以及介紹你的創意部分的 `README.md`
但如果沒有做創意部份的話,只需要你們修改 `Model.py` 和 `Controller.py`
---
## 相關教學
----
### `class`
```python=
class Food:
def __init__(self, pos):
self.surf = pg.surface.Surface(size=(SNAKE_SIZE, SNAKE_SIZE))
self.surf.fill(FOOD_COLOR)
self.rect = self.surf.get_rect(topleft=pos)
@property
def pos_x(self):
return self.rect.topleft[0]
@property
def pos_y(self):
return self.rect.topleft[1]
```
----
### `class`
`class` 裡面的 `self` 會代指物件本身,像這個例子就是代指蛇本身
----
### Coding Style
Python 語言本身很自由,但有推薦一些程式碼風格,這些規則都定義在 PEP8 裡面
我們可以用 `black` 來快速幫你 reformat
----
### Coding Style
下載 `black`
```
$ python3 -m pip install black --user
```
reformat 全部的檔案
```
$ python3 -m black .
```
---
### pygame 座標

----
### 貼心提醒
- 基本架構已經寫好了,也不需要理解每一行程式的意思
- debug 時可以用 `print` 幫助你
- 遇到不知道甚麼東西的時候先 `print` 就對了
- 不懂就問
---
## Live Demo
---
## Q & A
---
## 課堂練習
實作 `draw_snake`
的一部分
{"metaMigratedAt":"2023-06-18T01:01:16.134Z","metaMigratedFrom":"YAML","title":"Homework 1","breaks":true,"contributors":"[{\"id\":\"a2dd0460-a150-40b3-8024-44d3b3f2e06b\",\"add\":2049,\"del\":50}]"}