C語言實(shí)戰(zhàn)之浪漫煙花表白程序代碼
創(chuàng)建win32控制臺應(yīng)用程序,選擇空項(xiàng)目。
創(chuàng)建完畢后,右擊頭文件新建一個(gè)頭文件(.h)。名字寫main.h
然后在源文件新建一個(gè)C++文件(.cpp)。名字寫main.cpp
如圖:
然后在main.h里面寫上如下代碼:
#include <stdio.h> #include <graphics.h> #include <time.h> #include <stdlib.h> #include <math.h> #include <mmsystem.h> #pragma comment(lib,"winmm.lib") #define PI 3.1415926535 #define NUM 13 //煙花彈 struct JET { int x, y; //坐標(biāo) int hx,hy; //最高點(diǎn)坐標(biāo) bool shoot; //判斷煙花彈是不是發(fā)射狀態(tài) DWORD t1, t2, dt; //煙花彈發(fā)射的速度 IMAGE img[2]; //圖片2張 一明一暗的兩張 byte n : 1; //結(jié)構(gòu)體 位段 變量 n 占用內(nèi)存的一個(gè)位! }jet[NUM]; //煙花 struct FIRE { int r; //半徑 int maxr; //最大半徑 int x, y; //相對于窗口 中心點(diǎn)的坐標(biāo) int cenx, ceny; //相對于圖片本身 中心點(diǎn)的坐標(biāo) int width, height; int xy[240][240]; //圖片 保存到一個(gè)像素矩陣。 bool show; //是否綻放 bool draw; //是否繪制 DWORD t1, t2, dt; //爆炸的速度 }fire[NUM]; void Init(int i); void Load(); void Chose(DWORD& t1); void Shoot(); void Show(DWORD* pem); 在main.cpp寫上如下代碼: /**************************************************** ***************************************************** ****************表白浪漫煙花項(xiàng)目開發(fā)******************** ****************主講人:三黑之毅************************ ****************最后修改:2019年3月20日**************** ***************************************************** ****************************************************/ #include "main.h" int main() { //打開一個(gè)窗口 1200 800 initgraph(1200, 800); srand((unsigned int)time(NULL)); mciSendString(L"open ./fire/千年.mp3 alias bgm", 0, 0, 0); mciSendString(L"play bgm repeat", 0, 0, 0); DWORD t1 = GetTickCount(); DWORD* pem = GetImageBuffer(); for (int i = 0; i < NUM; i++) { Init(i); } Load(); BeginBatchDraw(); while (1) { Sleep(10); for (int clr = 0; clr < 1000; clr++) { for (int j = 0; j < 2; j++) { int px1 = rand() % 1200; int py1 = rand() % 800; if (py1 < 799) { pem[py1 * 1200 + px1] = pem[py1 * 1200 + px1 + 1] = BLACK; } } } Chose(t1); Shoot(); Show(pem); FlushBatchDraw(); } return 0; } //初始化 13個(gè) void Init(int i) { // 分別為:煙花中心到圖片邊緣的最遠(yuǎn)距離、煙花中心到圖片左上角的距離 (x、y) 兩個(gè)分量 int r[15] = { 120, 120, 155, 123, 130, 147, 138, 138, 130, 135, 140, 132, 155, 145, 124 }; int x[15] = { 120, 120, 110, 117, 110, 93, 102, 102, 110, 105, 100, 108, 110, 145, 124 }; int y[15] = { 120, 120, 85, 118, 120, 103, 105, 110, 110, 120, 120, 104, 85, 145, 124 }; fire[i].width = 500; fire[i].height = 500; fire[i].maxr = r[i]; fire[i].cenx = x[i]; fire[i].ceny = y[i]; fire[i].show = false; fire[i].t1 = GetTickCount(); fire[i].dt = 5; fire[i].r = 0; //初始化煙花彈的部分?jǐn)?shù)據(jù) jet[i].t1 = GetTickCount(); //定個(gè)時(shí)間點(diǎn) jet[i].dt = rand() % 10; //0-9 ms jet[i].n = 0; jet[i].shoot = false; //都是沒有發(fā)射的。 } //加載圖片 void Load() //加載到哪里去? { IMAGE fm, gm; loadimage(&fm, L"./fire/flower.jpg", 3120, 240); for (int i = 0; i < NUM; i++) { SetWorkingImage(&fm); //fm去拿 getimage(&gm,i*240, 0, 240, 240); //gm SetWorkingImage(&gm); //gm去拿 for (int a = 0; a < 240; a++) { for (int b = 0; b < 240; b++) { fire[i].xy[a][b] = getpixel(a, b); } } } //文件夾 IMAGE sm; loadimage(&sm, L"./fire/shoot.jpg", 200, 50); //保存在sm for (int i = 0; i < NUM; i++) { SetWorkingImage(&sm); //sm去拿 int n = rand() % 5; //0-4 getimage(&jet[i].img[0], n*20,0,20,50); //暗的 getimage(&jet[i].img[1], (n + 5) * 20, 0, 20, 50); //亮的 } SetWorkingImage(NULL); //sm去拿 } //選擇煙花彈 煙花彈產(chǎn)生的速度?。?! void Chose(DWORD& t1) { DWORD t2 = GetTickCount(); //13個(gè) if (t2 - t1 > 1) //每隔1個(gè)ms 產(chǎn)生一個(gè)煙花彈 { int n = rand() % NUM; //0-12 if (jet[n].shoot == false&&fire[n].show == false) //非發(fā)射狀態(tài) { jet[n].x = rand()%1200; jet[n].y = rand() % 100 + 600; //600-699之間 jet[n].hx = jet[n].x; jet[n].hy = rand()%400; //0-399 jet[n].shoot = true; //發(fā)射狀態(tài) putimage(jet[n].x, jet[n].y, &jet[n].img[jet[n].n], SRCINVERT); } t1 = t2; } } void Shoot() { for (int i = 0; i < NUM; i++) { jet[i].t2 = GetTickCount(); if (jet[i].t2 - jet[i].t1 >= jet[i].dt&&jet[i].shoot==true) { putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT); if (jet[i].y >= jet[i].hy) { jet[i].n++; //一閃一閃 jet[i].y -= 5; //上升 } //putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT); if (jet[i].y <= jet[i].hy) //到達(dá)最高點(diǎn)了 { //擦除煙花彈 putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT); //煙花彈最高點(diǎn)的 hx hy -----》煙花 fire[i].x = jet[i].hx; fire[i].y = jet[i].hy; //改變煙花彈的狀態(tài) jet[i].shoot = false; fire[i].show = true; } putimage(jet[i].x, jet[i].y, &jet[i].img[jet[i].n], SRCINVERT); jet[i].t1 = jet[i].t2; } } } void Show(DWORD* pem) { int dir[16] = { 5, 5, 5, 5, 5, 8, 25, 25, 25, 55, 55, 55, 55, 65, 65, 66 }; for (int i = 0; i < NUM; i++) { fire[i].t2 = GetTickCount(); if (fire[i].t2 - fire[i].t1>fire[i].dt&&fire[i].show == true) { if (fire[i].r < fire[i].maxr) { fire[i].r++; fire[i].dt = dir[fire[i].r / 10]; fire[i].draw = true; } if (fire[i].r >= fire[i].maxr - 1) { fire[i].draw = false; Init(i); } fire[i].t1 = fire[i].t2; } if (fire[i].draw == true) { //圓 PI for (double a = 0; a <= 6.28; a += 0.01) { int x1 = (int)(fire[i].cenx + fire[i].r*cos(a)); int y1 = (int)(fire[i].ceny - fire[i].r*sin(a)); if (x1 > 0 && x1<fire[i].width&&y1>0 && y1 < fire[i].height) { int b = fire[i].xy[x1][y1] & 0xff; int g = (fire[i].xy[x1][y1] >> 8) & 0xff; int r = fire[i].xy[x1][y1] >> 16; int xx = (int)(fire[i].x + fire[i].r*cos(a)); int yy = (int)(fire[i].y - fire[i].r*sin(a)); if (r>0x20 && g > 0x20 && b > 0x20 && xx > 0 && xx<1200 && yy>0 && yy < 800) pem[yy * 1200 + xx] = BGR(fire[i].xy[x1][y1]); } } fire[i].draw = false; } } }
注:音樂:千年.mp3,自己去網(wǎng)上下載,然后放到程序fire目錄下。
注:圖片素材就是這兩張:
自己下載一下這兩圖,也放到fire目錄下。
學(xué)習(xí)c語言:
幼兒園英語水平 初中數(shù)學(xué)水平 高中語文水平
也就是說只要會記單詞就行!??!
業(yè)務(wù)邏輯
寫程序的順序
這是最主要的,而并不是代碼
會了所有代碼,腦子里沒有業(yè)務(wù)邏輯,還是沒用,被稱為“碼農(nóng)”
還是不懂的聯(lián)系q:2060164008或進(jìn)q群:706625210。
今天直播到此結(jié)束?。?!三黑之毅!
相關(guān)文章
C++數(shù)據(jù)結(jié)構(gòu)之并查集詳解
這篇文章主要介紹了C++數(shù)據(jù)結(jié)構(gòu)之并查集詳解,并查集是一種樹型的數(shù)據(jù)結(jié)構(gòu),用于處理一些不相交集合的合并及查詢問題,并查集的思想是用一個(gè)數(shù)組表示了整片森林,需要的朋友可以參考下2023-08-08C語言實(shí)現(xiàn)時(shí)間戳轉(zhuǎn)日期的算法(推薦)
下面小編就為大家?guī)硪黄狢語言實(shí)現(xiàn)時(shí)間戳轉(zhuǎn)日期的算法(推薦)。小編覺得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2016-06-06