利用Greenfoot制作简单的小游戏——记忆翻牌游戏(三)

前两篇的文章
记忆翻牌游戏(一)
记忆翻牌游戏(二)


接上回,对于上篇中的翻牌效果,虽然实现了鼠标点击翻牌,但是可以发现,已经翻开的扑克牌,依然被放置在牌桌上,没有被移除。
此篇就来实现移除效果。

先来看看最终效果。

在这里插入图片描述
上篇我们已经可以通过鼠标点击翻牌,要想实现移除效果,则需要对扑克牌进行配对检查。
基本思路如下:

  • 遍历扑克牌集合中的每一张扑克牌,如果牌是第一张被翻开的,记录下此时牌的点数,若是第二张被翻开的,也记录下牌的点数;
  • 将第一张牌的点数与第二张牌的点数进行比较,若点数相同,则移除这两张牌,若不同,则将两张牌恢复为初始状态(即背面朝上)。

在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循环
                }
            }
        }
    }
}

至此,鼠标点击翻牌,并且相同点数的牌从牌桌上移除的效果已实现。

猜你喜欢

转载自blog.csdn.net/weixin_44892517/article/details/112792781