【引言】
大佬们是否还记得,那些年QQ空间农场偷摘菜的日子呢[偷笑]……
一、需求分析
QQ农场是腾讯QQ推出的一款社交类休闲游戏,玩家可以在游戏中体验种植、养殖等农场经营的乐趣。以下是对QQ农场游戏的详细分析:
经典游戏Java实现QQ农场小游戏(附源码)资源-CSDN文库
【预期效果】
【游戏功能】:
QQ农场游戏的设计思路主要围绕着模拟农场经营和社交互动展开,旨在提供玩家一个轻松愉快的游戏体验。以下是对QQ农场游戏设计思路的详细分析:
模拟农场经营:
- 游戏设计师通过模拟农场经营的方式,让玩家可以体验种植、养殖等农场经营的乐趣,包括选择作物、施肥浇水、收获等环节。
- 玩家需要关注作物的生长周期、需求等因素,合理安排时间和资源来经营农场,从中获得成就感和乐趣。
社交互动:
- 游戏强调社交互动的重要性,玩家可以邀请好友加入游戏,一起经营农场,互相赠送礼物、帮助清理农场等。
- 社交互动设计增加了游戏的互动性和趣味性,让玩家可以与好友一起合作、竞争,增强了游戏的社交属性。
成长与奖励机制:
- 游戏设计中包含了成长与奖励机制,玩家通过不断经营农场可以获得金币、经验等奖励,提升自己的等级,并解锁更多功能和新的种植、养殖物品。
- 成长与奖励机制激励玩家持续参与游戏,探索更多内容,体验游戏带来的成就感和乐趣。
简单易上手的操作:
- 游戏设计追求简单易上手的操作方式,让玩家可以快速上手游戏,并享受其中带来的乐趣,不需要复杂的操作就能体验游戏的核心玩法。
- 简单易上手的操作方式也有助于吸引更多玩家参与游戏,让游戏更具有通用性和受欢迎度。
虚拟经济系统:
- 游戏设计中包含了虚拟经济系统,通过金币作为游戏内货币,玩家可以通过种植、养殖等方式获取金币,用于购买种子、道具等。
- 虚拟经济系统的设计让玩家在游戏中有明确的目标和激励,促使他们持续参与游戏,创造更多的游戏价值和体验。
综上所述,QQ农场游戏的设计思路围绕着模拟农场经营、社交互动、成长与奖励机制、简单易上手的操作和虚拟经济系统展开,旨在为玩家提供一个有趣、互动性强的游戏体验,激励玩家持续参与并享受游戏带来的乐趣。
二、分析实现
1、我的农场界面
设计一个农场界面,有成块的土地,类似QQ农场的界面。
这里是支持换皮肤的,更换场景(附有5种皮肤场景)。同时带有许多的工具栏目,包括:
- 种子商店
- 果实仓库
- 播种背包
- 作物铲子
- 采摘手套
2、作物种植(核心)
种植:玩家可以在游戏中选择不同的农作物进行种植,包括蔬菜、水果等,通过浇水、施肥等操作来促进作物生长。
2.1、种子商城
【种子类】
类内部维护了一个方法,记录了生长周期的图片。
【果实类】
2.2 土地
土地类定义了许多属性,包括当前种植的植物参数。这类定义的计时器,起始代表的就是土地的肥沃程度,体现在作物的生长周期的快慢。其实就是计时器控制图片轮播速度,以模拟这种生长效果。
public class LandLabel extends JLabel {
private JLabel labelBackground;// 放土地的背景图
private JLabel labelCrop;// 以后放每个农作物的成长阶段图片
private int nowCropID;// 现在土地上种植的农作物的ID,当播种时可得到
private int nowCropFruitCount = 0;// 收获时的果实数量,刚开始播种时值为零
private int landNum;// 现在土地的编号
private Timer timer;// 这块土地上的定时器
private int nowStage;// 现在生长的阶段
private Farm farm;// 农场主界面
private CropBean nowCrop;// 土地上的农作物
private LandData landData;// 土地数据
private long leavetime;// 离开的时间
private boolean ishadbo = false;// 是否已经播种
private boolean isPick = false;// 是否已经采摘
private boolean isRipe = false;// 是否成熟
private boolean isSteal = false;// 是否偷过
}
3、作物生长周期
主要是一些图片素材,轮帧播放。但是需要注意的是,要进行规格的调整,适应不同的大小变化。
升级:通过不断经营,玩家可以获得金币、经验等奖励,提升自己的等级,在游戏中解锁更多功能和新的种植、养殖物品。
控制生长周期的关键代码:
/*
* 加载土地
*/
private void load(long startTime) {
landData.setCropID(nowCropID);
ishadbo = true;
nowCrop = CropRW.getCrop(nowCropID);
isRipe = true;// 是否成熟
isPick = landData.getIsEndStage() == 1 ? true : false;// 是否已经采摘
if (isPick) {// 已经采摘,刷新枯萎图片即可
flushPic(5);// 参数非0即可 刷新图片用isPick 判断是否枯萎
} else {
long nowTime = System.currentTimeMillis();
long dTime = nowTime - startTime;// 算出时间差
int i;// 生长阶段
for (i = 0; i < nowCrop.getStageCount(); i++) {
dTime = dTime - (i + 1) * nowCrop.getUnitTime() * 1000;
if (dTime <= 0) {// 到下一阶段时间不够,既还未成熟
isRipe = false;
break;
} else {
this.leavetime = dTime;// 剩余的时间
}
}
nowStage = i;
flushPic(nowStage);
if (!isRipe) {// 还未成熟
myTimer((int) leavetime);// 把扣除完当前生长阶段余下的时间设置给定时器
timer.start();
} else {
isRipe = true;// 果实成熟
int fruitNum = landData.getFruitNum();// 成熟时的果实数
int stealNum = landData.getStealCount();// 被偷个数
if (fruitNum == 0) {// 上次退出时还未成熟
fruitNum = (int) (Math.random() * 20) + 10;// 随机10~30个果实
landData.setFruitNum(fruitNum);
}
LandRW.landDataMap.put(landNum, landData);
nowCropFruitCount = fruitNum - stealNum;// 实际果实数=成熟时的果实-被偷个数
return;
}
}
}
4、偷菜功能
landData类记录了当前土地的状态,也包括了是否偷过菜了。
同时需要进行多个状态的判断:
- 地里没有种植
- 农作物已经枯萎
- 还没成熟状态
/*
* 采摘or偷取
*/
private void pick() {
if (landData.getCropID() == -1) {
JOptionPane.showMessageDialog(this, "地里啥都没有");
} else if (isPick) {
JOptionPane.showMessageDialog(this, "农作物已经枯萎了");
} else if (!isRipe) {// 未成熟
JOptionPane.showMessageDialog(this, "不要着急,还没熟呢");
} else {// 成熟
nowCrop = CropRW.getCrop(nowCropID);
if (farm.nowUserID == Farm.USERID) {// 自己的农场
FruitBean fruit = new FruitBean(nowCrop, nowCropFruitCount);
FruitRW.addTOStoreList(fruit);
farm.flushUserMsg(0, 1);//刷新经验
landData.setIsEndStage(1);
landData.setFruitNum(0);
LandRW.landDataMap.put(landNum, landData);
LandRW.saveLandMsg(Farm.USERID);
isPick = true;
flushPic(nowStage);
JOptionPane.showMessageDialog(this, "成功采摘" + nowCropFruitCount
+ "个" + nowCrop.getName());
nowCropFruitCount=0;
} else {// 好友的农场
if (isSteal || landData.getStealName().contains(Farm.USERID)) {// 偷过了
JOptionPane.showMessageDialog(this, "你已经偷过啦~");
} else {// 没偷过
if (nowCropFruitCount > 10) {// 果实大于10才可以偷
int stealNum = (int) (Math.random() * 2 + 1);
FruitBean fruit = new FruitBean(nowCrop, stealNum);
FruitRW.addTOStoreList(fruit);
int stealCount = landData.getStealCount() + stealNum;
String stealName = landData.getStealName()
+ Farm.USERID;
landData.setStealCount(stealCount);
landData.setStealName(stealName+"-");
LandRW.landDataMap.put(landNum, landData);
LandRW.saveLandMsg(farm.nowUserID);
isSteal = true;
JOptionPane.showMessageDialog(this, "成功偷取" + stealNum
+ "个" + nowCrop.getName());
} else {
JOptionPane.showMessageDialog(this, "已经快要被偷光了,手下留情吧~");
}
}
}
}
}
5、工具栏
定义了多个数据类来保存数据。
包括了仓库的果实、种子数据量的保存,都通过该类控制。
以上是一些主要功能的实现思路,其他的就不赘述了。
三、界面展示
1、蔬菜种植
2、种子商城
3、果实仓库
4、摘菜、生长周期、铲除