C++过生日(我给我自己做的生日礼物)

在这里插入图片描述

在这里插入图片描述在这里插入图片描述

🚀欢迎互三👉:程序猿方梓燚 💎💎
🚀关注博主,后期持续更新系列文章
🚀如果有错误感谢请大家批评指出,及时修改
🚀感谢大家点赞👍收藏⭐评论✍

引言

今天是我的生日,我写了一段代码作为自己的生日礼物。

一、项目要求

主要功能是播放一段音乐旋律并展示一张图片,模拟 “祝我生日快乐” 的场景。

二、代码详解

一、包含的头文件及库

#include <iostream>
// 引入输入输出流头文件,用于控制台的输入输出操作。#include <Windows.h>
// 提供与 Windows 操作系统交互的功能,在这里用于播放 MIDI 音乐。#include<cstdio>
// 提供标准输入输出函数。#include<cstdlib>
// 提供通用的函数,如内存分配等。#include <graphics.h>
// 用于图形绘制,可创建图形窗口和进行图像显示等操作。#include <conio.h>
// 提供控制台输入输出相关功能,如获取用户输入等。#include <thread>
// 支持多线程编程,允许同时执行多个任务。

这部分代码引入了多个头文件,为程序提供了不同的功能支持。iostream用于输入输出操作,Windows.h用于与 Windows 系统交互以播放 MIDI 音乐,cstdiocstdlib提供了 C 风格的输入输出和通用函数,graphics.h用于图形绘制,conio.h用于控制台输入输出,thread用于多线程编程。

二、枚举定义

音阶枚举Scale

enum Scale {Rest = 0,C8 = 108,B7 = 107,A7s = 106,A7 = 105,G7s = 104,G7 = 103,F7s = 102,F7 = 101,E7 = 100,D7s = 99,D7 = 98,C7s = 97,C7 = 96,B6 = 95,A6s = 94,A6 = 93,G6s = 92,G6 = 91,F6s = 90,F6 = 89,E6 = 88,D6s = 87,D6 = 86,C6s = 85,C6 = 84,B5 = 83,A5s = 82,A5 = 81,G5s = 80,G5 = 79,F5s = 78,F5 = 77,E5 = 76,D5s = 75,D5 = 74,C5s = 73,C5 = 72,B4 = 71,A4s = 70,A4 = 69,G4s = 68,G4 = 67,F4s = 66,F4 = 65,E4 = 64,D4s = 63,D4 = 62,C4s = 61,C4 = 60,B3 = 59,A3s = 58,A3 = 57,G3s = 56,G3 = 55,F3s = 54,F3 = 53,E3 = 52,D3s = 51,D3 = 50,C3s = 49,C3 = 48,B2 = 47,A2s = 46,A2 = 45,G2s = 44,G2 = 43,F2s = 42,F2 = 41,E2 = 40,D2s = 39,D2 = 38,C2s = 37,C2 = 36,B1 = 35,A1s = 34,A1 = 33,G1s = 32,G1 = 31,F1s = 30,F1 = 29,E1 = 28,D1s = 27,D1 = 26,C1s = 25,C1 = 24,B0 = 23,A0s = 22,A0 = 21
};

这个枚举定义了不同的音阶,从最低音A0到最高音C8,还包括一个休止符Rest。它为后续播放音乐时表示不同的音符提供了一种方便的方式。

声音枚举Voice

enum Voice {X1 = C2,X2 = D2,X3 = E2,X4 = F2,X5 = G2,X6 = A2,X7 = B2,L1 = C3,L2 = D3,L3 = E3,L4 = F3,L5 = G3,L6 = A3,L7 = B3,M1 = C4,M2 = D4,M3 = E4,M4 = F4,M5 = G4,M6 = A4,M7 = B4,H1 = C5,H2 = D5,H3 = E5,H4 = F5,H5 = G5,H6 = A5,H7 = B5,LOW_SPEED = 500,MIDDLE_SPEED = 400,HIGH_SPEED = 300,_ = 0XFF
};

这个枚举定义了不同的音符以及一些特殊的值。其中,从X1H7分别对应不同的音符,LOW_SPEEDMIDDLE_SPEEDHIGH_SPEED表示不同的播放速度,_是一个占位符。这个枚举为播放音乐提供了更多的控制选项。
枚举定义部分的作用是为程序中的不同音符和特殊值提供一种易于理解和使用的命名方式,使得代码更加清晰可读。同时,也方便在后续的代码中进行音乐播放和控制。

三、函数实现

播放音乐函数SRKL

void SRKL() {HMIDIOUT handle;// 打开一个 MIDI 输出设备,并将设备句柄存储在 handle 变量中。midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);int volume = 0x7f;// 定义音量为 0x7f。int voice = 0x0;// 初始化音符编号为 0。int sleep = 400;// 定义初始延迟时间为 400 毫秒。int tmp = 6;// 定义一个临时变量 tmp 并初始化为 6。int srkl[] = {L5, L5, L6, _, L5, _, M1, _, L7, _, _, _, L5, L5, L6, _, L5, _, M2, _, M1, _, _, L5, L5, M5, _, M3, _, M1, _,L7, _, L6, _, M4, M4, M3, _, M1, _, M2, _, M1, _, _, _,L5, L5, L6, _, L5, _, M1, _, L7, _, _, _, L5, L5, L6, _, L5, _, M2, _, M1, _, _, L5, L5, M5, _, M3, _, M1, _,L7, _, L6, _, M4, M4, M3, _, M1, _, M2, _, M1, _, _, _,};// 定义一个数组 srkl,其中包含了一系列音符和特殊标识,用于播放音乐旋律。for (int i : srkl) {if (i == LOW_SPEED || i == HIGH_SPEED || i == MIDDLE_SPEED) {sleep = i;// 如果当前元素是速度标识(LOW_SPEED、HIGH_SPEED、MIDDLE_SPEED),则更新延迟时间 sleep。continue;}if (i == 0) {sleep = 200;// 如果当前元素是 0,则将延迟时间设置为 200 毫秒。continue;}if (i == 700) {Sleep(200);// 如果当前元素是 700,则延迟 200 毫秒。continue;}if (i == _) {Sleep(400);// 如果当前元素是占位符 _,则延迟 400 毫秒。continue;}if (i == 1000) {tmp += 5;// 如果当前元素是 1000,则增加临时变量 tmp 的值。continue;}voice = (volume << 16) + ((i + tmp) << 8) + 0x90;// 计算音符编号 voice。midiOutShortMsg(handle, voice);// 通过 MIDI 输出设备发送音符编号播放音符。Sleep(sleep);// 根据延迟时间 sleep 进行延迟。}midiOutClose(handle);// 关闭 MIDI 输出设备。
}

这个函数用于播放一段特定的音乐旋律。它通过打开 MIDI 输出设备,设置音量、延迟时间等参数,然后遍历一个音符数组,根据不同的音符值进行不同的操作,包括播放音符、设置延迟时间等。最后关闭 MIDI 输出设备。

展示图片函数photo

void photo() {initgraph(614, 446); // 初始化图形窗口,设置窗口大小为 614x446。// 加载图片IMAGE img;loadimage(&img, "res\\1.png");// 加载名为“res\\1.png”的图片到 IMAGE 对象 img 中。// 在窗口中绘制图片putimage(0, 0, &img);// 在图形窗口的左上角(0,0)位置绘制图片。_getch();// 等待用户输入。closegraph();// 关闭图形窗口。
}

这个函数用于在图形窗口中展示一张图片。它首先初始化图形窗口,然后加载指定的图片,将图片绘制在窗口中,等待用户输入后关闭图形窗口。

四、主函数main

int main() {system("title 祝我生日快乐");// 设置控制台窗口标题为“祝我生日快乐”。thread musicThread(SRKL);thread photoThread(photo);// 创建两个线程,一个线程执行 SRKL 函数播放音乐,另一个线程执行 photo 函数展示图片。musicThread.join();photoThread.join();// 等待两个线程执行完毕。return 0;
}

主函数首先设置控制台窗口标题,然后创建两个线程分别用于播放音乐和展示图片。接着,等待这两个线程执行完毕,最后返回 0,表示程序正常结束。

三、完整代码

#include <iostream>
// 引入输入输出流头文件,用于控制台的输入输出操作。
#include <Windows.h>
// 提供与 Windows 操作系统交互的功能,在这里用于播放 MIDI 音乐。
#include<cstdio>
// 提供标准输入输出函数。
#include<cstdlib>
// 提供通用的函数,如内存分配等。
#include <graphics.h>
// 用于图形绘制,可创建图形窗口和进行图像显示等操作。
#include <conio.h>
// 提供控制台输入输出相关功能,如获取用户输入等。
#include <thread>
// 支持多线程编程,允许同时执行多个任务。#pragma comment(lib,"winmm.lib")
// 链接 winmm.lib 库,用于播放 MIDI 音乐。// 定义音阶枚举
enum Scale {Rest = 0,// 表示休止符,值为 0。C8 = 108,// 表示高音 C,音符值为 108。B7 = 107,// 以下类似,分别表示不同的音符。A7s = 106,A7 = 105,G7s = 104,G7 = 103,F7s = 102,F7 = 101,E7 = 100,D7s = 99,D7 = 98,C7s = 97,C7 = 96,B6 = 95,A6s = 94,A6 = 93,G6s = 92,G6 = 91,F6s = 90,F6 = 89,E6 = 88,D6s = 87,D6 = 86,C6s = 85,C6 = 84,B5 = 83,A5s = 82,A5 = 81,G5s = 80,G5 = 79,F5s = 78,F5 = 77,E5 = 76,D5s = 75,D5 = 74,C5s = 73,C5 = 72,B4 = 71,A4s = 70,A4 = 69,G4s = 68,G4 = 67,F4s = 66,F4 = 65,E4 = 64,D4s = 63,D4 = 62,C4s = 61,C4 = 60,B3 = 59,A3s = 58,A3 = 57,G3s = 56,G3 = 55,F3s = 54,F3 = 53,E3 = 52,D3s = 51,D3 = 50,C3s = 49,C3 = 48,B2 = 47,A2s = 46,A2 = 45,G2s = 44,G2 = 43,F2s = 42,F2 = 41,E2 = 40,D2s = 39,D2 = 38,C2s = 37,C2 = 36,B1 = 35,A1s = 34,A1 = 33,G1s = 32,G1 = 31,F1s = 30,F1 = 29,E1 = 28,D1s = 27,D1 = 26,C1s = 25,C1 = 24,B0 = 23,A0s = 22,A0 = 21
};// 定义声音枚举
enum Voice {X1 = C2,// 将 X1 定义为 C2 对应的音符值。X X2 = D2,// 以下类似,分别对应不同的音符。X3 = E2,X4 = F2,X5 = G2,X6 = A2,X7 = B2,L1 = C3,L2 = D3,L3 = E3,L4 = F3,L5 = G3,L6 = A3,L7 = B3,M1 = C4,M2 = D4,M3 = E4,M4 = F4,M5 = G4,M6 = A4,M7 = B4,H1 = C5,H2 = D5,H3 = E5,H4 = F5,H5 = G5,H6 = A5,H7 = B5,LOW_SPEED = 500,// 定义低速度播放对应的延迟时间为 500 毫秒。MIDDLE_SPEED = 400,// 定义中速度播放对应的延迟时间为 400 毫秒。HIGH_SPEED = 300,// 定义高速度播放对应的延迟时间为 300 毫秒。_ = 0XFF// 定义一个占位符,值为 0XFF。
};// 播放音乐的函数
void SRKL() {HMIDIOUT handle;// 定义一个 MIDI 输出设备句柄。midiOutOpen(&handle, 0, 0, 0, CALLBACK_NULL);// 打开 MIDI 输出设备,并将句柄存储在 handle 中。int volume = 0x7f;// 定义音量为 0x7f。int voice = 0x0;// 初始化音符编号为 0。int sleep = 400;// 定义初始延迟时间为 400 毫秒。int tmp = 6;// 定义一个临时变量 tmp 并初始化为 6。int srkl[] = {L5, L5, L6, _, L5, _, M1, _, L7, _, _, _, L5, L5, L6, _, L5, _, M2, _, M1, _, _, L5, L5, M5, _, M3, _, M1, _,L7, _, L6, _, M4, M4, M3, _, M1, _, M2, _, M1, _, _, _,L5, L5, L6, _, L5, _, M1, _, L7, _, _, _, L5, L5, L6, _, L5, _, M2, _, M1, _, _, L5, L5, M5, _, M3, _, M1, _,L7, _, L6, _, M4, M4, M3, _, M1, _, M2, _, M1, _, _, _,};// 定义一个数组 srkl,其中包含了一系列音符和特殊标识,用于播放音乐旋律。for (int i : srkl) {if (i == LOW_SPEED || i == HIGH_SPEED || i == MIDDLE_SPEED) {sleep = i;// 如果当前元素是速度标识(LOW_SPEED、HIGH_SPEED、MIDDLE_SPEED),则更新延迟时间 sleep。continue;}if (i == 0) {sleep = 200;// 如果当前元素是 0,则将延迟时间设置为 200 毫秒。continue;}if (i == 700) {Sleep(200);// 如果当前元素是 700,则延迟 200 毫秒。continue;}if (i == _) {Sleep(400);// 如果当前元素是占位符 _,则延迟 400 毫秒。continue;}if (i == 1000) {tmp += 5;// 如果当前元素是 1000,则增加临时变量 tmp 的值。continue;}voice = (volume << 16) + ((i + tmp) << 8) + 0x90;// 计算音符编号 voice。midiOutShortMsg(handle, voice);// 通过 MIDI 输出设备发送音符编号播放音符。Sleep(sleep);// 根据延迟时间 sleep 进行延迟。}midiOutClose(handle);// 关闭 MIDI 输出设备。
}void photo() {initgraph(614, 446); // 初始化图形窗口,设置窗口大小为 614x446。// 加载图片IMAGE img;loadimage(&img, "res\\1.png");// 加载名为“res\\1.png”的图片到 IMAGE 对象 img 中。// 在窗口中绘制图片putimage(0, 0, &img);// 在图形窗口的左上角(0,0)位置绘制图片。_getch();// 等待用户输入。closegraph();// 关闭图形窗口。
}int main() {system("title 祝我生日快乐");// 设置控制台窗口标题为“祝我生日快乐”。thread musicThread(SRKL);// 创建一个线程 musicThread,用于执行播放音乐的函数 SRKL。thread photoThread(photo);// 创建一个线程 photoThread,用于执行展示图片的函数 photo。musicThread.join();// 等待 musicThread 线程执行完毕。photoThread.join();// 等待 photoThread 线程执行完毕。return 0;
}

四、总结

该程序通过结合音乐播放和图片展示,为用户提供了一种多媒体的体验。利用多线程技术确保音乐和图片的展示可以同时进行,提高了程序的效率和用户体验。同时,代码中的枚举定义使得音符和特殊值的表示更加清晰可读,方便了音乐播放的控制。

五、素材

高清无水印图片素材如下↓↓↓
在这里插入图片描述

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

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

相关文章

电脑开机速度慢怎么解决?

电脑开机速度慢怎么解决&#xff1f;电脑开机速度慢的原因可以是多方面的&#xff0c;以下是一些常见的原因&#xff1a; 启动项过多&#xff1a; 许多软件在系统启动时会自动启动&#xff0c;导致启动项过多&#xff0c;从而延长了开机时间。过时的驱动程序&#xff1a; 设备…

wpf触发与模板的使用示例:批量生产工具

批量生产工具 <Window x:Class"WpfM20UpdateFW.MainWindow"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://schemas.microsoft.com/expressio…

2024年Java后端学习路线

思维导图&#xff1a; 必备知识&#xff1a; Java基础 JavaWeb 数据库&#xff1a;MySql&#xff0c;Redis 开发中间件&#xff1a;Maven &#xff0c;Git &#xff0c;Docker&#xff0c;RabbitMQ 开发框架&#xff1a;SSM&#xff0c;spring boot&#xff0c;mybatis-plus、s…

十一、DMSP/OLS、NPP/VIIRS等夜间灯光数据之GDP空间化——新方法理论介绍

一、前言 之前的空间理论方法是将第一产业GDP和第二、三产业GDP分开,第一产业GDP和耕地面积进行反演,第二、三产业GDP和夜间灯光指数进行拟合,或者干脆不划分产业,就是第一、二、三产业gdp数据和夜间灯指数拟合。之前给大家介绍都是这种,那么现在很多文献提出一种新的做法…

JVM 运行时数据区域

目录 前言 程序计数器 java虚拟机栈 本地方法栈 java堆 方法区 运行时常量池 前言 首先, java程序在被加载在内存中运行的时候, 会把他自己管理的内存划分为若干个不同的数据区域, 就比如你是一个你是一个快递员, 一堆快递过来需要你分拣, 这个时候, 你就需要根据投放的目…

[产品管理-23]:NPDP新产品开发 - 21 - 产品创新中的市场调研 - 市场调研对创新产品开发的意义

目录 前言&#xff1a; 一、市场调研概述 1.1 客户与市场的区别 1、定义与范围 2、关注焦点 3、作用与影响 4、总结 1.2 销售与市场的区别 1、对象与范围 2、工作方式 3、工作内容 4、目标 5、考核标准 6、在企业运营中的角色 1.3 什么是市场调研 1、市场调研的…

COMDEL电源维修CLX2500康戴尔射频电源维修

美国COMDEL射频电源维修常见型号包括&#xff1a;CLX2750&#xff1b;CLX2500&#xff1b;CLX-600H&#xff1b;CX600AS&#xff1b;CX-5000S&#xff1b;CX-3500S&#xff1b;CX-2500S&#xff1b;CV500&#xff1b;CDX2000等。 Comdel成立于1966年&#xff0c;总部设在马萨诸…

Golang | Leetcode Golang题解之第406题根据身高重建队列

题目&#xff1a; 题解&#xff1a; func reconstructQueue(people [][]int) (ans [][]int) {sort.Slice(people, func(i, j int) bool {a, b : people[i], people[j]return a[0] > b[0] || a[0] b[0] && a[1] < b[1]})for _, person : range people {idx : pe…

maya-vray渲染蒙版

要用一个叫vrayMulWrapper的材质球&#xff0c;把alpha Conterbution调到-1&#xff0c;勾选matte surface启用蒙版物体。

【GESP】C++一级练习BCQM3005,基本输出语句printf

一道基础练习题&#xff0c;练习基本输出语句printf。 BCQM3005 题目要求 描述 输出表达式1234∗5678的结果。 输入 无 输出 1234∗56787006652 输入样例 无 输出样例 1234 * 5678 7006652 全文详见个人独立博客&#xff1a;https://www.coderli.com/gesp-1-bcqm3005/ 【…

在树莓派上构建和部署 Node.js 项目

探索在Raspberry Pi上构建和部署Node.js项目的最佳实践。通过我们的专业提示和技巧&#xff0c;克服常见挑战&#xff0c;使您的项目顺利运行。 去年圣诞节&#xff0c;我收到了一份极其令人着迷的礼物&#xff0c;它占据了我许多周末的时间&#xff0c;甚至让我夜不能寐。它就…

零基础考过软考信息系统项目管理师经验分享

选择适合的课程&#xff1a;如果你是零基础&#xff0c;建议找一些专门针对新手的课程&#xff0c;讲解通俗易懂。 刷题至关重要&#xff1a;软考的题库很庞大&#xff0c;多做题是必须的。 做好笔记和复习&#xff1a;上课时要做好笔记&#xff0c;课后及时复习&#xff0c;…

网络安全学习(二)初识kali

kali有两种界面模式&#xff0c;为了更好的适应windows用户&#xff0c;需要操作一下。 先更新一下kali&#xff0c;执行命令 sudo apt-get update 然后换界面 sudo apt install kali-desktop-gnome 等待&#xff0c;出现如下界面时&#xff0c;选择gdm3&#xff08;键盘&a…

Mybatis中Like模糊查询三种处理方式

目录 Mybatis中Like模糊查询三种处理方式 1.通过单引号拼接${} 1&#xff09;mapper接口 2&#xff09;Mapper.xml 3&#xff09;测试代码 4) 测试结果 2.通过concat()函数拼接(个人推荐使用这种) 1&#xff09;mapper接口 2&#xff09;Mapper.xml 3&#xff09;测试代码 4) 测…

Requests-HTML模块怎样安装和使用?

要安装和使用Requests-HTML模块&#xff0c;您可以按照以下步骤进行操作&#xff1a; 打开命令行界面&#xff08;如Windows的命令提示符或Mac的终端&#xff09;。 使用pip命令安装Requests-HTML模块。在命令行中输入以下命令并按回车键执行&#xff1a; pip install request…

工厂模式(一):简单工厂模式

一、概念 顾名思义&#xff0c;带着工厂&#xff0c;两字肯定就是有标准、快速、统一等等一些工厂独有的特点。 那么什么是简单工厂模式呢&#xff1f; 定义&#xff1a;简单工厂模式是一种创建对象的设计模式&#xff0c;它定义了一个工厂类通过某个静态方法来生成不同类型的…

熵权法详细讲解+Python代码实现

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

C#/.NET/.NET Core技术前沿周刊 | 第 5 期(2024年9.9-9.15)

前言 C#/.NET/.NET Core技术前沿周刊&#xff0c;你的每周技术指南针&#xff01;记录、追踪C#/.NET/.NET Core领域、生态的每周最新、最实用、最有价值的技术文章、社区动态、优质项目和学习资源等。让你时刻站在技术前沿&#xff0c;助力技术成长与视野拓宽。 欢迎投稿&…

Docker安装mysql安装nginx安装Redis

Docker安装mysql 下载镜像 docker pull mysql:8.0注意,使用此方法安装镜像需要提前配置镜像源,详情看之前的文章 安装 docker run -d -p 3306:3306 \ --name mysql \ --restartalways \ --privilegedtrue \ -e TZAsia/Shanghai \ -e MYSQL_ROOT_PASSWORDroot \ mysql:8.0进…

[网络]https的概念及加密过程

文章目录 一. HTTPS二. https加密过程 一. HTTPS https本质上就是http的基础上增加了一个加密层, 抛开加密之后, 剩下的就是个http是一样的 s > SSL HTTPS HTTP SSL 这个过程, 涉及到密码学的几个核心概念 明文 要传输的真正意思是啥 2)密文 加密之后得到的数据 这个密文…