大一c語言使用easyX圖形庫製作打氣球小遊戲
如果你是入門easyX圖形庫,那麼這個打氣球小遊戲將會是和不錯的入門項目選擇,easyX開創了可視化窗口,使用戶更加直觀的瞭解到對象的變化,總代碼附在文章底下。
該可視化程序需下載easy圖形庫插件:https://easyx.cn/
ps:如報錯,需根據自己的音樂和背景路徑位置自行調整!!!
首先我們來看一下效果圖
這是我們的程序結構腦圖
下面附上代碼
#include<stdio.h> #include<math.h> #include<time.h> #include<stdlib.h> #include<Windows.h> //雙緩衝 #include <graphics.h> //easyX圖形庫 #include <process.h> //使用進程處理函數需要用到該頭文件,包含過程控制的函數(給鼠標開闢線程會用到) #include<mmsystem.h> //這兩個是載入音樂的頭文件 #pragma comment(lib,"winmm.lib") // #define NUM 15 int x, y; //炮口座標 DWORD t1, t2, tt1, tt2; //給一個時間限定 int score = 0; char strscore[5]; //設置存儲分數的數組 0-9999 MOUSEMSG msg = { 0 }; //定義鼠標信息 設爲全局變量,主函數裏開闢新的線程 //子彈的結構(結構體數組) struct Bullet { int x, y; //子彈座標 double vx, vy; //速度分量 int r; //子彈半徑 int color; //子彈顏色 int flag; //子彈是否存活 }bullet[NUM]; //氣球的結構(結構體數組) struct Balloon { int x, y; //氣球座標 int color; //氣球顏色 int flag; //氣球是否存在的標識 }balloon[NUM]; int main() { void gamepaint(); void GameInit(); void CreateBullet(double a); void MoveBullet(); void CreatBalloon(); void MoveBalloon(); void Boom(); void HideCursor(); //雙緩衝 void Mouse(); initgraph(720, 480); //創建窗口(寬720,高480) srand((unsigned int)time(NULL)); //種下隨機數種子。 固定那些地方產生哪些顏色 mciSendString("opne ./music.mp3", 0, 0, 0); //打開音樂 mciSendString("play music.mp3", 0, 0, 0); //播放音樂 GameInit(); t1 = GetTickCount(); //獲取系統時間 tt1 = GetTickCount(); _beginthread((_beginthread_proc_type)Mouse, 0, 0); //Mouse函數開啓了一個線程,Mouse是鼠標函數的地址(調用了Mouse函數),相當於main函數和鼠標函數同步執行 while (1) { sprintf_s(strscore, "%d", score); //將分數寫入到界面. sprintf不安全,課考慮用sprintf_s gamepaint(); tt2 = GetTickCount(); if (tt2 - tt1 > 500) CreatBalloon(); //產生氣球 t2 = GetTickCount(); if (t2 - t1 > 20) //t1-t2>20ms { MoveBullet(); //子彈移動 MoveBalloon(); //氣球移動 Boom(); //子彈氣球碰撞爆炸 t1 = t2; } } HideCursor(); //雙緩衝函數調用 getchar(); return 0; } //遊戲繪製函數 void gamepaint() { BeginBatchDraw(); //開始繪製 setlinestyle(PS_SOLID, 2); //設置線條樣式與寬度 (實線,像素2) setlinecolor(WHITE); //設置線條顏色 setfillcolor(RGB(177, 173, 175)); //右邊菜單欄 fillrectangle(640, 0, 719, 479); IMAGE img; //創建IMAGE對象 //左邊遊戲區 loadimage(&img, "E:\\c語言\\氣球小遊戲\\圖片素材\\sky.jpg", 640, 479);//絕對地址載入圖片 putimage(0, 0, &img); /*setfillcolor(RGB(149, 206, 245)); fillrectangle(0, 0, 640, 479);*/ circle(320, 460, 60); //圓心(320,460) r=60 setlinecolor(BLACK); //線條顏色 setfillcolor(BLACK); //填充顏色 fillcircle(320, 460, 10); //炮臺(小圓) setlinestyle(PS_SOLID, 8); //(實線,像素8) line(x, y, 320, 460); //炮口 setbkmode(0); //透明字體 outtextxy(650, 100, "Score:"); //要將項目->屬性->字符集設置爲多節字符集 outtextxy(650, 150, strscore); //分數 outtextxy(650, 300, "Author:"); outtextxy(650, 350, "王爍"); //作者 //設計氣球 setlinestyle(PS_SOLID, 2); //(實線,像素2) setlinecolor(WHITE); //設置線條顏色 for (int i = 0; i < NUM; i++) { if (balloon[i].flag == 1) { setfillcolor(balloon[i].color); //(畫圖工具裏的紅綠藍三色) fillellipse(balloon[i].x, balloon[i].y, balloon[i].x + 30, balloon[i].y + 50); //(圓心(100,100),寬度30,高度50) arc(balloon[i].x + 5, balloon[i].y + 5, balloon[i].x + 25, balloon[i].y + 45, 0, 1.2); //圓弧(()位置,()寬度和高度,弧度0—1.2π) arc(balloon[i].x + 15, balloon[i].y + 35, balloon[i].x + 35, balloon[i].y + 65, 3.14, 4.4); } } //子彈畫出來 for (int i = 0; i < NUM; i++) { if (bullet[i].flag == 1) { setlinecolor(bullet[i].color); //設置線條顏色 setfillcolor(bullet[i].color); //設置填充顏色 fillcircle(bullet[i].x, bullet[i].y, bullet[i].r); //子彈色位置和大小 } } EndBatchDraw(); //結束繪製 } //遊戲的初始化函數 void GameInit() { //子彈 int i; for (i = 0; i < NUM; i++) { bullet[i].r = 5; bullet[i].color = RGB(rand() % 257, rand() % 257, rand() % 257); //子彈顏色隨機 bullet[i].flag = 0; //不存貨(閒置); } //氣球 for (int i = 0; i < NUM; i++) //先給10個氣球 { if (i < 10) { balloon[i].x = rand() % 610; //氣球顯示,邊界窗口寬-氣球寬 640-30 balloon[i].y = rand() % 430; //480-50 balloon[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); balloon[i].flag = 1; //氣球存在了 } else //剩下5個氣球 { balloon[i].color = RGB(rand() % 256, rand() % 256, rand() % 256); balloon[i].flag = 0; //氣球沒存在界面內 } } } //產生子彈 void CreateBullet(double a) { //數組 for (int i = 0; i < NUM; i++) { if (bullet[i].flag == 0) { bullet[i].x = x; bullet[i].y = y; bullet[i].vx = 15 * cos(a); //15就是發射速度 bullet[i].vy = 15 * sin(a); bullet[i].flag = 1; //鎖住內存,相當於子彈打出去,還沒撿回來,沒子彈了。 break; } } } //子彈移動 void MoveBullet() { for (int i = 0; i < NUM; i++) { if (bullet[i].flag == 1) { bullet[i].x += bullet[i].vx; bullet[i].y -= bullet[i].vy; } } //移動之後,飛出場外 flag=0 for (int i = 0; i < NUM; i++) { if (bullet[i].flag == 1) { if (bullet[i].x < 0 || bullet[i].x>640 || bullet[i].y < 0 || bullet[i].y>480) { bullet[i].flag = 0; } } } } //產生氣球 void CreatBalloon() { for (int i = 0; i < NUM; i++) { if (balloon[i].flag == 0) { balloon[i].x = rand() % 610; //新產生x座標氣球隨機 balloon[i].y = 480; //新產生氣球y座標永遠在最底下; balloon[i].flag = 1; //鎖住內存,相當於氣球在界面內 break; } } } //氣球移動 void MoveBalloon() { //移動 for (int i = 0; i < NUM; i++) { if (balloon[i].flag == 1) { balloon[i].y -= 2; //往上移動 if (rand() % 2 == 0) //氣球實現左右移動。 rand()%2 = =0,概率1/2; balloon[i].x += 1; else balloon[i].x -= 1; } } //出界 for (int i = 0; i < NUM; i++) { if (balloon[i].flag == 1) { if (balloon[i].x + 30 < 0 || balloon[i].x > 640 || balloon[i].y + 50 < 0) //下邊界不算,因爲總會飄上來 { balloon[i].flag = 0; } } } } //打氣球,爆炸 void Boom() { for (int i = 0; i < NUM; i++) //遍歷氣球 { if (balloon[i].flag == 1) //選在界面裏邊的氣球 { for (int j = 0; j < NUM; j++) //遍歷子彈 { if (bullet[j].flag == 1) { if (bullet[j].x > balloon[i].x && bullet[j].x<balloon[i].x + 30 && bullet[j].y>balloon[i].y && bullet[j].y < balloon[i].x + 50) //判斷子彈是否與氣球重合 { bullet[j].flag = 0; balloon[i].flag = 0; score += 10; } } } } } } void Mouse() { while (1) { if (MouseHit()) //如果有鼠標信息 { msg = GetMouseMsg(); //獲取鼠標信息到msg double a = atan2(460.0 - msg.y, msg.x - 320); x = 320 + 70 * cos(a); y = 460 - 70 * sin(a); if (msg.uMsg == WM_LBUTTONDOWN) //點擊鼠標左鍵 { CreateBullet(a); } } } } //雙緩衝 void HideCursor() { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); CONSOLE_CURSOR_INFO CursorInfo; GetConsoleCursorInfo(handle, &CursorInfo);//獲取控制檯光標信息 CursorInfo.bVisible = false; //隱藏控制檯光標 SetConsoleCursorInfo(handle, &CursorInfo);//設置控制檯光標狀態 }
我們還可以根據以上描述氣球、子彈的思想,添加炸彈函數,計時功能等,添加更多有趣好玩的功能模塊。也可將炮臺,子彈,氣球等使用圖片形式看着效果更加好。