• Share
  • Email
  • Embed
  • Like
  • Save
  • Private Content
Solitaire with Greenfoot #3
 

Solitaire with Greenfoot #3

on

  • 613 views

Greenfoot接龍(三)—遊戲的邏輯與規則 ...

Greenfoot接龍(三)—遊戲的邏輯與規則
發表於:Greenfoot教師工作坊(六)
時間:2012/6/29(五) 14:00
地點:南港高中
(共四集,請續點閱)
http://www.slideshare.net/imacat/solitaire-with-greenfoot-1
http://www.slideshare.net/imacat/solitaire-with-greenfoot-2
http://www.slideshare.net/imacat/solitaire-with-greenfoot-3
http://www.slideshare.net/imacat/solitaire-with-greenfoot-4

Statistics

Views

Total Views
613
Views on SlideShare
613
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

CC Attribution-ShareAlike LicenseCC Attribution-ShareAlike License

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 #3 Solitaire with Greenfoot #3 Presentation Transcript

    • Greenfoot 接龍(三) 遊戲的邏輯與規則 依瑪貓/楊士青imacat@mail.imacat.idv.tw 2012/6/29
    • 「接龍遊戲—由上而下的物件導向程式設計」簡報由 依瑪貓╱楊士青 製作, 以 創用CC Attribution-ShareAlike 3.0 Unported 授權條款 釋出。
    • 自我介紹依瑪貓╱楊士青臺灣師範大學資訊教育研究所碩一研究生
    • Solitaire 接龍遊戲
    • Solitaire 接龍遊戲請先回憶一下接龍怎 麼玩。上網搜尋 Solitaire Flash遊 戲試玩,回憶一下 。rbell rbell@21cn.com. Solitaire. Retrieved fromhttp://www.thepcmanwebsite.com/media/flash_solitaire/
    • 請開啟 solitaire-3 專案。
    • Solitaire 接龍遊戲用滑鼠右鍵點各牌疊 上方的頁角,看有 哪些方法可以執行 。執行看看!
    • Solitaire 接龍遊戲看看各個類別的說明 文件,已經有哪些 方法或工具?它們 的用途是什麼?
    • 想一想移牌的方法都有了嗎 ?若沒有,還缺哪些移 牌方法?若都有了,有沒有什 麼問題?
    • (本頁留白)(請勿往後偷看)
    • 移牌還有什麼問題?移牌應該要有規則,不是隨便移都可以。 現在隨便移都可以。移牌的行為定義好了,但是 沒有定義規則。暫存區應該要可以一次移多張牌。 現在一次只能移一張牌。
    • 想一想移牌的規則是什麼呢?
    • (本頁留白)(請勿往後偷看)
    • 移牌的規則若要移到暫存區… 最上面的牌要已經翻開了。 要和最上面的牌不同顏色,點數要小一點。 若是空牌疊,則只限 K (點數 13 )。若要移到歸整區… 要和最上面的牌同花色,點數要多一點。 若是空牌疊,則只限 A (點數 1 )。
    • 撲克牌若要移到暫存區…最上面的牌要已經翻開了。要和最上面的牌不同顏色,點數要小一點。若是空牌疊,則只限 K (點數 13 )。
    • WorkingPile 的 isAcceptCard() 方法在 WorkingPile 類別新增一個 isAcceptCard() 方法(內容先為空),傳 入值是要移過來的牌,回傳 boolean 是否 接受移牌。在所有牌疊 ( FlippedPile 、 WorkingPile 、 ResultPile )的 moveToWorking() 方法 最前面,使用 WorkingPile 的 isAcceptCard() 方法來判斷是否移牌。
    • WorkingPile 的 isAcceptCard() 方法試著自己實作看看 WorkingPile 的 isAcceptCard() 方法!
    • (本頁留白)(請勿往後偷看)
    • WorkingPile 的 isAcceptCard() 方法public class WorkingPile extends Pile{ /** * 是否接受移入撲克牌? * * @param card 要移入的撲克牌 * @return 是否接受移入撲克牌 */ public boolean isAcceptCard(Card card) { if (getSize() > 0) { if (getTopCard().isFaceUp() && card.isDifferentColorFrom(getTopCard()) && card.getValue() == getTopCard().getValue() - 1) { return true; } return false; } else { if (card.getValue() == 13) { return true; } return false; } }}
    • 在 moveToWorking() 中加上用 isAcceptCard() 判斷/*** 把牌移到暫存區的撲克牌疊。** @param index 暫存區的第幾疊牌 (0-6)*/public void moveToWorking(int index){ Table table = (Table) getWorld(); WorkingPile target = table.getWorkingPiles().get(index); if (target.isAcceptCard(getTopCard())) { Card card = takeTopCard(); target.addCard(card); }}
    • 試著跑跑看,結果正不正確。
    • 撲克牌若要移到歸整區…要和最上面的牌同花色,點數要多一點。若是空牌疊,則只限 A (點數 1 )。
    • ResultPile 的 isAcceptCard() 方法試著自己實作看看!
    • (本頁留白)(請勿往後偷看)
    • ResultPile 的 isAcceptCard() 方法public class ResultPile extends Pile{ /** * 是否接受移入撲克牌? * * @param card 要移入的撲克牌 * @return 是否接受移入撲克牌 */ public boolean isAcceptCard(Card card) { if (getSize() > 0) { if (card.getSuit() == getTopCard().getSuit() && card.getValue() == getTopCard().getValue() + 1) { return true; } return false; } else { if (card.getValue() == 1) { return true; } return false; } }}
    • 在 moveToResult() 中加上用 isAcceptCard() 判斷/*** 把牌移到歸整區的撲克牌疊。** @param index 歸整區的第幾疊牌 (0-3)*/public void moveToResult(int index){ Table table = (Table) getWorld(); ResultPile target = table.getResultPiles().get(index); if (target.isAcceptCard(getTopCard())) { Card card = takeTopCard(); target.addCard(card); }}
    • 試著跑跑看,結果正不正確。
    • 想一想我們的 FlippedPile 、 WorkingPile 、 ResultPile 都有一模一樣的 moveToWorking() 和 moveToResult() 方法。每次要改就要改三次,不小心就很 容易敲錯。有沒有什麼方法,可以更容易 維護?
    • 想一想如果 WorkingPile 移動到同一疊 WorkingPile ,或是 ResultPile 移動到同 一疊 ResultPile ,會發生什麼事?實際實 驗看看。
    • 暫存區多牌移動暫存區應該可以一次移動好幾張牌。一次移 動好幾張牌時,有什麼規則?
    • (本頁留白)(請勿往後偷看)
    • 多牌移動的規則只能由暫存區移動到暫存區。從某一張牌起,之後的牌一起移動。只能移動已翻開的牌。移動起算的牌,和要移動過去的牌疊,要遵 守前面的規則。 移動起算的牌,和要移動過去的牌疊第一張牌, 顏色要不同,點數要比它小一眼。 要移過去的牌疊是空的時候,移動起算的牌只能 是 K ( 13 點)。
    • 多牌移動的規則只能由暫存區移動到暫存區。 所以我們只要動 WorkingPile 的 moveToWorking() 方法即可。
    • 多牌移動的規則從某一張牌起,之後的牌一起移動。 一點點陣列與迴圈的小考驗!
    • 多牌移動的規則只能移動已翻開的牌。 我們只要檢查起算的牌即可,只要起算的牌已翻 開,後面的牌是後來疊上去的,一定是已翻開 的牌。
    • 多牌移動的規則移動起算的牌,和要移動過去的牌疊,要遵 守前面的規則。 可以套用前面寫的 isAcceptCard() 。
    • 暫存區多牌移動在 WorkingPile 加一個方法 moveToWorking(int start, int index) 。 和原來的 moveToWorking(int index) 不同, 這次多一個參數 start 。
    • 方法多載 (Overload)上次我們提到方法重載 (override) ,也就是 蓋掉父類別的方法,改用我們子類別自己 的方法。方法多載 (overload) :為簡化函式的命名問 題,物件導向程式語言允許在不同的方法 上,使用同一個名稱,只要參數不同即可 。 可以簡化同樣功能的方法的命名困擾。
    • 方法多載 (Overload)add: add(int, int) add(double, double) add(BigInteger, BigInteger)moveToWorking: moveToWorking(int index) moveToWorking(int start, int index)
    • 一點點陣列與迴圈的小考驗如何按順序,抽掉從第 i 張到最後第 n-1 張 的牌?
    • 一點點陣列與迴圈的小考驗 Source Target … … M i i+1 … N Source Target … … i M+1 … N-1
    • 一點點陣列與迴圈的小考驗每次抽掉第 i 張後,後面補上,所以下一次抽 的還是第 i 張,只是總張數 N 減少了。一直抽到沒得抽為止,所以是抽到 N<=i 停 下來。
    • WorkingPile 的moveToWorking(int,int) 方法試著自己實作看看!
    • (本頁留白)(請勿往後偷看)
    • 暫存區多牌移動public class WorkingPile extends Pile{ /** * 把多張牌移到暫存區的撲克牌疊。 * * @param start 從第幾張牌開始 * @param index 暫存區的第幾疊牌 (0-6) */ public void moveToWorking(int start, int index) { Table table = (Table) getWorld(); WorkingPile target = table.getWorkingPiles().get(index); if (getCard(start).isFaceUp() && target.isAcceptCard(getCard(start))) { while (start < getSize()) { Card card = takeCard(start); target.addCard(card); } } }}
    • 試著跑跑看,結果正不正確。
    • 如果你上面的練習都做得正確,程式應該會長得像 solitaire-4 一樣。
    • 中場休息歡迎提出問題