int x = Greenfoot.getRandomNumber(getWidth()); int y = Greenfoot.getRandomNumber(getHeight()); addobject(card, x, y); 程式碼說明 : 滑鼠事件 Greenfoot.mouseClic

Similar documents
任務二 : 產生 20 個有炸彈的磚塊, 放在隨機的位置編輯 Block 類別的程式碼 import greenfoot.; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) Write a description of class

Lesson 1: Poke Case 撲 克 牌 發 牌 準 備 1 張 撲 克 牌 的 底 圖 :blue.png 準 備 13 張 撲 克 牌 的 圖 片 :1.png~13.png 新 建 場 景 類 別 Table, 設 定 圖 像 corkboard.jpg 新 建 演 員 類 別 Ca

Microsoft Word - Greenfoot-高慧君老師

主程式 : public class Main3Activity extends AppCompatActivity { ListView listview; // 先整理資料來源,listitem.xml 需要傳入三種資料 : 圖片 狗狗名字 狗狗生日 // 狗狗圖片 int[] pic =new

Microsoft Word - 01.DOC

用手機直接傳值不透過網頁連接, 來當作搖控器控制家電 ( 電視遙控器 ) 按下按鍵發送同時會回傳值來確定是否有送出 問題 :1. 應該是使用了太多 thread 導致在傳值上有問題 2. 一次按很多次按鈕沒辦法即時反應

Greenfoot 的特色有以下四點 : (1) 容易上手 :Greenfoot 的操作環境很簡單, 就是在一個微世界中安排幾個演員, 然後想辦法用程式碼讓這些演員動起來 初學者能夠很快地熟悉它的操作介面 (2) 變化萬千 : 你可以使用 Greenfoot 來開發各式各樣具有聲光效果的遊戲, 也能

Java

untitled

Chapter 9: Objects and Classes

EJB-Programming-3.PDF

<4D F736F F F696E74202D20332D322E432B2BC3E6CFF2B6D4CFF3B3CCD0F2C9E8BCC6A1AAD6D8D4D8A1A2BCCCB3D0A1A2B6E0CCACBACDBEDBBACF2E707074>

(TestFailure) JUnit Framework AssertionFailedError JUnit Composite TestSuite Test TestSuite run() run() JUnit

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

Microsoft Word - ch04三校.doc

untitled

Java java.lang.math Java Java.util.Random : ArithmeticException int zero = 0; try { int i= 72 / zero ; }catch (ArithmeticException e ) { // } 0,

詞 彙 表 編 號 詞 彙 描 述 1 預 約 人 資 料 中 文 姓 名 英 文 姓 名 身 份 證 字 號 預 約 人 電 話 性 別 2 付 款 資 料 信 用 卡 別 信 用 卡 號 信 用 卡 有 效 日 期 3 住 房 條 件 入 住 日 期 退 房 日 期 人 數 房 間 數 量 入

概述


untitled

雲端 Cloud Computing 技術指南 運算 應用 平台與架構 10/04/15 11:55:46 INFO 10/04/15 11:55:53 INFO 10/04/15 11:55:56 INFO 10/04/15 11:56:05 INFO 10/04/15 11:56:07 INFO

Chapter 9: Objects and Classes

Microsoft Word - Learn Objective-C.doc

EJB-Programming-4-cn.doc

untitled

1 Framework.NET Framework Microsoft Windows.NET Framework.NET Framework NOTE.NET NET Framework.NET Framework 2.0 ( 3 ).NET Framework 2.0.NET F

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

SDK 概要 使用 Maven 的用户可以从 Maven 库中搜索 "odps-sdk" 获取不同版本的 Java SDK: 包名 odps-sdk-core odps-sdk-commons odps-sdk-udf odps-sdk-mapred odps-sdk-graph 描述 ODPS 基

untitled

Microsoft PowerPoint - L17_Inheritance_v4.pptx

untitled

epub83-1

KillTest 质量更高 服务更好 学习资料 半年免费更新服务

Fun Time (1) What happens in memory? 1 i n t i ; 2 s h o r t j ; 3 double k ; 4 char c = a ; 5 i = 3; j = 2; 6 k = i j ; H.-T. Lin (NTU CSIE) Referenc

使 用 Java 语 言 模 拟 保 险 箱 容 量 门 板 厚 度 箱 体 厚 度 属 性 锁 具 类 型 开 保 险 箱 关 保 险 箱 动 作 存 取 款

无类继承.key

Microsoft Word - 把时间当作朋友(2011第3版)3.0.b.06.doc

2009年3月全国计算机等级考试二级Java语言程序设计笔试试题

untitled

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

(6) 要 求 付 款 管 理 员 从 预 订 表 中 查 询 距 预 订 的 会 议 时 间 两 周 内 的 预 定, 根 据 客 户 记 录 给 满 足 条 件 的 客 户 发 送 支 付 余 款 要 求 (7) 支 付 余 款 管 理 员 收 到 客 户 余 款 支 付 的 通 知 后, 检

untitled

javaexample-02.pdf

untitled

untitled

FY.DOC

《大话设计模式》第一章

新版 明解C++入門編

Swing-02.pdf

untitled

多媒體應用 13 新增專案並完成版面配置 <ExMusic01> <activity_main.xml> ImageView ID imgplay ImageView ID imgstop ImageView ID imgfront TextView ID txtsong TextView ID t

( 总 第 1073 期 ) 浙 江 省 人 民 政 府 主 办 2015 年 3 月 17 日 出 版 省 政 府 令 省 政 府 文 件 目 录 浙 江 省 大 型 群 众 性 活 动 安 全 管 理 办 法 ( 浙 江 省 人 民 政 府 令 第 333 号 ) (3) 浙 江 省 人 民 政

BOOL EnumWindows(WNDENUMPROC lparam); lpenumfunc, LPARAM (Native Interface) PowerBuilder PowerBuilder PBNI 2

1.JasperReport ireport JasperReport ireport JDK JDK JDK JDK ant ant...6

JavaIO.PDF

Important Notice SUNPLUS TECHNOLOGY CO. reserves the right to change this documentation without prior notice. Information provided by SUNPLUS TECHNOLO

<4D F736F F D20C8EDC9E82DCFC2CEE7CCE22D3039C9CF>

untitled

untitled

untitled

1.5招募说明书(草案)

Python a p p l e b e a r c Fruit Animal a p p l e b e a r c 2-2

目 录 第 一 部 分 档 案 局 概 况 一 主 要 职 责 二 部 门 决 算 单 位 构 成 第 二 部 分 档 案 局 2016 年 度 部 门 预 算 表 一 2016 年 度 市 级 部 门 收 支 预 算 总 表 二 2016 年 度 市 级 部 门 支 出 预 算 表 三 2016

2015 年 度 收 入 支 出 决 算 总 表 单 位 名 称 : 北 京 市 朝 阳 区 卫 生 局 单 位 : 万 元 收 入 支 出 项 目 决 算 数 项 目 ( 按 功 能 分 类 ) 决 算 数 一 财 政 拨 款 一 一 般 公 共 服 务 支 出 二

全国计算机技术与软件专业技术资格(水平)考试

chp6.ppt

Microsoft Word - JAVA Programming Language Homework I ans

INTRODUCTION TO COM.DOC

Java 1 Java String Date

untitled

基于CDIO一体化理念的课程教学大纲设计

内 容 简 介 本 书 是 一 本 关 于 语 言 程 序 设 计 的 教 材, 涵 盖 了 语 言 的 基 本 语 法 和 编 程 技 术, 其 中 包 含 了 作 者 对 语 言 多 年 开 发 经 验 的 总 结, 目 的 是 让 初 学 的 读 者 感 受 到 语 言 的 魅 力, 并 掌

untitled

PowerPoint Presentation

提问袁小兵:

untitled

基于ECO的UML模型驱动的数据库应用开发1.doc

Adobe® Flash® 的 Adobe® ActionScript® 3.0 程式設計

電機工程系認可證照清單 /7/1

1 1 大概思路 创建 WebAPI 创建 CrossMainController 并编写 Nuget 安装 microsoft.aspnet.webapi.cors 跨域设置路由 编写 Jquery EasyUI 界面 运行效果 2 创建 WebAPI 创建 WebAPI, 新建 -> 项目 ->

Microsoft Word - 第6章.doc

没 有 多 余 的 Contruol 或 Action 了 原 来 Domain 层 被 服 务 层 Service layer 遮 挡, 在 右 边 图 中, 则 Domain 层 直 接 暴 露 给 前 台 了, 没 有 被 遮 挡, 裸 露 了 这 样 一 步 到 位 实 现 领 域 模 型

Microsoft PowerPoint - Lecture7II.ppt

软件工程文档编制

星星排列 _for loop Protected Sub Page_Load(ByVal sender As Object, ByVal e As Dim h As Integer = 7 'h 為變數 ' Dim i, j As Integer For i = 1 To h

untitled

建模与图形思考

<4D F736F F F696E74202D20A4BDA640A475B57BA454BC68AFC5AB7EBDE8BADEB27AB460C0F4AC5BBA6328ADD7292DB35CBAFBAE78>

2009年下半年软件设计师下午试题

1: public class MyOutputStream implements AutoCloseable { 3: public void close() throws IOException { 4: throw new IOException(); 5: } 6:

Strings

Microsoft PowerPoint - plan08.ppt

RUN_PC連載_8_.doc

單步除錯 (1/10) 打開 Android Studio, 點選 Start a new Android Studio project 建立專案 Application name 輸入 BMI 點下 Next 2 P a g e

OOP with Java 通知 Project 4: 4 月 18 日晚 9 点 关于抄袭 没有分数

Java Access 5-1 Server Client Client Server Server Client 5-2 DataInputStream Class java.io.datainptstream (extends) FilterInputStream InputStream Obj

PowerPoint 簡報

Spyder Anaconda Spyder Python Spyder Python Spyder Spyder Spyder 開始 \ 所有程式 \ Anaconda3 (64-bit) \ Spyder Spyder IPython Python IPython Sp

Microsoft PowerPoint - VB14.ppt

Transcription:

撲克牌遊戲 簡易接龍 高慧君南港高中 準備一張牌桌的圖片 :porkboard.jpg 準備一張撲克牌的底圖 :blueflip.png 準備一張空的撲克牌 :empty.png 準備 13 張撲克牌的圖片 :1.png~13.png 開啟專案 Poke01 新建場景類別 Table, 設置圖像 porkboard.jpg 新建演員類別 Card 新建演員類別 Deck, 設置圖像 blueflip.png 編輯 Table 的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) * Write a description of class Table here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Table extends World private Deck deck = new Deck(); public Table() super(600, 400, 1); addobject(deck, 50, 50); public void act() if (Greenfoot.mouseClicked(deck)) Card card = new Card(); card.setimage((1+greenfoot.getrandomnumber(13))+".png");

int x = Greenfoot.getRandomNumber(getWidth()); int y = Greenfoot.getRandomNumber(getHeight()); addobject(card, x, y); 程式碼說明 : 滑鼠事件 Greenfoot.mouseClicked() 方法簽名 : Public static Boolean mouseclicked(java.lang.object obj) 方法說明 : 如果滑鼠在某物件上按完左鍵 ( 按下並放開 ), 則傳回 true 參數 obj Typically one of Actor, Wolrd or null 傳回值 True / False 問題改進 在上例中, 我們使用亂數來取卡片, 這樣做會有重複發同一張牌的可能性 所以 接下來我們要用陣列串列 (ArrayList) 來儲存 13 張牌 編輯 Card 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) * Write a description of class Card here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Card extends Actor private int value; public Card(int value) this.value = value;

public int getvalue() return value; * Act do whatever the Card wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here. 編輯 Deck 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; * Write a description of class Deck here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Deck extends Actor private ArrayList<Card> cards = new ArrayList<Card>(); public Deck() for (int i=1; i<=13; i++) Card card = new Card(i); cards.add(card); public Card getcard() if (cards.size()>0) Card card = cards.get(0);

cards.remove(card); return card; return null; public int getsize() return cards.size(); * Act do whatever the Deck wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here. 修改 Table 類別的程式碼 public void act() if (Greenfoot.mouseClicked(deck)) Card card = deck.getcard(); card.setimage(card.getvalue()+".png"); int x = Greenfoot.getRandomNumber(getWidth()); int y = Greenfoot.getRandomNumber(getHeight()); addobject(card, x, y); if (deck.getsize()==0) removeobject(deck); 程式碼說明 : ArrayList 是 java.util 當中的一個類別 使用方法 : 以字串為例

1. 建構 ArrayList<String> myarraylist = new ArrayList<String>(); // 指定是 String 的型態 2. 加入元素 String s = new String(); mylist.add(s); 3. 查詢 list 大小 int thesize = mylist.size(); 4. 查詢特定元素 boolean isin = mylist.contains(s); // 若用上面的例子因為有 s 字串所以回傳 true 5. 查詢特定元素位置 int idx = mylist.indexof(s); // 會回傳 0 表第 0 個位置 6. 判斷 List 是否為空 boolean empty = mylist.isempty(); // 因為有一個元素會回傳 false 7. 刪除特定元素 mylist.remove(s); 8. 清除所有元素 mylist.clear(); 問題改進在上例中, 我們會依序發出 13 張牌, 但實務上, 我們在發牌前會先做洗牌的動作, 我們可以匯入 Collections 套件, 來做打亂陣列串列內容的動作 在 Deck 類別中增加程式碼 : Import java.util.collections; 在 Deck 的建構子中增加程式碼 : public Deck() for (int i=1; i<=13; i++) Card card = new Card(i);

cards.add(card); Collections.shuffle(cards); 問題改進 在上例中, 撲克牌的位置是隨機的, 接下來, 我們要產生一個牌疊 (Pile) 來存放發 出的撲克牌 新建演員類別 Pile, 設置圖像 empty.png 編輯 Pile 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; * Write a description of class Pile here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Pile extends Actor private ArrayList<Card> cards = new ArrayList<Card>(); public void addcard(card card) cards.add(card); getworld().addobject(card, getx()+(cards.size() 1)*20, gety()); * Act do whatever the Pile wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here.

修改 Table 類別的程式碼 public class Table extends World private Deck deck = new Deck(); private Pile pile = new Pile(); public Table() super(600, 400, 1); addobject(deck, 50, 50); addobject(pile, 150, 50); public void act() if (Greenfoot.mouseClicked(deck)) Card card = deck.getcard(); card.setimage(card.getvalue()+".png"); pile.addcard(card); if (deck.getsize()==0) removeobject(deck); 問題改進 在上例中, 發出的撲克牌是固定不動的, 接下來, 我們要來讓撲克牌可以拖曳 修改 Card 類別的程式碼 public class Card extends Actor private int value; private int initx, inity; public Card(int value) this.value = value; public int getvalue() return value;

* Act do whatever the Card wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here. MouseInfo mouse = Greenfoot.getMouseInfo(); if (Greenfoot.mousePressed(this)) initx = getx(); inity = gety(); if (Greenfoot.mouseDragged(this)) setlocation(mouse.getx(), mouse.gety()); if (Greenfoot.mouseDragEnded(this)) setlocation(initx, inity); 程式碼說明 1. static boolean mousedragended(java.lang.object obj) 若滑鼠結束拖拉, 則傳回 true 2. static boolean mousedragged(java.lang.object obj) 若滑鼠正在這個物件上拖拉, 則傳回 true 3. static boolean mousepressed(java.lang.object obj) 若滑鼠按在這個物件上 ( 滑鼠鍵由沒按下狀態轉為按下狀態 ), 則傳回 true 4. static MouseInfo getmouseinfo()

取得滑鼠資訊物件, 內含滑鼠目前的狀態 問題改進 在上例中, 撲克牌可以拖曳, 但圖層效果不對, 我們希望拖曳中的撲克牌會在最 上層, 放開後會回到原地點原圖層 增加 Table 類別的程式碼 public Pile getpile() return pile; 增加 Pile 類別的程式碼 public void removecard(card card) cards.remove(card); public void redraw() for (Card card : cards) World world = getworld(); int x = card.getx(); int y = card.gety(); world.removeobject(card); world.addobject(card, x, y); 修改 Card 類別的程式碼 public void act() // Add your action code here. MouseInfo mouse = Greenfoot.getMouseInfo(); if (Greenfoot.mousePressed(this)) initx = getx(); inity = gety(); World world = getworld(); world.removeobject(this);

world.addobject(this, initx, inity); if (Greenfoot.mouseDragged(this)) setlocation(mouse.getx(), mouse.gety()); if (Greenfoot.mouseDragEnded(this)) Table table = (Table) getworld(); table.getpile().redraw(); setlocation(initx, inity); 問題改進 在上例中, 撲克牌可以拖曳, 接下來, 我們要來讓撲克牌可以依序由小到大收入 到目標牌疊 (CardStack) 中 撲克牌放入目標牌疊後就不能拖曳 新建演員類別 CardStack, 設置圖像 empty.png 修改 Table 類別的建構子程式碼 public Table() super(600, 400, 1); addobject(deck, 50, 50); addobject(pile, 150, 50); addobject(cardstack, 150, 150); 編輯 CardStack 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; * Write a description of class CardStack here. * * @author Jean, Hue Ching Kao * @version 2013.3.31

public class CardStack extends Actor private ArrayList<Card> cards = new ArrayList<Card>(); public void addcard(card card) cards.add(card); card.setcandrag(false); card.setlocation(getx(), gety()+(cards.size() 1)*15); public boolean isacceptcard(card card) if (cards.size()>0) Card lastcard = cards.get(cards.size() 1); if (lastcard.getvalue()+1==card.getvalue()) return true; else if (card.getvalue()==1) return true; return false; * Act do whatever the CardStack wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here. 修改 Card 類別的程式碼 public class Card extends Actor private int value; private int initx, inity; private boolean candrag=true; public Card(int value) this.value = value;

public int getvalue() return value; public void setcandrag(boolean candrag) this.candrag = candrag; * Act do whatever the Card wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here. if (!candrag) return; MouseInfo mouse = Greenfoot.getMouseInfo(); if (Greenfoot.mousePressed(this)) initx = getx(); inity = gety(); World world = getworld(); world.removeobject(this); world.addobject(this, initx, inity); if (Greenfoot.mouseDragged(this)) setlocation(mouse.getx(), mouse.gety()); if (Greenfoot.mouseDragEnded(this)) Table table = (Table) getworld(); Pile pile = table.getpile(); CardStack cardstack = (CardStack) getoneintersectingobject(cardstack.class); if (cardstack!= null)

if (cardstack.isacceptcard(this)) pile.removecard(this); cardstack.addcard(this); return; pile.redraw(); setlocation(initx, inity); 問題改進 在上例中, 目標牌疊 (CardStack) 的感應區只有一張牌的大小, 我們希望加大感應 區的縱向範圍 ( 加長 200 個像素 ) 修改 Table 類別的建構子程式碼 public Table() super(600, 400, 1); addobject(deck, 50, 50); addobject(pile, 150, 50); addobject(cardstack, 150, 250); 編輯 CardStack 類別的程式碼 public class CardStack extends Actor private ArrayList<Card> cards = new ArrayList<Card>(); public void addcard(card card) cards.add(card); card.setcandrag(false); card.setlocation(getx(), gety()+(cards.size() 1)*15 100); public boolean isacceptcard(card card) if (cards.size()>0) Card lastcard = cards.get(cards.size() 1);

if (lastcard.getvalue()+1==card.getvalue()) return true; else if (card.getvalue()==1) return true; return false; public void addedtoworld(world world) setimage("empty.png"); GreenfootImage image = new GreenfootImage(getImage().getWidth(), getimage().getheight()+200); image.drawimage(new GreenfootImage("empty.png"), 0, 0); setimage(image); * Act do whatever the CardStack wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here. 問題改進在上例中, 我們已經完成了 13 張撲克牌的簡易接龍, 接下來, 我們要來處理 52 張牌的情形, 並且能夠依不同的花色來處理接龍動作 在這裡, 我們用 52 張牌來再複習一遍上面所做過的動作 準備一張牌桌的圖片 :porkboard.jpg 準備一張撲克牌的底圖 :blueflip.png 準備一張空的撲克牌 :empty.png 準備 52 張撲克牌的圖片 :spades1.png~diamonds13.png 開啟專案 Poke02 新建場景類別 Table, 設置圖像 porkboard.jpg

新建演員類別 Card 新建演員類別 Deck, 設置圖像 blueflip.png 新建演員類別 Pile, 設置圖像 empty.png 新建演員類別 CardStack, 設置圖像 empty.png 編輯 Card 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) * Write a description of class Card here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Card extends Actor public enum Suit spades, hearts, clubs, diamonds; private Suit suit; private int value; private boolean candrag=true; public Card(Suit suit, int value) this.suit = suit; this.value = value; setimage(suit+""+value+".png"); public Suit getsuit() return suit; public int getvalue() return value; public void setcandrag(boolean candrag) this.candrag = candrag;

程式碼說明 在上例中, 我們使用了列舉 (Enum) 來儲存撲克牌的花色, 列舉可以賦予常數值可 讀意義的簡便方法, 基於 Java 語言的特性, Enum 應用在方法的參數傳遞與回 傳值上, 具有提高表達能力以及強制內容檢查的兩種好處 編輯 Deck 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; import java.util.collections; * Write a description of class Deck here. * * @author (your name) * @version (a version number or a date) public class Deck extends Actor private ArrayList<Card> cards = new ArrayList<Card>(); public Deck() for (Card.Suit suit: Card.Suit.values()) for (int i=1; i<=13; i++) Card card = new Card(suit, i); cards.add(card); Collections.shuffle(cards); public Card getcard() if (cards.size()>0) Card card = cards.get(0); cards.remove(card); return card;

return null; public int getsize() return cards.size(); 編輯 CardStack 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) * Write a description of class CardStack here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class CardStack extends Actor public void addedtoworld(world world) setimage("empty.png"); GreenfootImage image = new GreenfootImage(getImage().getWidth(), getimage().getheight()+200); image.drawimage(new GreenfootImage("empty.png"), 0, 0); setimage(image); 編輯 Table 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; * Write a description of class Table here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Table extends World

private Deck deck = new Deck(); private Pile pile = new Pile(); private ArrayList<CardStack> cardstacks = new ArrayList<CardStack>(); * Constructor for objects of class Table. * public Table() // Create a new world with 600x400 cells with a cell size of 1x1 pixels. super(600, 400, 1); addobject(deck, 50, 50); addobject(pile, 150, 50); for (int i=0; i<4; i++) CardStack cardstack = new CardStack(); cardstacks.add(cardstack); addobject(cardstack, 150+i*100, 250); 任務一 : 發牌到牌疊上 編輯 Pile 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; * Write a description of class Pile here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Pile extends Actor private ArrayList<Card> cards = new ArrayList<Card>();

public void addcard(card card) cards.add(card); getworld().addobject(card, getx()+(cards.size() 1)*8, gety()); public void removecard(card card) cards.remove(card); 修改 Table 類別的程式碼 public void act() if (Greenfoot.mouseClicked(deck)) Card card = deck.getcard(); pile.addcard(card); if (deck.getsize()==0) removeobject(deck); 任務二 : 讓牌疊上的撲克牌可以拖曳, 拖曳時會顯示在最上層, 拖曳完後會回到 原來的圖層 編輯 Card 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) * Write a description of class Card here. * * @author Jean, Hue Ching Kao * @version 2013.3.31 public class Card extends Actor public enum Suit spades, hearts, clubs, diamonds; private Suit suit;

private int value; private boolean candrag=true; private int initx, inity; public Card(Suit suit, int value) this.suit = suit; this.value = value; setimage(suit+""+value+".png"); public Suit getsuit() return suit; public int getvalue() return value; public void setcandrag(boolean candrag) this.candrag = candrag; * Act do whatever the Card wants to do. This method is called whenever * the 'Act' or 'Run' button gets pressed in the environment. public void act() // Add your action code here. if (!candrag) return; MouseInfo mouse = Greenfoot.getMouseInfo(); Table table = (Table) getworld(); Pile pile = table.getpile(); if (Greenfoot.mousePressed(this)) initx = getx(); inity = gety(); World world = getworld();

world.removeobject(this); world.addobject(this, initx, inity); if (Greenfoot.mouseDragged(this)) setlocation(mouse.getx(), mouse.gety()); if (Greenfoot.mouseDragEnded(this)) pile.redraw(); setlocation(initx, inity); 新增 Table 類別的程式碼 public Pile getpile() return pile; 新增 Pile 類別的程式碼 public void redraw() for (Card card: cards) int x = card.getx(); int y = card.gety(); World world = getworld(); world.removeobject(card); world.addobject(card, x, y); 任務三 : 撲克牌可以拖曳到目標牌疊上, 依花色排列, 放入後就不能再拖曳 編輯 CardStack 類別的程式碼 import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo) import java.util.arraylist; * Write a description of class CardStack here.

* * @author Jean, Hue Ching Kao * @version 2013.3.31 public class CardStack extends Actor private ArrayList<Card> cards = new ArrayList<Card>(); public void addcard(card card) cards.add(card); card.setcandrag(false); card.setlocation(getx(), gety()+(cards.size() 1)*15 100); public boolean isacceptcard(card card) if (cards.size()>0) Card lastcard = cards.get(cards.size() 1); if (lastcard.getsuit() == card.getsuit()) if (lastcard.getvalue()+1==card.getvalue()) return true; else if (card.getvalue()==1) return true; return false; public void addedtoworld(world world) setimage("empty.png"); GreenfootImage image = new GreenfootImage(getImage().getWidth(), getimage().getheight()+200); image.drawimage(new GreenfootImage("empty.png"), 0, 0); setimage(image); 編輯 Card 類別的程式碼

public class Card extends Actor public void act() // Add your action code here. if (!candrag) return; MouseInfo mouse = Greenfoot.getMouseInfo(); Table table = (Table) getworld(); Pile pile = table.getpile(); if (Greenfoot.mousePressed(this)) initx = getx(); inity = gety(); World world = getworld(); world.removeobject(this); world.addobject(this, initx, inity); if (Greenfoot.mouseDragged(this)) setlocation(mouse.getx(), mouse.gety()); if (Greenfoot.mouseDragEnded(this)) CardStack cardstack = (CardStack) getoneintersectingobject(cardstack.class); if (cardstack!= null && cardstack.isacceptcard(this)) cardstack.addcard(this); pile.removecard(this); return; pile.redraw(); setlocation(initx, inity); 編輯 Pile 類別的程式碼 public class Pile extends Actor

private ArrayList<Card> cards = new ArrayList<Card>(); private static int cardnumber=0; public Pile() cardnumber=0; public void addcard(card card) cards.add(card); cardnumber++; getworld().addobject(card, getx()+(cardnumber 1)*8, gety());