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.thepc...
請開啟 solitaire-3 專案。
Solitaire 接龍遊戲用滑鼠右鍵點各牌疊 上方的頁角,看有 哪些方法可以執行 。執行看看!
Solitaire 接龍遊戲看看各個類別的說明 文件,已經有哪些 方法或工具?它們 的用途是什麼?
想一想移牌的方法都有了嗎 ?若沒有,還缺哪些移 牌方法?若都有了,有沒有什 麼問題?
(本頁留白)(請勿往後偷看)
移牌還有什麼問題?移牌應該要有規則,不是隨便移都可以。 現在隨便移都可以。移牌的行為定義好了,但是  沒有定義規則。暫存區應該要可以一次移多張牌。 現在一次只能移一張牌。
想一想移牌的規則是什麼呢?
(本頁留白)(請勿往後偷看)
移牌的規則若要移到暫存區… 最上面的牌要已經翻開了。 要和最上面的牌不同顏色,點數要小一點。 若是空牌疊,則只限 K (點數 13 )。若要移到歸整區… 要和最上面的牌同花色,點數要多一點。 若是空牌疊,則只限 A (點數 1 )。
撲克牌若要移到暫存區…最上面的牌要已經翻開了。要和最上面的牌不同顏色,點數要小一點。若是空牌疊,則只限 K (點數 13 )。
WorkingPile 的     isAcceptCard() 方法在 WorkingPile 類別新增一個 isAcceptCard() 方法(內容先為空),傳 入值是要移過來的牌,回傳 boolean 是否 接受移牌。在所有牌疊 ( Fl...
WorkingPile 的    isAcceptCard() 方法試著自己實作看看 WorkingPile 的 isAcceptCard() 方法!
(本頁留白)(請勿往後偷看)
WorkingPile 的                          isAcceptCard() 方法public class WorkingPile extends Pile{    /**     * 是否接受移入撲克牌?    ...
在 moveToWorking() 中加上用 isAcceptCard() 判斷/*** 把牌移到暫存區的撲克牌疊。** @param index 暫存區的第幾疊牌 (0-6)*/public void moveToWorking(int in...
試著跑跑看,結果正不正確。
撲克牌若要移到歸整區…要和最上面的牌同花色,點數要多一點。若是空牌疊,則只限 A (點數 1 )。
ResultPile 的   isAcceptCard() 方法試著自己實作看看!
(本頁留白)(請勿往後偷看)
ResultPile 的                     isAcceptCard() 方法public class ResultPile extends Pile{    /**    * 是否接受移入撲克牌?    *    * @...
在 moveToResult() 中加上用 isAcceptCard() 判斷/*** 把牌移到歸整區的撲克牌疊。** @param index 歸整區的第幾疊牌 (0-3)*/public void moveToResult(int inde...
試著跑跑看,結果正不正確。
想一想我們的 FlippedPile 、 WorkingPile 、 ResultPile 都有一模一樣的 moveToWorking() 和 moveToResult() 方法。每次要改就要改三次,不小心就很 容易敲錯。有沒有什麼方法,可以更...
想一想如果 WorkingPile 移動到同一疊 WorkingPile ,或是 ResultPile 移動到同 一疊 ResultPile ,會發生什麼事?實際實 驗看看。
暫存區多牌移動暫存區應該可以一次移動好幾張牌。一次移 動好幾張牌時,有什麼規則?
(本頁留白)(請勿往後偷看)
多牌移動的規則只能由暫存區移動到暫存區。從某一張牌起,之後的牌一起移動。只能移動已翻開的牌。移動起算的牌,和要移動過去的牌疊,要遵 守前面的規則。 移動起算的牌,和要移動過去的牌疊第一張牌,  顏色要不同,點數要比它小一眼。 要移過去的牌疊是空...
多牌移動的規則只能由暫存區移動到暫存區。 所以我們只要動 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) m...
一點點陣列與迴圈的小考驗如何按順序,抽掉從第 i 張到最後第 n-1 張 的牌?
一點點陣列與迴圈的小考驗 Source     Target   …         …              M        i  i+1   …   N Source     Target   …         …        i...
一點點陣列與迴圈的小考驗每次抽掉第 i 張後,後面補上,所以下一次抽 的還是第 i 張,只是總張數 N 減少了。一直抽到沒得抽為止,所以是抽到 N<=i 停 下來。
WorkingPile 的moveToWorking(int,int) 方法試著自己實作看看!
(本頁留白)(請勿往後偷看)
暫存區多牌移動public class WorkingPile extends Pile{    /**     * 把多張牌移到暫存區的撲克牌疊。     *     * @param start 從第幾張牌開始     * @param i...
試著跑跑看,結果正不正確。
如果你上面的練習都做得正確,程式應該會長得像 solitaire-4 一樣。
中場休息歡迎提出問題
Upcoming SlideShare
Loading in...5
×

Solitaire with Greenfoot #3

340

Published on

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

Published in: Technology
0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total Views
340
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
5
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Solitaire with Greenfoot #3

  1. 1. Greenfoot 接龍(三) 遊戲的邏輯與規則 依瑪貓/楊士青imacat@mail.imacat.idv.tw 2012/6/29
  2. 2. 「接龍遊戲—由上而下的物件導向程式設計」簡報由 依瑪貓╱楊士青 製作, 以 創用CC Attribution-ShareAlike 3.0 Unported 授權條款 釋出。
  3. 3. 自我介紹依瑪貓╱楊士青臺灣師範大學資訊教育研究所碩一研究生
  4. 4. Solitaire 接龍遊戲
  5. 5. Solitaire 接龍遊戲請先回憶一下接龍怎 麼玩。上網搜尋 Solitaire Flash遊 戲試玩,回憶一下 。rbell rbell@21cn.com. Solitaire. Retrieved fromhttp://www.thepcmanwebsite.com/media/flash_solitaire/
  6. 6. 請開啟 solitaire-3 專案。
  7. 7. Solitaire 接龍遊戲用滑鼠右鍵點各牌疊 上方的頁角,看有 哪些方法可以執行 。執行看看!
  8. 8. Solitaire 接龍遊戲看看各個類別的說明 文件,已經有哪些 方法或工具?它們 的用途是什麼?
  9. 9. 想一想移牌的方法都有了嗎 ?若沒有,還缺哪些移 牌方法?若都有了,有沒有什 麼問題?
  10. 10. (本頁留白)(請勿往後偷看)
  11. 11. 移牌還有什麼問題?移牌應該要有規則,不是隨便移都可以。 現在隨便移都可以。移牌的行為定義好了,但是 沒有定義規則。暫存區應該要可以一次移多張牌。 現在一次只能移一張牌。
  12. 12. 想一想移牌的規則是什麼呢?
  13. 13. (本頁留白)(請勿往後偷看)
  14. 14. 移牌的規則若要移到暫存區… 最上面的牌要已經翻開了。 要和最上面的牌不同顏色,點數要小一點。 若是空牌疊,則只限 K (點數 13 )。若要移到歸整區… 要和最上面的牌同花色,點數要多一點。 若是空牌疊,則只限 A (點數 1 )。
  15. 15. 撲克牌若要移到暫存區…最上面的牌要已經翻開了。要和最上面的牌不同顏色,點數要小一點。若是空牌疊,則只限 K (點數 13 )。
  16. 16. WorkingPile 的 isAcceptCard() 方法在 WorkingPile 類別新增一個 isAcceptCard() 方法(內容先為空),傳 入值是要移過來的牌,回傳 boolean 是否 接受移牌。在所有牌疊 ( FlippedPile 、 WorkingPile 、 ResultPile )的 moveToWorking() 方法 最前面,使用 WorkingPile 的 isAcceptCard() 方法來判斷是否移牌。
  17. 17. WorkingPile 的 isAcceptCard() 方法試著自己實作看看 WorkingPile 的 isAcceptCard() 方法!
  18. 18. (本頁留白)(請勿往後偷看)
  19. 19. 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; } }}
  20. 20. 在 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); }}
  21. 21. 試著跑跑看,結果正不正確。
  22. 22. 撲克牌若要移到歸整區…要和最上面的牌同花色,點數要多一點。若是空牌疊,則只限 A (點數 1 )。
  23. 23. ResultPile 的 isAcceptCard() 方法試著自己實作看看!
  24. 24. (本頁留白)(請勿往後偷看)
  25. 25. 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; } }}
  26. 26. 在 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); }}
  27. 27. 試著跑跑看,結果正不正確。
  28. 28. 想一想我們的 FlippedPile 、 WorkingPile 、 ResultPile 都有一模一樣的 moveToWorking() 和 moveToResult() 方法。每次要改就要改三次,不小心就很 容易敲錯。有沒有什麼方法,可以更容易 維護?
  29. 29. 想一想如果 WorkingPile 移動到同一疊 WorkingPile ,或是 ResultPile 移動到同 一疊 ResultPile ,會發生什麼事?實際實 驗看看。
  30. 30. 暫存區多牌移動暫存區應該可以一次移動好幾張牌。一次移 動好幾張牌時,有什麼規則?
  31. 31. (本頁留白)(請勿往後偷看)
  32. 32. 多牌移動的規則只能由暫存區移動到暫存區。從某一張牌起,之後的牌一起移動。只能移動已翻開的牌。移動起算的牌,和要移動過去的牌疊,要遵 守前面的規則。 移動起算的牌,和要移動過去的牌疊第一張牌, 顏色要不同,點數要比它小一眼。 要移過去的牌疊是空的時候,移動起算的牌只能 是 K ( 13 點)。
  33. 33. 多牌移動的規則只能由暫存區移動到暫存區。 所以我們只要動 WorkingPile 的 moveToWorking() 方法即可。
  34. 34. 多牌移動的規則從某一張牌起,之後的牌一起移動。 一點點陣列與迴圈的小考驗!
  35. 35. 多牌移動的規則只能移動已翻開的牌。 我們只要檢查起算的牌即可,只要起算的牌已翻 開,後面的牌是後來疊上去的,一定是已翻開 的牌。
  36. 36. 多牌移動的規則移動起算的牌,和要移動過去的牌疊,要遵 守前面的規則。 可以套用前面寫的 isAcceptCard() 。
  37. 37. 暫存區多牌移動在 WorkingPile 加一個方法 moveToWorking(int start, int index) 。 和原來的 moveToWorking(int index) 不同, 這次多一個參數 start 。
  38. 38. 方法多載 (Overload)上次我們提到方法重載 (override) ,也就是 蓋掉父類別的方法,改用我們子類別自己 的方法。方法多載 (overload) :為簡化函式的命名問 題,物件導向程式語言允許在不同的方法 上,使用同一個名稱,只要參數不同即可 。 可以簡化同樣功能的方法的命名困擾。
  39. 39. 方法多載 (Overload)add: add(int, int) add(double, double) add(BigInteger, BigInteger)moveToWorking: moveToWorking(int index) moveToWorking(int start, int index)
  40. 40. 一點點陣列與迴圈的小考驗如何按順序,抽掉從第 i 張到最後第 n-1 張 的牌?
  41. 41. 一點點陣列與迴圈的小考驗 Source Target … … M i i+1 … N Source Target … … i M+1 … N-1
  42. 42. 一點點陣列與迴圈的小考驗每次抽掉第 i 張後,後面補上,所以下一次抽 的還是第 i 張,只是總張數 N 減少了。一直抽到沒得抽為止,所以是抽到 N<=i 停 下來。
  43. 43. WorkingPile 的moveToWorking(int,int) 方法試著自己實作看看!
  44. 44. (本頁留白)(請勿往後偷看)
  45. 45. 暫存區多牌移動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); } } }}
  46. 46. 試著跑跑看,結果正不正確。
  47. 47. 如果你上面的練習都做得正確,程式應該會長得像 solitaire-4 一樣。
  48. 48. 中場休息歡迎提出問題
  1. ¿Le ha llamado la atención una diapositiva en particular?

    Recortar diapositivas es una manera útil de recopilar información importante para consultarla más tarde.

×