---
# System prepended metadata

title: 20208邱泓諭_Greenfoot遊戲(撲克牌記憶翻牌)
tags: [Greenfoot遊戲設計]

---

# 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>
