# 20208邱泓諭_Greenfoot遊戲(撲克牌記憶翻牌) ###### tags: `Greenfoot遊戲設計` ## 遊戲情境(擷圖) ![image](https://hackmd.io/_uploads/HJQDMU-IA.png) ## 程式碼整理 * 場景-桌子 ```cpp= import greenfoot.*; // (World、Actor、GreenfootImage、GreenfootSound、Greenfoot及MouseInfo) import java.util.ArrayList; import java.util.List; import java.util.Collections; public class Table extends World { private ArrayList<Card> cards = new ArrayList<Card>(); private ClickCount clickCount = new ClickCount(); public Table() { super(800, 600, 1); addObject(new Timer(),720,30); Card.clicked=0; for (int i=0; i<32; i++) { Card card = new Card(i%16+1); cards.add(card); } Collections.shuffle(cards); for (int i=0; i<32; i++) { addObject(cards.get(i), 50+(i%4)*150, 50+(i/4)*70); } addObject(clickCount, 100, 400); clickCount.getImage().clear(); } public ClickCount getClickCount() { return clickCount; } } ``` * 空白卡面 ```cpp= import greenfoot.*; // (World、Actor、GreenfootImage、GreenfootSound、Greenfoot及MouseInfo) /** * 請在此撰寫 ClickCount 類別的說明。 * * @author (你的名字) * @version (日期或版號) */ public class ClickCount extends Actor { /** * Act - 隨便 ClickCount 想做什麼。 * 每次按下「單步執行」或「執行」按鈕,都會呼叫這個方法。 */ public void act() { // 在這裏寫程式。 } } ``` * 牌 ```cpp= import greenfoot.*; // (World、Actor、GreenfootImage、GreenfootSound、Greenfoot及MouseInfo) public class Card extends Actor { public static int clicked=0; //翻牌次數 private int value; //撲克牌面點數 private static Card lastCard; private static int pairCount=0; //配對數量 private boolean canClick=true; //是否可點選 private boolean flipped=true; //是否可翻牌 public Card(int value) { this.value = value; setImage("sticker.png"); } public int getValue() { return value; } public void setCanClick(boolean canClick) { this.canClick = canClick; } public void setFlipped(boolean flipped) { if (flipped) //可翻牌模式, 設定背景圖 { setImage("sticker.png"); } else { //已翻開牌, 秀出牌點數 setImage(value+".png"); } this.flipped = flipped; } public void act() { if (Greenfoot.mouseClicked(this)&&canClick) { clicked++; Table table = (Table) getWorld(); GreenfootImage image = table.getClickCount().getImage(); image.scale(150,100); image.clear(); image.drawString("翻牌次數:"+clicked,0,10); if (clicked%2==1) { lastCard = this; setCanClick(false); setFlipped(false); } else { setFlipped(false); setCanClick(false); if (this.getValue() == lastCard.getValue()) { Greenfoot.playSound("correct.wav"); this.setCanClick(false); lastCard.setCanClick(false); pairCount++; if (pairCount==16) { Greenfoot.playSound("win.wav"); } } else { Greenfoot.playSound("fail.wav"); Greenfoot.delay(100); setCanClick(true); setFlipped(true); lastCard.setFlipped(true); lastCard.setCanClick(true); lastCard = null; } } } } } ``` * 計時器 ```cpp= import greenfoot.*; // (World、Actor、GreenfootImage、GreenfootSound、Greenfoot及MouseInfo)import java.awt.Color; //加入才能讓Color顏色設定生效 public class Timer extends Actor { private int timer = 55*60; //設定60秒倒數計時 public Timer() { updateImage(); } public void act() { timer--; if (timer % 55 == 0) updateImage(); if (timer < 1) Greenfoot.stop(); } private void updateImage() { setImage(new GreenfootImage("倒數計時: " + timer/55, 32, Color.WHITE, Color.BLUE)); } } ``` ## 遊戲連結 * [官方連結](https://www.greenfoot.org/scenarios/33548) ## 開始玩遊戲 (embed嵌入) * 1.觸控牌面相同的牌型會消除,消除所有牌就可以聽到音樂了。 <iframe src="https://www.greenfoot.org/scenarios/33548?embed=true"""width="1000"height="600"></iframe>