https://blog.csdn.net/A1344714150/article/details/84993946

原文链接: https://blog.csdn.net/A1344714150/article/details/84993946

游戏介绍:
“开心农场”是一款以种植为主的社交游戏。用户可以扮演一个农场的农场主,在自己的农场里开垦土地,种植各种水果蔬菜。本次开发了一个“开心农场”游戏,运行程序,效果如下图所示。鼠标先选定指定土地(默认选择第一块土地),点击“播种”按钮,可以播种种子;点击“生长”按钮,可以让作物处于生长阶段;点击“开花”按钮,可以让作物处于开花阶段;点击“结果”按钮,可以让作物结果;点击“收获”按钮,可以收获果实到仓库。默认生长期为1分钟,开花期为2分钟,落果期为3分钟,支持作物离线生长。
在这里插入图片描述

在这里插入图片描述

游戏设计的思路:
使用一个带背景的面板作为游戏面板,图片里有九块可种植的土地,每块土地对应的Farm对象存储当前土地状态和最后一次操作时间,先判断鼠标点击的哪块土地,再对选定的土地进行后续操作。面板使用“播种”、“生长”、“开花”、“结果”、“收获”五个按钮和9个用于表示九块土地上的作物的Crop对象。5个按钮的点击事件,会改变土地的状态和最后操作时间以及Crop对象的图片,通过改变Crop对象的图片可以达到农作物各种状态的转变。使用文本存储当前游戏数据,使用线程每秒自动刷新游戏页面并更新文件中的游戏数据,在游戏初始化时先读取历史数据,再做状态的换算,用以达到作物离线生长的作用。

设计步骤:
1.1设计农作物Crop类:

农作物Crop类实现作物状态的显示,通过继承JLabel组件和设置JLabel组件的Icon实现。

package farmGame;

import javax.swing.Icon;
import javax.swing.ImageIcon;
import javax.swing.JLabel;

public class Crop extends JLabel{

Icon icon = null;
public Crop(){
	super();
}

public void setIcon(String picture){
	icon = new ImageIcon(picture);//获取图片
	setIcon(icon);
}

}
1.2设计游戏面板BackgroundPanel类:

BackgroundPanel类主要用来显示游戏背景图。

package farmGame;

import java.awt.Graphics;
import java.awt.Image;

import javax.swing.JPanel;

public class BackgroundPanel extends JPanel{

private Image image;

public BackgroundPanel(){
	super();
	setOpaque(false);//当设置为false时,组件并未不会显示其中的某些像素,允许控件下面的像素显现出来。
	setLayout(null);
}

public void setImage(Image image){
	this.image = image;
}

protected void paintComponent(Graphics g){//重写绘制组件外观方法
	if(image!=null){
		int width = getWidth();
		int height = getHeight();
		g.drawImage(image, 0, 0, width, height, this);
	}
	super.paintComponent(g);
}

}
1.3农场土地Farm类:

Farm类对象用来存储一块土地的状态和最后一次操作时间(例如播种),包含该块土地相关的播种、生长、开花、结果、收获操作;state0时未播种,state1时已播种,state2时生长中,state3时开花中,state==4已结果;每次操作如果符合条件修改state值和最后一次操作时间,否则设置提示信息为不能播种。

package farmGame;

import java.io.Serializable;
import java.util.Date;

public class Farm implements Serializable {
private static final long serialVersionUID = 1L;
public int state = 0;
public Date lastTime = null;

public int getState() {
	return state;
}

public void setState(int state) {
	this.state = state;
}

public Date getLastTime() {
	return lastTime;
}

public void setLastTime(Date lastTime) {
	this.lastTime = lastTime;
}

public String seed(Crop crop,String picture){
	String returnValue = "";
	if(state == 0){
		crop.setIcon(picture);
		state = 1;
		lastTime = new Date();
	}else{
		returnValue = getMessage()+",不能播种";
	}
	
	return returnValue;
}

public String grow(Crop crop,String picture){
	String returnValue = "";
	if(state == 1){
		crop.setIcon(picture);
		state = 2;
		lastTime = new Date();
	}else{
		returnValue = getMessage()+",不能生长";
	}
	
	return returnValue;
}

public String bloom(Crop crop,String picture){
	String returnValue = "";
	if(state == 2){
		crop.setIcon(picture);
		state = 3;
		lastTime = new Date();
	}else{
		returnValue = getMessage()+",不能开花";
	}
	
	return returnValue;	
}


public String fruit(Crop crop,String picture){
	String returnValue = "";
	if(state == 3){
		crop.setIcon(picture);
		state = 4;
		lastTime = new Date();
	}else{
		returnValue = getMessage()+",不能结果";
	}
	
	return returnValue;
}

public String harvest(Crop crop,String picture){
	String returnValue="";
	if(state==4){
		crop.setIcon(picture);
		state = 0;
		lastTime = null;
	}else{
		returnValue = getMessage()+",不能收获!";
	}
	
	return returnValue;
}


public String getMessage() {

	String message = "";
	switch(state){
	case 0:
		message = "作物还没有播种";
		break;
	case 1:
		message = "作物刚刚播种";
		break;
	case 2:
		message = "作物正在生长";
		break;
	case 3:
		message = "作物正处于开花期";
		break;
	case 4:
		message = "作物已经结果";
		break;
	}
	
	return message;
}

}

猜你喜欢

转载自blog.csdn.net/hjh2018/article/details/102700908