# 20208邱泓諭_Greenfoot遊戲(撲克牌記憶翻牌)
###### tags: `Greenfoot遊戲設計`
## 遊戲情境(擷圖)

## 程式碼整理
* 場景-桌子
```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>