# 2023 python 語法班 一階大作業
siriuskoan & yjrubixcube
---
## 作業簡介
[spec連結](/yichzSHkRRinQDgxykF4VQ)
- 用python跟pygame寫貪吃蛇
- 基本的架構已經寫好了
- 實作一些function/method
----
## 作業目標
- 熟悉之前學過的python語法
- 學習寫稍微長一點的程式
- 體驗python的應用(Pygame)
----
## 貼心提醒
- 4/30 截止
- 不需要知道程式碼每一行在幹嘛
- 除蟲的時候可以使用print大法
- 也可以用break/return
- 善用註解
- 不懂就問
---
## 前置作業
----
### pygame
`$ python -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 出現以下文字
![](https://i.imgur.com/j61lWfS.png)
---
## 程式碼
----
### Class
- 自定義變數型態
- 用某個模板做出一個變數
- 有屬性(attribute)跟方法(method)
- 用`物件.attribute`或是`物件.method(參數)`
----
```python=
class Food:
# 有關Food的初始化、method、attribute等
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]
# 用Food生成一個物件food1
food1 = Food((100, 200))
print(food1.pos_x) # 100
```
----
### 遊戲物件 - Player
```python=
player = Player()
player.head_x
player.head_y
player.length
player.snake_list # 一個list[list]
player.snake_list[3] # [x, y, SNAKE_SIZE, SNAKE_SIZE]
```
遊戲裡面所有的座標都是記左上角!
遊戲裡面所有的座標都是記左上角!!
遊戲裡面所有的座標都是記左上角!!!
----
### 遊戲物件 - 其他
`Food, Poison, Wall`
`foods, walls, next_walls (list)`
```python=
p = Poison((89, 64))
x = foods[3].pos_x
y = walls[2].pox_y
```
遊戲裡面所有的座標都是記左上角!
遊戲裡面所有的座標都是記左上角!!
遊戲裡面所有的座標都是記左上角!!!
----
### 座標
- pygame的`(0, 0)`在畫面左上角
- x 向右為正
- y 向下為正
![](https://i.imgur.com/5rPFbyR.png)
---
## 遊戲簡介
----
![](https://i.imgur.com/TZTWyPh.png)
----
### 規則
- 碰到食物(紅色)
- 碰到毒藥(綠色)變短
- 碰到牆壁(白色)遊戲結束
- 碰到自己遊戲結束
- 超出邊界遊戲結束
----
### 物件 - 蛇
用方向鍵控制蛇(黃藍)的移動
![](https://i.imgur.com/YLtHfkd.png)
----
### 物件 - 食物
蛇碰到食物(紅色)會變長
吃完後要生新的食物
----
### 物件 - 食物
![](https://i.imgur.com/ao0WIfO.png)
----
### 物件 - 食物
![](https://i.imgur.com/YLtHfkd.png)
----
### 物件 - 牆壁
蛇吃到食物的時候後生新的牆壁(白色)
新的牆壁要在現有牆壁周圍
----
### 物件 - 牆壁
![](https://i.imgur.com/ZiiySXF.png)
----
### 物件 - 牆壁
![](https://i.imgur.com/YLtHfkd.png)
----
### 物件 - 毒藥
蛇吃到毒藥長度變短
吃到毒藥或食物後生成新的毒藥
----
### 物件 - 毒藥
![](https://i.imgur.com/dXNcNf0.png)
----
### 物件 - 毒藥
![](https://i.imgur.com/2VlW5TV.png)
---
## Coding style
----
增加程式的可讀性
推薦風格: [PEP8](https://peps.python.org/pep-0008/)
我們可以用`black`來快速reformat
----
### `black`
下載
`$ python -m pip install black`
reformat `main.py`
`$ black main.py`
reformat 所有檔案
`$ black .`
---
## 作業繳交
交作業的時候請繳交一個zip檔(`王小明_北區.zip`)
解壓縮 `王小明_北區.zip`後,資料夾的內容應該要長這樣
![](https://i.imgur.com/17FvxmO.png)
----
### 如何zip
先把檔案放到資料夾`王小明_北區`內,然後在終端機/cmd裡面打
`zip -r 王小明_北區.zip 王小明_北區`
---
# Q & A
{"metaMigratedAt":"2023-06-18T00:24:12.694Z","metaMigratedFrom":"YAML","title":"2023 python 語法班 一階大作業","breaks":true,"contributors":"[{\"id\":\"54bbdba3-ffbf-423a-b026-751cb8a77149\",\"add\":4371,\"del\":1485}]"}