超详细实现【贪吃蛇】(1)

目录

技术要点介绍

🙂Win32 API

🙂控制台程序

🎇标题

🎇大小

在Windows终端上:

在VS上:

🎇坐标

🙂光标

😶‍🌫️GetStdHandle

😶‍🌫️GetConsoleCursorInfo

CONSOLE_CURSOR_INFO

😶‍🌫️SetConsoleCursorInfo

😶‍🌫️SetConsoleCursorPosition

🎇光标隐藏

🎇光标定位

🙂按键情况设置

🙂□●★宽字节

本地化

类项

🎇setlocale函数

🎇宽字符的打印

🙂控制台坐标特点

贪吃蛇游戏设计与分析

☁围墙设计

☁蛇身和食物设计

☁游戏规则设计

☁游戏流程设计


这周来实现【贪吃蛇小游戏】。贪吃蛇是久负盛名的游戏,它也和俄罗斯⽅块,扫雷等游戏位列经典游戏的⾏列。我们实现贪吃蛇小游戏需要的知识有:C语⾔、数据结构(链表)、枚举、结构体、动态内存管理、预处理指令、win32API

技术要点介绍

🙂Win32 API

 本次实现贪吃蛇会使⽤到的⼀些Win32?API知识,那么就学习⼀下。什么是Win32 API?

Windows 这个多作业(完成某个任务)系统除了协调应⽤程序的执⾏、分配内存、管理资源之外,它同时也是⼀个很⼤的服务中⼼,调⽤这个服务中⼼的各种服务(每⼀种服务就是⼀个函数),可以帮应⽤程式达到开启视窗、描绘图形、使⽤周边设备等⽬的,由于这些函数服务的对象是应⽤程序(Application),所以便称之为 Application Programming Interface,简称API函数WIN32API 也就是MicrosoftWindows32位平台的应⽤程序编程接⼝

每一种操作系统在完成正常的操作系统该有的功能,如果文件管理,内存管理等等。还提供了一些接口(函数),这些接口提供给程序员自己调用,能够实现一些自己想要的功能。这些接口被称为AIP函数。以Windows为例子,这些接口统一叫:win32API

🙂控制台程序

平常我们运⾏起来的⿊框程序其实就是控制台程序。在Windows中,cmd的程序这个就是控制台程序,也就是终端(在Linux当中我们常称为终端)

所以对于VS的控制台的设置,即便VS是命令提示符形式,我们也可以使用操作系统的系统命令在VS上实现。当然VS上使用控制台的命令,必须还要包含C语言头库函数,以及库函数的头文件。 

🎇标题

使⽤cmd命令来设置控制台窗⼝的⻓宽:设置控制台窗⼝的⼤⼩,30⾏,100列

mode:mode | Microsoft Learn 

mode con cols=100 lines=30 

🎇大小

通过cmd命令设置控制台窗⼝的名字:

title 贪吃蛇 
在Windows终端上:

在VS上:
  • 包含C语言库函数头文件stdlib.h  
  • 使用C语言库函数函数才能使用系统命令
#include<stdio.h>
#include<stdlib.h>
int main()
{system("mode con cols=100 lines=30");system("title 贪吃蛇游戏");return 0;
}

🎇坐标

COORD 是WindowsAPI中定义的⼀种结构,表⽰⼀个字符在控制台屏幕上的坐标。通过COORD就可以在控制台上坐标定位。

COORD类型的声明: 

typedef struct _COORD {SHORT X;SHORT Y;
} COORD, *PCOORD;

 COORD的使用(给坐标赋值):

COORD pos = { 10, 15 }; 

 同样在VS上使用,我们需要头文件windows.h

#include<stdio.h>
#include<windows.h>
int main()
{COORD pos = { 3,5 };return 0;
}

🙂光标

我们获取了控制台上某个坐标。但是我们怎样去那个坐标打印数据。

  • 首先我们需要获取控制台设备的信息。
  • 其次我们是用光标来打印数据,我们需要获取相关控制台设备上的光标信息
  • 接着我们可以修改光标的欣喜(大小,可见度)
  • 最后修改完光标信息,我们需要将光标设置在我们想要的位置上

😶‍🌫️GetStdHandle

GetStdHandle是⼀个Windows API函数。它⽤于从⼀个特定的标准设备(标准输⼊、标准输出或标准错误)中取得⼀个句柄(⽤来标识不同设备的数值),使⽤这个句柄可以操作设备。 

GetStdHandle 函数 - Windows Console | Microsoft Learn

HANDLE GetStdHandle(DWORD nStdHandle); 
//传入参数是:标准输入/输出/错误设备
//返回的是这个设备的句柄 == 就是这个设备的指针(找到这个设备)
HANDLE hOutput = NULL;//定义一个句柄
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);

😶‍🌫️GetConsoleCursorInfo

检索有关指定控制台屏幕缓冲区的光标⼤⼩和可⻅性的信息

GetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn

 函数原型:

BOOL WINAPI GetConsoleCursorInfo(HANDLE hConsoleOutput,PCONSOLE_CURSOR_INFO lpConsoleCursorInfo
);
//内部被封装成了一个结构体
PCONSOLE_CURSOR_INFO是指向 CONSOLE_CURSOR_INFO 结构的指针, 该结构接收有关主机游标(光标)的信息

光标的信息:

typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;

获取光标信息:

HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//获得句柄
CONSOLE_CURSOR_INFO CursorInfo;//定义一个光标结构体了类型的变量
GetConsoleCursorInfo(hOutput, &CursorInfo); //获取控制台光标信息

CONSOLE_CURSOR_INFO

这个结构体,包含有关控制台游标的信息

typedef struct _CONSOLE_CURSOR_INFO {DWORD dwSize;BOOL bVisible;
} CONSOLE_CURSOR_INFO, *PCONSOLE_CURSOR_INFO;
  • dwSize,由光标填充的字符单元格的百分⽐。此值介于1到100之间。光标外观会变化,范围从完全填充单元格到单元底部的⽔平线条。 
  • bVisible,游标的可⻅性。如果光标可⻅,则此成员为TRUE。
CursorInfo.bVisible = false; //隐藏控制台光标 

😶‍🌫️SetConsoleCursorInfo

设置指定控制台屏幕缓冲区的光标的⼤⼩和可⻅性。

SetConsoleCursorInfo 函数 - Windows Console | Microsoft Learn

函数原型:

BOOL WINAPI SetConsoleCursorInfo(HANDLE hConsoleOutput,const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo
);

 设置光标信息:

#include<stdbool.h>//需要包含头文件
HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//影藏光标操作
CONSOLE_CURSOR_INFO CursorInfo;
GetConsoleCursorInfo(hOutput, &CursorInfo); //获取控制台光标信息
CursorInfo.bVisible = false; //隐藏控制台光标
SetConsoleCursorInfo(hOutput, &CursorInfo); //设置控制台光标状态

 

😶‍🌫️SetConsoleCursorPosition

设置指定控制台屏幕缓冲区中的光标位置,我们将想要设置的坐标信息放在COORD类型的pos中,调⽤SetConsoleCursorPosition函数将光标位置设置到指定的位置

SetConsoleCursorPosition 函数 - Windows Console | Microsoft Learn

 函数原型:

BOOL WINAPI SetConsoleCursorPosition(HANDLE hConsoleOutput,COORD pos
);

光标定位:

COORD pos = { 10, 5};
HANDLE hOutput = NULL;
//获取标准输出的句柄(⽤来标识不同设备的数值)
hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
//设置标准输出上光标的位置为pos
SetConsoleCursorPosition(hOutput, pos);

 

 那学习以上的预备知识,我们能实现光标两个功能。光标的隐藏/光标的定位

🎇光标隐藏

#include<stdio.h>
#include<windows.h>
#include<stdbool.h>
int main()
{HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);//获取句柄CONSOLE_CURSOR_INFO CursorInfo;//光标信息GetConsoleCursorInfo(hOutput, &CursorInfo); //获取控制台光标信息CursorInfo.bVisible = false; //隐藏控制台光标SetConsoleCursorInfo(hOutput, &CursorInfo); //设置控制台光标状态return 0;
}

🎇光标定位

SetPos:封装⼀个设置光标位置的函数

#include<stdio.h>
#include<windows.h>
#include<stdbool.h>
#include<windows.h>
void SetPos(int x, int y)
{HANDLE hOutput = GetStdHandle(STD_OUTPUT_HANDLE);COORD pos = { x, y };SetConsoleCursorPosition(hOutput, pos);
}
int main()
{SetPos(10, 15);//把光标设定到指定位置printf("haha");return 0;
}

🙂按键情况设置

GetAsyncKeyState function (winuser.h) - Win32 apps | Microsoft Learn

获取按键情况,GetAsyncKeyState的函数原型如下:

SHORT GetAsyncKeyState(int vKey
);

将键盘上每个键的虚拟键值传递给函数,函数通过返回值来分辨按键的状态。

按键的虚拟值:虚拟键码 (Winuser.h) - Win32 apps | Microsoft Learn 

GetAsyncKeyState 的返回值是short类型,在上⼀次调⽤ GetAsyncKeyState 函数后,如果返回的16位的short数据   、中,最⾼位是1,说明按键的状态是按下,如果最⾼是0,说明按键的状态是抬起;如果最低位被置为1则说明,该按键被按过,否则为0。

如果我们要判断⼀个键是否被按过,可以检测GetAsyncKeyState返回值的最低值是否为1

#define KEY_PRESS(VK) ( (GetAsyncKeyState(VK) & 0x1) ? 1 : 0 ) 
//ret&0000000000000001
//宏 & 三目操作符

🙂□●★宽字节

在游戏界面上,我们打印墙体使⽤宽字符:□,打印蛇使⽤宽字符●,打印⻝物使⽤宽字符★

普通的字符是占⼀个字节的,这类宽字符是占⽤2个字节。

char : 普通字符

wchar_t : 宽字符的类型

这⾥再简单的讲⼀下C语⾔的国际化特性相关的知识,过去C语⾔并不适合⾮英语国家(地区)使⽤。C语⾔最初假定字符都是但⾃⼰的。但是这些假定并不是在世界的任何地⽅都适⽤。

  • C语⾔字符默认是采⽤ASCII编码的,ASCII字符集采⽤的是单字节编码,且只使⽤了单字节中的低7位,最⾼位是没有使⽤的,可表⽰为0xxxxxxxx;可以看到,ASCII字符集共包含128个字符,在英语国家中,128个字符是基本够⽤的。
  • 但是,在其他国家语⾔中,⽐如,在法语中,字⺟上⽅有注⾳符号,它就⽆法⽤ASCII码表⽰。于是,⼀些欧洲国家就决定,利⽤字节中闲置的最⾼位编⼊新的符号。⽐如,法语中的é的编码为130(⼆进制10000010)。这样⼀来,这些欧洲国家使⽤的编码体系,可以表⽰最多256个符号。
  • 但是,这⾥⼜出现了新的问题。不同的国家有不同的字⺟,因此,哪怕它们都使⽤256个符号的编码⽅式,代表的字⺟却不⼀样。⽐如,130在法语编码中代表了é,在希伯来语编码中却代表了字⺟Gimel,在俄语编码中⼜会代表另⼀个符号。
  • 但是不管怎样,所有这些编码⽅式中,0--127表⽰的符号是⼀样的,不⼀样的只是128--255的这⼀段。⾄于亚洲国家的⽂字,使⽤的符号就更多了,汉字就多达10万左右。⼀个字节只能表⽰256种符号,肯定是不够的,就必须使⽤多个字节表达⼀个符号。⽐如,简体中⽂常⻅的编码⽅式是GB2312,使⽤两个字节表⽰⼀个汉字,所以理论上最多可以表⽰256x256=65536个符号。

后来为了使C语⾔适应国家化,C语⾔的标准中不断加⼊了国际化的⽀持。⽐如:加⼊和宽字符的类型wchar_t 和宽字符的输⼊和输出函数,加⼊和<locale.h>头⽂件,其中提供了允许程序员针对特定地区(通常是国家或者说某种特定语⾔的地理区域)调整程序⾏为的函数。

<locale.h>本地化

<locale.h>提供的函数⽤于控制C标准库中对于不同的地区会产⽣不⼀样⾏为的部分。在标准可以中,依赖地区的部分有以下⼏项:

  • 数字量的格式
  • 货币量的格式
  • 字符集
  • ⽇期和时间的表⽰形式

类项

通过修改地区,程序可以改变它的⾏为来适应世界的不同区域。但地区的改变可能会影响库的许多部分,其中⼀部分可能是我们不希望修改的。所以C语⾔⽀持针对不同的类项进⾏修改,下⾯的⼀个宏,指定⼀个类项:

每个类型的详细说明。【请参考,戳一戳】:setlocale,_wsetlocale | Microsoft Learn

  • LC_COLLATE
  • LC_CTYPE
  • LC_MONETARY
  • LC_NUMERIC
  • LC_TIME
  • LC_ALL  - 针对所有类项修改

🎇setlocale函数

setlocale - C++ Reference (cplusplus.com)

char* setlocale (int category, const char* locale); 
  • setlocale函数⽤于修改当前地区,可以针对⼀个类项修改,也可以针对所有类项。
  • setlocale的第⼀个参数可以是前⾯说明的类项中的⼀个,那么每次只会影响⼀个类项。
  • 如果第⼀个参数是LC_ALL,就会影响所有的类项。
  • C标准给第⼆个参数仅定义了2种可能取值:"C"和" "
  • 当地区设置为"C"时,库函数按正常⽅式执⾏,⼩数点是⼀个点。
  • 当程序运⾏起来后想改变地区,就只能显⽰调⽤setlocale函数。⽤" "作为第2个参数,调⽤setlocale函数就可以切换到本地模式,这种模式下程序会适应本地环境。
  • ⽐如:切换到我们的本地模式后就⽀持宽字符(汉字)的输出等。

操作系统本地化: 

setlocale(LC_ALL, " "); //切换到本地环境

🎇宽字符的打印

那如果想在屏幕上打印宽字符,怎么打印呢?

  • 宽字符的字面量必须加上前缀"L" 否则C语言会把字面量当作窄字符类型处理
  • 前缀"L"在单引号前面,表示宽字符,对应wprintf()的占位符为%lc
  • 在双引号前面,表示宽字符串,对饮的wprintf()的占位符为%ls
#include <stdio.h>
#include<locale.h>
int main() {setlocale(LC_ALL, "");wchar_t ch1 = L'●';wchar_t ch2 = L'唐';wchar_t ch3 = L'棣';wchar_t ch4 = L'★';printf("%c%c\n", 'a', 'b');wprintf(L"%c\n", ch1);wprintf(L"%c\n", ch2);wprintf(L"%c\n", ch3);wprintf(L"%c\n", ch4);return 0;

🙂控制台坐标特点

这⾥不得不讲⼀下控制台窗⼝的⼀些知识,如果想在控制台的窗⼝中指定位置输出信息,我们得知道该位置的坐标,所以⾸先介绍⼀下控制台窗⼝的坐标知识。控制台窗⼝的坐标如下所⽰,

  • 横向的是X轴,从左向右依次增⻓,纵向是Y轴,从上到下依次增⻓。
  • 坐标系(0,0)的远点位于缓冲区的顶部左侧单元格。
  • ⼀个普通字符占⼀个字符的位置。但是打印⼀个汉字字符,占⽤2个字符的位置。
  • 一个坐标2x=y(是长方形,不是正方形)
  • 1个坐标1个正常字符,2个坐标可以存放1个宽字符

贪吃蛇游戏设计与分析

☁围墙设计

控制台大小:

围墙大小: 

  • x必须是2的倍数

☁蛇身和食物设计

初始化状态,假设蛇的⻓度是5,蛇⾝的每个节点是●,在固定的⼀个坐标处,⽐如(24,5)处开始出现蛇,连续5个节点。

  • 蛇的每个节点的x坐标必须是2个倍数,否则可能会出现蛇的⼀个节点有⼀半⼉出现在墙体中,另外⼀般在墙外的现象,坐标不好对⻬。
  • 关于⻝物,x坐标必须是2的倍数
  • 食物在围墙内,随机生成
  • 食物的坐标不能和蛇的⾝体重合,然后打印★

☁游戏规则设计

  • 在游戏运⾏的过程中,有蛇(单链表)
  • 有食物,(单链表节点)
  • 蛇的开始方向
  • 🐍蛇的速度(程序休眠时间)
  • 每个食物的分数
  • 每次吃⼀个⻝物,蛇的⾝体就会变⻓⼀节,获得分数
  • 游戏状态(正常,撞墙,咬到自己,正常结束)

☁游戏流程设计

✔✔✔✔✔最后感谢大家的阅读,若有错误和不足,欢迎指正!乖乖敲代码哦! 

代码---------→【唐棣棣 (TSQXG) - Gitee.com】

联系---------→【邮箱:2784139418@qq.com】

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

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

相关文章

基于STM32 + TIM _定时器的基本机构和工作原理详解

前言 本篇博客主要学习了解定时器的基本结构和工作原理&#xff0c;掌握定时器的驱动程序和设计。本篇博客大部分是自己收集和整理&#xff0c;如有侵权请联系我删除。 本次博客板子使用的是正点原子精英版&#xff0c;芯片是STM32F103ZET6,需要资料可以我拿取。 本博客内容原…

[数据结构]红黑树的定义以及添加原则

红黑树是一种自平衡的二叉查找树&#xff0c;是一种常用的数据结构 1972年出现&#xff0c;在当时被称为平衡二叉B树。后来1978年被修改为如今的“红黑树” 它是一个特殊的二叉查找树&#xff0c;红黑树的每一个节点上都有储存位表示节点的颜色 每一个节点可以是红或者黑&#…

代码生成器——MyBatisX插件

MyBatisX插件 MyBatis-Plus为我们提供了强大的mapper和service模板&#xff0c;能够大大的提高开发效率。 但是在真正开发过程中&#xff0c;MyBatis-Plus并不能为我们解决所有问题&#xff0c;例如一些复杂的SQL&#xff0c;多表联查&#xff0c;我们就需要自己去编写代码和SQ…

密码学实验三

第一题&#xff1a; 寻找满足特定条件的 e&#xff1b; 第一步&#xff1a; 第二步&#xff1a; 由式1.7知&#xff0c;给定e,p,q&#xff0c;就可计算出相应的RSA不动点的数目。因此设计算法步骤如下&#xff1a; 枚举找出所有与φ(n)互素的e。枚举所有满足条件的e&#xff…

为XiunoBBS4.0开启redis缓存且支持密码验证

修改模块文件1 xiunoPHP/cache_redis.class.php: <?phpclass cache_redis {public $conf array();public $link NULL;public $cachepre ;public $errno 0;public $errstr ;public function __construct($conf array()) {if(!extension_loaded(Redis)) {return $thi…

HTTP 基本概念(计算机网络)

一、HTTP 是什么&#xff1f; HTTP(HyperText Transfer Protocol) &#xff1a;超文本传输协议。 HTTP 是一个在计算机世界里专门在「两点」之间「传输」文字、图片、音频、视频等「超文本」数据的「约定和规范」。 「HTTP 是用于从互联网服务器传输超文本到本地浏览器的协议…

Linux部分基础指令讲解

目录 1.echo指令 2.more指令 3.less指令&#xff08;重要&#xff09; 4.head指令 5.tail指令 6.管道| 7.时间相关的指令 8.cal指令 9.find指令 10.grep指令 1.echo指令 我们先看效果 如图所示我们可以看到显示器显示出了hellow world和hellow这两句话&#xff0c;我们的echo的…

51单片机对SHT30的驱动,读取温湿度

一、SHT30简介 SHT30温湿度传感器是一种数字式温湿度传感器&#xff0c;由Sensirion公司开发和生产。它具有高精度、快速响应和稳定性强的特点&#xff0c;被广泛用于气象观测、室内环境监测、智能家居和工业自动化等领域。 以下是SHT30温湿度传感器的主要特点&#xff1a; 高精…

简单句子成分、阅读技巧

四、段落的主旨题&#xff1a;问这一段讲了什么&#xff08;一般都在段落的第一句话或最后一句话&#xff09; 词汇题的答案一般都在生词的上一句或者下一句 做题步骤&#xff1a; 1、先标段落 2、看题&#xff0c;划出关键词 3、去原文定位&#xff0c;标注中文意思 4、第一遍…

Dart编程基础 - 一种新的编程语言

Dart编程基础 – 一种新的编程语言 Dart Programming Essentials - A New Type of Programming Language By JacksonML Dart is a client-optimized language for fast apps on any platform From dart.dev 在1999年之前&#xff0c;和我一样对计算机技术感兴趣的伙伴们&…

1094. 拼车(差分堆排序)

Problem: 1094. 拼车 文章目录 题目思路Review 差分数组定义区间加法减法更新差分数组&#xff1a;为啥这样更新 思路1 Code思路2 Code 题目 车上最初有 capacity 个空座位。车 只能 向一个方向行驶&#xff08;也就是说&#xff0c;不允许掉头或改变方向&#xff09; 给定整…

高级前端面试中的三个 “送命题” !!!

原型与原型链 说到原型&#xff0c;就不得不提一下构造函数&#xff0c;首先我们看下面一个简单的例子&#xff1a; function Dog(name,age){this.name name;this.age age; }let dog1 new Dog("哈士奇",3); let dog2 new Dog("泰迪",2);首先创造空的…

机械臂运动规划、抓取末端执行器、抓取开源项目

运动规划 1.1已有抓取点 假设抓取点已检测到。这些方法设计了从机器人手到目标物体抓取点的路径。这里运动表示是关键问题。虽然存在从机器人手到目标抓握点的无限数量的轨迹&#xff0c;但是由于机器人臂的限制&#xff0c;许多区域无法到达。因此&#xff0c;需要对轨迹进行…

python etree.HTML 以及xpath 解析网页的工具

文章目录 导入模块相关语法实战 导入模块 from lxml import etree相关语法 XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位和选择元素的语言。XPath的主要应用领域是在XML文档中进行导航和查询&#xff0c;通常用于在XML中选择节点或节点集合。以…

UiPath学习笔记

文章目录 前言RPA介绍UiPath下载安装组件内容 前言 最近有一个项目的采集调研涉及到了客户端的采集&#xff0c;就取了解了一下RPA和UIPATH&#xff0c;记录一下 RPA介绍 RPA&#xff08;Robotic Process Automation&#xff1a;机器人处理自动化&#xff09;&#xff0c;是…

pta模拟题(7-15 BCD解密、7-16 数列求和-加强版、7-17 出租、7-18 反向数相加、7-19 一帮一、7-20 连续因子)

7-15 BCD解密 BCD数是用一个字节来表达两位十进制的数&#xff0c;每四个比特表示一位。所以如果一个BCD数的十六进制是0x12&#xff0c;它表达的就是十进制的12。但是小明没学过BCD&#xff0c;把所有的BCD数都当作二进制数转换成十进制输出了。于是BCD的0x12被输出成了十进制…

JS 实现一键复制文本内容

1、演示&#xff1a; 2、代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>一键复制</title&g…

羊大师分析,鲜羊奶对健康的影响与作用

羊大师分析&#xff0c;鲜羊奶对健康的影响与作用 你是否曾经听到过“羊奶比牛奶更健康”的说法&#xff1f;而鲜羊奶作为最纯正的羊奶形式&#xff0c;其营养价值更是不可小觑。除了拥有传统奶类所包含的营养成分外&#xff0c;鲜羊奶还含有更多人体必需的氨基酸和微量元素&a…

更有效的问卷发布方法与必备问卷工具推荐

问卷怎么发&#xff1f;通过哪些渠道发&#xff1f;怎么发收集的数量更多&#xff1f;怎么获得有效数据&#xff1f;这些是做问卷的调查人员经常会遇到的问题。的确&#xff0c;问卷的发放是否有效不仅会影响到收集数据的体量&#xff0c;更会影响到最终结论的真实性。所以&…

centos7 yum安装mysql5.7

1.获取源 wget http://dev.mysql.com/get/mysql57-community-release-el7-11.noarch.rpm 2.安装源 yum -y install mysql57-community-release-el7-11.noarch.rpm 3.安装mysql yum -y install mysql-server 4.如果出现下面错误&#xff0c;没有错误就忽略 使用以下命令解决…