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

今天来学习怎样用Greenfoot制作一款记忆翻盘游戏。

游戏规则如下:首先在牌桌上摆放一系列的扑克牌,游戏开始时牌的背面朝上,玩家无法看到牌的点数(保证扑克牌的点数成对)。玩家任意翻开两张扑克牌,若起点数相同则从桌面上移除这两张扑克牌,若点数不同,则将其翻转,使牌的背面重新朝上,直至桌面上的所有牌都被移除,游戏结束。

先来看看最终效果
最终实现效果

目录

一、 Greenfoot概述

二、Greenfoot安装

三、基本操作方法

四、 记忆翻牌游戏


一、Greenfoot概述

Greenfoot是由英国肯特大学的Michael和Martin设计的一款Java 游戏设计工具,是一个功能完整的开发环境,可以使用Java方便地编写游戏和进行模拟。

下图为Greenfoot的主界面
在这里插入图片描述

二、Greenfoot安装

下载地址:https://www.greenfoot.org/download


在这里插入图片描述

选择适合的版本下载即可。
下载完成后,双击安装
在这里插入图片描述

单击next
在这里插入图片描述

Install just for you,单击next
在这里插入图片描述
选择安装路径,next
在这里插入图片描述
点击Install,等待安装即可
在这里插入图片描述
在这里插入图片描述
单击Finish,完成安装
在这里插入图片描述
想改为中文界面的朋友,双击打开安装好的Greenfoot 选择Tools——Preferences
在这里插入图片描述
选择Interface,将Language改为中文
在这里插入图片描述
重启,再次打开Greenfoot,已经是中文界面了
在这里插入图片描述

三、基本操作方法
1. 创建游戏场景

单击剧本,选择新建一个Java剧本
在这里插入图片描述

在弹出来的对话框中设置名字和存储位置,
在这里插入图片描述

点击确定,出现一个空的游戏场景界面。界面右侧有两个类,场景类World和角色类Actor。
需要注意的是,这两个类都是抽象类,不能直接被使用,需要创建它们的子类才行。这里,有一个系统自动生成的子类MyWorld。
在这里插入图片描述



下面介绍如何新创建一个子类。
右键单击World,选择新建子类
在这里插入图片描述
在弹出的新建类的对话框中,输入新的类名,
在这里插入图片描述
点击确定,一个新的子类就创建好了。
在这里插入图片描述
双击新建好的子类,可看到系统自动生成的代码框架
在这里插入图片描述
其中super(60,400,1);表示的是创建一个尺寸为600像素×400像素大小的游戏场景。
右键单击新建的子类,单击设置图像。
在这里插入图片描述
在打开的对话框中选择一个图片,确定
在这里插入图片描述
右键点击myGame,new myGame(),此时游戏的背景图则被替换为我们刚才选择的图片
在这里插入图片描述
也可以从本地上传图片作为背景图,
同样,右键单击myGame子类,选择设置图像,单击左下角的设置,选择从库中导入,选择本地图片,确定
在这里插入图片描述
在这里插入图片描述
再次右键单击myGame,new myGame(),则背景换为我们自己从本地导入的图片
在这里插入图片描述

2. 添加游戏角色

在添加游戏角色之前,需要在游戏中创建一个角色,Greenfoot提供了一个角色类Actor。
右键单击Actor类,选择新建子类
在这里插入图片描述
输入新的类名
在这里插入图片描述
右键点击新建好的子类,选择设置图象,基本步骤和选择背景图一样
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
按住shift键选择角色,移动鼠标,可重复向该场景中添加多个对象
在这里插入图片描述

3. 运行游戏

点击下方的运行,即可运行程序
在这里插入图片描述


四、记忆翻牌游戏
1. 游戏整体设计

游戏场景和角色设计
作为记忆翻牌游戏,首先需要若干扑克牌参与游戏,一个放置扑克牌的牌桌,所以至少需要两个类,一个为扑克牌类(Card),一个为牌桌类(Table)。

游戏规则设计
若有相同点数的牌被翻开,则两张牌被移除,若翻开的两张牌点数不同,则重新将其翻面,当牌桌上所有的牌被移除后,游戏结束。

2. 游戏程序实现

初始化游戏场景,创建Card类和Table类,加入扑克牌背面图和牌桌图片
在这里插入图片描述
在这里插入图片描述
为Card类定义相关的字段和方法

private int value = -1;    //初始点数为-1,表示还没有生成确定的扑克牌。一旦生成了一张牌,其点数就不为-1
private boolean isFaceUp = false;	//isFaceUp=true,则牌正面朝上,否则背面朝上
private GreenfootImage faceUpImage = null;//faceUpImage表示牌的正面图案文件
private GreenfootImage faceDownImage = null;//faceDownImage表示牌的背面面图案文件

为Card类编写构造方法

public Card(int cardValue) {
    
    //cardValue是构造一张Card对象时传入的牌的点数
        value = cardValue;
        isFaceUp = false;	//所有被构造的牌都是背面朝上的
        String fileName = "hearts" + value + ".png";  //根据牌点数匹配的正面图案文件名
        //生成牌的正面图像对象
        faceUpImage = new GreenfootImage(fileName.toLowerCase());
        faceDownImage = new GreenfootImage("blueflip.png");	//生成牌的背面图案对象
        setImage(faceDownImage);	//让牌背面朝上放在牌桌上
}

因为设置的图片的名字和扑克牌的点数对应,可以根据扑克牌的点数来获取完整的图片文件名,根据此文件名来获取扑克牌正面的图像

String fileName = "hearts" + value + ".png";  //根据牌点数匹配的正面图案文件名
faceUpImage = new GreenfootImage(fileName.toLowerCase());//生成牌的正面图像对象

设置图片背面的图像,将其设置为扑克牌的默认图像

faceDownImage = new GreenfootImage("blueflip.png");	//生成牌的背面图案对象
setImage(faceDownImage);	//让牌背面朝上放在牌桌上

编写其他需要用到的方法

//act()方法是游戏单步执行的动作
    public void act() {
    
    

    }

    //获取这张牌的点数
    public int getValue(){
    
    
        return value;
    }

    //获取这张牌是否已翻面
    public boolean getFaceup(){
    
    
        return isFaceUp;
    }

    //将牌翻成背部朝上
    public void turnFaceDown(){
    
    
        isFaceUp = false;
        setImage(faceDownImage);

    }

完整代码如下

import greenfoot.*;  // (World, Actor, GreenfootImage, Greenfoot and MouseInfo)


/**
 * 扑克牌类,可以被翻开
 */
public class Card extends Actor{
    
    
    private int value = -1;    //初始点数为-1,表示还没有生成确定的扑克牌。一旦生成了一张牌,其点数就不为-1
    private boolean isFaceUp = false;	//isFaceUp=true,则牌正面朝上,否则背面朝上
    private GreenfootImage faceUpImage = null;//faceUpImage表示牌的正面图案文件
    private GreenfootImage faceDownImage = null;//faceDownImage表示牌的背面面图案文件

    //Card类的构造方法
    public Card(int cardValue) {
    
    //cardValue是构造一张Card对象时传入的牌的点数
        value = cardValue;
        isFaceUp = false;	//所有被构造的牌都是背面朝上的
        String fileName = "hearts" + value + ".png";  //根据牌点数匹配的正面图案文件名
        //生成牌的正面图像对象
        faceUpImage = new GreenfootImage(fileName.toLowerCase());
        faceDownImage = new GreenfootImage("blueflip.png");	//生成牌的背面图案对象
        setImage(faceDownImage);	//让牌背面朝上放在牌桌上
    }

    //act()方法是游戏单步执行的动作
    public void act() {
    
    

    }

    //获取这张牌的点数
    public int getValue(){
    
    
        return value;
    }

    //获取这张牌是否已翻面
    public boolean getFaceup(){
    
    
        return isFaceUp;
    }

    //将牌翻成背部朝上
    public void turnFaceDown(){
    
    
        isFaceUp = false;
        setImage(faceDownImage);

    }

}

为Table类编写相关的字段和方法,这里使用ArrayList对象。
首先定义一个扑克牌对象的集合

ArrayList<Card> cards = new ArrayList<Card>();  //声明一个保存扑克牌对象的集合cards

编写构造方法。通过循环语句获取扑克牌对象

for (int i=1; i<=5; i++) {
    
          //向集合cards中添加两组共10张5点以下的牌
            cards.add(new Card(i));
            cards.add(new Card(i));
        }
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;
        }

打乱扑克牌的顺序

Collections.shuffle(cards); //集合类Collections的混排算法,用于打乱集合cards中牌的顺序

完整代码如下

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) {
    
    			//如果是第一张翻开的牌
                   
                }
                if (count == 2) {
    
    			//如果是第二张翻开的牌
                
                }
            }
        }
    }
}

点击运行,可看到牌桌上自动放入了10张牌,且每张牌背面朝上
在这里插入图片描述
注意,需要将牌放入FlopGame文件夹下面的images文件夹中,否则会出现错误
在这里插入图片描述
在这里插入图片描述
至此,翻牌游戏的界面初步制作完成。

猜你喜欢

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