C/C++編程筆記:C語言開發黃金礦工遊戲!項目源碼分享學習

玩家經過鍵盤的按鍵控制礦工抓取金塊,將鉤子碰觸到的金塊抓取過來。 要求以下: 編程

1. 遊戲的金塊的總數是20(能夠本身去設置),大小位置是隨機的。數組

2. 在沒有抓取狀態下,鉤子左右擺動,此時礦工的是靜止的。當鉤子擺動到必定角度,玩家能夠單擊鍵盤上的上下左右鍵中的下方向鍵或者是空格鍵控制礦工伸出長鉤,抓取金子,此時礦工是向下搖動轉軸。獲取到金子往回拉後,礦工是不斷轉動轉軸,直到金子拉動到鉤子初始處,礦工恢復靜止,鉤子繼續左右搖擺,直到玩家再次單擊向下方向鍵。微信

3. 伸出的鉤子若是碰觸到金子,則鉤子和金子一塊兒往回拉,回收的速度根據抓取到的金子的大小變化而變化,金子越大,回拉的速度越慢,反之亦然。若是鉤子沒有碰觸到金子,而是碰觸到左右和下的邊界,則鉤子保持原來的速度往回收。  函數

4. 抓取到的金子拉回到轉軸處消失,此時金子數目減小一個。若是玩家將全部金子抓取完,遊戲返回或者結束。學習

所用編譯器:VS2013,代碼純手寫,但願各位也能本身去手敲,而不是複製粘貼!!!圖片你們能夠本身去找素材圖,也能夠關注筆者微信公衆號回覆關鍵字:黃金礦工領取~spa

話很少說:直接上源碼!code

#include<stdio.h>
#include<math.h>
#include<graphics.h>//easyx 包含頭文件,能夠使用提供的接口,函數
#define WIN_WIDTH 1080
#define WIN_HEIGHT 640
#define MAX_IMAGE 11  //最大圖片數量
#define MAX_MINE 10   //最大物品數量
#define MAX_ANGLE 80 //最大角度
#define PI 3.1415926535898
//int a,char b
enum MINE //枚舉圖片數組下標
{
    i_gold=1,
    i_money=3,
    i_soledown=5,
    i_soleup=7,
    i_stone=9,
    i_bk = MAX_IMAGE-1,
};
enum MINE_TYPE //物品類型枚舉
{
    GOLD,
    MONEY,
    STONE,
    //方向
    LEFT,
    RIGHT,
    //狀態,正常,伸長,縮短
    M_NOMAL,
    M_LONG,
    M_SHORT,
};
struct Sole //角色信息
{
    int x;//貼圖位置
    int y;
    int width;//圖片寬高
    int height;
    int coin;//金幣
}sole;
struct Mine //物品
{
    int x;
    int y;
    int szie; //邊界判斷
    bool flag;//是否存在
    int type;//物品類型,石頭,金塊,錢袋
    int gold;//物品價值
}mine[MAX_MINE];
struct Hook //鉤子
{
    int x;
    int y;
    int endx;
    int endy;
    int len;//長度
    int angle;//角度
    int dir;//擺動方向
    int vx;//速度份量
    int vy;
    int state;
    int index;//記錄抓到的物品下標
}hook;
IMAGE img[MAX_IMAGE];
int distance(Hook hook);
//初始化數據
void GameInit()
{
    //建立窗口 init 初始化  graphics圖形界面
    initgraph(WIN_WIDTH, WIN_HEIGHT,SHOWCONSOLE);
    //設置隨機數種子
    srand(GetTickCount());
    //加載圖片
    for (int i = 0; i < MAX_IMAGE-1; i++)
    {
        char temp[25]="";
        sprintf(temp, "./images/%d.jpg", i);
        if (i <= 1)
        {
            loadimage(&img[i], temp,73,62);//注意:字符集問題
        }
        else
        {
            loadimage(&img[i], temp);//注意:字符集問題
        }
        
    }
    loadimage(&img[i_bk], "./images/bk.jpg", WIN_WIDTH, WIN_HEIGHT-120);
    //初始化角色信息
    sole.width = 140;
    sole.height = 120;
    sole.x = WIN_WIDTH/2-sole.width/2;//x軸居中
    sole.y = 0;
    sole.coin = 0;

    //初始化物品信息
    for (int i = 0; i < MAX_MINE; i++)
    {
        mine[i].flag = true;
        mine[i].gold = rand() % 200+1;
        mine[i].szie = 60;
        mine[i].type = rand()%3;
        mine[i].x = rand() % (WIN_WIDTH - 60);
        mine[i].y = rand() % (WIN_HEIGHT - 150) + 150;
    }
    //初始化鉤子
    hook.x = sole.x + 40;
    hook.y = sole.y + 100;
    hook.len = 50;
    hook.endx = hook.x;
    hook.endy = hook.y + hook.len;
    hook.angle = 0;
    hook.dir = RIGHT;
    hook.vx = 0;
    hook.vy = 0;
    hook.state = M_NOMAL;
    hook.index = -1;
}
//遊戲繪製
void GameDraw()
{
    //繪製背景
    putimage(0, 120, &img[i_bk]);
    //繪製角色背景顏色
    setfillcolor(RGB(255, 208, 52));
    solidrectangle(0, 0, WIN_WIDTH, 120);
    //繪製角色
    putimage(sole.x, sole.y, &img[i_soledown-1],SRCAND);//知道爲啥減1不?
    putimage(sole.x, sole.y, &img[i_soledown],SRCPAINT);
    //繪製物品
    for (int i = 0; i < MAX_MINE; i++)
    {
        if (mine[i].flag == true)
        {
            switch (mine[i].type)
            {
            case GOLD:
                putimage(mine[i].x, mine[i].y, &img[i_gold-1],SRCAND);
                putimage(mine[i].x, mine[i].y, &img[i_gold],SRCPAINT);
                break;
            case MONEY:
                putimage(mine[i].x, mine[i].y, &img[i_money - 1], SRCAND);
                putimage(mine[i].x, mine[i].y, &img[i_money], SRCPAINT);
                break;
            case STONE:
                putimage(mine[i].x, mine[i].y, &img[i_stone - 1], SRCAND);
                putimage(mine[i].x, mine[i].y, &img[i_stone], SRCPAINT);
                break;
            }
        }
    }
    //繪製鉤子
    setlinecolor(BROWN);
    setlinestyle(PS_SOLID, 5);
    line(hook.x, hook.y, hook.endx, hook.endy);

    //繪製分數
    char score[30] = "";
    sprintf(score, "分數:%d", sole.coin);
    settextcolor(WHITE);
    setbkmode(TRANSPARENT);
    settextstyle(50, 0, "楷體");
    outtextxy(20, 20, score);
}
//鉤子擺動
void HookRock()
{
    if (hook.state == M_NOMAL)
    {
        if (hook.dir == RIGHT)
        {
            hook.angle++;
        }
        else
        {
            hook.angle--;
        }
        if (hook.angle > MAX_ANGLE)
        {
            hook.dir = LEFT;
        }
        else if (hook.angle<-MAX_ANGLE)
        {
            hook.dir = RIGHT;
        }
        //角度轉弧度  360 2pai  180  PI  
        hook.endx = hook.x + sin(PI / 180 * hook.angle)*hook.len;
        hook.endy = hook.y + cos(PI / 180 * hook.angle)*hook.len;
    }
    
}

//遊戲控制
void GameControl(int speed)
{
    if (GetAsyncKeyState(VK_SPACE) && hook.state==M_NOMAL)
    {
        //按鍵,求出速度份量
        hook.vx = sin(PI / 180 * hook.angle)*speed;
        hook.vy = cos(PI / 180 * hook.angle)*speed;
        hook.state = M_LONG;
    }
    //碰到邊界返回
    if (hook.endx<0 || hook.endx>WIN_WIDTH || hook.endy > WIN_HEIGHT)
    {
        hook.state = M_SHORT;
    }
    if (hook.state == M_LONG)
    {
        hook.endx += hook.vx;
        hook.endy += hook.vy;
    }
    else if (hook.state==M_SHORT)
    {
        hook.endx -= hook.vx;
        hook.endy -= hook.vy;
        //縮短完成
        if (distance(hook))
        {
            hook.state = M_NOMAL;
        }
    }
    //接下來就是讓hook.endx 加上hook.vx
    printf("%d %d\n", hook.vx, hook.vy);
}
void JudgeGrap()
{
    //判斷抓到那個物品
    for (int i = 0; i < MAX_MINE; i++)
    {
        if (mine[i].flag == true &&
            hook.endx>mine[i].x && hook.endx<mine[i].x+mine[i].szie &&
            hook.endy>mine[i].y && hook.endy<mine[i].y+mine[i].szie)
        {
            hook.index = i;
            break;
        }
    }
    //若是抓到了
    if (hook.index != -1)
    {
        hook.state = M_SHORT;
        mine[hook.index].x = hook.endx;
        mine[hook.index].y = hook.endy;
        //縮短完成
        if (distance(hook))
        {
            mine[hook.index].flag = false;
            hook.index = -1;
            hook.state = M_NOMAL;
        }
    }
}
//void main 
int main()
{
    GameInit();
    DWORD t1 , t2;
    t1 = t2 = GetTickCount();
    BeginBatchDraw();
    while (1)
    {
        if (t2 - t1 > 15)
        {
            HookRock();
            t1 = t2;
        }
        t2 = GetTickCount();
        GameDraw();
        FlushBatchDraw();
        GameControl(10);
        JudgeGrap();
        //防止閃退
    }
    return 0;
}
int distance(Hook hook)
{
    int dis = sqrt((float)(hook.x - hook.endx)*(hook.x - hook.endx) + (hook.y - hook.endy)*(hook.y - hook.endy));
    return dis <= hook.len;
}

還在等什麼呢?代碼都給你了,趕忙照着去作唄!blog

自學C/C++編程難度很大,不妨和一些志同道合的小夥伴一塊兒學習成長!接口

C語言C++編程學習交流圈子,【點擊進入微信公衆號:C語言編程學習基地遊戲

有一些源碼和資料分享,歡迎轉行也學習編程的夥伴,和你們一塊兒交流成長會比本身琢磨更快哦!

相關文章
相關標籤/搜索