Weitere ähnliche Inhalte
Ähnlich wie Solitaire with Greenfoot #2/4 (8)
Solitaire with Greenfoot #2/4
- 12. 撲克牌是怎麼動的?
還沒翻的牌疊 暫放區的牌疊
翻牌 移到暫放區其他疊
翻開來的牌疊 移到歸整區
重新翻牌 歸整區的牌疊
移到暫放區 移到暫放區
移到歸整區 移到歸整區其他疊
- 13. 步驟一:建立方法
還沒翻的牌疊 class UnflippedPile
{
翻牌 public void flipNextCard() {
}
}
- 14. 步驟一:建立方法
翻開來的牌疊
class FlippedPile
{
重新翻牌 public void returnAllCards() {
}
移到暫放區 public void moveToWorking() {
移到歸整區 }
public void moveToResult() {
}
}
- 15. 步驟一:建立方法
暫放區的牌疊
class WorkingPile
{
移到暫放區其他疊 public void moveToWorking() {
}
移到歸整區 public void moveToResult() {
}
}
- 16. 步驟一:建立方法
歸整區的牌疊
class ResultPile
{
移到暫放區 public void moveToWorking() {
}
移到歸整區其他疊 public void moveToResult() {
}
}
- 21. 步驟二:方法內容實作
翻牌 flipNextCard()
用 takeTopCard() 抽出最上面的撲克牌。
用 turnFaceUp() 翻正面。
用 addCard(Card card) 把牌放到已翻開的
牌堆。
- 22. 步驟二:方法內容實作
強制型別轉換
Table table = (Table) getWorld()
getWorld() 是 UnflippedPile 繼承自 Actor
的方法,傳回值型態是 World 。
- 23. 步驟二:方法內容實作
強制型別轉換
getWorld() 是 UnflippedPile 繼承自 Actor
的方法,傳回值型態是 World 。
我們要拿 Table 的 flippedPile 來
addCard , flippedPile 屬於 Table ,而
不是 World 。
Java 編譯認定 World 沒有 flippedPile ,只
有 Table 才有 flippedPile 。
- 24. 步驟二:方法內容實作
強制型別轉換
解決方法:強制型別轉換 type casting 。
(Table) getWorld()
和 C 語言的強制型別轉換一樣。
float pi = 3.1415926;
int p = (int) pi;
- 25. 步驟二:方法內容實作
強制型別轉換
子類別轉到父類別,因為子類別本來就屬於
父類別,不需強制型別轉換。
World world = table;
card.pile = unflippedPile;
Pile pile = unflippedPile;
- 26. 步驟二:方法內容實作
強制型別轉換
父類別轉到子類別,才需強制型別轉換。
Table table = (Table) getWorld();
- 27. 步驟二:方法內容實作
強制型別轉換
只有父類別可以轉到子類別,不相關的類別
間不能轉。
以下都是錯誤範例:
FlippedPile pile = (FlippedPile) unflippedPile;
Card card = (Card) pile;
Table table = (Table) card;
- 28. 步驟二:方法內容實作
強制型別轉換
強制型別轉換有危險性,教科書教很多。
但因為我們已知這個 World 就是 Table ,這是
程式設計者已知的現實,所以無所謂。
- 29. 步驟二:方法內容實作
強制型別轉換
因為 Actor 不知道 Table 的存在,由 Actor
繼承來的 getWorld() ,只可能回傳
World ,不可能直接回傳 Table 。
所以父類別轉為子類別的強制型別轉換,是物件
導向程式設計常見的技巧。
- 30. 步驟二:方法內容實作
翻牌 flipNextCard()
**
* 未翻開的撲克牌疊。
*/
public class UnflippedPile extends Pile
{
/**
* 翻一張撲克牌。
*/
public void flipNextCard()
{
Table table = (Table) getWorld();
Card card = takeTopCard();
card.turnFaceUp();
table.flippedPile.addCard(card);
}
}
- 32. 步驟二:方法內容實作
重新翻牌 returnAllCards()
用 takeTopCard() 抽出最上面的撲克牌。
用 turnFaceDown() 翻背面。
用 addCard(Card newCard) 把牌放到未翻
開的牌堆。
重複做到所有的牌都還回去為止。
- 34. 步驟二:方法內容實作
重新翻牌 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);
}
}
}