【C++实战】C++实现贪吃蛇(含源代码)—基于easyx图形库

食用指南:本文在有C++基础的情况下食用更佳
🍀本文前置知识:C++基础
♈️今日夜电波:toge—あよ
0:36 ━━━━━━️💟──────── 4:03
🔄 ◀️ ⏸ ▶️ ☰
💗关注👍点赞🙌收藏您的每一次鼓励都是对我莫大的支持😍
目录
📱一、前置条件—easyx图形库的安装
easyx简介
easyx安装
easyx安装步骤
🐍二、进入正题!—贪吃蛇的实现!
1、大致实现思路
2、具体实现思路
父类:
蛇类 :
食物类:
游戏场景的实现(重要):
📑三、 实现效果以及源代码
1、运行效果
2、总体代码
🔑3、一些注意事项
📱一、前置条件—easyx图形库的安装
easyx简介
easyx 是一款基于 C /C++的图形库,它提供了简单易用的接口,可以方便地进行图形绘制和交互操作。通过引入 easyx,开发者可以快速实现基于 Windows 平台的图形界面应用程序开发。
easyx 提供了一系列的绘图函数,例如画线、画圆、填充颜色等,开发者可以利用这些函数创建各种图形效果。同时,easyx 还提供了键盘和鼠标事件的处理函数,方便用户与图形界面进行交互。
easyx 的优势在于它的简洁易用性和适用性。它不仅适用于初学者学习 C /C++图形编程,也可以用于快速原型开发和小型项目。易于安装和使用,对于想要学习图形编程的开发者来说是一个很好的选择。
easyx安装
easyx安装地址(本文为EasyX 2023大暑版 )
easyx安装步骤
简单又快捷的安装 😍 我可太爱了!

根据相应的提示安装即可

🐍二、进入正题!—贪吃蛇的实现!
1、大致实现思路
话不多说,先上一张图୧(๑•̀◡•́๑)૭

通过父类与子类节点继承的关系这样可以使得代码连贯以及紧密相连(其实只是作者想复习一下前段时间学的父类跟子类的知识而已( ̄3 ̄)a)大体的功能实现如上图。
2、具体实现思路
父类:
class sprite//父类
{
public:int m_x;int m_y;COLORREF m_color;
public:sprite() :sprite(0, 0) {};sprite(int x, int y) :m_x(x), m_y(y), m_color(BLUE) {};//初始化坐标,颜色virtual void draw(){setfillcolor(m_color);fillrectangle(m_x, m_y, m_x + 10, m_y + 10);}virtual void draw(COLORREF a){setfillcolor(a);fillrectangle(m_x, m_y, m_x + 10, m_y + 10);}void moveby(int dx,int dy){m_x += dx;m_y += dy;}bool collision(const sprite& ote)//碰撞食物检测{return m_x == ote.m_x && m_y == ote.m_y;}
};
作为最基本的类,所要实现的最基本任务就是储存数据,对此我做了坐标数据的储存以及蛇颜色数据的储存。接着是对于基本绘图需求实现函数、移动需求实现函数以及配置检查函数。这几个函数也是对于蛇基本的逻辑判断以及移动的需求。
蛇类 :
class Snake:public sprite//蛇体
{
public:Snake() :Snake(0, 0) {};Snake(int x, int y):sprite(x, y),dir(VK_RIGHT),grade(0) //初始化三节蛇{nodes.push_back(sprite(120, 100));//蛇头nodes.push_back(sprite(110, 100));nodes.push_back(sprite(100, 100));};void draw(){for (int i = 0; i < nodes.size(); i++){nodes[i].draw();}}void move(){for (int i=nodes.size()-1;i>0;i--)//整体移动{nodes[i] = nodes[i - 1];}switch (dir)//控制方向{case VK_UP:nodes[0].moveby(0,-10);break;case VK_DOWN:nodes[0].moveby(0, 10);break;case VK_LEFT:nodes[0].moveby(-10, 0);break;case VK_RIGHT:nodes[0].moveby(10, 0);break;}}bool collision(const sprite& ote){return nodes[0].collision(ote);}void increase()//长度增加一节{nodes.push_back(sprite());grade++;}void cotget()//计分{string str = "当前得分为:";str += to_string(grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(15, 0, "宋体");settextcolor(GREEN);outtextxy(20, 20, Outscore);}bool dead()//死亡检测{for (int i = 1; i < nodes.size(); i++)//撞到自己{if (nodes[0].m_x == nodes[i].m_x && nodes[0].m_y == nodes[i].m_y){cleardevice();return true;}}if (nodes[0].m_x == 0 || nodes[0].m_y == 0 || nodes[0].m_x == 630 || nodes[0].m_y == 470)//撞到墙return true;return false;}
private:vector<sprite> nodes;//存蛇节public:int dir;//蛇的方向int grade;//得分
};
这个类就是具体的蛇体实现的过程了。主要是实现了蛇的初始化以及所有逻辑判断。在原父类的基础上还进行了蛇的方向、得分、蛇节点等数据的添加。
食物类:
class Food :public sprite//食物
{
public:Food() :sprite(0, 0) {changefood();};void draw(){setfillcolor(RED);fillrectangle(m_x, m_y, m_x + 10, m_y + 10);}//生成食物void changefood(){//随机生成坐标m_x = rand() % 64 * 10;if (m_x == 0)m_x += 10;else if (m_x == 640)m_x -= 20;else if (m_x == 630)m_x -= 10;m_y = rand() % 48 * 10;if (m_y == 0)m_y += 10;else if (m_y == 480)m_y -= 30;else if (m_x == 470)m_y -= 20;}};
这个类就是在父类的基础上实现了食物的随机位置生成,基于坐标数据所生成的。
游戏场景的实现(重要):
class gameScreen//游戏场景
{
private:Snake snake;Food food;
public:gameScreen() {};void run(){//双缓冲绘图setbkcolor(YELLOW);BeginBatchDraw();cleardevice();wall();snake.draw();//蛇生成food.draw();//实物生成snake.cotget();snake.dead();EndBatchDraw();//移动snake.move();//吃食物SnakeEat();//获取信息ExMessage msg = { 0 };while (peekmessage(&msg, EX_KEY)){onmesg(msg);}}//改变蛇的方向 通过方向键 void onmesg(const ExMessage& msg){//判断键盘有没有方向按键按下if (msg.message == WM_KEYDOWN)//接受↑↓←→信息{switch (msg.vkcode)//不让蛇头向后走{case VK_UP:if(snake.dir!= VK_DOWN)snake.dir = msg.vkcode;break;case VK_DOWN:if (snake.dir != VK_UP)snake.dir = msg.vkcode;break;case VK_LEFT:if (snake.dir != VK_RIGHT)snake.dir = msg.vkcode;break;case VK_RIGHT:if (snake.dir != VK_LEFT)snake.dir = msg.vkcode;break;}}}void SnakeEat(){if (snake.collision(food))//吃到了食物{//蛇节数增加snake.increase();//食物重新生成food.changefood();}}void deadcot()//死亡结算{string str = "您的最终得分为:";str += to_string(snake.grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(30, 0, "宋体");settextcolor(GREEN);outtextxy(200, 210, Outscore);}void realdead()//判死{if (snake.dead()){deadcot();Sleep(3000);closegraph();}}void wall()//生成墙{sprite wa;for (int i = 0; i < 480; i+=10) {//首先声明颜色,否则第一个格子怪怪的wa.draw(GREEN);wa.moveby(0, 10);}sprite wb;{for (int i = 0; i < 640; i += 10) {//首先声明颜色,否则第一个格子怪怪的wb.draw(GREEN);wb.moveby(10, 0);}}sprite sa(630, 470);for (int i = 0; i < 480; i += 10) {//首先声明颜色,否则第一个格子怪怪的sa.draw(GREEN);sa.moveby(0, -10);}sprite sb(630, 470);for (int i = 0; i < 640; i += 10) {//首先声明颜色,否则第一个格子怪怪的sb.draw(GREEN);sb.moveby(-10, 0);}}};
这个类实现的就是将前面所实现的类进行整合,然后再进行有些稍微的调节。比如:增加了接受方向键的函数omsg,得以操控蛇的运动。这个类也进行了蛇活动场景的搭建等等。
📑三、 实现效果以及源代码
1、运行效果
游戏开始界面:

游戏运行界面:

游戏结算界面:

2、总体代码
#include<iostream>
#include<easyx.h>
#include<vector>
#include<stdlib.h>
#include<time.h>
#include<string>
#include<conio.h>using namespace std;class sprite//父类
{
public:int m_x;int m_y;COLORREF m_color;
public:sprite() :sprite(0, 0) {};sprite(int x, int y) :m_x(x), m_y(y), m_color(BLUE) {};//初始化坐标,颜色virtual void draw(){setfillcolor(m_color);fillrectangle(m_x, m_y, m_x + 10, m_y + 10);}virtual void draw(COLORREF a){setfillcolor(a);fillrectangle(m_x, m_y, m_x + 10, m_y + 10);}void moveby(int dx,int dy){m_x += dx;m_y += dy;}bool collision(const sprite& ote)//碰撞食物检测{return m_x == ote.m_x && m_y == ote.m_y;}
};class Snake:public sprite//蛇体
{
public:Snake() :Snake(0, 0) {};Snake(int x, int y):sprite(x, y),dir(VK_RIGHT),grade(0) //初始化三节蛇{nodes.push_back(sprite(120, 100));//蛇头nodes.push_back(sprite(110, 100));nodes.push_back(sprite(100, 100));};void draw(){for (int i = 0; i < nodes.size(); i++){nodes[i].draw();}}void move(){for (int i=nodes.size()-1;i>0;i--)//整体移动{nodes[i] = nodes[i - 1];}switch (dir)//控制方向{case VK_UP:nodes[0].moveby(0,-10);break;case VK_DOWN:nodes[0].moveby(0, 10);break;case VK_LEFT:nodes[0].moveby(-10, 0);break;case VK_RIGHT:nodes[0].moveby(10, 0);break;}}bool collision(const sprite& ote){return nodes[0].collision(ote);}void increase()//长度增加一节{nodes.push_back(sprite());grade++;}void cotget()//计分{string str = "当前得分为:";str += to_string(grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(15, 0, "宋体");settextcolor(GREEN);outtextxy(20, 20, Outscore);}bool dead()//死亡检测{for (int i = 1; i < nodes.size(); i++)//撞到自己{if (nodes[0].m_x == nodes[i].m_x && nodes[0].m_y == nodes[i].m_y){cleardevice();return true;}}if (nodes[0].m_x == 0 || nodes[0].m_y == 0 || nodes[0].m_x == 630 || nodes[0].m_y == 470)//撞到墙return true;return false;}
private:vector<sprite> nodes;//存蛇节public:int dir;//蛇的方向int grade;//得分
};class Food :public sprite//食物
{
public:Food() :sprite(0, 0) {changefood();};void draw(){setfillcolor(RED);fillrectangle(m_x, m_y, m_x + 10, m_y + 10);}//生成食物void changefood(){//随机生成坐标m_x = rand() % 64 * 10;if (m_x == 0)m_x += 10;else if (m_x == 640)m_x -= 20;else if (m_x == 630)m_x -= 10;m_y = rand() % 48 * 10;if (m_y == 0)m_y += 10;else if (m_y == 480)m_y -= 30;else if (m_x == 470)m_y -= 20;}};class gameScreen//游戏场景
{
private:Snake snake;Food food;
public:gameScreen() {};void run(){//双缓冲绘图setbkcolor(YELLOW);BeginBatchDraw();cleardevice();wall();snake.draw();//蛇生成food.draw();//实物生成snake.cotget();snake.dead();EndBatchDraw();//移动snake.move();//吃食物SnakeEat();//获取信息ExMessage msg = { 0 };while (peekmessage(&msg, EX_KEY)){onmesg(msg);}}//改变蛇的方向 通过方向键 void onmesg(const ExMessage& msg){//判断键盘有没有方向按键按下if (msg.message == WM_KEYDOWN)//接受↑↓←→信息{switch (msg.vkcode)//不让蛇头向后走{case VK_UP:if(snake.dir!= VK_DOWN)snake.dir = msg.vkcode;break;case VK_DOWN:if (snake.dir != VK_UP)snake.dir = msg.vkcode;break;case VK_LEFT:if (snake.dir != VK_RIGHT)snake.dir = msg.vkcode;break;case VK_RIGHT:if (snake.dir != VK_LEFT)snake.dir = msg.vkcode;break;}}}void SnakeEat(){if (snake.collision(food))//吃到了食物{//蛇节数增加snake.increase();//食物重新生成food.changefood();}}void deadcot()//死亡结算{string str = "您的最终得分为:";str += to_string(snake.grade);char Outscore[1024];strcpy_s(Outscore, sizeof(Outscore), str.c_str());settextstyle(30, 0, "宋体");settextcolor(GREEN);outtextxy(200, 210, Outscore);}void realdead()//判死{if (snake.dead()){deadcot();Sleep(3000);closegraph();}}void wall()//生成墙{sprite wa;for (int i = 0; i < 480; i+=10) {//首先声明颜色,否则第一个格子怪怪的wa.draw(GREEN);wa.moveby(0, 10);}sprite wb;{for (int i = 0; i < 640; i += 10) {//首先声明颜色,否则第一个格子怪怪的wb.draw(GREEN);wb.moveby(10, 0);}}sprite sa(630, 470);for (int i = 0; i < 480; i += 10) {//首先声明颜色,否则第一个格子怪怪的sa.draw(GREEN);sa.moveby(0, -10);}sprite sb(630, 470);for (int i = 0; i < 640; i += 10) {//首先声明颜色,否则第一个格子怪怪的sb.draw(GREEN);sb.moveby(-10, 0);}}};void play()
{cleardevice();//initgraph(640, 480);srand(time(nullptr));gameScreen game;while (1){Sleep(100);game.run();game.realdead();}getchar();}void menu()
{char str_0[] = "》 -贪吃蛇- 《";char str_1[] = "1.play";char str_2[] = "2.游戏帮助";char str_3[] = "按任意键退出";settextstyle(20, 0, "宋体");outtextxy(200, 150, str_0);outtextxy(220, 190, str_1);outtextxy(220, 230, str_2);outtextxy(220, 270, str_3);
}void intro()
{cleardevice();char str_0[] = "【帮助】";char str_1[] = "操作技巧:↑↓← →控制蛇的方向";char str_2[] = "什么?你说你没方向键?";char str_3[] = "亲,请点右上角";char str_4[] = "制作者:慕斯";char str_5[] = "按任意键返回";settextstyle(20, 0, "宋体");outtextxy(200, 120, str_0);outtextxy(180, 160, str_1);outtextxy(180, 200, str_2);outtextxy(180, 240, str_3);outtextxy(180, 280, str_4);outtextxy(180, 320, str_5);int leb = 0;leb = _getch();
}void SNAKE()
{int leb = 0;int kk = 1;do{initgraph(640, 480);menu();leb = _getch();switch (leb){case 49:play();break;case 50:intro();break;default:kk = 0;break;}} while (kk);}int main()
{SNAKE();//play();return 0;
}
🔑3、一些注意事项
由于有些字符的限制,我们需要按以下步骤去更改一下字符集,将字符集改为使用多字节字符集以解决其中一些报错!报错情况如下:

如果你出现以上报错,请按以下步骤进行多字节字符集设置:


感谢你耐心的看到这里ღ( ´・ᴗ・` )比心,如有哪里有错误请踢一脚作者o(╥﹏╥)o!
给个三连再走嘛~
相关文章:
【C++实战】C++实现贪吃蛇(含源代码)—基于easyx图形库
食用指南:本文在有C基础的情况下食用更佳 🍀本文前置知识:C基础 ♈️今日夜电波:toge—あよ 0:36 ━━━━━━️💟──────── 4:03 &a…...
PHP获取两个日期之间的所有日期
下面是一个示例代码,用于计算给定开始和结束日期之间的所有日期: <?phpfunction getDatesBetween($start_date, $end_date) {// 初始化结果数组$dates array();// 将开始日期转换为时间戳$current_date strtotime($start_date);$end_date strtot…...
STL之stack(适配器讲解以及双端队列的讲解)
很多人在听到适配器的时候,应该都是懵的,因为对适配器的理解都是懵懵懂懂,其实他很好理解,就是相当于一个转换器。我们可以这样理解,就是现实当中是的插排一样,上面有三个孔的,也有两个孔的&…...
JVM解密: 解构类加载与GC垃圾回收机制
文章目录 一. JVM内存划分二. 类加载机制1. 类加载过程2. 双亲委派模型 三. GC垃圾回收机制1. 找到需要回收的内存1.1 哪些内存需要回收?1.2 基于引用计数找垃圾(Java不采取该方案)1.3 基于可达性分析找垃圾(Java采取方案) 2. 垃圾回收算法2.1 标记-清除算法2.2 标记…...
【Spring Boot】Spring Boot结合MyBatis简单实现学生信息管理模块
实战:实现学生信息管理模块 环境准备 JDKSpring BootMyBatis 创建Spring Boot项目 使用Spring Initializr创建一个新的Spring Boot项目,并添加以下依赖: Spring WebMyBatis FrameworkMySQL Driver 数据库设计 在MySQL数据库中创建一个名…...
【Java List与Map】List<T> Map与Map List<T>的区别(126)
List<T> Map:List里面的数据类型包含Map; Map List<T>:Map里面value的数据类型包含List; 测试案例: import java.util.ArrayList; import java.util.HashMap; import j…...
【FreeRTOS】常用函数总结
xTaskCreate(): 用法: xTaskCreate(taskFunction, taskName, stackSize, parameters, priority, taskHandle)参数: taskFunction:任务函数,即任务的入口函数。taskName:任务的名称。stackSize:任…...
The Cherno——OpenGL
The Cherno——OpenGL 1. 欢迎来到OpenGL OpenGL是一种跨平台的图形接口(API),就是一大堆我们能够调用的函数去做一些与图像相关的事情。特殊的是,OpenGL允许我们访问GPU(Graphics Processing Unit 图像处理单元&…...
linux中学习控制进程的要点
1. 进程创建 1.1 fork函数 #include <unistd.h> pid_t fork(void); 返回值:自进程中返回0,父进程返回子进程id,出错返回-1 进程调用fork,当控制转移到内核中的fork代码后,内核会做以下操作 分配新的内存块和…...
C++Qt QSS要注意的坑
qss源自css,相当于css的一个子集,主要支持的是css2标准,很多网上的css3的标准的写法在qss这里是不生效的,所以不要大惊小怪。 qss也不是完全支持所有的css2,比如text-align官方文档就有说明,只支持 QPushB…...
LeetCode每日一题:56. 合并区间(2023.8.27 C++)
目录 56. 合并区间 题目描述: 实现代码与解析: 排序 贪心 原理思路: 56. 合并区间 题目描述: 以数组 intervals 表示若干个区间的集合,其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&…...
电视盒子什么牌子好?经销商整理线下热销电视盒子品牌排行榜
在面对众多品牌和型号时,不知道电视盒子哪个牌子好的消费者超多,很多人进店都会问我电视盒子哪款好?我根据店铺内近两年的销量情况整理了电视盒子品牌排行榜,看看实体店哪些电视盒子最值得入手吧。 TOP 1.泰捷WEBOX 40Pro Max电视…...
JavaScript关于函数的小挑战
题目 回到两个体操队,即海豚队和考拉队! 有一个新的体操项目,它的工作方式不同。 每队比赛3次,然后计算3次得分的平均值(所以每队有一个平均分)。 只有当一个团队的平均分至少是另一个团队的两倍时才会获胜。否则&…...
机器学习深度学习——针对序列级和词元级应用微调BERT
👨🎓作者简介:一位即将上大四,正专攻机器学习的保研er 🌌上期文章:机器学习&&深度学习——NLP实战(自然语言推断——注意力机制实现) 📚订阅专栏:机…...
重启Mysql时报错rm: cannot remove ‘/var/lock/subsys/mysql‘: Permission denied
只有用mysql重启时报错,用root不报错 [mysqlt3-dtpoc-dtpoc-web04 bin]$ service mysql restart Shutting down MySQL.. SUCCESS! rm: cannot remove /var/lock/subsys/mysql: Permission denied Starting MySQL.. SUCCESS! [roott3-dtpoc-dtpoc-web04 ~]# serv…...
[C/C++]指针详讲-让你不在害怕指针
个人主页:北海 🎐CSDN新晋作者 🎉欢迎 👍点赞✍评论⭐收藏✨收录专栏:C/C🤝希望作者的文章能对你有所帮助,有不足的地方请在评论区留言指正,大家一起学习交流!ǹ…...
无涯教程-Android - Frame Layout函数
Frame Layout 旨在遮挡屏幕上的某个区域以显示单个项目,通常,应使用FrameLayout来保存单个子视图,因为在子视图彼此不重叠的情况下,难以以可扩展到不同屏幕尺寸的方式组织子视图。 不过,您可以使用android:layout_grav…...
docker desktop安装es 并连接elasticsearch-head:5
首先要保证docker安装成功,打开cmd,输入docker -v,出现如下界面说明安装成功了 下面开始安装es 第一步:拉取es镜像 docker pull elasticsearch:7.6.2第二步:运行容器 docker run -d --namees7 --restartalways -p 9…...
计网(第四章)(网络层)(六)
目录 一、路由选择协议(动态路由自动获取路由信息)概述: 二、因特网采用的路由协议 主要特点: 1.自适应 2.分布式 3.分层次 因特网采用分层次的路由选择协议: 三、常见的路由选择协议 一、路由选择协议ÿ…...
科研无人机平台P600进阶版,突破科研难题!
随着无人机技术日益成熟,无人机的应用领域不断扩大,对无人机研发的需求也在不断增加。然而,许多开发人员面临着无法从零开始构建无人机的时间和精力压力,同时也缺乏适合的软件平台来支持他们的开发工作。为了解决这个问题…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
多模态2025:技术路线“神仙打架”,视频生成冲上云霄
文|魏琳华 编|王一粟 一场大会,聚集了中国多模态大模型的“半壁江山”。 智源大会2025为期两天的论坛中,汇集了学界、创业公司和大厂等三方的热门选手,关于多模态的集中讨论达到了前所未有的热度。其中,…...
MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例
一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...
【网络安全产品大调研系列】2. 体验漏洞扫描
前言 2023 年漏洞扫描服务市场规模预计为 3.06(十亿美元)。漏洞扫描服务市场行业预计将从 2024 年的 3.48(十亿美元)增长到 2032 年的 9.54(十亿美元)。预测期内漏洞扫描服务市场 CAGR(增长率&…...
LeetCode - 394. 字符串解码
题目 394. 字符串解码 - 力扣(LeetCode) 思路 使用两个栈:一个存储重复次数,一个存储字符串 遍历输入字符串: 数字处理:遇到数字时,累积计算重复次数左括号处理:保存当前状态&a…...
【CSS position 属性】static、relative、fixed、absolute 、sticky详细介绍,多层嵌套定位示例
文章目录 ★ position 的五种类型及基本用法 ★ 一、position 属性概述 二、position 的五种类型详解(初学者版) 1. static(默认值) 2. relative(相对定位) 3. absolute(绝对定位) 4. fixed(固定定位) 5. sticky(粘性定位) 三、定位元素的层级关系(z-i…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
大学生职业发展与就业创业指导教学评价
这里是引用 作为软工2203/2204班的学生,我们非常感谢您在《大学生职业发展与就业创业指导》课程中的悉心教导。这门课程对我们即将面临实习和就业的工科学生来说至关重要,而您认真负责的教学态度,让课程的每一部分都充满了实用价值。 尤其让我…...
