前两篇的文章
记忆翻牌游戏(一)
记忆翻牌游戏(二)
接上回,对于上篇中的翻牌效果,虽然实现了鼠标点击翻牌,但是可以发现,已经翻开的扑克牌,依然被放置在牌桌上,没有被移除。
此篇就来实现移除效果。
先来看看最终效果。
上篇我们已经可以通过鼠标点击翻牌,要想实现移除效果,则需要对扑克牌进行配对检查。
基本思路如下:
- 遍历扑克牌集合中的每一张扑克牌,如果牌是第一张被翻开的,记录下此时牌的点数,若是第二张被翻开的,也记录下牌的点数;
- 将第一张牌的点数与第二张牌的点数进行比较,若点数相同,则移除这两张牌,若不同,则将两张牌恢复为初始状态(即背面朝上)。
在Table类的act()方法中添加以下配对检查的代码
- 首先定义所需要的变量
Card card1 = null, card2 = null; //用来保存两张牌的对象
int count = 0; //表示牌桌上被翻开的是第几张牌
int card1Value = 0,card2Vlaue = 0;//记录两张牌的点数
- 接下来循环遍历扑克牌集合
整体框架
for (int i=0; i< cards.size(); i++) {
//用for循环遍历集合cards中的所有牌
if (cards.get(i).getFaceup() == true) {
//如果遍历到的这张牌是翻开的
count++; //用count将牌桌上翻开的牌数累加
if (count == 1) {
//如果是第一张翻开的牌
}
if (count == 2) {
//如果是第二张翻开的牌
}
}
}
通过count的值来确定当前被翻开的牌是第几张,为1则表示为第一张,只需保存其点数。
if (count == 1) {
//如果是第一张翻开的牌
card1 = cards.get(i);
card1Value = card1.getValue(); //变量card1Value记录第一张翻开牌的点数
}
保存点数后继续遍历集合,若还有被点击翻开的扑克牌,则count值加为2,并且比较桌上被翻开的两张牌的点数是否相同。
if (count == 2) {
//如果是第二张翻开的牌
card2 = cards.get(i);
card2Value = card2.getValue(); //变量card2Value记录第二张翻开牌的点数
if (card1Value == card2Value) {
// 如果翻开的两张牌的点数是一样的
Greenfoot.playSound("WaterDrop.wav");
Greenfoot.delay(10); //延迟10毫秒,游戏效果更好
//移除翻开的两张同样的牌
removeObject(card1);
removeObject(card2);
cards.remove(card1);
cards.remove(card2);
} else {
//如果翻开的两张牌不同
reenfoot.delay(15);
// 将两张牌面朝下背朝上
card1.turnFaceDown();
card2.turnFaceDown();
}
break; //剩下的牌不再遍历,结束for循环
}
通过比较card1Value和card2Value的值是否相同来判断两张牌是否相同,相同则调用removeObject()方法将其从牌桌移除,同时也需要调用remove()方法将其从整个扑克牌集合中移除。
完整代码如下:
import greenfoot.*; // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)
import java.util.ArrayList;
import java.util.Collections;
/**
* 牌桌类,提供游戏的运行场景
*/
public class Table extends World{
ArrayList<Card> cards = new ArrayList<Card>(); //声明一个保存扑克牌对象的集合cards
//Table类的构造方法
public Table() {
super(600, 400, 1);
for (int i=1; i<=5; i++) {
//向集合cards中添加两组共10张5点以下的牌
cards.add(new Card(i));
cards.add(new Card(i));
}
Collections.shuffle(cards); //集合类Collections的混排算法,用于打乱集合cards中牌的顺序
int x=100, y=100; //牌桌上摆放牌的起点坐标
for (int i=0; i<5; i++) {
//用for循环依次在牌桌上摆放每排5张,共两排的扑克牌
addObject(cards.get(i) , x, y);
addObject(cards.get(i+5) , x, y + cards.get(i).getImage().getHeight() + 20);
x += cards.get(i).getImage().getWidth()+20;
}
}
//act()方法是游戏单步执行的动作
public void act() {
int count = 0, card1Value=0, card2Value=0; //count表示牌桌上被翻开的第几张牌
Card card1=null, card2=null;
for (int i=0; i< cards.size(); i++) {
//用for循环遍历集合cards中的所有牌
if (cards.get(i).getFaceup() == true) {
//如果遍历到的这张牌是翻开的
count++; //用count将牌桌上翻开的牌数累加
if (count == 1) {
//如果是第一张翻开的牌
card1 = cards.get(i);
card1Value = card1.getValue(); //变量card1Value记录第一张翻开牌的点数
}
if (count == 2) {
//如果是第二张翻开的牌
card2 = cards.get(i);
card2Value = card2.getValue(); //变量card2Value记录第二张翻开牌的点数
if (card1Value == card2Value) {
// 如果翻开的两张牌的点数是一样的
Greenfoot.playSound("WaterDrop.wav");
Greenfoot.delay(10); //延迟10毫秒,游戏效果更好
//移除翻开的两张同样的牌
removeObject(card1);
removeObject(card2);
cards.remove(card1);
cards.remove(card2);
}
else {
//如果翻开的两张牌不同
Greenfoot.delay(15);
// 将两张牌面朝下背朝上
card1.turnFaceDown();
card2.turnFaceDown();
}
break; //两张牌如相同,则移除,如不同,则翻回来。剩下的牌不再遍历,结束for循环
}
}
}
}
}
至此,鼠标点击翻牌,并且相同点数的牌从牌桌上移除的效果已实现。