C语言实战演练之C语言满屏飘字表白代码(可修改文案)

                                                          关注我将爱永远写进文里

                                                  "你的名字,是我读过最短的情诗"   

下面是截图效果,实战运行是动态图

12567adfc2c34faf9af1541686a246c3.jpg

2124a8be7df147988e6fbf169844ba60.png

2adfd951eceb449dab7b64dcebc40d62.png

在本篇文章中,厾罗将c语言实现的文字跑马灯做了进一步的完善,最终实现了一个进阶版的满屏飘字表白程序,一起来看看吧!

(在代码的34~62行这里可以更改你想说的话哦)

7ba0ba0a12534e049dd61b59f3b42b40.png

软件:Visual Studio 2022

环境搭建:如何下载安装Visual Studio并搭建C语言开发环境

在开始编写代码前,我们需要先安装一下EasyX库哦~

e7470066184f4b259eeda2028445a4bf.png

640?wx_fmt=gif&from=appmsg&wxfrom=13&wx_lazy=1&tp=wxpic

EasyX是一个基于Windows GDI(图形设备接口)的C++图形库。它为C++程序员提供了一个易于使用且功能强大的图形编程接口,可以在Windows操作系统下创建各种图形界面应用程序。EasyX提供了丰富的绘图函数,可以实现图形绘制、文本输出、图像处理等功能,开发者可以使用它来实现各种有趣的图形应用程序,比如游戏、画图等。


640?wx_fmt=gif&from=appmsg&wxfrom=5&wx_lazy=1&tp=wxpic

EasyX的最大特点是其易用性,它基于简单易懂的GDI接口封装了一套易于学习和使用的C++接口。EasyX支持众多的图形绘制函数,比如直线、矩形、椭圆、圆弧等,再加上丰富的颜色、字体、图片等参数设置,可以轻松实现各种复杂的图形绘制。


640?wx_fmt=gif&from=appmsg&wxfrom=5&wx_lazy=1&tp=wxpic

除此之外,EasyX还提供了一些实用的辅助功能,比如键盘输入、鼠标操作等。开发者可以使用这些辅助功能来实现用户交互、游戏逻辑等功能,使得开发过程更加简单快捷。


640?wx_fmt=gif&from=appmsg&wxfrom=5&wx_lazy=1&tp=wxpic

EasyX适用于Windows操作系统,并且可以兼容多个版本的VC++编译器。EasyX不仅支持多种语言的编程,比如C++、C#、Python等,而且还提供了详细的开发文档和示例代码,方便开发者使用和学习。EasyX库的安装非常简单,只需下载并解压缩,然后在Visual Studio等IDE平台中配置相关设置即可完成安装。它还提供了详细的使用手册和丰富的示例代码,用户可以通过手册和示例代码快速学习和使用EasyX库。


640?wx_fmt=gif&from=appmsg&wxfrom=5&wx_lazy=1&tp=wxpic

总的来说,EasyX库是一个非常适合初学者学习和使用的图形库,因为它不仅提供了简单易用的API接口,同时也提供了丰富的教程和示例代码,帮助用户快速上手。对于有一定图形开发经验的程序员来说,EasyX库可以极大地提高开发效率,快速实现各种图形界面和界面效果。因此,EasyX库在教育、游戏、多媒体等领域有着广泛的应用。


EasyX下载安装

640?wx_fmt=gif&from=appmsg&wxfrom=5&wx_lazy=1&tp=wxpic

                                        WINTER IS COMING

进入EasyX官网,点击“下载EasyX”开始下载

d3bcf640639f497bb274bb729be4f346.png

 下载完成后,进入下载目录双击.exe文件开始安装EasyX

fba8c225c2194967876a1717881effc4.png

 接下来就是无脑安装啦

fefb29e0c8014adc8b145d45d0cf943e.png

4daf2f25afde4358ad875a7a2015eea3.png

253b802917dd4c0e9e73bab5ae37686a.png

        表白代码

640?wx_fmt=png&from=appmsg&tp=wxpic&wxfrom=5&wx_lazy=1&wx_co=1

       完整程序如下:


#include <graphics.h>
#include <time.h>
#include <stdio.h>
#include <conio.h>
#include <vector>
using namespace std;
// 彩球基础设置
#define MAXLove 999  // 设置彩球总数
// 文字基础设置
#define MAX_TEXT_SIZE 20        // 最小文字大小
#define MAX_TEXT_COUNT 30       // 最大同时显示的文字数量
#define MAX_TEXT_BUFFER 255     // 每一句文字的最大字符个数
struct Love
{
  double x;    // 彩球横坐标
  int y;          // 彩球纵坐标
  int r;        // 彩球的大小
  double  speed;  // 彩球下落速度
  int   color;      // 彩球的颜色
};
// 文字结构体
struct Text
{
  int x;       // 橫坐标
  int y;         // 纵坐标
  int textWidth;    // 句子长度
  int textHeight;   // 句子高度
  double step;  // 速度
  int color;    // 颜色
  int size;    // 文字大小
  int direction;  // 方向:默认右边滚动到左边   
  WCHAR* content;      // 文字内容
};
// 定义你想输出的文字,注意句子长度不能超过 MAX_TEXT_BUFFER 个字符,句子数量不能超过 MAX_TEXT_COUNT 
WCHAR TEXT_LIST[MAX_TEXT_COUNT][MAX_TEXT_BUFFER] = {
   _T("我爱你"),
   _T("I Love You!"),
   _T("永远爱你"),
   _T("你是我年少的欢喜"),
   _T("一生一世一双人"),
   _T("余生我陪你走"),
   _T("陪你到来生"),
   _T("春风十里不如你"),
   _T("三生有幸来日方长"),
   _T("夜很长幸有你"),
   _T("爱你的全部"),
   _T("踏过八荒四海只为你"),
   _T("愿得一人心"),
   _T("众里寻他千百度"),
   _T("顶峰相见"),
   _T("等你下课"),
   _T("往后余生"),
   _T("Missing You!"),
   _T("做我女朋友好么"),
   _T("你已经在我的未来里了"),
   _T("陪你到世界之巅"),
   _T("白头偕老"),
   _T("我喜欢你"),
   _T("好想好想你"),
   _T("想你想你想你"),
   _T("今夜月色真美"),
   _T("你是我的唯一")
};
// 存储所有彩球
Love Love[MAXLove]; //保存所有彩球
// 设置字体
LPCTSTR textType = (LPCTSTR)("微软雅黑");
// 存储所有文字数据
Text text[MAX_TEXT_SIZE];
// 初始化彩球
void InitLove(int i, int width, int height)
{
  Love[i].x = rand() % width;
  Love[i].y = rand() % height - height;
  Love[i].r = rand() % 4 + 1;
  Love[i].speed = (rand() % 3333) / 1000.0 + 1;
  Love[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);
}
// 彩球的下落函数
void MoveLove(int i, int width, int height)
{
  setlinecolor(RGB(0, 0, 0));
  setfillcolor(RGB(0, 0, 0));
  // 删除原来的彩球
  fillcircle((int)Love[i].x, Love[i].y, Love[i].r);
  // 计算彩球新位置
  Love[i].y += Love[i].speed;
  if (Love[i].y > height)  InitLove(i, width, height);
  // 画新彩球
  setfillcolor(Love[i].color);
  setlinecolor(Love[i].color);
  fillcircle((int)Love[i].x, Love[i].y, Love[i].r);
}
// 初始化文字
void InitText(int index, int Width, int Height) {
  text[index].x = Width;
  text[index].y = rand() % Height;
  text[index].size = rand() % MAX_TEXT_SIZE + MAX_TEXT_SIZE; // 设置最小文字大小为 20 个像素
  text[index].step = (rand() % 20) + 2;
  text[index].direction = (rand() % 2) + 0.5;
  text[index].content = TEXT_LIST[(rand() % MAX_TEXT_COUNT)];
  text[index].textWidth = textwidth(text[index].content);
  text[index].textHeight = textheight(text[index].content);
  int color = (int)(text[index].step * 255 / 5.0 + 0.5);
  text[index].color = RGB((rand() % 255), (rand() % 255), (rand() % 255));
}
// 初始化文字个数
void InitTexts(int Width, int Height) {
  for (int i = 0; i < MAX_TEXT_COUNT; i++) {
    InitText(i, Width, Height);
  }
}
// 移动文字
void MoveText(int Width, int Height)
{
  for (int i = 0; i < MAX_TEXT_COUNT; i++) {
    // 删除原来的文字
    int textHeight = textheight(text[i].content);
    int textWidth = textwidth(text[i].content);
    settextcolor(RGB(0, 0, 0));
    settextstyle(text[i].size, text[i].size, textType);
    outtextxy(text[i].x, text[i].y, text[i].content);
    // 计算新位置
    text[i].x -= text[i].step;
    if ((text[i].x + textWidth) <= 0) {
      InitText(i, Width, Height);
    }
    settextcolor(text[i].color);
    settextstyle(text[i].size, 0, textType);
    outtextxy(text[i].x, text[i].y, text[i].content);
  }
}
// 主函数
int main()
{
  srand((unsigned)time(NULL));// 设置随机种子
  int ScreenWidth = GetSystemMetrics(SM_CXSCREEN);
  int ScreenHeight = GetSystemMetrics(SM_CYSCREEN);
  initgraph(ScreenWidth, ScreenHeight);// 创建绘图窗口
  HWND hwnd = GetHWnd(); // 获取绘图窗口句柄
  int x = 0; // 窗口左上角横坐标
  int y = 0; // 窗口左上角纵坐标
  SetWindowPos(hwnd, HWND_TOP, x, y, 0, 0, SWP_NOSIZE); // 设置窗口位置
  // 初始化所有彩球
  for (int i = 0; i < MAXLove; i++)
  {
    InitLove(i, ScreenWidth, ScreenHeight);
    Love[i].x = rand() % ScreenWidth;
  }
  // 初始化所有文字
  InitTexts(ScreenWidth, ScreenHeight);
  // 绘制彩球,按任意键退出
  while (!_kbhit())
  {
    for (int i = 0; i < MAXLove; i++)
      MoveLove(i, ScreenWidth, ScreenHeight);
    BeginBatchDraw();
    MoveText(ScreenWidth, ScreenHeight);
    FlushBatchDraw();
    Sleep(5);
  }
  EndBatchDraw();
  closegraph();// 关闭绘图窗口
}

图片

详细分析

图片

本代码使用了EasyX图形库和WinAPI,是一个萌萌哒的表白程序,主要功能是随机生成不同颜色的彩球和文字,在屏幕上自由飘动,让人感到温馨。

该程序主要分成以下几个部分:

图片

1

宏定义和数据结构定义

图片

在程序开头,先定义了一些宏和数据结构,用于控制彩球数量、文字数量、颜色等等。同时定义了两个结构体,分别用于存储彩球和文字的相关信息。

图片

2

初始化彩球和文字

图片

在程序开始运行时,先通过一个for循环,初始化了所有的彩球。根据屏幕的宽度和高度生成随机的x、y坐标、大小、颜色、下落速度,并将生成的彩球信息存储在Love数组中。同样地,也会初始化所有的文字,生成随机的x、y坐标、文字大小、方向、颜色、文字内容等信息,并将信息存储在text数组中。

图片

3

彩球下落和文字滚动

图片

在绘制窗口的过程中,使用for循环遍历所有的彩球和文字,通过MoveLove()函数实现彩球的下落效果,通过MoveText()函数实现文字的水平滚动效果。在下落和滚动的过程中,先通过setlinecolor()和setfillcolor()函数去除图形原来的颜色,再根据彩球或文字的新坐标和新的颜色进行填充。

图片

4

程序主函数

图片

在主函数中,先通过srand()函数设置随机种子,生成真正的随机数。然后通过initgraph()函数初始化图形窗口,并获取窗口句柄,设置窗口的位置。接着运用for循环,绘制所有彩球和文字。通过BeginBatchDraw()和EndBatchDraw()函数实现图形的批量绘制和刷新,加快图形绘制的速度。最后,在while循环中等待键盘输入,如果有键盘输入,则退出程序,并通过closegraph()函数关闭图形窗口。

图片

5

 总结

图片

本程序通过EasyX图形库和WinAPI,利用C++实现了一个简单的萌萌哒表白程序,让人感到温馨。程序运用到了数组、结构体、随机数、批量绘制、键盘输入等知识点,适合初学者练手。

图片

运行结果

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Leetcode刷题笔记题解(C++):LCR 181. 字符串中的单词反转

思路&#xff1a;根据栈的原理先进后出&#xff0c;使用栈来依次保存每个单词&#xff0c;然后再依次从栈中取出每个单词 class Solution { public:string reverseMessage(string message) {int left 0;int right message.size()-1;//消除字符串前后多余的空格&#xff0c;比…

mybatis数据输出-insert操作时获取自增列的值给对应的属性赋值

jdbc-修改 水果库存系统的 BaseDao 的 executeUpdate 方法支持返回自增列-CSDN博客 1、建库建表 CREATE DATABASE mybatis-example;USE mybatis-example;CREATE TABLE t_emp(emp_id INT AUTO_INCREMENT,emp_name CHAR(100),emp_salary DOUBLE(10,5),PRIMARY KEY(emp_id) );INSE…

点评项目——优惠卷秒杀

2023.12.8 本章将用redis实现优惠劵秒杀下单的功能。 构建全局唯一ID 我们都有在店铺中抢过优惠券&#xff0c;优惠券也是一种商品&#xff0c;当用户抢购时&#xff0c;就会生成订单并保存到数据库对应的表中&#xff0c;而订单表如果使用数据库自增ID就存在一些问题&#xf…

二叉树的锯齿形层序遍历[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你二叉树的根节点 root &#xff0c;返回其节点值的 锯齿形层序遍历 。&#xff08;即先从左往右&#xff0c;再从右往左进行下一层遍历&#xff0c;以此类推&#xff0c;层与层之间交替进行&#xff09;。 示例 1&#xff1a; 输…

【Java 基础】27 XML 解析

文章目录 1.SAX 解析器1&#xff09;什么是 SAX2&#xff09;SAX 工作流程初始化实现事件处理类解析 3&#xff09;示例代码 2.DOM 解析器1&#xff09;什么是 DOM2&#xff09;DOM 工作流程初始化解析 XML 文档操作 DOM 树 3&#xff09;示例代码 总结 在项目开发中&#xff0…

阿里云(云服务器)上搭建项目部署环境

目录 安装docker docker安装MySQL5.7.37 安装MySQL 方式一&#xff1a;docker中MySQL时区调整 方式二&#xff1a;docker中MySQL时区调整 docker安装MySQL8.0.27 docker安装redis5.0.14 云服务器上安装jdk1.8 安装docker 1、先卸载docker&#xff0c;因为有一些服务器…

Grad-CAM原理

这篇是我对哔哩哔哩up主 霹雳吧啦Wz 的视频的文字版学习笔记 感谢他对知识的分享 只要大家一提到深度学习 缺乏一定的解释性 比如说在我们之前讲的分类网络当中 网络它为什么要这么预测 它针对每个类别所关注的点在哪里呢 在great cam这篇论文当中呢 就完美的解决了在cam这篇论…

SpringSecurity6 | 自定义登录页面

✅作者简介&#xff1a;大家好&#xff0c;我是Leo&#xff0c;热爱Java后端开发者&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;Leo的博客 &#x1f49e;当前专栏&#xff1a; Java从入门到精通 ✨特色专栏&#xf…

基于Vue框架的电子商城购物平台小程序的设计与开发

基于JavaWebSSMVue电子商城购物平台小程序系统的设计和实现 源码获取入口KaiTi 报告/Ren务书Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 KaiTi 报告/Ren务书 一、选题的目的和意义 自从微信推出了微信小程序…

1.cloud-微服务架构编码构建

1.微服务cloud整体聚合父工程 1.1 New Project 1.2 Maven选版本 1.3 字符编码 1.4 注解生效激活 主要为lombok中的Data 1.5 java编译版本选8 1.6 File Type过滤 *.hprof;*.idea;*.iml;*.pyc;*.pyo;*.rbc;*.yarb;*~;.DS_Store;.git;.hg;.svn;CVS;__pycache__;_svn;vssver.scc;v…

Web 开发的 20 个实用网站

Web 开发的 20 个实用网站 作为一名前端开发工程师&#xff0c;我们一定使用过很多工具来提高自己的工作效率。它们可以是网站、文档或 JavaScript 库。 本文将分享30个有趣的网站。 JavaScript正则表达式可视化工具 https://jex.im/regulex/#!flags&re%5E(a%7Cb)*%3F%…

金南瓜SECS/GEM C# SDK 快速使用指南

本文对如何使用金南瓜SECS/GEM C# SDK 快速创建一个满足SECS/GEM通信要求的应用程序&#xff0c;只需简单3步完成。 第一步&#xff1a;创建C# .NET程序 示例使用Visual Studio 2010&#xff0c;使用者可以选择更高级版本 Visual Studio 第二步&#xff1a;添加DLL库引用&am…

力扣37. 解数独(java回溯解法)

Problem: 37. 解数独 文章目录 题目描述思路解题方法复杂度Code 题目描述 思路 该题可以使用回溯来模拟穷举。回溯问题通常涉及到可选列表&#xff0c;决策阶段&#xff0c;决策路径&#xff0c;而对于本题目我们选择将棋盘的每一个格子作为决策阶段&#xff0c;为此我们应该解…

短视频ai剪辑分发矩阵系统源码3年技术团队开发搭建打磨

如果您需要搭建这样的系统&#xff0c;建议您寻求专业的技术支持&#xff0c;以确保系统的稳定性和安全性。 在搭建短视频AI剪辑分发矩阵系统时&#xff0c;您需要考虑以下几个方面&#xff1a; 1. 技术实现&#xff1a;您需要选择适合您的需求和预算的技术栈&#xff0c;例如使…

STM32 配置TIM定时中断常用库函数

单片机学习&#xff01; 目录 ​编辑 1. 函数TIM_DeInit 2. 函数TIM_TimeBaseInit 配置时基单元 3. 函数TIM_TimeBaseStructInit 4. 函数TIM_Cmd 运行控制 5. 函数TIM_ITConfig 中断输出控制 6. 时基单元的时钟选择函数 6.1 函数TIM_InternalClockConfig 6.2 函数 TIM…

【图论笔记】克鲁斯卡尔算法(Kruskal)求最小生成树

【图论笔记】克鲁斯卡尔算法&#xff08;Kruskal&#xff09;求最小生成树 适用于 克鲁斯卡尔适合用来求边比较稀疏的图的最小生成树 简记&#xff1a; 将边按照升序排序&#xff0c;选取n-1条边&#xff0c;连通n个顶点。 添加一条边的时候&#xff0c;如何判断能不能添加…

python数据分析小案例:天猫订单数据综合分析

嗨喽~大家好呀&#xff0c;这里是魔王呐 ❤ ~! python更多源码/资料/解答/教程等 点击此处跳转文末名片免费获取 本数据集共收集了发生在一个月内的28010条数据&#xff0c;包含以下&#xff1a; 7个字段说明 订单编号&#xff1a;订单编号 总金额&#xff1a;订单总金额 买…

if语句和switch语句来确定金额之下的优惠折扣

一、优惠规则 输入相应的金额&#xff0c;可以获得规则之下&#xff0c;金额相应的享受的折扣&#xff0c;需要先定义金额&#xff0c;然后就是使用if语句进行判断&#xff0c;使用switch语句选择判断规则之下对应的优惠折扣。 二、相关代码 public class DiscountPrice {p…

Dockerfile文件

什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。 Docker通过读取Dockerfile中的指令自动生成映像。 docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Docke…

ConvNeXt V2: Co-designing and Scaling ConvNets with Masked Autoencoders

1.关于稀疏卷积的解释&#xff1a;https://zhuanlan.zhihu.com/p/382365889 2. 答案&#xff1a; 在深度学习领域&#xff0c;尤其是计算机视觉任务中&#xff0c;遮蔽图像建模&#xff08;Masked Image Modeling, MIM&#xff09;是一种自监督学习策略&#xff0c;其基本思想…