利用Greenfoot制作简单的小游戏 |
您所在的位置:网站首页 › 记忆类游戏设计 › 利用Greenfoot制作简单的小游戏 |
今天来学习怎样用Greenfoot制作一款记忆翻盘游戏。 游戏规则如下:首先在牌桌上摆放一系列的扑克牌,游戏开始时牌的背面朝上,玩家无法看到牌的点数(保证扑克牌的点数成对)。玩家任意翻开两张扑克牌,若起点数相同则从桌面上移除这两张扑克牌,若点数不同,则将其翻转,使牌的背面重新朝上,直至桌面上的所有牌都被移除,游戏结束。 先来看看最终效果 Greenfoot是由英国肯特大学的Michael和Martin设计的一款Java 游戏设计工具,是一个功能完整的开发环境,可以使用Java方便地编写游戏和进行模拟。 下图为Greenfoot的主界面 下载地址:https://www.greenfoot.org/download 选择适合的版本下载即可。 下载完成后,双击安装 单击next Install just for you,单击next 单击剧本,选择新建一个Java剧本 在弹出来的对话框中设置名字和存储位置, 点击确定,出现一个空的游戏场景界面。界面右侧有两个类,场景类World和角色类Actor。 需要注意的是,这两个类都是抽象类,不能直接被使用,需要创建它们的子类才行。这里,有一个系统自动生成的子类MyWorld。 下面介绍如何新创建一个子类。 右键单击World,选择新建子类 在添加游戏角色之前,需要在游戏中创建一个角色,Greenfoot提供了一个角色类Actor。 右键单击Actor类,选择新建子类 点击下方的运行,即可运行程序 游戏场景和角色设计 作为记忆翻牌游戏,首先需要若干扑克牌参与游戏,一个放置扑克牌的牌桌,所以至少需要两个类,一个为扑克牌类(Card),一个为牌桌类(Table)。 游戏规则设计 若有相同点数的牌被翻开,则两张牌被移除,若翻开的两张牌点数不同,则重新将其翻面,当牌桌上所有的牌被移除后,游戏结束。 2. 游戏程序实现初始化游戏场景,创建Card类和Table类,加入扑克牌背面图和牌桌图片 为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 cards = new ArrayList(); //声明一个保存扑克牌对象的集合cards编写构造方法。通过循环语句获取扑克牌对象 for (int i=1; 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 cards = new ArrayList(); //声明一个保存扑克牌对象的集合cards //Table类的构造方法 public Table() { super(600, 400, 1); for (int i=1; 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 //如果遍历到的这张牌是翻开的 count++; //用count将牌桌上翻开的牌数累加 if (count == 1) { //如果是第一张翻开的牌 } if (count == 2) { //如果是第二张翻开的牌 } } } } }点击运行,可看到牌桌上自动放入了10张牌,且每张牌背面朝上 |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |