本人自学C++已有一段时间了,但接触到EasyX图形库不久,因最近体彩大乐透接连中出2注亿元大奖,本人受此启发,用C++运用EasyX图形库在控制台模式下编写出一个‘ 天降横财 ’的小程序来自娱自乐并憧憬一下! 也算是对自己所掌握C++知识的 检验 吧 。先看看运行效果图(本程序在VS2019 下运行通过):

天降横财
一.编写程序前的准备 ( 一)程序构思 1.要在程序显示窗口中的不同位置上“ 天降横财 ”和“ 财神到!财神赐财啦! ”及“ 恭喜你发大财! ”的文字; 2.要从显示窗口中的 顶部向下每次徐徐下落5张图片 (每次下落高度是不同的,其中 中间2张是静态固定调用 , 其余10张是动态随机调用的 ,本人将其和MP3音乐一起放在‘MySrc’文件夹内)。 (二)编写前要准备的素材 1. 透明PNG图片 (本人准备12张图片)及一张256x256尺寸的透明PNG图标;2.一首‘ 财神到 ’的MP3音乐作为背景音乐(程序打开后 一直 循环*放播**下去)。


二.编写代码 (一)编写程序时遇到的难点 1.采用普通情况下生成的随机种子在重复2次调用随机数后会产生3个相同的随机数( 导致 一直 同时出现3张相同图片 ): 后来上网查资料后知道: 因在极短时间内若计时器产生的随机种子的频率不较高,会导致产生相同的随机数, 因此要 制作高频计时器 用来给rand()初始化种子用。 2.贴透明PNG图片 若使用putImag函数来直接贴图,则显示出来的透明PNG图片 是不透明的 ,因此自己又要上网查资料,利用他人 编写能显示透明PNG图片的功能函数来实现。 (二)程序的代码如下 /*--------天降横财---------注意:因为要使用loadimage函数加载随机产生的变量来选择图片,因此本程序一定设置为' 使用多字节字符集 ',尤其在Release状态下 */#include <graphics.h>#include <Windows.h>#include <time.h>#include <cmath>#include <iostream> #pragma comment(lib,"winmm.lib") //引用Winmm.lib链接库来插*放播**音乐#pragma comment( lib, "MSIMG32.LIB") using namespace std; #define SCR_WIDTH 1260#define SCR_HEIGHT 820#define PIC_WIDTH 225 //165#define PIC_HEIGHT1 165 //121#define PIC_HEIGHT2 253 IMAGE CoinImg1, CoinImg2, CoinImg3, CoinImgA, CoinImgB; const int NUM_IMAGES = 10 ; // 10张图 const char* images[NUM_IMAGES] = { "MySrc\\Coin0.png",//放MySrc文件夹内 "MySrc\\Coin1.png", "MySrc\\Coin2.png", "MySrc\\Coin3.png", "MySrc\\Coin4.png", "MySrc\\Coin5.png", "MySrc\\Coin6.png", "MySrc\\Coin7.png", "MySrc\\Coin8.png", "MySrc\\Coin9.png" //注意此处是无逗号}; //注意:此处一定要加上'const //制作高频计时器 int randEx() { LARGE_INTEGER seed;//只要使初始种子的单位比秒更小即可QueryPerformanceFrequency(&seed); QueryPerformanceCounter(&seed); srand(seed.QuadPart);//初始化一个以微秒为单位的时间种子 return rand();} void loadRandomImage() { // 初始化随机数生成器 int RanId; srand((unsigned)time(NULL)); // 生成一个随机索引来选择一张图片 RanId= randEx() % NUM_IMAGES; loadimage(&CoinImg1,images[RanId], PIC_WIDTH, PIC_HEIGHT1);// 因为使用此随机变量'images[randomIndex]',一定设置为' 使用多字节字符集 ' srand((unsigned)time(NULL)); srand((unsigned)time(NULL));// 设置再做一次,是为保证留有较多时间去改变随机因子从而真正产生不同的随机数 RanId = randEx() % NUM_IMAGES; loadimage(&CoinImg2, images[RanId], PIC_WIDTH, PIC_HEIGHT1); srand((unsigned)time(NULL)); srand((unsigned)time(NULL)); RanId = randEx() % NUM_IMAGES; loadimage(&CoinImg3, images[RanId], PIC_WIDTH, PIC_HEIGHT1);} //编写能显示透明PNG图片的功能 ,若使用PutImg函数来直接贴图,则显示出来的PNG图片是不透明的void transparentimage(IMAGE* dstimg, int x, int y, IMAGE* srcimg) { HDC dstDC = GetImageHDC(dstimg); HDC srcDC = GetImageHDC(srcimg); int w = srcimg->getwidth(); int h = srcimg->getheight(); BLENDFUNCTION bf = { AC_SRC_OVER, 0, 255, AC_SRC_ALPHA }; AlphaBlend(dstDC, x, y, w, h, srcDC, 0, 0, w, h, bf);} void flash_word(){ settextstyle(65, 0, "黑体"); //设置文字大小和字体 settextcolor(RGB(255, 255, 15));//设置字体颜色为黄色 outtextxy(545, 30, "天降横财"); setfont(58, 0, "黑体"); //setcolor(RED); //设置字体颜色为红色 settextcolor(RGB(238, 0, 0)); //设置字体颜色为红色 outtextxy(385, 130, "财神到!财神赐财啦!"); settextcolor(RGB(255, 0, 255)); //设置字体颜色为洋红色 outtextxy(500,220,"恭喜你发大财!"); } int main(){ // 初始化设备 initgraph(SCR_WIDTH, SCR_HEIGHT); HWND hwnd = GetHWnd(); //获得窗口句柄 SetWindowText(hwnd, "C++编写的天降横财"); //修改窗口名称, //设置背景颜色 setbkcolor(RGB(250, 225, 225)); //设置背景颜色为浅红色 //setbkcolor(WHITE); cleardevice();//清屏 // 静态下加载元宝图片 loadRandomImage(); loadimage(&CoinImgA, _T("MySrc\\CoinA.png"), PIC_WIDTH, PIC_HEIGHT2); loadimage(&CoinImgB, _T("MySrc\\CoinB.png"), PIC_WIDTH, PIC_HEIGHT2); int ph = 0;//下落的高度值 setbkmode(TRANSPARENT); //*放播**背景音乐 mciSendString (_T("open MySrc\\ 天降横财 .mp3 alias bkmusic"), NULL, 0, NULL);//*放播**音乐‘天降横财.mp3’,在‘ 使用多字节字符集 ’状态下, 仍可使用‘_T’ mciSendString(_T("play bkmusic repeat "), NULL, 0, NULL);//循环*放播** while (1) { BeginBatchDraw();// 双缓冲 for (int i = 0; i < 25; i++) { flash_word(); // 绘制元宝图片 ph = int(i*i+1+sqrt(35*i)) ;//设置不相等下降的高度值,实现徐徐下落 //putimage(45,ph, &CoinImg); //透明图片这样直接贴图,是不能实现透明显示 transparentimage (NULL,40, ph, &CoinImg1); //可透明显示png图片 transparentimage(NULL, 290, ph, &CoinImgA); //可透明显示png图片 transparentimage(NULL, 515, ph, &CoinImg2); //可透明显示png图片 transparentimage(NULL, 755, ph, &CoinImgB); //可透明显示png图片 transparentimage(NULL, 1005, ph, &CoinImg3); //可透明显示png图片 Sleep(450); // 延迟一段时间 FlushBatchDraw(); //缓冲显示图片 EndBatchDraw(); cleardevice();//清屏,一定要用上此语句才清除拖影 } loadRandomImage(); } // 清理资源 closegraph(); return 0;} 运行效果图:



附代码图:




附显示程序桌面上的图标效果图:

图标显示效果图
希望你喜欢哦[吃瓜群众](完)