【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进阶版,突破科研难题!
随着无人机技术日益成熟,无人机的应用领域不断扩大,对无人机研发的需求也在不断增加。然而,许多开发人员面临着无法从零开始构建无人机的时间和精力压力,同时也缺乏适合的软件平台来支持他们的开发工作。为了解决这个问题…...

Apache的简单介绍(LAMP架构+搭建Discuz论坛)
文章目录 1.Apache概述1.1什么是apache1.2 apache的功能及特性1.2.1功能1.2.2特性 1.3 MPM 工作模式1.3.1 prefork模式1.3.2 worker模式1.3.3 event模式 2.LAMP概述2.1 LAMP的组成2.2 LAMP各组件的主要作用2.3 LAMP的工作过程2.4CGI和FastCGI 3.搭建Discuz论坛所需4.编译安装Ap…...

CDL基础原理
一、CDL简介 CDL(全称Change Data Loader)是一个基于Kafka Connect框架的实时数据集成服务。 CDL服务能够从各种OLTP数据库中捕获数据库的Data Change事件,并推送到kafka,再由sink connector推送到大数据生态系统中。 CDL目前支…...

WPF基础入门-Class7-WPF-MVVN框架
WPF基础入门 Class7-MVVN框架 使用框架可以省掉如Class6中的ViewModelBase.cs的OnPropertyChanged,亦方便命令传参 1、NuGet安装CommunityToolkit.Mvvm(原Mircrosoft.Toolkit.Mvvm)也可以安装MVVMLight等其他集成库 2、显示页面࿱…...

C语言练习题第三弹!!!绝对典中典!!!
目录 1.单身狗1 1.1 题目 1.2 分析推理 1.3 代码实现 2.单身狗2 2.1 题目 2.2 分析推理 2.3 代码实现 3.字符串左旋 3.1 题目 3.2 分析推理 3.3 代码实现 3.3.1 方法一 3.3.2 优化一 3.3.2.1 思路分析 3.3.2.2 strcpy函数和strncat函数 3.3.2.3 代码实现 3.3.…...

Jedis
Jedis 使用Java操作redis Jedis是redis官方推荐的Java连接开发工具! 使用Java操作redis的中间件 测试 导入对应的依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis --><dependency><groupId>redis.clients</groupId&g…...

Linux 使用TCP_INFO查询TCP连接的状态信息
Linux 上可以使用TCP_INFO查询TCP连接状态信息包括: 发送方拥塞窗口阈值、发送方缓冲区拥塞窗口、advmss(Advertised MSS)、通过 ACK 确认的累计字节数等等 struct tcp_info {__u8 tcpi_state;__u8 tcpi_ca_state;__u8 tcpi_retransmits;__…...

软件测试案例 | 气象探测库存管理系统的集成测试计划
将经过单元测试的模块按照设计要求连接起来,组成规定的软件系统的过程被称为“集成”。集成测试也被称为组装测试、联合测试、子系统测试或部件测试等,其主要用于检查各个软件单元之间的接口是否正确。集成测试同时也是单元测试的逻辑扩展,即…...

vue点击按钮重新加载页面(vue第一次加载页面点击按钮出现页面刷新问题之后一切正常)
问题描述 所开发的vue项目每次跑起来之后就会出现点击按钮后重新加载整个页面的问题,但是只会在第一次点击的时候出现,后面就不会在出现加载整个页面的情况。 原因 在form表单中使用button按钮导致form表单进行了页面刷新。button默认的“type‘submi…...

软件工程(十一) 系统设计分类
我们知道需求规格说明书(SRS)落地之后, 就要开始着手系统设计了,看一下这个系统该如何来设计,并且如何实现。学习系统设计之前,需要先了解系统设计有哪些分类。 系统设计的分类如下 界面设计结构化设计面向对象设计(最重要)1、界面设计 界面设计也叫做人机界面设计,属于…...

数字转中文大写金额
有时候,我们需要显示中文大写金额,比如打印银行付款申请单等。 新建一个工程,加入一个标准模块在模块中加入如下代码,窗口中调用 AmountInChineseWords 函数即可。最大解析到百万亿,小数最多解析两位到分。 模块代码…...