tft每日頭條

 > 遊戲

 > c語言初學必背代碼文庫

c語言初學必背代碼文庫

遊戲 更新时间:2025-03-05 02:02:22

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

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

  c語言初學必背代碼文庫(CC編程筆記)(1)

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

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

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

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

  話不多說:直接上源碼!

  #includestdio.h #includemath.h #includegraphics.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 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, //繪制角色背景顔色 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.endx0 || hook.endxWIN_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.endxmine[i].x && hook.endxmine[i].x mine[i].szie && hook.endymine[i].y && hook.endymine[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/C 編程】C語言編程學習基地

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

  c語言初學必背代碼文庫(CC編程筆記)(2)

  c語言初學必背代碼文庫(CC編程筆記)(3)

  ,

更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!

查看全部

相关遊戲资讯推荐

热门遊戲资讯推荐

网友关注

Copyright 2023-2025 - www.tftnews.com All Rights Reserved