Java基础项目---飞机大战的简易实现

推荐阅读

智能化校园:深入探讨云端管理系统设计与实现(一)
智能化校园:深入探讨云端管理系统设计与实现(二)


文章目录

  • 推荐阅读
  • 前言
  • 一、系统分析
    • 问题描述
    • 总体设计
    • 功能流程图
  • 二、程序和算法的介绍
    • FlyingObject(本机和所有敌机父类)
    • Airplane(小敌机类)
    • Bee(小蜜蜂敌机类)
    • Bullet(子弹类)
    • Flying(本机类)
    • Enemy(敌机接口)和Award(奖励接口)
    • Game(总体框架实现类,主类)
  • 三、界面设计
    • 游戏界面设计


前言

Java基础知识学完后,大家可能都有过自己动手敲一个小游戏的想法吧,我自己之前也动手敲了一个常见的飞机大战小游戏,最近整理了一下之前的笔记,把我之前敲得代码的思路和逻辑等跟大家分享一下。

一、系统分析

问题描述

本程序是一个利用Java应用软件制作的飞机大战小游戏。在游戏过程中,用户通过鼠标的移动来控制飞机的运行方向,用鼠标点击控制游戏开始,鼠标移出界面表示暂停;鼠标移入继续进行游戏;程序运行窗口的右上角显示用户在游戏过程中所得的分数和飞机的生命值。当飞机生命值为0时游戏结束。本程序界面美观,随机奖励的设定增加了游戏的趣味性。

总体设计

本项目一共用了一个软件包shoot.Day01包,6个类分别为Airplane(小敌机类)Bee(小蜜蜂敌机类)Bullet(子弹类)Flying(本机类)FlyingObject(本机父类,所有敌机父类)Game(总体框架实现类,主类),2个接口 Award(奖励接口)Enemy(敌机接口)。

功能流程图

在这里插入图片描述

二、程序和算法的介绍

FlyingObject(本机和所有敌机父类)

定义了所有飞行物的长宽,坐标,以及共同的移动属性,是否出界标准等

package shoot.Day01;
import java.awt.image.BufferedImage;public abstract class FlyingObject{protected BufferedImage image;protected int width;protected int height;protected int x;protected int y;//共同的属性,行为protected abstract  void step();public abstract boolean outOfBounds();//判断子弹是否打中敌人,在一定区域范围就算打中。public boolean shootBy(Bullet bullet){int x1=this.x;int x2=this.x+this.width;int y1=this.y;int y2=this.y+this.height;int x= bullet.x;int y=bullet.y;return x>x1 &&x<x2 &&y>y1 &&y<y2;}
}

Airplane(小敌机类)

定义小敌机的属性,长宽,下落距离,随机产生小敌机,得分,判断是否出界等。

package shoot.Day01;
import java.util.Random;
public class Airplane extends FlyingObject implements Enemy{private int speed=3;//敌机的属性,长宽,下落距离,随机产生public Airplane(){image=Game.enemy;width=image.getWidth();height=image.getHeight();Random rand=new Random();x= rand.nextInt(Game.WIDTH-this.width);y=-this.height;}//得分public int getScore(){return 5;}//下落距离public void step(){y+=speed;}//判断是否出界public boolean outOfBounds(){return this.y>=Game.HEIGHT;}}

Bee(小蜜蜂敌机类)

定义了小蜜蜂移动的格数,奖励,获取奖励类型,判断是否出界等。

package shoot.Day01;
import java.util.Random;public class Bee extends FlyingObject implements Award{//设定小蜜蜂移动的格数,奖励private int xSpeed=1;private int ySpeed=2;private int awardType;//构造方法,自动调用public Bee(){image=Game.bee;//自动获取图片长宽width=image.getWidth();height=image.getHeight();Random rand=new Random();x= rand.nextInt(Game.WIDTH-this.width);y=-this.height;//奖励随机获取awardType= rand.nextInt(2);}//获取奖励类型public int getType(){return awardType;}//重写step方法public void step(){x+=xSpeed;y+=ySpeed;//判断小蜜蜂是否到达边界,并决定是否返回if (x>=Game.WIDTH-this.width){xSpeed=-1;}if (x<=0){xSpeed=1;}}//判断是否出界public boolean outOfBounds(){return this.y>=Game.HEIGHT;}
}

Bullet(子弹类)

定义了子弹基本的下落距离,子弹的移动方法,判断子弹是否出界等。

package shoot.Day01;import java.util.Random;public class Bullet extends FlyingObject{private int speed=3;//子弹构造方法,传参随本机public Bullet(int x,int y){image=Game.stack;width=image.getWidth();height=image.getHeight();this.x=x;this.y=y;}//子弹移动方法public void step(){y-=speed;}//判断子弹是否出界public boolean outOfBounds(){return this.y<=-this.height;}}

Flying(本机类)

定义了本机的基本属性,生命值,火力值,状态,以及射击的方法,随鼠标移动的方法,生命值火力值增加减少的方法,判断是否撞上飞行物的方法。

package shoot.Day01;
import java.awt.image.BufferedImage;
import java.util.Random;
public class Flying extends FlyingObject {//本机属性,生命值,火力,状态private int life;private int doubleFire;private BufferedImage[] images;private int index;//构造方法public Flying() {image = Game.benji;width = image.getWidth();height = image.getHeight();x = 150;y = 400;life = 3;doubleFire = 0;images = new BufferedImage[]{Game.benji, Game.benji1};index = 0;}//本机状态的切换public void step() {//控制两种图片变换时间index++;int a = index / 50;int b = a % 2;image = images[b];}//射击方法public Bullet[] shoot() {//出炮口位置int xStep = this.width / 8;int yStep = 30;//单倍火力和双倍火力切换条件if (doubleFire > 0) {Bullet[] bs = new Bullet[2];bs[0] = new Bullet(this.x + xStep, this.y - yStep);bs[1] = new Bullet(this.x + 3 * xStep, this.y - yStep);doubleFire -= 2;return bs;} else {Bullet[] bs = new Bullet[1];bs[0] = new Bullet(this.x + 2 * xStep, this.y - yStep);return bs;}}public void moveTo(int x, int y) {this.x = x - this.width/2;this.y = y - this.height/2;}//随鼠标移动,但也要重写该方法public boolean outOfBounds(){return false;}//生命值增加和减少public  void addLife(){life++;}public int getLife(){return life;}public void clearLife(){life--;}//火力值增加和减少public void addDoubleFire(){doubleFire+=40;}public  void clearDoubleFire(){doubleFire=0;}//判断是否撞上敌人,在一定范围就算撞上public boolean hit(FlyingObject object ){int x1= object.x-this.width/2;int x2=object.x+object.width+this.width/2;int y1=object.y-this.height/2;int y2=object.y+object.height+this.height/2;int x=this.x+this.width/2;int y=this.y+this.height/2;return x>x1&&x<x2&&y>y1&&y<y2;}
}

Enemy(敌机接口)和Award(奖励接口)

Enemy(敌机接口)

package shoot.Day01;
public interface Enemy {public int getScore();
}

Award(奖励接口)

package shoot.Day01;public interface Award {public int Double_File=0;public int LIFE=1;public int getType();
}

这两个接口没有设置太多的功能,大家可以根据自行需要去扩展。

Game(总体框架实现类,主类)

继承JPanel类,添加了图片,对各类进行初始化,并加入了计时器等操作。

package shoot.Day01;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import java.util.Random;
import java.util.Timer;
import java.util.TimerTask;
import java.util.Arrays;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.Color;
import java.awt.Font;/*** Game(总体框架实现类)主类* 继承JPanel类,添加了图片,对各类进行初始化,并加入了计时器等操作。* @author ioik*/
//主程序
public class Game extends JPanel {//设定界面长,宽public static final int WIDTH=400;public static final int HEIGHT=654;public static BufferedImage background;public static BufferedImage start;public static BufferedImage jixu;public static BufferedImage benji;public static BufferedImage benji1;public static BufferedImage end;public static BufferedImage bee;public static BufferedImage stack;public static BufferedImage enemy;//设定三种状态public static final int START=0;public static final int RUNNING=1;public static final int PAUSE=2;public static final int GAME_OVER=3;private int state=START;//创建本机对象,敌人数组,子弹数组private Flying myfly=new Flying();private FlyingObject[] flyings={};private Bullet[] bullets={};//文件流错误必须要异常处理static {try{//插入图片background=ImageIO.read(Game.class.getResource("black.png"));start=ImageIO.read(Game.class.getResource("start.png"));jixu=ImageIO.read(Game.class.getResource("jixuyouxi.png"));end=ImageIO.read(Game.class.getResource("gameover.png"));benji=ImageIO.read(Game.class.getResource("benji.png"));benji1=ImageIO.read(Game.class.getResource("benji1.png"));enemy=ImageIO.read(Game.class.getResource("enemy.png"));bee=ImageIO.read(Game.class.getResource("bee.png"));stack=ImageIO.read(Game.class.getResource("stack.png"));}catch(Exception e){//抛出异常e.printStackTrace();}}//随机数方法 随机产生敌人和小蜜蜂奖励public FlyingObject nextOne(){Random rand=new Random();int type= rand.nextInt(20);if (type<5){return new Bee();}else{return new Airplane();}}//进入函数(自动的)int flyEnteredTIndex=0;public void enterAction(){flyEnteredTIndex++;//400ms,调用敌人产生函数每0.4秒产生一次敌人if (flyEnteredTIndex%40==0){FlyingObject one=nextOne();//敌人数组扩容,接收新产生敌人,并赋值于最后一个位置flyings=Arrays.copyOf(flyings,flyings.length+1);flyings[flyings.length-1]=one;}}//敌人,子弹动起来public void stepAction(){//调用本机动起来函数myfly.step();//调用所有子弹,敌人动起来for (int i=0;i<flyings.length;i++){flyings[i].step();}for (int i=0;i<bullets.length;i++){bullets[i].step();}}//射击方法int shootIndex=0;public void shootAction(){shootIndex++;//控制射击频率if (shootIndex%30==0){//存储子弹Bullet[] bs=myfly.shoot();bullets=Arrays.copyOf(bullets,bullets.length+bs.length);//新产生的子弹放入数组System.arraycopy(bs,0,bullets,bullets.length-bs.length,bs.length);}}//确定是否越界public void outOfBoundsAction(){int index=0;//判断敌人对象是否越界FlyingObject[] flyingLives=new FlyingObject[flyings.length];for (int i=0;i<flyings.length;i++){FlyingObject f=flyings[i];//保留未出界对象,出界对象数组缩容除去if (!f.outOfBounds()){flyingLives[index]=f;index++;}}flyings=Arrays.copyOf(flyingLives,index);int j=0;//判断子弹是否出界Bullet[] ba=new Bullet[bullets.length];for (int i=0;i<bullets.length;i++){Bullet b=bullets[i];if (!b.outOfBounds()){ba[j]=b;j++;}}bullets=Arrays.copyOf(ba,j);}//子弹撞击public void bangAction(){for (int i=0;i<bullets.length;i++){Bullet b=bullets[i];bang(b);}}//子弹撞击方法int score=0;public void bang(Bullet b){int index=-1;for (int i=0;i<flyings.length;i++){FlyingObject f=flyings[i];//成功撞击的子弹if (f.shootBy(b)){index=i;break;}}//成功撞击的子弹确定撞击对象if (index!=-1){FlyingObject a=flyings[index];if (a instanceof Enemy ){//向上转型,如果是普通敌人对象就得分Enemy e=(Enemy) a;score+=e.getScore();}if (a instanceof Award){//如果是小蜜蜂对象,就判断得哪一种奖励,本机加火力值或者加生命值Award c=(Award) a;int type=c.getType();switch (type){case Award.Double_File:myfly.addDoubleFire();break;case Award.LIFE:myfly.addLife();break;}}//成功撞击的敌人需要除去,故进行数组缩容,除去被撞敌人FlyingObject t=flyings[index];flyings[index]=flyings[flyings.length-1];flyings[flyings.length-1]=t;flyings=Arrays.copyOf(flyings,flyings.length-1);}}//检查游戏是否结束public  void   checkGameOverAction(){if (isGameOver()){state=GAME_OVER;}}//判断游戏结束的条件public boolean isGameOver(){for (int i=0;i<flyings.length;i++){FlyingObject f=flyings[i];if (myfly.hit(f)){myfly.clearLife();myfly.clearDoubleFire();//撞击后的敌机消失,数组缩容FlyingObject t=flyings[i];flyings[i]=flyings[flyings.length-1];flyings[flyings.length-1]=t;flyings=Arrays.copyOf(flyings,flyings.length-1);}}return myfly.getLife() <=0;}//减少main函数的负担public void action(){//鼠标点击,运行状态下本机随着鼠标移动MouseAdapter  l=new MouseAdapter() {public void mouseMoved(MouseEvent e){if (state==RUNNING) {int x = e.getX();int y = e.getY();myfly.moveTo(x, y);}}public void mouseClicked(MouseEvent e){switch (state){//鼠标点击,开始游戏case START:state=RUNNING;break;//游戏结束后,敌人子弹消失,得分为0;再次点击,游戏重新开始case GAME_OVER:score=0;myfly=new Flying();flyings=new FlyingObject[0];bullets=new Bullet[0];state=START;break;}}//移出鼠标,游戏暂停public void mouseExited(MouseEvent e){if (state==RUNNING){state=PAUSE;}}//移入鼠标,游戏暂停public void mouseEntered(MouseEvent e){if (state==PAUSE){state=RUNNING;}}};this.addMouseListener(l);this.addMouseMotionListener(l);//添加计时器,并设定时间间隔为10毫秒Timer timer=new Timer();int intervel=10;timer.schedule(new TimerTask() {public void run() {if (state == RUNNING) {enterAction();stepAction();shootAction();outOfBoundsAction();bangAction();checkGameOverAction();}repaint();}}, intervel, intervel);}//画板,画背景,画敌机,画本机,画状态public void paint(Graphics g){g.drawImage(background,0,0,null);paintmyfly(g);paintBullets(g);paintFlyingObjects(g);paintSA(g);paintState(g);}//画本机public void paintmyfly(Graphics g){g.drawImage(myfly.image,myfly.x,myfly.y,null);}//画敌机,小蜜蜂,随机产生public void paintFlyingObjects(Graphics g){for (int i=0;i<flyings.length;i++){FlyingObject f=flyings[i];g.drawImage(f.image,f.x,f.y,null);}}//画子弹public void paintBullets(Graphics g){for (int i=0;i<bullets.length;i++){Bullet b=bullets[i];g.drawImage(b.image,b.x,b.y,null);}}public void paintSA(Graphics g){g.setColor(new Color(0xFF0000));g.setFont(new Font(Font.SANS_SERIF,Font.BOLD,24));g.drawString("SCORE:"+score,10,25);g.drawString("LIFE:"+myfly.getLife(),10,45);}public void paintState(Graphics g){switch (state){case START:g.drawImage(start,100,250,null);break;case PAUSE:g.drawImage(jixu,80,250,null);break;case GAME_OVER:g.drawImage(end,100,250,null);break;}}public static void main(String[] args){JFrame frame=new JFrame("Shooting");Game game=new Game();frame.add(game);frame.setSize(WIDTH,HEIGHT);frame.setAlwaysOnTop(true);frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setLocationRelativeTo(null);frame.setVisible(true);game.action();}}

三、界面设计

游戏界面设计

界面美观是用户游戏时,眼球的愉悦感和游戏的吸引力之一。
游戏界面:背景,本机,小敌机,小蜜蜂敌机

background=ImageIO.read(Game.class.getResource("black.png"));

将图片路径装在Game类中,,在游戏面板上,以此面板作为观察者用Graphics进行重画。
1.游戏面板进行时界面:
在这里插入图片描述
2.游戏进行界面
在这里插入图片描述
3. 游戏结束界面
在重画面板时进行判断若本机生命值为0,即弹出“Game Over”界面。
在这里插入图片描述
4. 分数显示栏,用标签和文本域实现,生命值初始为3。
在这里插入图片描述
到这一步,这个小游戏就基本上完成了,大家可以根据自己的需求去增加不同的功能哈。如果有啥问题,欢迎大家指出,谢谢大家。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/615286.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Open CASCADE学习|参数化球面的奇异性

参数曲面的奇异性是一个相对复杂的概念&#xff0c;它涉及到参数曲面的几何特性和参数化过程中的一些特殊情况。参数曲面通常用于描述三维空间中的复杂形状&#xff0c;通过参数方程将二维参数域映射到三维空间中。然而&#xff0c;在某些情况下&#xff0c;参数曲面可能会表现…

回顾2023,展望未来

回顾2023 重拾博客 CSDN博客创建和写作&#xff0c;几乎是和我正式开始学习编程开始&#xff0c;至今已经6年。刚上编程课的时候&#xff0c;刚上C语言课的时候&#xff0c;老师说可以通过写技术博客来帮助自己更好学习&#xff0c;于是我就开始自己的技术博客编写之旅。 我…

在微信上秒杀链接怎么做_带给用户微信秒杀新体验

微信秒杀新体验&#xff1a;让每一次点击都成为一次抢购的狂欢&#xff01; 在这个数字化、信息化的时代&#xff0c;微信已经成为了我们生活中不可或缺的一部分。与此同时&#xff0c;微信营销也成为了众多商家竞相角逐的新战场。如何在众多的营销信息中脱颖而出&#xff0c;吸…

持续构建行业影响力|HarmonyOS SDK荣膺年度“技术卓越”奖项

自2023年9月华为宣布鸿蒙原生应用全面启动以来&#xff0c;HarmonyOS SDK通过将HarmonyOS系统级能力对外开放&#xff0c;支撑开发者高效打造更纯净、更智能、更精致、更易用的鸿蒙原生应用&#xff0c;和开发者共同成长。 通过在开发者社区和HarmonyOS开发者持续的内容共创与技…

Leetcode 494 目标和

题意理解&#xff1a; 给你一个非负整数数组 nums 和一个整数 target 。 向数组中的每个整数前添加 或 - &#xff0c;然后串联起所有整数&#xff0c;可以构造一个 表达式 &#xff1a; 例如&#xff0c;nums [2, 1] &#xff0c;可以在 2 之前添加 &#xff0c;在 1 之前添…

Curl命令POST请求

curl工具介绍&#xff1a; CURL是一个利用URL语法在命令行下工作的文件传输工具&#xff0c;被广泛应用在Unix、Linux发行版中&#xff0c;并且有DOS和Win32、Win64的移植版本。同时它还支持诸多的通信协议&#xff08;我们常用的有HTTP、HTTPS、FTP、SMTP、TELNET等&#xff0…

网站ICP备案和公安备案教程

由于最近华为云那边的服务器到期了&#xff0c;而续费的价格比较贵一点&#xff0c;刚好阿里云这边有活动就入手了一台&#xff0c;但是将网站迁移过来后发现又要进行ICP备案&#xff0c;那就备案呗。但是备案完成之后发现还有一个公安备案&#xff0c;真让人头大啊... 很多人也…

vue3dLoader Cannot read properties of null (reading ‘setCrossOrigin‘)“这个报错怎么解决?

默认情况下crossOrigin默认值是“anonymous” 如果出现报错的情况 请设置crossOrigin为空字符串即可。如&#xff1a; <vue3dLoader crossOrigin""> 相关阅读 推荐&#xff1a;vue-3d-loader支持.dae/.fbx/.gltf/.glb/.obj/.ply/.stl/.json&#xff0c;并支…

Java基础到高级:锁的全面解析与实践

前言 在项目开发过程中&#xff0c;当需要使用多线程去处理一些业务问题的时候&#xff0c;尤其涉及到多线程读写数据同时发生的操作时&#xff0c;就会产生一些线程安全的问题。那如何理解线程安全问题呢&#xff1f; 线程安全问题是指多线程环境中&#xff0c;由于存在数据…

Python入门-面向对象

1.类和对象 是不是很熟悉&#xff1f;和Java一样&#xff0c;在Python中&#xff0c;都可以把万物看成(封装成)对象。它俩都是面向对象编程 1.1 查看对象数据类型 a 10 b 9.8 c helloprint(type(a)) print(type(b)) print(type(c))运行结果&#xff1a; D:\Python_Home\v…

k8s-调度 13

调度器通过 kubernetes 的 watch 机制来发现集群中新创建且尚未被调度到 Node 上的 Pod。调度器会将发现的每一个未调度的 Pod 调度到一个合适的 Node 上来运行。 kube-scheduler 是 Kubernetes 集群的默认调度器&#xff0c;并且是集群控制面的一部分。 如果你真的希望或者有…

C#上位机与欧姆龙PLC的通信11----【爆肝】上位机应用开发(Winform版)

1、先上图 前面10讲&#xff0c;让你爽煹了肝&#xff0c;已经进入最后收尾阶段&#xff0c;这节来个常规应用&#xff0c;让前面的技能直接飞上天&#xff0c;我们要做的界面软件是这样的&#xff0c;虽然没有潘金莲漂亮&#xff0c;但也是爆抱&#xff1a; 2、如何爆&#x…

爬虫到底违法吗?你离违法还有多远?

最近&#xff0c;国家依法查处了部分编写爬虫程序&#xff0c;盗取其他公司数据的不良企业。一时间风声鹤唳&#xff0c;关于爬虫程序是否违法的讨论遍布程序员圈子。那么到底编写爬虫程序是否违法呢&#xff1f; 其爬虫下载数据&#xff0c;一般而言都不违法&#xff0c;因为…

【机器学习】模型调参工具:Hyperopt 使用指南

机器学习| 模型调参工具&#xff1a;Hyperopt 使用指南 前言1. Hyperopt是什么&#xff1f;2. Hyperopt的优缺点3. 如何使用 Hyperopt 进行调参3.1 安装 Hyperopt3.2 构建超参数空间3.3 定义目标函数3.4 运行 Hyperopt 优化3.5 获取最优超参数 4. XGB调参代码示例参考资料 前言…

Hyperledger Fabric Docker 方式多机部署生产网络

规划网络拓扑 3 个 orderer 节点&#xff1b;组织 org1 , org1 下有两个 peer 节点&#xff0c; peer0 和 peer1; 组织 org2 , org2 下有两个 peer 节点&#xff0c; peer0 和 peer1; 因为我只有 3 台虚拟机资源所以没法实现完全的多机部署&#xff0c;资源使用规划如下&#…

智能分析网关V4方案:太阳能+4G+AI识别搭建智慧果园/种植园远程视频监控监管方案

一、方案背景 我国是水果生产大国&#xff0c;果园种植面积大、产量高。由于果园的位置大都相对偏远、面积较大、看守人员较少&#xff0c;值守的工作人员无法顾及园区每个角落&#xff0c;果园财产安全成为了关注的重点。人为偷盗、野生生物偷吃等事件时有发生&#xff0c;并…

磷酸铁锂电池生产污废水需要哪些工艺及设备

磷酸铁锂电池作为一种常见的锂离子电池&#xff0c;已广泛应用于电动汽车、储能系统等领域。然而&#xff0c;在磷酸铁锂电池的生产过程中&#xff0c;难免会产生一定量的污废水。为了有效处理和处理这些污废水&#xff0c;我们需要合适的工艺和设备。 首先&#xff0c;针对磷酸…

制造业卓越管理从6S管理开始

在当今制造业环境中&#xff0c;企业间的竞争愈发激烈&#xff0c;而管理水平的卓越与否&#xff0c;直接决定了企业在市场竞争中的地位和成功与否。管理并非一蹴而就&#xff0c;需要经过不断的实践和探索&#xff0c;逐步提升。其中&#xff0c;6S管理作为现代企业管理的基础…

Ubuntu 卸载重装 Nvidia 显卡驱动

问题描述 我使用 airsim 的时候&#xff0c;发现 UE4 没法使用显卡&#xff0c;导致非常卡顿 输入 nvidia-smi 有显卡型号等信息的输出&#xff0c;但是进程 process 里面没有显示 airsim 和其他软件占用显卡情况 因此&#xff0c;我选择了卸载重装 一.卸载旧版本的驱动 …

内容分发功能升级!一站式搞定文案生成/违规检测/一键分发全流程

随着社交媒体的不断发展&#xff0c;越来越多的企业开始布局新媒体矩阵&#xff0c;从集团总部到区域门店、个人销售&#xff0c;从全品类到细分垂直类目、从单一平台到多平台&#xff0c;试图让品牌影响力覆盖更广泛群体&#xff0c; 当然&#xff0c;随之而来的&#xff0c;如…