用C++写个简单的程序表白老妈

news2024/11/15 7:18:58

后天就是老妈的生日了,我打算写一个简单的程序表白老妈子,来肉麻一下她。在实现的过程中,有不少我没学过的知识,这些知识我都会予以补充。

创建图形窗口

创建图形窗口要包头文件:

#include<easyx.h>

这是简单的图形库,只要会写c语言就能用。

注意:只有先去官网下载这个图形库,再包才会生效!下载方法c站一搜就有。

包了这个图形库,我们以前运行程序出现的那个黑框窗口,就被图形窗口所取代了。

ok,现在要怎么创建图形窗口呢?用initgraph函数:初始化图形窗口。

#include<iostream>
#include<easyx.h>
​
int main() {
    initgraph(1000, 800);  //两个参数分别是 
    while(1)
    {}
    return 0;
}

这里的while(1){}只是为了让图形窗口停留,不然它会一闪而过。

创建出来的图形窗口:

🚩补充:initgraph函数

initgraph(w,h,f);

用于初始化图形窗口。

三个参数分别为: width 绘图环境的宽度 height 绘图环境高度 flag 绘图环境样式(可省略)

播放音乐

🚩这里要介绍一个用于播放音乐的函数mciSendString(),它是用来播放多媒体文件的API指令,可以播放mp3、wma、wav、mid等文件。

我先来介绍一下函数名,帮助大家理解。mci媒体控制接口:media control interface

mciSendString可以理解为:向mci发送命令字符串

它在使用时一般按这个格式写:

mciSendString("open XX.mp3",NULL,0,NULL);

如果这样写编译不过去,就用这个格式:

mciSendString(_T("open XX.mp3"),NULL,0,NULL);   //注意XX.mp3要写明它的路径

只需要记忆第一个参数,后面三个就按照格式的来。

第一个参数重点记忆三个:open、play、close,分别对应打开、播放、关闭。

使用mciSendString()前要包含头文件:#include<mmsystem.h>

并导入库:#pragma comment<lib."winmm.lib">

实现:

#include<iostream>
#include<easyx.h>
#include<mmsystem.h>  
#pragma comment(lib,"winmm.lib")  
​
void Display() {
    //播放背景音乐   
    mciSendString(_T("open ./source/别看我只是一只羊.mp3 alias bgm "), NULL,0, NULL);   //alias给文件取别名,叫bgm,便于后续操作
    mciSendString(_T("play bgm "), NULL, 0, NULL);
}
int main() {
    initgraph(1000, 800);
    Display(); 
    while(1)
    {}
    return 0;
}

输出文字

🚩补充:

1.设置字体样式settextstyle()

我们在vs下是能看到这个函数的参数的,分别为:高度、宽度、样式。

2.设置字体颜色settextcolor()

settextcolor(BLUE);  //将字体设为蓝色
settextcolor(RGB(223,234,100));   //自选字体颜色

如何自选字体颜色?

打开画图软件,选择你喜欢的颜色,然后记住这三个参数:

因为所有颜色都是由红绿蓝(RGB) 三原色合成的,所以输入这三个参数就可以合成对应的颜色。

3.输出文字outtextxy()

outtextxy()函数,可以这样理解:out text x y,在坐标(x,y)输出文本信息。它是C++中的一个绘图函数,可以在屏幕上输出文本信息。它使用起来也很简单:

void outtextxy(int x,int y,const char* str);  //前两个参数是坐标信息,第三个参数是要输出的文本

图形窗口中的坐标轴,原点在左上角,x轴向右,y轴向下。

实现:

void Display() {
    mciSendString(_T("open ./source/别看我只是一只羊.mp3 alias bgm "), NULL,0, NULL);
    mciSendString(_T("play bgm "), NULL, 0, NULL);
​
    //设置字体样式
    settextstyle(40, 20, _T("仿宋"));
    //设置颜色
    settextcolor(RGB(100,216,234));
    //输出文字
    outtextxy(50, 50, _T("妈妈,我是宝宝!"));
    outtextxy(50, 100, _T("明天就是你的生日了,"));
    outtextxy(50, 150, _T("祝你生日快乐!"));
    outtextxy(50, 200, _T("我写了首诗,献给你:"));
    outtextxy(50, 250, _T("“鹅鹅鹅,红掌拨清波”"));
}

emmmm,挺丑的。现在我们来把它变好看一点。

如何做出颜色闪动效果

刚刚的颜色太单调了,只有一种。我们想要的效果是,每过几秒,它就能随机变幻颜色。要想生成随机值,就用rand()。

让颜色随机

🚩生成随机数rand():

rand()不需要参数,它会返回一个从0到最大随机数的任意整数,最大随机数的大小通常是固定的一个大整数。

如果你要产生0~99这100个整数中的一个随机整数,可以表达为:int num = rand() %100; 这样,num的值就是一个0~99中的一个随机数了。

而RGB的参数值范围是0~255,所以就用rand()%256。

在用rand()的过程中,我遇到的几个问题:

1.连续生成的颜色都比较相近,不够随机!

这是因为没有设置种子。什么是种子?请听我说~

rand()产生的是 伪随机数,并不是真正的随机数。这个伪随机数 是根据种子推导得到的。

所谓种子,就是初值。打个比方,我给的初值是100,那这个100作为种子,推出的伪随机数是99。这个99再作为种子,推出的伪随机数是102。102再作为种子,……

现在,你能知道为啥rand()连续产生的数值都比较相近了吧!

只有初值变化,伪随机数才变。如果不涉及密码学,那用时间来当种子完全够了,因为时间是时时刻刻在变化的。

在rand()之前,用srand()播种:

srand((unsigned)time(NULL));   //用srand()设置种子,叫“播种”。以时间作为种子

但要注意:srand不能写在循环里,因为循环一次的时间间隔太短了,time十分相近,产生的种子就是相同的了。

srand写在循环外(前面),只设置一次就可以了。

对了,记得引头文件<time.h>

2.闪动得太快了!一秒变好几个颜色。

要想延迟,用Sleep()函数,注意S大写。

Sleep(1000);  //延迟1000ms

实现:

#include<iostream>
#include<easyx.h>
#include<time.h>
#include<mmsystem.h>   
#pragma comment(lib,"winmm.lib")  
​
void Display() {
    //每次循环开始前,要清屏
    cleardevice(); 
    //播放背景音乐  
    mciSendString(_T("open ./source/别看我只是一只羊.mp3 alias bgm "), NULL,0, NULL);
    mciSendString(_T("play bgm "), NULL, 0, NULL);
​
    //设置字体样式
    settextstyle(40, 29, _T("仿宋"));
    //设置文字颜色
    //srand((unsigned)time(NULL));
    settextcolor(RGB(rand()%256, rand() % 256, rand() % 256));
    //输出文字
    outtextxy(50, 50, _T("妈妈,我是宝宝!"));
    outtextxy(50, 100, _T("明天就是你的生日了,"));
    outtextxy(50, 150, _T("祝你生日快乐!"));
    outtextxy(50, 200, _T("我写了首诗,献给你:"));
    outtextxy(50, 250, _T("“鹅鹅鹅,红掌拨清波”"));
    //再插入点图案
    for (int i = 0; i < 8; i++) {      
        settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
        outtextxy(rand() % 1001, rand() % 651, _T("🤍"));
        outtextxy(rand() % 1001, rand() % 651, _T("🎈"));
    }
    Sleep(1000);
}
int main() {
    //创建图形窗口
    initgraph(1000, 650);
    srand((unsigned)time(NULL));
    while (1) {
        Display();
    }
    return 0;
}

让图案背景透明

但此时,我们会发现,字被图案遮挡了:

 

这是因为,图案的背景被填充上了颜色,这种颜色是不透明的。而此时我们希望透过图案背景看到下面的字。

这就需要我们在输出文字之前,设置背景为透明。

setbkmode函数(设置背景模式):

setbkmode(TRANSPARENT);

来看效果:

最终效果:

插入背景图

流程是这样的:

Step1.先创建一个IMAGE类型的数组,将你准备的几张背景图按个放进数组。

Step2.在Display函数中,选一张图片插入图形窗口。

🚩补充:

1.从图片文件获取图像loadimage

void loadimage(
IMAGE* p,     // 保存图像的 IMAGE 对象指针
LPCTSTR pImgFile,     // 图片文件名
int nWidth = 0,    // 图片的拉伸宽度
int nHeight = 0,     // 图片的拉伸高度
bool bResize = false     // 是否调整 IMAGE 的大小以适应图片
);

2.输出图像putimage(int left,int right,void*buf,int ops);

参数(left,top)为输出屏幕图像的左上角,即输出图像的起始位置。buf指向要输出的内存中图像。参数ops控制图像以何种方式输出到屏幕上(可省略)。

实现:

IMAGE img[2];   //创建全局的数组。注:IMAGE是一个类型
​
int main() {
    //创建图形窗口
    initgraph(1000, 650);
    //将图片放进数组
    loadimage(img, _T("./source/1.jpg"), 1000, 650);
    loadimage(img+1, _T("./source/2.png"), 1000, 650);
​
    //展示效果
    srand((unsigned)time(NULL));
    while (1) {
        Display();
    }
    return 0;
}
oid Display() {
    //每次循环开始前,要清屏
    cleardevice();
    //插入背景
    putimage(0, 0, img+1);
    //播放背景音乐 
    mciSendString(_T("open ./source/别看我只是一只羊.mp3 alias bgm "), NULL,0, NULL);
    mciSendString(_T("play bgm "), NULL, 0, NULL);
    ……
}

效果:

如果没看到效果,那可能是你图片的格式不行,我一开始那张图是.webp,不行。后来改属性变成.jpg或者.png,就可以了。

按任意键退出

为了展示效果,我们当前把程序写成了死循环。现在,我要达到 按任意键就能退出页面 的效果。这要用到函数_kbhit()。

包头文件:

#include<conio.h>

_kbhit()是用来检测有没有按键的,没有按键返回假。

那我们这样写,就可以让程序顺利运行,按键退出:

int main() {
    //创建图形窗口
    initgraph(1000, 650);
    //将图片放进数组
    loadimage(img, _T("./source/1.jpg"), 1000, 650);
    loadimage(img+1, _T("./source/2.png"), 1000, 650);
​
    //展示效果
    srand((unsigned)time(NULL));
    while (!_kbhit()) {     //没有按键返回真
        Display();
    }
    return 0;
}

那么最终效果呈现为:

(此处有bgm)

总代码

#include<iostream>
#include<easyx.h>
#include<conio.h>
#include<time.h>
#include<mmsystem.h>   
#pragma comment(lib,"winmm.lib")  
​
IMAGE img[2];
​
void Display() {
    //每次循环开始前,要清屏
    cleardevice();
    //插入背景
    putimage(0, 0, img+1);
    //播放背景音乐 
    mciSendString(_T("open ./source/别看我只是一只羊.mp3 alias bgm "), NULL,0, NULL);
    mciSendString(_T("play bgm "), NULL, 0, NULL);
​
    //设置字体样式
    settextstyle(40, 29, _T("仿宋"));
    //设置文字颜色
    settextcolor(RGB(rand()%256, rand() % 256, rand() % 256));
    //设置背景为透明
    setbkmode(TRANSPARENT);
    //输出文字
    outtextxy(50, 50, _T("妈妈,我是宝宝!"));
    outtextxy(50, 100, _T("明天就是你的生日了,"));
    outtextxy(50, 150, _T("祝你生日快乐!"));
    outtextxy(50, 200, _T("我写了首诗,献给你:"));
    outtextxy(50, 250, _T("“鹅鹅鹅,红掌拨清波”"));
​
    for (int i = 0; i < 8; i++) {
        settextcolor(RGB(rand() % 256, rand() % 256, rand() % 256));
        outtextxy(rand() % 1001, rand() % 651, _T("🤍"));
        outtextxy(rand() % 1001, rand() % 651, _T("🎈"));
    }
    Sleep(1000);
}
int main() {
    //创建图形窗口
    initgraph(1000, 650);
    //将图片放进数组
    loadimage(img, _T("./source/1.jpg"), 1000, 650);
    loadimage(img+1, _T("./source/2.png"), 1000, 650);
​
    //展示效果
    srand((unsigned)time(NULL));
    while (!_kbhit()) {
        Display();
    }
    return 0;
}

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

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

相关文章

WordPress主题模板 大前端D8 5.1版本完整开源版源码简洁大气多功能配置

源码测评&#xff1a;该模板官方已更新至5.2&#xff0c;但是这个5.1也是非常好用的&#xff0c;经测试所有页面均完好&#xff0c;推荐下载使用。 模板简介&#xff1a; 大前端D8 主题是一款非常牛逼的WordPress博客主题,响应式,功能齐全,支持手机,电脑,平板,非常适合做博客站…

vue项目,程序控制台不报错,但是也没有达到预期

敲代码时&#xff0c;有时控制台不报错&#xff0c;但是也不如预期那样展示 1&#xff0c;需要打断点&#xff0c;有可能是某个对象没有值&#xff0c;比如axios.js&#xff0c;如图所示&#xff1a; error里面不一定有msg&#xff0c;所以直接《error.msg.indexOf(cancelCach…

动手学深度学习—批量规范化(代码详解)

批量规范化 1. 训练深层网络2. 批量规范化层2.1 全连接层2.2 卷积层 3. 从零实现批量规范化层4. 使用批量规范化层的 LeNet 批量规范化&#xff08;batch normalization&#xff09;&#xff0c;可持续加速深层网络的收敛速度。 1. 训练深层网络 数据预处理的方式通常会对最终结…

Stable Diffusion AI绘图

提示词&#xff1a; masterpiece, best quality, 1girl, (anime), (manga), (2D), half body, perfect eyes, both eyes are the same, Global illumination, soft light, dream light, digital painting, extremely detailed CGI anime, hd, 2k, 4k background 反向提示词&…

微机原理:汇编指令集——调用传送指令、算术运算指令、转移类指令(详解)

文章目录 一、通用传送类指令1、数据传送指令2、堆栈操作指令 二、算术运算指令1、总图2、加减运算指令2.1 例子2.2 INC/DEC指令 3、比较指令 三、转移类指令1、无条件转移2、有条件转移2.1 无符号数条件转移指令2.2 有符号数条件转移指令2.3 例题一2.4 循环控制指令&#xff0…

【golang】Go中的切片slice和操作笔记,垃圾回收机制,重组 reslice ,复制和追加,内存结构

切片 文章目录 切片将切片传递给函数make() 创建一个切片new() 和 make()的区别多维切片bytes包for-range切片重组 reslice切片的复制和追加 字符串、数组和切片的应用获取字符串的某一部分字符串和切片的内存结构修改字符串中的某个字符字节数组对比函数搜索及排序切片和数组a…

非侵入式负荷检测与分解:电力数据挖掘新视角

电力数据挖掘 概述案例背景分析目标分析过程数据准备数据探索缺失值处理 属性构造设备数据周波数据模型训练 性能度量推荐阅读 主页传送门&#xff1a;&#x1f4c0; 传送 概述 摘要&#xff1a;本案例将根据已收集到的电力数据&#xff0c;深度挖掘各电力设备的电流、电压和功…

全网最全面最深入 剖析华为“五看三定”战略神器中的“五看”(即市场洞察)(长文干货,建议收藏)

添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; &#xff08;本文摘自谢宁专著《华为战略管理法&#xff1a;DSTE实战体系》&#xff0c;欢迎购买&#xff09; 兵法有云&#xff1a;胜兵先胜而后求战&#xff0c;败兵先战而后求胜&#xff0c;所谓胜兵先…

对被测软件来说,需要多少测试就足够了?

相信每位测试人员或者测试团队都曾遇到这样的问题“需要多少测试才能确保软件成功发布”。这个答案很难回答&#xff0c;在很大程度上&#xff0c;这取决于被测软件的类型、用途和目标受众。所有的测试人员都希望用一种比测试手电筒的应用程序更严格的方法来测试其他软件。然而…

JavaScript异步编程:提升性能与用户体验

目录 什么是异步编程&#xff1f; 回调函数 Promise Async/Await 总结 在Web开发中&#xff0c;处理耗时操作是一项重要的任务。如果我们在执行这些操作时阻塞了主线程&#xff0c;会导致页面失去响应&#xff0c;用户体验下降。JavaScript异步编程则可以解决这个问题&…

睿趣科技:抖音开网店多久回本

随着互联网的发展&#xff0c;越来越多的人选择在抖音上开设网店。然而&#xff0c;开店容易&#xff0c;经营难。许多人关心的问题是&#xff1a;抖音开网店多久能回本? 首先&#xff0c;我们需要明确一点&#xff0c;抖音开网店的回本时间并不是固定的&#xff0c;它受到许多…

经典卷积神经网络 - NIN

网络中的网络&#xff0c;NIN。 AlexNet和VGG都是先由卷积层构成的模块充分抽取空间特征&#xff0c;再由全连接层构成的模块来输出分类结果。但是其中的全连接层的参数量过于巨大&#xff0c;因此NiN提出用1*1卷积代替全连接层&#xff0c;串联多个由卷积层和“全连接”层构成…

C语言:杨氏矩阵、杨氏三角、单身狗1与单身狗2

下面介绍四道题目和解法 1.杨氏矩阵 算法&#xff1a;右上角计算 题目&#xff1a;有一个数字矩阵&#xff0c;矩阵的每行从左到右是递增的&#xff0c;矩阵从上到下是递增的&#xff0c;请编写程序在这样的矩阵中查找某个数字是否存在。 要求&#xff1a;时间复杂度小于O(N…

react笔记基础部分(组件生命周期路由)

注意点&#xff1a; class是一个关键字&#xff0c; 类。 所以react 写class, 用classname &#xff0c;会自动编译替换class 点击方法&#xff1a; <button onClick {this.sendData}>给父元素传值</button>常用的插件&#xff1a; 需要引入才能使用的&#xf…

ubuntu执行普通用户或root用户执行apt-get update时报错Couldn‘t create temporary file /tmp/...

apt-get update无法更新&#xff0c;报错&#xff1a; Couldnt create temporary file /tmp/apt.conf.GSzv74 for passing config to&#xff0c;&#xff0c;&#xff0c; 这是由于/tmp目录没有权限导致的&#xff0c;解决办法&#xff1a; chmod 777 /tmp

额定电压输出电流:电源性能测试指标之一

额定电压和额定电流是电源设计生产时需要考虑的两个重要参数&#xff0c;额定电压是电源输出的电压标准&#xff0c;额定电流是电源能够提供的最大电流容量。这两个参数是评估电源性能的重要指标之一&#xff0c;指导着电气设备的正常工作运行。 额定电压输出电流测试方法 额定…

上门家政维修多城市代理多商户师傅入驻小程序开源版开发

上门家政维修多城市代理多商户师傅入驻小程序开源版开发 用户登录/注册&#xff1a;用户可以使用手机号或第三方账号登录或注册小程序。 服务分类&#xff1a;在主页上显示不同的服务分类&#xff0c;例如电器维修、家具拆装、管道疏通、清洁保洁等。 城市选择&#xff1a;用…

C++反转链表递归

文章目录 题目描述解题思路代码复杂度分析 题目描述 LCR 024. 反转链表 - 力扣&#xff08;LeetCode&#xff09; 给定单链表的头节点 head &#xff0c;请反转链表&#xff0c;并返回反转后的链表的头节点。 解题思路 这里我们采用递归的思路来解决首先我们分为两个视角来查看…

竞赛选题 深度学习卫星遥感图像检测与识别 -opencv python 目标检测

文章目录 0 前言1 课题背景2 实现效果3 Yolov5算法4 数据处理和训练5 最后 0 前言 &#x1f525; 优质竞赛项目系列&#xff0c;今天要分享的是 &#x1f6a9; **深度学习卫星遥感图像检测与识别 ** 该项目较为新颖&#xff0c;适合作为竞赛课题方向&#xff0c;学长非常推荐…

超好用的数据可视化工具推荐,小白也适用!

Excel、Tableau……可以做数据可视化的工具不少&#xff0c;但简单、好用又高效&#xff0c;甚至连无SQL基础的小白也能轻松使用的就真没几个。奥威BI数据可视化工具是少有的操作难度低、成本支出低、灵活自助分析能力强的BI工具。 1、操作难度低 奥威BI数据可视化工具的操作…