Solitaire with Greenfoot #2/4
Upcoming SlideShare
Loading in...5
×
 

Solitaire with Greenfoot #2/4

on

  • 578 views

Greenfoot接龍()—由上而下的物件導向程式設計(上)...

Greenfoot接龍()—由上而下的物件導向程式設計(上)
發表於:Greenfoot教師工作坊(五)
時間:2012/6/15(五) 14:00
地點:南港高中
(共四集,請續點閱)

Statistics

Views

Total Views
578
Views on SlideShare
578
Embed Views
0

Actions

Likes
0
Downloads
1
Comments
0

0 Embeds 0

No embeds

Accessibility

Categories

Upload Details

Uploaded via as OpenOffice

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Solitaire with Greenfoot #2/4 Solitaire with Greenfoot #2/4 Presentation Transcript

  • Greenfoot 接龍(二)由上而下的物件導向程 式設計(下) 依瑪貓/楊士青imacat@mail.imacat.idv.tw 2012/6/15
  • 「接龍遊戲—由上而下的物件導向程式設計」簡報由 依瑪貓╱楊士青 製作, 以 創用CC Attribution-ShareAlike 3.0 Unported 授權條款 釋出。
  • 自我介紹依瑪貓╱楊士青臺灣師範大學資訊教育研究所碩一研究生
  • 二、設計方法 (Method)
  • 類別、物件建立好了以後,要怎麼樣才能讓程式動起來?
  • 玩接龍的時候,撲克牌是怎麼動的呢?
  • 撲克牌是怎麼動的?
  • 還沒翻的牌疊
  • 已翻開的牌疊
  • 暫放區的牌疊
  • 歸整區的牌疊
  • 撲克牌是怎麼動的?還沒翻的牌疊 暫放區的牌疊 翻牌 移到暫放區其他疊翻開來的牌疊 移到歸整區 重新翻牌 歸整區的牌疊 移到暫放區 移到暫放區 移到歸整區 移到歸整區其他疊
  • 步驟一:建立方法還沒翻的牌疊 class UnflippedPile { 翻牌 public void flipNextCard() { } }
  • 步驟一:建立方法翻開來的牌疊 class FlippedPile { 重新翻牌 public void returnAllCards() { } 移到暫放區 public void moveToWorking() { 移到歸整區 } public void moveToResult() { } }
  • 步驟一:建立方法暫放區的牌疊 class WorkingPile { 移到暫放區其他疊 public void moveToWorking() { } 移到歸整區 public void moveToResult() { } }
  • 步驟一:建立方法歸整區的牌疊 class ResultPile { 移到暫放區 public void moveToWorking() { } 移到歸整區其他疊 public void moveToResult() { } }
  • 步驟一:建立方法請先建立沒有內容的空方法。 不需要填上內容。
  • 步驟一:建立方法 物件要做什麼動作,我們就建立什麼方法。
  • 步驟一:建立方法每個物體的動作,都對應到我們建立的一個 method 。 物件導向程式設計,把我們理解的抽象物件行為 ,直接對應到 method ,寫成 method 。
  • 方法建好後,我們就來開始實作方法裏的程式碼。
  • 步驟二:方法內容實作 翻牌 flipNextCard()用 takeTopCard() 抽出最上面的撲克牌。用 turnFaceUp() 翻正面。用 addCard(Card card) 把牌放到已翻開的 牌堆。
  • 步驟二:方法內容實作 強制型別轉換Table table = (Table) getWorld()getWorld() 是 UnflippedPile 繼承自 Actor 的方法,傳回值型態是 World 。
  • 步驟二:方法內容實作 強制型別轉換getWorld() 是 UnflippedPile 繼承自 Actor的方法,傳回值型態是 World 。我們要拿 Table 的 flippedPile 來 addCard , flippedPile 屬於 Table ,而 不是 World 。Java 編譯認定 World 沒有 flippedPile ,只 有 Table 才有 flippedPile 。
  • 步驟二:方法內容實作 強制型別轉換解決方法:強制型別轉換 type casting 。(Table) getWorld() 和 C 語言的強制型別轉換一樣。 float pi = 3.1415926; int p = (int) pi;
  • 步驟二:方法內容實作 強制型別轉換子類別轉到父類別,因為子類別本來就屬於父類別,不需強制型別轉換。 World world = table; card.pile = unflippedPile; Pile pile = unflippedPile;
  • 步驟二:方法內容實作 強制型別轉換父類別轉到子類別,才需強制型別轉換。 Table table = (Table) getWorld();
  • 步驟二:方法內容實作 強制型別轉換只有父類別可以轉到子類別,不相關的類別間不能轉。 以下都是錯誤範例: FlippedPile pile = (FlippedPile) unflippedPile; Card card = (Card) pile; Table table = (Table) card;
  • 步驟二:方法內容實作 強制型別轉換強制型別轉換有危險性,教科書教很多。 但因為我們已知這個 World 就是 Table ,這是 程式設計者已知的現實,所以無所謂。
  • 步驟二:方法內容實作 強制型別轉換因為 Actor 不知道 Table 的存在,由 Actor繼承來的 getWorld() ,只可能回傳World ,不可能直接回傳 Table 。 所以父類別轉為子類別的強制型別轉換,是物件 導向程式設計常見的技巧。
  • 步驟二:方法內容實作 翻牌 flipNextCard()** * 未翻開的撲克牌疊。 */public class UnflippedPile extends Pile{ /** * 翻一張撲克牌。 */ public void flipNextCard() { Table table = (Table) getWorld(); Card card = takeTopCard(); card.turnFaceUp(); table.flippedPile.addCard(card); }}
  • 試著執行看看。
  • 步驟二:方法內容實作 重新翻牌 returnAllCards()用 takeTopCard() 抽出最上面的撲克牌。用 turnFaceDown() 翻背面。用 addCard(Card newCard) 把牌放到未翻 開的牌堆。重複做到所有的牌都還回去為止。
  • 步驟二:方法內容實作重新翻牌 returnAllCards() 歡迎大家自己實作看看, 測試自己的實力!
  • 步驟二:方法內容實作 重新翻牌 returnAllCards()/** * 已翻開的撲克牌疊。 */public class FlippedPile extends Pile{ /** * 重新翻牌。把撲克牌全部退回未翻開的牌疊。 */ public void returnAllCards() { Table table = (Table) getWorld(); while (getSize() > 0) { Card card = takeTopCard(); card.turnFaceDown(); table.getUnflippedPile().addCard(card); } }}
  • 試著執行看看。
  • 如果你上面的練習都做得正確,程式應該會長得像 solitaire-2 一樣。
  • 習題剩下的 moveToWorking() 、 moveToResult() , 請大家回去自己做做看。
  • 謝謝大家。歡迎提出問題。