在windows的控制台实现贪吃蛇小游戏

欢迎来到博主的文章
博主id:代码小豪

前言:看懂这篇文章需要具有C语言基础,还要对单链表具有一定的理解。如果你只是想要试玩这个游戏,可以直接在文章末尾找到源码

由于实现贪吃蛇需要调用Win32 API函数,这些函数我会简单介绍,不涉及底层(主要是博主能力不够哈哈)。这篇文章的注意讲解在于贪吃蛇的算法

文章目录

    • 贪吃蛇的算法
      • 坐标
      • “蛇”的节点
      • 蛇的移动
      • 蛇的速度
      • 游戏呈现
    • 控制台指令
    • Win32api
      • 控制台光标
      • 键盘读取
    • 贪吃蛇源码
      • 头文件
      • 定义文件
      • 执行文件

贪吃蛇的算法

坐标

这是一个windows控制台,其中白色的点叫做光标。
在这里插入图片描述
如过想要控制台输出字符,字符就会出现在光标的位置。这些光标是可以通过坐标控制的,左上角的第一个坐标为(0,0),x轴向右,y轴向下。坐标点随轴依次递增。
如下:
在这里插入图片描述
假设现在有个光标在点(x,0)处,让光标的y值依次递增并输出字符’1’。呈现的效果是这样的
在这里插入图片描述
这个’1’像不像一个向下移动的贪吃蛇呢?

“蛇”的节点

我们将蛇身的坐标(x和y)作为数据项。通过链表的形式将蛇连接起来。

typedef int _pos;
typedef struct SnakeNode//蛇身的数据类型
{_pos x;//横坐标_pos y;//纵坐标struct SnakeNode* next;
}SnakeNode, * PSnakeNode;

贪吃蛇中的食物也要有相应的坐标,因此食物的数据类型也可以用上述的结构体类型。
在这里插入图片描述
每个节点(不论是蛇身还是食物)都有其对应的坐标,通过遍历整个链表,每访问一个节点,就在该节点对应的坐标(存储的x值,y值)打印相应的物体。

蛇的移动

蛇头作为参考点,根据玩家的方向控制,在相应的坐标处生成一个新的节点,使用头插法将新生成的节点插入蛇头的位置,并将末尾的节点释放掉。

以向下移动为例,在蛇头(x,y)向下的位置(x,y+1)的位置生成新的节点,并将末尾节点释放掉。
在这里插入图片描述

在这里插入图片描述

这样子就能做到蛇的“移动”。
在这里插入图片描述

蛇的速度

在移动的程序当中添加一个“时停”的函数,比如Sleep函数,当程序执行Sleep函数时会暂停指定的时间,然后继续执行其他操作

while (1){phead=SnakeMove(phead);Sleep(1000);}

这里的Sleep函数是库函数,定义在头文件<windows.h>

游戏呈现

这里给大家看看博主贪吃蛇实现如何

QQ录屏20240208220229

控制台指令

通过指令可以对控制台进行操作,比如输入指令“cls”可以清除当前控制台屏幕。

	system("cls");

执行这段代码时会清理控制台屏幕的当前信息

	system("pause");

暂停操作

	system("mode con cols=120 lines=30");

对控制台的窗口大小进行修改

	system("title 贪吃蛇");

修改标题

Win32api

贪吃蛇的算法已经讲解完,现在来介绍一下使用到的其他函数

控制台光标

我将操作控制台光标的程序封装成了一个函数,只需要输入坐标,控制台光标就会移动到该坐标上

void SetPos(int x, int y)//设置光标位置
{HANDLE cursorhandle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x,y };SetConsoleCursorPosition(cursorhandle, pos);
}

GetStdHanDle函数用来获取控制台的句柄
COORD:是WindowsAPI中定义的⼀个结构体,表⽰⼀个字符在控制台屏幕上的坐标
SetConsoleCursorPosition:设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置

这段代码的原理如下:
先获得控制台的句柄,在创建一个“坐标”的变量,然后使用函数将光标移动到指定坐标的位置

键盘读取

程序需要接收玩家的按键操作,此时需要用到一个读取虚拟键码的函数——GetAysncKeyState
在这里插入图片描述
将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态

如果返回的16位的short数据中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;
如果最低位被置为1则说明,该按键被按过,否则为0。
如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1

可以将这个函数做成一个宏,少些点代码

#define KEY_PRESS(vk) (GetAsyncKeyState(vk)&0x1?1:0)

比如判断是否按下s键,可以找到s键对应的虚拟键码
在这里插入图片描述

	if (KEY_PRESS(0x53)){printf("press s");}

这样子就会执行按下这个键后对应的操作

所有的键位对应的虚拟键码可以在这个网站上找到
虚拟键码

贪吃蛇源码

这里附上贪吃蛇的源代码,大家可以根据自己的思路设计自己的贪吃蛇游戏

贪吃蛇代码被博主用一个头文件,和两个源文件进行封装。其中头文件用来声明函数和数据类型,一个源文件用来定义函数类型,还有一个源文件用来测试案例。

头文件

#define _CRT_SECURE_NO_WARNINGS 1
#pragma once#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<locale.h>
#include<stdbool.h>
#include<assert.h>
#include<time.h>#define WALL L'□'//墙体模型
#define BODY L'●'//蛇身模型
#define FOOD L'★'//食物模型#define COLS 56 //地图长度
#define ROWS 25 //地图宽度#define ORIGIN_POS_X 24//初始x坐标
#define ORIGIN_POS_Y 5//初始y坐标
#define ORIGIN_NODE 5//初始蛇长#define KEY_PRESS(vk) (GetAsyncKeyState(vk)&0x1?1:0)
enum GAME_STATUS//游戏运行状态
{PLAY = 1,ESC,KILL_BY_WALL,KILL_BY_SELF
};enum DIRECTION//蛇的移动方向 
{UP = 1,DOWN,LEFT,RIGHT
};typedef int _pos;
typedef struct SnakeNode//蛇身的数据类型
{_pos x;//横坐标_pos y;//纵坐标struct SnakeNode* next;
}SnakeNode, * PSnakeNode;typedef struct Snake//记录游戏数据
{PSnakeNode snake;//蛇的当前位置PSnakeNode food;//食物的当前位置int score;//总分int foodwight;//单个食物得分int speed;//蛇的速度,由于Sleep函数的特性,这个值越大,蛇的速度越慢enum GAME_STATUS status;enum DIRECTION dir;
}snake, * psnake;void GameStart(psnake snake);//开始流程void CreateMap(void);//生成地图void GameMenu(void);//游戏菜单void CreateSnake(psnake psnake);//生成贪吃蛇void CreateFood(psnake psnake);//生成食物void GameRun(psnake psnake);//游戏流程void SnakeMove(psnake psnake);//移动操作bool NextIsFood(psnake psnake, PSnakeNode pnext);//得分判定void EatFoodSuccess(psnake psnake,PSnakeNode pnext);//成功吃到食物void EatFoodFail(psnake psnake, PSnakeNode pnext);//未成功吃到食物void KillBySelf(psnake psnake);//碰撞检测void KillByWall(psnake psnake);//检测是否撞墙void GameOver(psnake psnake);void SetPos(int x, int y);

定义文件

#include"snake.h"
void SetPos(int x, int y)//设置光标位置
{HANDLE cursorhandle = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x,y };SetConsoleCursorPosition(cursorhandle, pos);
}void GameMenu(void)
{setlocale(LC_ALL, "");//将语言环境设置为中文语言,方便宽字体打印SetPos(40, 15);printf("欢迎来到贪吃蛇小游戏");SetPos(40, 20);system("pause");system("cls");/*介绍游戏规则*/SetPos(20, 10);printf("用↑ ↓ ← →控制蛇吞掉食物,F3加速,F4减速");SetPos(20, 11);printf("速度越快,得分越高,不要碰到墙壁,也不要吃掉自己哦\n");SetPos(20, 12);system("pause");system("cls");
}void GameStart(psnake psnake)
{srand((unsigned int)time(NULL));system("mode con cols=120 lines=30");//如果地图扩大了,那么请将这里的指令也修改一下system("title 贪吃蛇");/*隐藏光标*/HANDLE cmd_handle = GetStdHandle(STD_OUTPUT_HANDLE);CONSOLE_CURSOR_INFO info = { 0 };GetConsoleCursorInfo(cmd_handle, &info);info.bVisible = false;SetConsoleCursorInfo(cmd_handle, &info);/*游戏主菜单*/GameMenu();/*生成地图*/CreateMap();/*生成贪吃蛇*/CreateSnake(psnake);/*创建食物*/CreateFood(psnake);/*函数结束*/
}void CreateMap(void)
{_pos i = 0;//生成地图上层SetPos(0, 0);for (i = 0; i <= COLS; i += 2)wprintf(L"%lc", WALL);//生成地图下层SetPos(0, ROWS);for (i = 0; i <= COLS; i += 2)wprintf(L"%lc", WALL);//生成地图左侧for (i = 1; i < ROWS; i++){SetPos(0, i);wprintf(L"%lc", WALL);}//生成地图右侧for (i = 1; i < ROWS; i++){SetPos(COLS, i);wprintf(L"%lc", WALL);}
}void CreateSnake(psnake psnake)
{int i = 0;PSnakeNode cur = NULL;//蛇头PSnakeNode snakehead = NULL;for (i = 0; i < ORIGIN_NODE; i++){cur = (PSnakeNode)malloc(sizeof(SnakeNode));assert(cur);cur->x = ORIGIN_POS_X + 2 * i;cur->y = ORIGIN_POS_Y;cur->next = NULL;//由于蛇身的数据结构是链表,因此用头插法将蛇的节点连接起来if (!snakehead) {snakehead = cur;}else {cur->next = snakehead;snakehead = cur;}}psnake->snake = snakehead;//将初始化好的数据记录在主游戏数据中/*根据数据在游戏中生成贪吃蛇*/cur = psnake->snake;while (cur){SetPos(cur->x, cur->y);wprintf(L"%lc", BODY);cur = cur->next;}/*初始化游戏中的所有数值*/psnake->dir = RIGHT;psnake->score = 0;psnake->speed = 200;psnake->foodwight = 10;psnake->status = PLAY;
}void CreateFood(psnake psnake)
{_pos x;_pos y;again:do {x = rand() % (COLS - 3) + 2;y = rand() % (ROWS - 1) + 1;} while (x % 2 != 0);/*检查生成食物的坐标是否合理*/PSnakeNode cur = psnake->snake;while (cur){if (cur->x == x && cur->y == y)goto again;cur = cur->next;}/*生成食物*/PSnakeNode pfood = (PSnakeNode)malloc(sizeof(SnakeNode));assert(pfood);pfood->x = x;pfood->y = y;SetPos(pfood->x, pfood->y);wprintf(L"%lc", FOOD);psnake->food = pfood;
}void Printmsg(void)
{SetPos(COLS + 10, 15);printf("不能撞墙,不能咬到自己");SetPos(COLS + 10, 16);printf("用↑ ↓ ← →控制蛇吞掉食物,F3加速,F4减速");SetPos(COLS + 10, 20);printf("关注代码小豪谢谢喵");
}void pause()
{SetPos(COLS + 10, ROWS - 1);printf("按空格继续");do{Sleep(100);if (KEY_PRESS(VK_SPACE))break;} while (1);SetPos(COLS + 10, ROWS - 1);printf("          ");
}
void GameRun(psnake psnake)
{/*游戏内信息*/Printmsg();//游戏运行逻辑do{//分数SetPos(COLS + 10, 10);printf("总分:%d", psnake->score);SetPos(COLS + 10, 11);printf("单个食物得分:%2d",psnake->foodwight);//检测按键if (KEY_PRESS(VK_UP) && psnake->dir != DOWN)psnake->dir = UP;if (KEY_PRESS(VK_DOWN) && psnake->dir != UP)psnake->dir = DOWN;if (KEY_PRESS(VK_LEFT) && psnake->dir != RIGHT)psnake->dir = LEFT;if (KEY_PRESS(VK_RIGHT) && psnake->dir != LEFT)psnake->dir = RIGHT;if (KEY_PRESS(VK_ESCAPE))psnake->status = ESC;//退出游戏if (KEY_PRESS(VK_SPACE)) //暂停游戏pause();if (KEY_PRESS(VK_F3))//加速{if (psnake->speed > 50){psnake->speed -= 30;psnake->foodwight += 2;}}if (KEY_PRESS(VK_F4))//减速{if (psnake->foodwight > 2){psnake->speed += 30;psnake->foodwight -= 2;}}Sleep(psnake->speed);//蛇的移动SnakeMove(psnake);} while (psnake->status == PLAY);
}void SnakeMove(psnake psnake)
{PSnakeNode pnext = (PSnakeNode)malloc(sizeof(SnakeNode));assert(pnext);pnext->next = NULL;switch (psnake->dir){case UP:pnext->x = psnake->snake->x;pnext->y = psnake->snake->y - 1;break;case DOWN:pnext->x = psnake->snake->x;pnext->y = psnake->snake->y + 1;break;case LEFT:pnext->x = psnake->snake->x-2;pnext->y = psnake->snake->y ;break;case RIGHT:pnext->x = psnake->snake->x+2;pnext->y = psnake->snake->y ;break;}/*判断该方向的坐标上是不是食物*/if (NextIsFood(psnake, pnext))//是食物就吃掉,并增加体型{EatFoodSuccess(psnake,pnext);//成功吃到食物}else{EatFoodFail(psnake,pnext);//未成功吃到食物}KillBySelf(psnake);KillByWall(psnake);
}bool NextIsFood(psnake psnake, PSnakeNode pnext)
{if (psnake->food->x == pnext->x && psnake->food->y == pnext->y)//判定成功return true;return false;//判定失败
}void EatFoodSuccess(psnake psnake, PSnakeNode pnext)
{/*增加体型*/pnext->next = psnake->snake;psnake->snake = pnext;/*在屏幕上生成蛇的新节点*/SetPos(pnext->x, pnext->y);psnake->score += psnake->foodwight;//加分free(psnake->food);CreateFood(psnake);
}void EatFoodFail(psnake psnake, PSnakeNode pnext)
{pnext->next = psnake->snake;psnake->snake = pnext;PSnakeNode cur = psnake->snake;while (cur->next->next)//找到尾结点{SetPos(cur->x, cur->y);cur = cur->next;wprintf(L"%lc", BODY);}SetPos(cur->next->x, cur->next->y);wprintf(" ");free(cur->next);cur->next = NULL;
}void KillBySelf(psnake psnake)//碰撞判定
{_pos x = psnake->snake->x;_pos y = psnake->snake->y;PSnakeNode cur = psnake->snake->next;while (cur){if (cur->x == x && cur->y == y)//如果蛇头碰到身体就算死亡{psnake->status = KILL_BY_SELF;return;}cur = cur->next;}
}void KillByWall(psnake psnake)
{_pos x = psnake->snake->x;_pos y = psnake->snake->y;if (x == 0 ||//判断贪吃蛇是否撞到墙x >= COLS ||y == 0 ||y >= ROWS)psnake->status = KILL_BY_WALL;
}void GameOver(psnake psnake)
{SetPos(30, 15);switch (psnake->status){case ESC:system("cls");printf("退出成功,感谢您的游玩");SetPos(0, ROWS+2);exit(EXIT_SUCCESS);break;case KILL_BY_SELF:printf("很抱歉,您被自己吃了");break;case KILL_BY_WALL:printf("很抱歉,您撞到墙了");break;}/*清空动态内存*/PSnakeNode cur = psnake->snake;PSnakeNode del = NULL;while (cur){del = cur;cur = cur->next;free(del);}free(psnake->food);psnake = NULL;
}

执行文件

#include"snake.h"void Test1(void)
{char ch = 0;do{snake snake = { 0 };GameStart(&snake);//初始化游戏GameRun(&snake);//游戏运行GameOver(&snake);//游戏结束SetPos(30, 15);printf("重新游玩?(输入Y):");ch = getchar();getchar();} while (ch == 'Y' || ch == 'y');system("cls");SetPos(30, 15);printf("退出成功,感谢您的游玩");SetPos(0, ROWS + 2);
}
int main()
{Test1();return 0;
}

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

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

相关文章

JVM 性能调优 - Java 虚拟机内存体系(1)

Java 虚拟机我们简称为 JVM&#xff08;Java Virtual Machine&#xff09;。 Java 虚拟机在执行 Java 程序的过程中&#xff0c;会管理几个不同的数据区域。如下图所示&#xff1a; 下面我会介绍这几个数据区的特点。 堆 堆区的几个特点&#xff1a; 线程共享。启动时创建堆…

滑块识别验证

滑块识别 1. 获取图片 测试网站&#xff1a;https://www.geetest.com/adaptive-captcha-demo 2. 点击滑块拼图并开始验证 # 1.打开首页 driver.get(https://www.geetest.com/adaptive-captcha-demo)# 2.点击【滑动拼图验证】 tag WebDriverWait(driver, 30, 0.5).until(la…

Spring Boot 整合 Redis 使用教程

作为开发者&#xff0c;相信大家都知道 Redis 的重要性。Redis 是使用 C 语言开发的一个高性能键值对数据库&#xff0c;是互联网技术领域使用最为广泛的存储中间件&#xff0c;它是「Remote Dictionary Service」的首字母缩写&#xff0c;也就是「远程字典服务」。 Redis 以超…

Mac电脑清空特别大型旧文件如何一键清理?

在我们的数字生活中&#xff0c;Mac电脑常常承载着大量个人资料和重要文件。但当我们决定把自己的Mac送给亲人或朋友使用时&#xff0c;面临的首要任务便是彻底且高效地清空所有个人数据&#xff0c;以保证隐私安全。传统的删除方法虽然简单&#xff0c;但往往不能彻底清除所有…

WebSocket+Http实现功能加成

WebSocketHttp实现功能加成 前言 首先&#xff0c;WebSocket和HTTP是两种不同的协议&#xff0c;它们在设计和用途上有一些显著的区别。以下是它们的主要特点和区别&#xff1a; HTTP (HyperText Transfer Protocol): 请求-响应模型&#xff1a; HTTP 是基于请求-响应模型的协…

VXLAN:虚拟化网络的强大引擎

1.什么是VXLAN VXLAN&#xff08;Virtual eXtensible Local Area Network&#xff0c;虚拟扩展局域网&#xff09;&#xff0c;是由IETF定义的NVO3&#xff08;Network Virtualization over Layer 3&#xff09;标准技术之一&#xff0c;是对传统VLAN协议的一种扩展。VXLAN的特…

嵌入式系统:挑战与机遇并存的领域

嵌入式系统&#xff1a;挑战与机遇并存的领域嵌入式系统是一个既具有挑战性又充满前景的领域。要成为一名合格的嵌入式系统工程师&#xff0c;需要经过大量的学习和实践。然而&#xff0c;进入这个领域时&#xff0c;刚入行可能会面临许多困境。让我们一起探讨一下嵌入式系统工…

JAVA反射总结学习

初始反射反射的基本操作反射安全性问题 反射是指在Java运行状态中: 给定一个类对象(Class对象)&#xff0c;通过反射获取这个类对象(Class对象)的所有成员结构&#xff1b; 给定一个具体的对象&#xff0c;能够动态地调用它的方法及对任意属性值进行获取和赋值&#xff1b; …

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测

多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测 目录 多维时序 | Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现RF-Adaboost随机森林结合Adaboost多变量时间序列预…

专业135+总400+中国科学院大学859国科大信号与系统考研经验电子信息与通信,真题,大纲,参考书

今年考研专业课859信号与系统135&#xff0c;总分400上岸国科大&#xff0c;总结一下自己这一年的复习经验&#xff0c;希望对后面报考中科院大学的同学有所帮助。 专业课&#xff1a; 国科大不同研究所都是统一命题&#xff0c;859信号与系统的参考书目是郑君里的《信号与系…

前后端通讯:前端调用后端接口的五种方式,优劣势和场景

Hi&#xff0c;我是贝格前端工场&#xff0c;专注前端开发8年了&#xff0c;前端始终绕不开的一个话题就是如何和后端交换数据&#xff08;通讯&#xff09;&#xff0c;本文先从最基础的通讯方式讲起。 一、什么是前后端通讯 前后端通讯&#xff08;Frontend-Backend Commun…

【十】【C++】string类的模拟实现

浅拷贝 浅拷贝&#xff08;Shallow Copy&#xff09;是对象复制的一种方式&#xff0c;其中复制对象的过程仅仅复制对象的值&#xff0c;而不复制引用所指向的实际对象或数据。这意味着原始对象和拷贝对象会共享相同的引用或指针指向的数据。 浅拷贝的特点&#xff1a; 共享…

中创ET4410 台式LCR数字电桥 简单开箱测评

最近买了一台LCR电桥&#xff0c;完善一下自己实验室的设备&#xff0c;选了中创ET4410&#xff0c;这款性价比高一点。 1199元在PDD买的&#xff0c;好像胜利的VC4090C也是找中创代工的。 ET4410介绍 本系列LCR数字电桥是采用自动平衡电桥原理设计的元件参数分析仪&#xf…

【Linux】学习-深入了解文件的读与写

深入了解语言级别(C语言)文件操作的"读"与"写" 在学习前&#xff0c;我们先要知道在Linux下的一个原则&#xff1a;一切皆是文件 如何理解呢&#xff1f;举个外设的例子&#xff0c;比如键盘和显示器&#xff0c;这两个外设也可以其实本质上也是文件&…

强敌环伺:金融业信息安全威胁分析——整体态势

从早期的Zeus和其他以银行为目标的特洛伊木马程序&#xff0c;到现在的大规模分布式拒绝服务&#xff08;DDoS&#xff09;攻击&#xff0c;再到新颖的钓鱼攻击和勒索软件&#xff0c;金融服务业已成为遭遇网络犯罪威胁最严重的行业之一。金融服务业的重要性不言而喻&#xff0…

[office] excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 #笔记#学习方法

excel如何计算毛重和皮重的时间间隔 excel计算毛重和皮重时间间隔方法 在日常工作中经常会到用excel&#xff0c;有时需要计算毛重和皮重的时间间隔&#xff0c;具体的计算方式是什么&#xff0c;一起来了解一下吧 在日常工作中经常会到用excel&#xff0c;在整理编辑过磅数据…

Debezium发布历史120

原文地址&#xff1a; https://debezium.io/blog/2022/04/07/read-only-incremental-snapshots/ 欢迎关注留言&#xff0c;我是收集整理小能手&#xff0c;工具翻译&#xff0c;仅供参考&#xff0c;笔芯笔芯. Read-only Incremental Snapshots for MySQL April 7, 2022 by K…

软件应用实例分享,电玩计时计费怎么算,佳易王PS5游戏计时器系统程序教程

软件应用实例分享&#xff0c;电玩计时计费怎么算&#xff0c;佳易王PS5游戏计时器系统程序教程 一、前言 以下软件教程以 佳易王电玩计时计费管理系统软件V17.9为例说明 软件文件下载可以点击最下方官网卡片——软件下载——试用版软件下载 点击开始计时后&#xff0c;图片…

k8s-资源限制与监控 15

资源限制 上传实验所需镜像 Kubernetes采用request和limit两种限制类型来对资源进行分配。 request(资源需求)&#xff1a;即运行Pod的节点必须满足运行Pod的最基本需求才能 运行Pod。 limit(资源限额)&#xff1a;即运行Pod期间&#xff0c;可能内存使用量会增加&#xff0…

泛娱乐社交出海洞察,Flat Ads解锁海外增长新思路

摘要:解读泛娱乐社交应用出海现状与趋势,解锁“掘金”泛娱乐社交出海赛道新思路。 根据全球舆情监测机构 Meltwater 和社交媒体机构We are Social最新发布数据显示,全球社交媒体活跃用户数量已突破50亿,约占世界人口总数62.5%。庞大的用户数量意味着广阔的增量空间,目前,随着全…