今天来学习怎样用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文件夹中,否则会出现错误
至此,翻牌游戏的界面初步制作完成。