1. 程式人生 > 實用技巧 >C/C++程式設計筆記:C語言開發黃金礦工遊戲!專案原始碼分享學習

C/C++程式設計筆記:C語言開發黃金礦工遊戲!專案原始碼分享學習

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

1. 遊戲的金塊的總數是20(可以自己去設定),大小位置是隨機的。

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

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

4. 抓取到的金子拉回到轉軸處消失,此時金子數目減少一個。如果玩家將所有金子抓取完,遊戲返回或者結束。

所用編譯器:VS2013,程式碼純手寫,希望各位也能自己去手敲,而不是複製貼上!!!圖片大家可以自己去找素材圖,也可以關注筆者微信公眾號回覆關鍵字:黃金礦工領取~

話不多說:直接上原始碼!

#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; }

還在等什麼呢?程式碼都給你了,趕緊照著去做唄!

自學C/C++程式設計難度很大,不妨和一些志同道合的小夥伴一起學習成長!

C語言C++程式設計學習交流圈子,【點選進入微信公眾號:C語言程式設計學習基地

有一些原始碼和資料分享,歡迎轉行也學習程式設計的夥伴,和大家一起交流成長會比自己琢磨更快哦!