Java 编写开心农场系统 窗体程序 功能强大 完整源码

本文介绍了一个使用Java语言和SWING框架开发的开心农场游戏,具备播种、生长、开花、结果和收获等农作物生命周期功能。游戏界面美观,提供完整源码,支持MySQL数据库。系统实现了作物离线生长和状态自动更新,通过文件存储游戏进度。文章还展示了程序运行的各个阶段截图,并提及开发过程中的挑战和解决方案。
摘要由CSDN通过智能技术生成

今天为大家分享一个java语言编写的开心农场,目前系统功能已经很全面,后续会进一步完善。整个系统界面漂亮,有完整得源码,希望大家可以喜欢。喜欢的帮忙点赞和关注。一起编程、一起进步

开发环境

开发语言为Java,开发环境Eclipse或者IDEA都可以,数据为MySQL。运行主程序,或者执行打开JAR文件即可以运行本程序。

系统框架

利用JDK自带的SWING框架开发。纯窗体模式,直接运行Main文件即可以。同时带有详细得设计文档。

主要功能

程序启动方法

开心农场介绍

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

设计思路

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

主要功能

控制鼠标依次点击植物状态(播种、生长、开花、结果);农场中的植物根据对应状态变换不同图片效果;当点击收获时图片消失,果实加一;农场的5个阶段如下:

1、播种种子

2、种子生长

3、种子开花

4、种子结果

5、收获种子

系统运行效果

图1 程序主界面

图2 播种后界面

图3 不能重复播种界面

图4 植物生长界面

图5 植物开花界面

图6 植物结果界面

图7 收获果实到仓库界面

关键代码

package farmGame;

import java.awt.EventQueue;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;

public class MainFrame extends JFrame implements MouseListener,Runnable{

    int fruitNumber = 0;
    Farm[] farms = new Farm[9];
    Crop[] crops = new Crop[9];
    Farm farm = new Farm();
    Crop crop = new Crop();
    JLabel storage;    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    FileInputStream fis = null;
    FileOutputStream fos = null;
    DataInputStream dis = null;
    DataOutputStream dos = null;

    //生长期1小时,开花期2小时,结果期3小时
    public static final long GROWTIME = 1000*60,BLOOMTIME = 1000*60*2,FRUITTIME = 1000*60*3;

    public MainFrame(){
        super();
        setTitle("打造自己的开心农场");
        setBounds(500,200,900,600);//设置窗口位置和大小
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        addMouseListener(this);
        final BackgroundPanel backgroundPanel = new BackgroundPanel();
        Image bk = Toolkit.getDefaultToolkit().getImage("src/farmBackground.png");
        backgroundPanel.setImage(bk);
        backgroundPanel.setBounds(0,0,855,553);//设置游戏面板位置和大小
        getContentPane().add(backgroundPanel);
        storage = new JLabel();
        storage.setHorizontalAlignment(SwingConstants.CENTER);
        storage.setText("您的仓库没有任何果实,快快播种吧!");
        storage.setBounds(200,70,253,28);//标签位置
        backgroundPanel.add(storage);

        initlize();
        for(Crop temp:crops){
            backgroundPanel.add(temp);
        }        

        final JButton button_1 = new JButton();//播种
        button_1.setRolloverIcon(new ImageIcon("src/播种1.png"));//移动到图标上显示的图片
        button_1.setBorderPainted(false);
        button_1.setContentAreaFilled(false);
        button_1.setIcon(new ImageIcon("src/播种.png"));//正常显示图片
        button_1.addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent e) {
                if(farm == null)//如果没有先选中土地
                    return ;

                String message = farm.seed(crop, "src/seed.png");
                if(!message.equals("")){
                    JOptionPane.showMessageDialog(null, message);
                }
            }            
        });        
        button_1.setBounds(140,477,56,56);//29, 185, 56, 56
        backgroundPanel.add(button_1);


        final JButton button_2 = new JButton();//生长
        button_2.setContentAreaFilled(false);
        button_2.setBorderPainted(false);
        button_2.setRolloverIcon(new ImageIcon("src/生长1.png"));
        button_2.setIcon(new ImageIcon("src/生长.png"));
        button_2.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(farm == null)//如果没有先选中土地
                    return ;

                String message = farm.grow(crop, "src/grow.png");
                if(!message.equals("")){
                    JOptionPane.showMessageDialog(null, message);
                }
            }
        });
        backgroundPanel.add(button_2);
        button_2.setBounds(280,477,56,56);//114,185,56,56


        final JButton button_3 = new JButton();
        button_3.setContentAreaFilled(false);
        button_3.setBorderPainted(false);
        button_3.setRolloverIcon(new ImageIcon("src/开花1.png"));
        button_3.setIcon(new ImageIcon("src/开花.png"));
        button_3.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {

                if(farm == null)//如果没有先选中土地
                    return ;

                String message = farm.bloom(crop, "src/bloom.png");
                if(!message.equals("")){
                    JOptionPane.showMessageDialog(null, message);
                }
            }
        });
        backgroundPanel.add(button_3);
        button_3.setBounds(420,477,56,56);//199,185,56,56;


        final JButton button_4 = new JButton();
        button_4.setContentAreaFilled(false);
        button_4.setBorderPainted(false);
        button_4.setRolloverIcon(new ImageIcon("src/结果1.png"));
        button_4.setIcon(new ImageIcon("src/结果.png"));
        button_4.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(farm == null)//如果没有先选中土地
                    return ;

                String message = farm.fruit(crop,"src/fruit.png");
                if(!message.equals("")){
                    JOptionPane.showMessageDialog(null, message);
                }
            }
        });
        backgroundPanel.add(button_4);
        button_4.setBounds(560,477,56,56);


        final JButton button_5 = new JButton();
        button_5.setContentAreaFilled(false);
        button_5.setBorderPainted(false);
        button_5.setRolloverIcon(new ImageIcon("src/收获1.png"));
        button_5.setIcon(new ImageIcon("src/收获.png"));
        button_5.addActionListener(new ActionListener() {

            @Override
            public void actionPerformed(ActionEvent e) {
                if(farm == null)//如果没有先选中土地
                    return ;

                String message = farm.harvest(crop, "");
                if(!message.equals("")){
                    JOptionPane.showMessageDialog(null, message);
                }else{
                    fruitNumber++;
                    storage.setText("您的仓库现在有"+fruitNumber+"个果实.");
                }
            }
        });
        backgroundPanel.add(button_5);
        button_5.setBounds(700,477,56,56);//369,185,56,56

        new Thread(this).start();

    }


    public void initlize(){

        for(int i=0;i<9;i++){
            farms[i] = new Farm();
            crops[i] = new Crop();
        }

        crops[0].setBounds(269, 153, 106, 96);
        crops[1].setBounds(165, 195, 106, 96);
        crops[2].setBounds(59, 238, 106, 96);
        crops[3].setBounds(378, 199, 106, 96);
        crops[4].setBounds(278, 236, 106, 96);
        crops[5].setBounds(169, 284, 106, 96);
        crops[6].setBounds(501, 247, 106, 96);
        crops[7].setBounds(393, 281, 106, 96);
        crops[8].setBounds(286, 333, 106, 96);


        farm = farms[0];//默认选中第一块土地
        crop = crops[0];//默认第一株植物
        readNowState();//更新现在状态
    }

    @Override
    public void mouseClicked(MouseEvent e) {
        // TODO Auto-generated method stub
        int x = e.getX();
        int y = e.getY();

        System.out.println("x is "+x+", y is "+y);

        if(isInDiamond(x-324,y-258,160,65)){//第一块土地
            System.out.println("第一块土地");
            farm = farms[0];
            crop = crops[0];
        }else if(isInDiamond(x-220,y-300,160,65)){
            System.out.println("第二块土地");            
            farm = farms[1];
            crop = crops[1];
        }else if(isInDiamond(x-114,y-343,160,65)){
            System.out.println("第三块土地");
            farm = farms[2];
            crop = crops[2];
        }else if(isInDiamond(x-433,y-304,160,65)){
            System.out.println("第四块土地");
            farm = farms[3];
            crop = crops[3];
        }else if(isInDiamond(x-333,y-341,160,65)){
            System.out.println("第五块土地");
            farm = farms[4];
            crop = crops[4];
        }else if(isInDiamond(x-224,y-389,160,65)){
            System.out.println("第六块土地");
            farm = farms[5];
            crop = crops[5];
        }else if(isInDiamond(x-556,y-352,160,65)){
            System.out.println("第七块土地");
            farm = farms[6];
            crop = crops[6];
        }else if(isInDiamond(x-448,y-386,160,65)){
            System.out.println("第八块土地");
            farm = farms[7];
            crop = crops[7];
        }else if(isInDiamond(x-341,y-438,160,65)){//第九块土地
            System.out.println("第九块土地");
            farm = farms[8];
            crop = crops[8];
        }else{
            farm = null;
            crop = null;
            System.out.println("没有选中任何土地");
        }

    }

    //width菱形宽,height菱形高
    public boolean isInDiamond(int x,int y,int width,int height){
        if(Math.abs(x*height)+Math.abs(y*width)<=width*height*0.5){
            return true;
        }

        return false;
    }

    public void readNowState(){

        File file = new File("D://GameRecordAboutSwing");

        if(!file.exists()){
            file.mkdirs();
        }

        File record = new File("D://GameRecordAboutSwing/recordFarmGame.txt");

        try{
            if(!record.exists()){//如果不存在,新建文本
                record.createNewFile();
                fos = new FileOutputStream(record);
                dos = new DataOutputStream(fos);
                String s = "0,null;0,null;0,null;0,null;0,null;0,null;0,null;0,null;0,null&0";
                dos.writeBytes(s);
                System.out.println(record.isFile());;
            }

            //读取记录
            fis = new FileInputStream(record);
            dis = new DataInputStream(fis);
            String str = dis.readLine();
            String[] array1 = str.split("&");//作物相关
            String[] array2 = array1[0].split(";");//土地相关
            fruitNumber = Integer.parseInt(array1[1]);//仓库果实
            if(fruitNumber == 0){
                storage.setText("您的仓库没有任何果实,快快播种吧!");
            }else{
                storage.setText("您的仓库现在有"+fruitNumber+"个果实.");
            }

            for(int i=0;i<9;i++){
                String[] help = array2[i].split(",");
                int state = Integer.parseInt(help[0]);
                if(help[1].equals("null")){//未播种,直接跳过
                    continue;
                }
                Date lastTime = sdf.parse(help[1]);
                Date nowTime = new Date();
                long subTime = nowTime.getTime() - lastTime.getTime();//得到相差毫秒數
                long temp = 0;//存储farm[i]最后操作的时间到当前时间的时间差(毫秒表示)
                if(state == 1){//已播种
                    if(subTime>=GROWTIME){
                        subTime -= GROWTIME;
                        temp += GROWTIME;
                        state = 2;
                    }
                }
                if(state == 2){//已生长
                    if(subTime>=BLOOMTIME){
                        subTime -= BLOOMTIME;
                        temp += BLOOMTIME;
                        state = 3;
                    }
                }
                if(state == 3){//已开花
                    if(subTime>=FRUITTIME){
                        subTime -= FRUITTIME;
                        temp += FRUITTIME;
                        state = 4;
                    }
                }

                switch(state){
                case 1:
                    farms[i].state = 1;
                    farms[i].lastTime = lastTime;
                    crops[i].setIcon("src/seed.png");
                    break;
                case 2:
                    farms[i].state = 2;
                    farms[i].lastTime = new Date(lastTime.getTime()+temp);
                    crops[i].setIcon("src/grow.png");
                    break;
                case 3:
                    farms[i].state = 3;
                    farms[i].lastTime = new Date(lastTime.getTime()+temp);
                    crops[i].setIcon("src/bloom.png");
                    break;
                case 4:
                    farms[i].state = 4;
                    farms[i].lastTime = new Date(lastTime.getTime()+temp);
                    crops[i].setIcon("src/fruit.png");
                    break;
                }

            }

        }catch(Exception e){
            e.printStackTrace();
        }finally{
            try {
                if(fis!=null)
                    fis.close();
                if(dis!=null)
                    dis.close();            
                if(fos!=null)
                    fos.close();
                if(dos!=null)
                    dos.close();                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }

    }



    public void saveNowState(){

        StringBuilder sb = new StringBuilder();
        String[] strs = new String[9];

        for(int i=0;i<9;i++){
            strs[i] = farms[i].lastTime == null?"null":sdf.format(farms[i].lastTime);//土地最后一次操作时间
            if(i!=8)
                sb.append(farms[i].state+","+strs[i]+";");
            else
                sb.append(farms[i].state+","+strs[i]);                
        }

        sb.append("&"+fruitNumber);
//        System.out.println(sb);    

        File record = new File("D://GameRecordAboutSwing/recordFarmGame.txt");

        try {
            //清空原有记录
            FileWriter fileWriter =new FileWriter(record);
            fileWriter.write("");
            fileWriter.flush();
            fileWriter.close();
            //重新写入文本
            fos = new FileOutputStream(record);
            dos = new DataOutputStream(fos);
            String s = sb.toString();
            dos.writeBytes(s);
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            try {
                if(fos!=null)
                    fos.close();
                if(dos!=null)
                    dos.close();                
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }

    }

    @Override
    public void run() {
        try {
            while(true){
                Thread.sleep(1000);
                saveNowState();
                readNowState();
            }
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

    }


    @Override
    public void mouseEntered(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseExited(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mousePressed(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    @Override
    public void mouseReleased(MouseEvent arg0) {
        // TODO Auto-generated method stub

    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable(){
            public void run(){
                try{
                    MainFrame frame = new MainFrame();
                    frame.setVisible(true);
                }catch(Exception e){
                    e.printStackTrace();
                }
            }
        });
    }



}

项目总结

经过半个月的熬夜编码,我终于完成图书管理系统的设计与开发,达到了预期的目标。在开发的过程中过程中遇到不少困难,通过查阅相关资料,反复琢磨,请教同学,问题最终都得以解决。虽然系统的基本功能都已实现,但还是存在系统不稳定,操作提示操作不够友好等多个问题尚待解决。这个系统主要是我自己开发的,但也得到了老师和同学的很大帮助,在此对他们表示感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

计算机程序

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值