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

前几篇文章在这里
记忆翻牌游戏(一)
记忆翻牌游戏(二)
记忆翻牌游戏(三)


在上一篇中我们已经实现了记忆翻牌游戏的大部分功能,游戏也能正常运行。那我们怎样才能知道游戏已经结束了呢?还是需要给用户一点提示。
今天就来实现最后一点游戏结束功能

最终效果
在这里插入图片描述
当牌桌上所有的扑克牌都被消除时,给用户一个游戏结束的信息。

需要做的就是,在每一轮比较之后,检查桌面上是否还残存有扑克牌,若有,则游戏继续,若没有,则游戏结束。

if (cards.size() == 0) {
    
                //配对的牌全部找到,游戏结束
	showText("Game Over!",300,200);
	Greenfoot.stop();
}

显示画面如下:

在这里插入图片描述
完整代码如下:

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);
						if (cards.size() == 0) {
    
        //配对的牌全部找到,游戏结束
                            showText("Game Over! ",  300, 200);
                            Greenfoot.stop();
                        }
                    }
                    else {
    
    	//如果翻开的两张牌不同
                        Greenfoot.delay(15);
                        // 将两张牌面朝下背朝上
                        card1.turnFaceDown();
                        card2.turnFaceDown();
                    }
                    break;	//两张牌如相同,则移除,如不同,则翻回来。剩下的牌不再遍历,结束for循环
                }
            }
        }
    }
}

至此,记忆翻牌游戏已全部完成,但只是实现了最基本的功能,还有改进和完善的地方。

  • 加入更多的扑克牌
  • 添加计数器和计时器,记录玩家翻牌的次数以及整个游戏用时
  • 添加更多的文字提示
  • 使用其他图像

猜你喜欢

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