c語言使用easyX圖形庫製作打氣球小遊戲

大一c語言使用easyX圖形庫製作打氣球小遊戲

 

       如果你是入門easyX圖形庫,那麼這個打氣球小遊戲將會是和不錯的入門項目選擇,easyX開創了可視化窗口,使用戶更加直觀的瞭解到對象的變化,總代碼附在文章底下。

       該可視化程序需下載easy圖形庫插件:https://easyx.cn/

ps:如報錯,需根據自己的音樂和背景路徑位置自行調整!!!

首先我們來看一下效果圖

C:\Users\lenovo\Desktop

這是我們的程序結構腦圖

 

下面附上代碼

#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);//設置控制檯光標狀態
}



       我們還可以根據以上描述氣球、子彈的思想,添加炸彈函數,計時功能等,添加更多有趣好玩的功能模塊。也可將炮臺,子彈,氣球等使用圖片形式看着效果更加好。

希望可以對您有所幫助!!!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章