Java游戏开发——开心农场

article/2025/11/11 7:12:04

游戏介绍:

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

使用素材文件夹:

素材以及完整源码链接:https://pan.baidu.com/s/1p1rXX1VlB21RnLfHEAStCg 提取码: gszw

游戏设计的思路:

使用一个带背景的面板作为游戏面板,图片里有九块可种植的土地,每块土地对应的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类对象用来存储一块土地的状态和最后一次操作时间(例如播种),包含该块土地相关的播种、生长、开花、结果、收获操作;state==0时未播种,state==1时已播种,state==2时生长中,state==3时开花中,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;}}

1.4设计游戏窗口MainFrame类:

编写一个继承自JFrame类的MainFrame窗体类,用于完成播种、生长、开花、结果、收获等操作。

GROWTIME常量表示1分钟的生长期毫秒数,BLOOMTIME和FRUITTIME表示2分钟的开花期毫秒数和3分钟的落果期毫秒数,fruitNumber记录仓库果实数量,farms对应9块土地,crops对应9块土地上的作物图片,isInDiamond()方法用于判断鼠标点击的是哪块土地,saveNowState()方法用于存储当前游戏数据,readNowState()方法用于读取历史游戏数据并转换成当前时间对应的游戏数据,线程每秒执行一次存储游戏和读取游戏的操作。

详细说明:

判断鼠标选定的是哪块土地

在这里土地是菱形土地,所以需要判断点在哪块菱形土地上,经测量,菱形土地宽width160px,高height65px;先让鼠标点击点依次尝试位移九块土地的中心点(点击处坐标-每个菱形中心坐标=点击处相对于每个菱形中心的坐标x,y),

如果|x*width|+|y*height|<=width*height*0.5,说明点击处位于该块菱形土地内,否则位于该块土地外。

详细证明过程参考:https://blog.csdn.net/hany3000/article/details/11265499

如果每块土地都判断过一次相对点是否在菱形上,并且点击处都不在其上,说明没有选中可种植土地。

②种植信息的保存

这里使用文本IO的形式进行保存,存储格式是

第一块土地上的种植状态,第一块土地最后一次操作时间;第二块土地种植状态,第二块土地最后一次操作时间;......第九块土地种植状态,第九块土地最后一次操作时间&当前仓库果实数

③种植信息的读取

先读取文本字符串str,使用str.split("&")将文本分割成两段,第一段array1[0]表示9块土地相关信息,第二段array1[1]表示当前仓库果实数量;对array1[0]进行细分,array1[0].split(";")得到每块土地的种植信息和最后一次操作时间拼接得到的字符串array2数组;再对array2[i]进行细分,array2[i].split(",")得到help数组,help[0]表示土地种植状态,help[1]表示土地最后一次操作时间。

④作物状态的转换

      每块土地的最后一次操作时间是使用Date对象存储的,上面获取到了每块土地的种植状态和最后一次操作时间,那么可以先使用new Date()获取当前时间,根据当前时间的长整型的毫秒数和最后一次操作时间长整型的毫秒数相减,得到中间相差了subTime毫秒。

创建temp变量暂存变化时间;

如果种植状态是已播种,判断subTime是否大于生长期GROWTIME,如果大于说明现在可以进入到下一阶段,subTime-=GROWTIME,emp+=GROWTIME,并且种植状态改为已生长。

接着如果当前种植状态是已生长,判断subTime是否大于开花期BLOOMTIME,如果大于说明现在可以进入到下一阶段,subTime-=BLOOMTIME,temp+=BLOOMTIME,并且种植时间改为已开花。

再如果当前种植状态是已开花,判断subTime是否大于落果期FRUITTIME,如果大于说明现在可以进入到下一阶段,subTime-=FRUITTIME,temp+=FRUITTIME,并且种植时间改为已结果。

      最后判断当前种植状态是什么,将最后一次操作时间+=temp得到新的最后一次操作时间,然后将当前土地对应的作物的图片进行修改,便得到了最新的农场状态。

⑤自动更新游戏数据

创建线程,线程开始时先休眠1000毫秒,再保存游戏数据,读取游戏数据(读取历史游戏数据和更新游戏状态是在同一个方法里做到的);休眠1000毫秒......依次循环

这样可以确保每秒都能及时保存游戏数据,并且保证当前农场状态的正确性。

MainFrame类完整代码:

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("D:/Game/FarmGame/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("D:/Game/FarmGame/播种1.png"));//移动到图标上显示的图片button_1.setBorderPainted(false);button_1.setContentAreaFilled(false);button_1.setIcon(new ImageIcon("D:/Game/FarmGame/播种.png"));//正常显示图片button_1.addActionListener(new ActionListener(){@Overridepublic void actionPerformed(ActionEvent e) {if(farm == null)//如果没有先选中土地return ;String message = farm.seed(crop, "D:/Game/FarmGame/seed.png");if(!message.equals("")){JOptionPane.showMessageDialog(null, message);}}			});		button_1.setBounds(140,477,56,56);//29, 185, 56, 56backgroundPanel.add(button_1);final JButton button_2 = new JButton();//生长button_2.setContentAreaFilled(false);button_2.setBorderPainted(false);button_2.setRolloverIcon(new ImageIcon("D:/Game/FarmGame/生长1.png"));button_2.setIcon(new ImageIcon("D:/Game/FarmGame/生长.png"));button_2.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if(farm == null)//如果没有先选中土地return ;String message = farm.grow(crop, "D:/Game/FarmGame/grow.png");if(!message.equals("")){JOptionPane.showMessageDialog(null, message);}}});backgroundPanel.add(button_2);button_2.setBounds(280,477,56,56);//114,185,56,56final JButton button_3 = new JButton();button_3.setContentAreaFilled(false);button_3.setBorderPainted(false);button_3.setRolloverIcon(new ImageIcon("D:/Game/FarmGame/开花1.png"));button_3.setIcon(new ImageIcon("D:/Game/FarmGame/开花.png"));button_3.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if(farm == null)//如果没有先选中土地return ;String message = farm.bloom(crop, "D:/Game/FarmGame/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("D:/Game/FarmGame/结果1.png"));button_4.setIcon(new ImageIcon("D:/Game/FarmGame/结果.png"));button_4.addActionListener(new ActionListener() {@Overridepublic void actionPerformed(ActionEvent e) {if(farm == null)//如果没有先选中土地return ;String message = farm.fruit(crop,"D:/Game/FarmGame/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("D:/Game/FarmGame/收获1.png"));button_5.setIcon(new ImageIcon("D:/Game/FarmGame/收获.png"));button_5.addActionListener(new ActionListener() {@Overridepublic 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,56new 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();//更新现在状态}@Overridepublic void mouseClicked(MouseEvent e) {// TODO Auto-generated method stubint 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("D:/Game/FarmGame/seed.png");break;case 2:farms[i].state = 2;farms[i].lastTime = new Date(lastTime.getTime()+temp);crops[i].setIcon("D:/Game/FarmGame/grow.png");break;case 3:farms[i].state = 3;farms[i].lastTime = new Date(lastTime.getTime()+temp);crops[i].setIcon("D:/Game/FarmGame/bloom.png");break;case 4:farms[i].state = 4;farms[i].lastTime = new Date(lastTime.getTime()+temp);crops[i].setIcon("D:/Game/FarmGame/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 blocke.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]+";");elsesb.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 blocke.printStackTrace();}finally{try {if(fos!=null)fos.close();if(dos!=null)dos.close();				} catch (IOException e) {// TODO Auto-generated catch blocke.printStackTrace();}}}@Overridepublic void run() {try {while(true){Thread.sleep(1000);saveNowState();readNowState();}} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Overridepublic void mouseEntered(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mouseExited(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic void mousePressed(MouseEvent arg0) {// TODO Auto-generated method stub}@Overridepublic 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();}}});}}

游戏代码已经贴完了,虽说游戏功能较弱,但是基本的作物定时生长,种植信息的保存和读取,已经实现了。

后续可能会通过微信小程序的形式对该游戏进行完整的制作(如果毕设老师同意该命题的话^_^),敬请期待(#^.^#)。


http://chatgpt.dhexx.cn/article/5uEOSLW4.shtml

相关文章

qq农场 html5,登陆qq农场 QQ浏览器怎么登陆QQ农场

首先打开手机QQ程序&#xff0c;在QQ主页面中点击右下角的“动态”选项。 进入“动态”页面后点击其中的“好友动态”选项。 然后在打开的“好友动态”页面中点击页面上方的“小游戏”选项。 打开“小游戏”界面后即可在页面中看到“QQ农潮。 qq农场进不去的处理方法一&#xf…

基于java-swing的开心农场游戏

目的 本方案为java面向对象部分的综合评测&#xff0c;本项目是对JAVA GUI API的综合实训。 项目描述 该项目是对qq农场做出的简单的小案例。 1、播种种子 2、种子生长 3、种子开花 4、种子结果 5、收获种子 项目要求 使用JAVA SWING 或者 AWT 包下的API类实现该项目&am…

linux渲染农场大连教程,Deadline 渲染农场搭建记录

渲染农场的工作模式:多台机器组建集群进行渲染,比如:集群中有2台渲染机器A和B,服务器会同时分配给A和B任务,A渲染第一帧,B渲染第二帧,当A完成那么服务器会继续分配第三帧,同样B服务器完成以后服务器分配第四帧,以此类推。 渲染农场分服务端和节点,服务器端也可以加入集…

c++农场主均分土地为方块

题目背景&#xff1a;假设你是一个农场主&#xff0c;有一块小土地&#xff0c;1680*640那么大&#xff0c;你要将这块土地均匀的分成方块&#xff0c;要使分出的方块足够大&#xff0c;应该怎么分&#xff1f; 样例输入&#xff1a; 1680 640 样例输出&#xff1a; 80 一个…

爆肝一周,用Python在物联网设备上写了个智能语音助手-阿里云智能对话机器人

基于HaaS云端一体框架&#xff0c;用Python打造HaaS EDU K1智能语音助手的过程中需要用到云端能力。本篇文章介绍如何开通智能对话机器人&#xff0c;并通过实际案例演示如何为机器人配置知识库并进行发布。请参考《爆肝一周&#xff0c;用Python在物联网设备上写了个智能语音助…

智能客服机器人:基于知识图谱的多轮对话系统

━━━━ 近年来&#xff0c;随着人工智能的快速发展&#xff0c;人机交互能力不断增强&#xff0c;其中问答技术能够在保证一定准确度的情况下极大地简化用户的搜索操作&#xff0c;在节约时间的同时&#xff0c;还能够加深用户对搜索事物的了解程度&#xff0c;百度公司的小…

【人机对话】对话机器人技术简介:问答系统、对话系统与聊天机器人

点击上方&#xff0c;选择星标或置顶&#xff0c;每天给你送干货&#xff01; 阅读大概需要16分钟 跟随小博主&#xff0c;每天进步一丢丢 来自&#xff1a;AI算法之心 作者&#xff1a;段清华个人主页&#xff1a;http://qhduan.comGithub链接: https://github.com/qhduan/ 原…

数据可视化工具是什么

智能手机的普及&#xff0c;互联网使用的增长&#xff0c;机器学习的快速发展&#xff0c;以及云计算技术和物联网的不断采用&#xff0c;都在推动全球数据可视化市场。此外&#xff0c;对智能工厂的日益倾向&#xff0c;以及视觉分析、信息可视化和科学可视化在小型和大型组织…

如何进行数据可视化图表设计?

如何进行数据可视化图表设计&#xff1f; 对数据人来说&#xff0c;数据可视化是分析理解数据&#xff0c;并最终呈现数据的必修课。本文从以下几个点来说明&#xff0c;如何进行数据可视化图表设计。1、数据背后的故事2、充分理解数据3、多种图表类型设计指南 1数据背后的故…

优秀的数据可视化,原来是这样做的!

大数据时代&#xff0c;数据驱动决策。处理不好庞大、复杂的数据&#xff0c;其价值将大打折扣。 可以想象一本没有图片的教科书。没有图表、图形或是带有箭头和标签的插图或流程图&#xff0c;那么这门学科将变得更加难以理解。人类天生就是视觉动物&#xff0c;而视觉效果对于…

数据可视化是什么,数据可视化怎么做最好?

数据可视化都有一个共同的目的&#xff0c;那就是准确而高效、精简而全面地传递信息和知识。可视化能将不可见的数据现象转化为可见的图形符号&#xff0c;能将错综复杂、看起来没法解释和关联的数据&#xff0c;建立起联系和关联&#xff0c;发现规律和特征&#xff0c;获得更…

如何完美实现数据可视化?

为什么要可视化数据? 在工作中&#xff0c;无论你在哪个场景&#xff0c;你都会接触到数据&#xff0c;需要表达出来。数据可视化的作用是通过结合图表和数据来更好地传达业务信息。目前&#xff0c;大多数公司正在逐步从传统的流程管理过渡到基于数据的管理。数据可视化可以…

程序员如何轻松实现数据可视化?

这里以Web前端为例&#xff0c;简单介绍一下程序员是如何实现前端数据可视化的&#xff0c;主要内容如下&#xff1a; Highcharts.js 这是一个纯粹的JavaScript可视化库&#xff0c;完美支持移动端&#xff0c;可以快速的为Web网站添加具有交互性的图表&#xff08;包括曲线图…

好看的数据可视化图片是怎样做的?

好看的数据可视化图片是怎么样做的&#xff1f;这里我将介绍如下几个知识点&#xff0c;相信掌握如下数据可视化技巧和知识&#xff0c;一定可以让你的图表焕然一新&#xff0c;令人眼前一亮~ 图表制作规范&#xff1a;图表选取&#xff0c;突出显示重点数据&#xff0c;消除图…

同一个ip,不同端口号,session失效

背景 我有两个工程projectA、projectB&#xff0c;projectA放在TomcatA中&#xff0c;projectB放在TomcatB中&#xff0c;TomcatA、TomcatB在一台server上。 工程都映射的根路径&#xff0c;不用project名字就可以访问&#xff0c;如下 http://ip1:7777/ http://ip1:8080/ …

用Python做【游玩攻略】之上海四日游,假期旅游不用愁啦~

导语&#xff1a; 哈喽铁汁们~这不马上元旦吗小假期有准备来个短期旅行(疫情期间还是注意安全尽量不出门&#xff09;却还没做游玩攻略的友友们这期可不能错过了噢~ 这期呢我们就先“去一趟”上海吧~ ​​ 人们通常戏称上海为魔都。那么上海魔在哪里呢&#xff1f;这里的魔主…

包学习(一款安卓端小学到高中全部课程精讲APP)

简介 【包学习】是一款拥有小学至高中九个学年的全套学习资料的APP&#xff0c;名校名师重点、难点精讲 软件简单介绍 软件分为首页、必刷课、动态教辅、在学、我的五大模块。 进入软件会让你选择对应的年级&#xff0c;小编这里就以高三年级课程给大家截图演示&#xff0…

学堂在线课程字幕下载

事情起因 学堂在线 工程伦理课程 在线学习,没有课件, 考试的时候可能会不方便,做一解决此类问题 字幕下载 合成为Txt 文件或者word 文件以供学习使用 事情经过 首先想到的是自己写一个爬虫 怕区相应的字幕, 发现是文本形式存储和, 很好做, 但是涉及到登录的cookie信息, 暂时…

课堂派资料PDF文件下载

课堂派资料PDF文件下载 前排提示&#xff0c;本文没有什么技术含量&#xff0c;大佬轻喷 因为暂时要上网课&#xff0c;但是年前走得着急其实是懒 &#xff0c;课本没有带回来&#xff0c;所幸有的老师会发一些课本、习题的PDF到课堂派的“资料”里。但是有的时候会限制不让下…

Python程序开发案例教程PDF,python程序开发案例教程

大家好&#xff0c;本文将围绕Python程序开发案例教程黑马程序员电子版书展开说明&#xff0c;Python程序开发案例教程黑马课后答案是一个很多人都想弄明白的事情&#xff0c;想搞清楚Python程序开发案例教程pdf黑马程序员需要先了解以下几个事情。 1、python软件开发的案例有哪…