---
# System prepended metadata

title: 紙牌遊戲 Beta test

---

# 紙牌遊戲 Beta test

### Feedback from Tim
### U1 第一張牌
* 最一開始希望能有個簡短的動畫，讓學生知道成果長得什麼樣子
* 建議可以把專案的 features/steps 先寫出來（就像是我們做 webinar 一樣）
* `這裡，我們用百分比的方式設定卡片大小。用到的是 flex 的捷徑語法，它一次可以控制三個屬性，依序分別是：` 這裡建議增加說明，讓學生知道這是指上面 CSS 當中 flex: 後面的三個參數
* `flex-basis` 這斷解說如果有圖示的話會更好
* `最後再加上卡片高度：.card { height: 8vw }` 這裡上架格式好像有誤 


### U2 第一張牌

* 這一段的程式碼應該有誤，src 裡面應該不會再包 a tag?

```javascript=
const view = {
  // displayCards(){...},
  getCardElement(index) {
    return `<div class="card"><p>8</p><img src="<a href="https://image.flaticon.com/icons/svg/105/105219.svg" target="_blank">https://image.flaticon.com/icons/svg/105/105219.svg</a>"><p>8</p></div>`
  }
}
```
* `3.- keys() 回傳的是一個 iterator` 不確定我們有沒有教過 iterator
* 樣式校正 > 設定牌桌 這一段的程式碼上架格式錯誤

### U3 洗牌
* Fisher-Yates Shuffle 如果有中文的介紹文章會更好 :)


### U4 點擊與翻牌

* 問題：在這個遊戲之前，我們之前有教物件導向的寫法嗎？
* 問題：這裡開始拆分 view & controller 所負責的 function，需要特別多解釋一點這個概念嗎？


### U6 計分

* 在這個 unit 裡面還沒有定義 view.renderScore 這個 function，所以會出錯
```javascript=
 score () {
    view.renderScore((model.score += 10))
    view.pairCard(model.revealedCards[0])
    view.pairCard(model.revealedCards[1])
    model.clearRevealedCards()
    this.currentState = GAME_STATE.FirstCardAwaits
  }
```

### U7 優化遊戲體驗
* 最後面的程式碼不完全，並非最終的程式碼
* 遊戲結束的時候，沒有動畫出現。猜測是 controller 中的
```javascript
showGameFinished() {
  const completeText = document.createElement('p')
  const header = document.querySelector('#header')
  const cards = document.querySelector('#cards')
  
  completeText.classList.add('complete')
  completeText.innerText = 'Complete!'
  
  header.insertBefore(completeText, document.querySelector('#header .score'))
  header.classList.add('completed')
  cards.classList.add('completed')
}
```
沒有被呼叫。應該要再 score 等於滿分的時候，呼叫出這個 function

### 總結
* 我大概花了 2~3 小時看過內容，複製貼上程式碼試跑。如果學生認真要學的話，可能要花至少 3 天的時間吧
* 學生如果沒有物件導向的概念，可能會稍微卡住
* 學生應該是一次遇到 scope 這麼大的專案，建議可以先把所有 functions 以及 model/view/controller 的分類＆roadmap 先寫出來讓學生有個最基本的 overview。我猜學生可能容易迷失在眾多的步驟與 function 當中，然後不知道自己在做什麼
* 建議 Model/View/Controller 的分類可以多說明一點
* 我猜測有些學生學完之後會自信心受挫。因為第一次接觸到較為大型的專案，學習的過程中可能就真的只能複製貼上，要到自己真的能夠從0開始刻的階段，可能會有一個 gap。建議在專案的最開始建立好期待，以及學習重點，譬如
```
    *  Stage 1 - 跟著教案一步一步完成
    *  Stage 2 - 充分了解物件導向寫法、MVC架構等
    *  Stage 3 - 能夠將複雜專案差解成細部的 functions
    *  ...
```
以上是我隨便寫的，總之我認為期待需要訂得非常清楚 ...
* 建議可以在過程中，可以引導學生回頭複習相關章節
* 對於程度優秀的學生來說應該蠻好玩的，但是對於程度中等，甚至是中上的學生來說，會覺得有點挑戰。不確定目前這個教材的難度設定為何

***
### 踩地雷作業

https://codepen.io/tsungtingdu-the-bold/pen/povzxgY

1. 基本版遊戲主架構大概花 3 hr 完成，剩下 2 hr 再修一些細節
2. 第一次打開 ac 提供的 codepen 範本的時候，其實有點不知道該如何下手，所以就馬上關掉。稍微思考一個晚上決定設計思路後，隔天才開始寫。寫的時候主要按照自己的想法來寫，並沒有完全按照 ac 提供的架構 or function 來寫，所以會有未使用的程式碼
3. 這份題目對我來說難易適中，雖然前面翻牌遊戲的內容提供了很好的設計想法，但我最一開始沒有辦法立即將翻牌遊戲的設計應用在踩地雷上，花了一點時間回頭消化翻牌遊戲的內容
4. 有參考外部資源，主要是 2D array 的使用以及 Timer 設計
5. 這個遊戲有蠻大的發揮空間，應該蠻好玩的，但是我想對於一些學生來說，要把翻牌遊戲的學習應用在踩地雷上面可能是一大挑戰。也許可以提供設計的思路，讓學生能夠一步一步慢慢做出東西