《吃豆游戲》是一款休閑小游戲,和貪吃蛇,球球大作戰吃食物都是有差不多的游戲邏輯。
這個游戲本身很簡單,一共3關,吃掉畫面上全部小豆子就過關,被敵人碰到就over。吃大豆子可以讓敵人暫時能被你吃,但是后面關卡,敵人恢復時間很短,敵人速度也很快。
當然現在你用代碼自己開發的話,設置多少關卡,什么樣的難度都看你自己咯!
游戲中使用了圖片【https://codebus.cn/f/a/0/0/135/boxman.zip】
本項目編譯環境:Visual Studio 2019/2022,EasyX插件
代碼展示:
#include#include #include #include #define M 640 //開屏大小 #define N 480 #define rank 1 //游戲等級 int g_sum = 0; //統計吃豆的個數 int g_score = 0; //分數統計 bool g_win = true; //成敗的標志 IMAGE image[5]; //裝載圖片 enum {LEFT=1, RIGHT, UP, DOWN}; //方向的控制 struct figure //人物屬性 { int x; //人物圖紙坐標 int y; int x1; //人物方向移動 int y1; int x2; //人物物理坐標 int y2; }you,enemy[5]; /*0豆子,1可以移動地方,2墻壁,3自己,4敵人*/ int a[15][20]= {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,2, 2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2, 2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2, 2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2, 2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2, 2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2, 2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2, 2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2, 2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2, 2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2, 2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2, 2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2, 2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*數組就是地圖*/ int b[15][20]= {2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2, 2,1,0,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,0,2, 2,1,2,2,2,1,1,2,1,1,0,0,0,1,1,4,1,1,0,2, 2,1,1,0,2,1,1,2,0,1,1,2,2,2,2,2,0,0,0,2, 2,4,1,0,2,1,1,2,1,1,1,0,1,1,1,1,0,1,1,2, 2,1,2,1,2,1,1,2,1,3,2,2,1,1,1,1,2,2,1,2, 2,1,2,1,2,1,1,1,1,1,1,1,1,0,0,0,1,1,1,2, 2,1,2,1,0,1,1,1,1,2,1,0,1,2,2,2,1,1,1,2, 2,1,0,1,0,1,2,1,1,2,1,0,1,2,1,1,4,1,1,2, 2,1,0,2,0,1,2,1,1,2,1,0,1,2,1,1,1,1,1,2, 2,1,0,2,1,1,2,1,1,2,1,0,2,2,1,0,0,0,1,2, 2,1,1,2,1,1,2,1,1,2,1,0,2,1,1,2,2,1,1,2, 2,1,2,2,1,2,2,1,1,1,1,0,1,4,1,2,0,0,1,2, 2,1,0,0,0,0,0,4,0,1,1,0,1,1,1,1,0,0,1,2, 2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2,2};/*數組就是地圖*/ ////////////////////////////函數聲明///////////////////////////////// void Init_begin(); //初始化開始界面 void Initia(); //初始化界面 void Init_score(); //記分板 void Init_loss(); //失敗的界面 void Init_win(); //成功的界面 void Init_leave(); //離開的界面 void Init_copy(); //圖形復制 void enemymove(); //敵人運動 void randdire(struct figure *sth); //使方向隨即改變 bool judgemeet(); //相遇判斷 void youmove(int k ,int speed) ; //對自己進行移動 void mobile(); //自己移動 void eatbean(); //判斷是否吃小黃點 void play(); //開始游戲 int sjs(int a,int b); //產生a,b之間的數 void enemymeetroad(int i); //敵人與路 void enemymeetbean(int i) ; //敵人遇豆子 void load_image(); //加載圖片 void Game_levels(); //游戲等級設定 ///////////////////////////////////////////////////////////////////// void Init_begin() //初始化開始界面 { setbkcolor(BLACK); char init[20] = "吃豆子游戲"; int x = M/2 - 250,y = 100; setcolor(CYAN); setfont(100, 0,"楷體",0,0,FW_DEMIBOLD,false,false,false); outtextxy(x,y,init); Sleep(400); RECT r = {x + 50, 250, 540, 460}; setfont(24, 0, "宋體"); setcolor(BROWN); outtextxy(x + 50, 250,"吃豆子游戲規則:"); setfont(18, 0, "宋體"); drawtext(" 1:游戲中,操作者可以通過方向鍵(上、下、左、右)或字母鍵(‘w’、‘s’、‘a’、‘d’)來調整方向 2:游戲中途可以按‘空格鍵’來暫停游戲 3:按‘ESC’推出游戲", &r, DT_WORDBREAK); setfont(24, 0,"楷體"); setcolor(DARKGRAY); outtextxy(M/2 - 107,y + 300, "按"); setcolor(RED); outtextxy(M/2 - 80, y + 300, "回車鍵"); setcolor(DARKGRAY); outtextxy(M/2 , y + 300, "開始游戲"); char put ; put = getch(); while(put != 13) put = getch(); } /*0豆子,1可以移動地方,2墻壁,3自己,4敵人*/ void Initia() //初始化界面 { cleardevice(); setbkcolor(RGB(72,12,12)); for( int i = 0;i < 15;i++) for(int j = 0;j < 20;j++) putimage(100+j*20,100+i*20,&image[a[i][j]]); you.x=9; you.y=5; //敵人和自己的初始圖紙坐標 enemy[0].x=15; enemy[0].y=2; enemy[1].x=1; enemy[1].y=4; enemy[2].x=16; enemy[2].y=8; enemy[3].x=13; enemy[3].y=12; enemy[4].x=7; enemy[4].y=13; you.x2 = you.x * 20 + 100; //圖紙坐標轉化為屏幕坐標 you.y2 = you.y * 20 + 100; for(i=0;i<5;i++) { enemy[i].x2 = enemy[i].x * 20 + 100; enemy[i].y2 = enemy[i].y * 20 + 100; enemy[i].x1 = 0; enemy[i].y1 = 1; } Init_score(); } void load_image() //加載圖片 { loadimage(&image[0],"IMAGE", "0.jpg"); loadimage(&image[1],"IMAGE", "1.jpg"); loadimage(&image[2],"IMAGE", "2.jpg"); loadimage(&image[3],"IMAGE", "3.jpg"); loadimage(&image[4],"IMAGE", "4.jpg"); } void Init_score() //記分板 { setbkcolor(RGB(72,12,12)); char infor[10]; itoa(g_score,infor,10); setcolor(CYAN); setfont(28,0,"Arial"); outtextxy(M - 140,90,"當前分數為"); setfillstyle(RGB(72,12,12)); bar(M - 40,140,M - 20,170); outtextxy(M - 80,140,infor); } int sjs(int a,int b) //產生a,b之間的數 { return a+rand()%(b-a+1); } void Init_copy() //圖形復制 { for(int i = 0;i < 15;i++) for(int j = 0;j < 20;j++) a[i][j] = b[i][j]; } void enemymeetbean(int i) //敵人遇豆子 { int x = enemy[i].x2 ; int y = enemy[i].y2 ; for(int j = 0;j<20;j++) { putimage(x,y,&image[0]); enemy[i].x2 += enemy[i].x1; enemy[i].y2 += enemy[i].y1; putimage(enemy[i].x2,enemy[i].y2,&image[4]); } } void enemymeetroad(int i) //敵人遇路 { int x = enemy[i].x2 ; int y = enemy[i].y2 ; for( int j = 0;j < 20;j++) { putimage(x,y,&image[1]); enemy[i].x2 += enemy[i].x1; enemy[i].y2 += enemy[i].y1; putimage(enemy[i].x2,enemy[i].y2,&image[4]); } } void enemymove() //敵人運動 { Game_levels(); for(int i = 0;i < 5;i++) //判斷是否與墻壁相遇,如果相遇,隨即改變方向 { if(a[enemy[i].y+enemy[i].y1][enemy[i].x+enemy[i].x1] == 2 || abs(enemy[i].y1) == abs(enemy[i].x1)) randdire(&enemy[i]); } for(i = 0;i < 5;i++) { if(a[enemy[i].y ][enemy[i].x] == 0) enemymeetbean(i); else enemymeetroad(i); enemy[i].x+=enemy[i].x1; enemy[i].y+=enemy[i].y1; if(judgemeet()) break; } Sleep(180); } void Game_levels() //游戲等級設定 { if( sjs (1,rank) == 1) { int t = rand() % 5; enemy[t].x1 = enemy[t].x - you.x > 0 ? -1 : 1; enemy[t].y1 = enemy[t].y - you.y > 0 ? -1 : 1; } for(int i = 0;i < 5;i++) { if(enemy[i].x == you.x && enemy[i].y + 1 == you.y) {enemy[i].x1 = 0 ; enemy[i].y1 = 1;} if(enemy[i].x == you.x && enemy[i].y - 1 == you.y) {enemy[i].x1 = 0 ; enemy[i].y1 = -1;} if(enemy[i].x + 1 == you.x && enemy[i].y == you.y) {enemy[i].x1 = 1 ; enemy[i].y1 = 0;} if(enemy[i].x - 1 == you.x && enemy[i].y == you.y) {enemy[i].x1 = -1 ; enemy[i].y1 = 1;} } } void randdire( struct figure *sth) //使方向隨即改變 { int b=1; int x,y; while(b) { x =sjs(-1,1); y=sjs(-1,1); if(a[sth->y + y][sth->x + x] != 2 && abs(y) != abs(x)) { b = 0; sth->x1 = x; sth->y1 = y; } else b = 1; } } bool judgemeet () //相遇判斷 { for(int i = 0;i < 5;i++) { if(enemy[i].x == you.x && enemy[i].y == you.y ) { g_win = false; Init_loss(); return true; break; } } return false; } void eatbean() //判斷是否吃小黃點 { if(a[you.y][you.x] == 0) { a[you.y][you.x] = 1; g_sum++; g_score += 10; Init_score(); a[you.y][you.x] = 1; } } void youmove(int k) //對自己進行移動 { switch(k) { case LEFT: you.x1 = -1;you.y1 = 0; break; case RIGHT: you.x1 = 1;you.y1 = 0; break; case DOWN: you.x1 = 0;you.y1 = 1; break; case UP: you.x1 = 0;you.y1 = -1; break; } if(a[you.y + you.y1][you.x + you.x1] != 2) { int x = you.x2 ; int y = you.y2 ; for(int j = 0 ;j < 10;j++) { putimage(x,y,&image[1]); you.x2 += you.x1 * 2; you.y2 += you.y1 * 2; putimage(you.x2,you.y2,&image[3]); } you.x += you.x1; you.y += you.y1; eatbean(); } } void Init_loss() //失敗的界面 { cleardevice(); char str[] = "挑戰失敗,還需繼續努力呀!"; LOGFONT f; getfont(&f); f.lfHeight = 48; strcpy(f.lfFaceName , "楷體"); f.lfQuality = ANTIALIASED_QUALITY; f.lfWeight = FW_NORMAL; setcolor(LIGHTGREEN); setfont(&f); outtextxy(20,200,str); char tryagain[] = "是否想繼續挑戰?(Y/N)"; f.lfHeight = 28; setfont(&f); setcolor(BROWN); outtextxy(90,300,tryagain); char yesorno ; int keep = 1 ; while(keep) { yesorno = getch(); if(yesorno == 'Y' || yesorno == 'y' || yesorno == 'N' || yesorno == 'n') keep = 0; } if(yesorno == 'Y'|| yesorno == 'y') { g_win = true; g_score = 0; g_sum = 0; cleardevice(); Init_copy(); Initia(); } else Init_leave(); } void Init_leave() { cleardevice(); char str[] = "下次繼續努力吧!"; LOGFONT f; getfont(&f); f.lfHeight = 48; strcpy(f.lfFaceName , "楷體"); f.lfQuality = ANTIALIASED_QUALITY; f.lfWeight = FW_NORMAL; setcolor(LIGHTGREEN); setfont(&f); outtextxy(150,200,str); Sleep(2000); exit(0); } void Init_win() //成功的界面 { cleardevice(); char str[] = "恭喜你通過了游戲!!!"; LOGFONT f; getfont(&f); f.lfHeight = 48; strcpy(f.lfFaceName , "楷體"); f.lfQuality = ANTIALIASED_QUALITY; f.lfWeight = FW_NORMAL; setcolor(LIGHTGREEN); setfont(&f); outtextxy(50,200,str); Sleep(4000); char tryagain[] = "是否想再次挑戰?(Y/N)"; f.lfHeight = 28; setfont(&f); setcolor(BROWN); outtextxy(70,300,tryagain); char yesorno ; yesorno = getch(); if(yesorno == 'y' || yesorno == 'Y') { g_win = true; g_score = 0; g_sum = 0; cleardevice(); Init_copy(); Initia(); } else exit(0); } void stop() //游戲暫停 { char key = 'a'; char stop[] = "游戲暫停中"; setcolor(RED); setfont(28,0,"楷體"); outtextxy(230,50,stop); Sleep(100); while(key != ' ') key = getch(); setcolor(RGB(72,12,12)); outtextxy(230,50,stop); } void play() { setbkcolor(RGB(72,12,12)); char key; //獲取字母 int t; //記錄方向 while(g_win) { enemymove(); judgemeet(); while(kbhit()) { key = getch(); switch(key) { case 'a': case 75: t = LEFT; youmove(t ); break; case 'd': case 77: t = RIGHT; ; youmove(t ); break; case 's': case 80: t = DOWN; youmove(t ); break; case 'w': case 72: t = UP; youmove(t ); break; case 27: Init_leave(); break; case 32: stop(); break; default : break; } } if(g_sum == 50) Init_win(); } } void main() { initgraph(M,N); load_image(); Init_begin(); setbkcolor(RGB(72,12,12)); srand((unsigned)time(NULL)); Initia(); play(); closegraph(); }
大家趕緊去動手試試吧!
審核編輯:湯梓紅
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
游戲
+關注
關注
2文章
760瀏覽量
26562 -
C語言
+關注
關注
180文章
7623瀏覽量
139420 -
編程
+關注
關注
88文章
3668瀏覽量
94575 -
源碼
+關注
關注
8文章
664瀏覽量
30002
原文標題:C語言零基礎項目:吃豆人小游戲!詳細思路+源碼分享
文章出處:【微信號:cyuyanxuexi,微信公眾號:C語言編程學習基地】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
llabview黑白棋小游戲制作詳細解析
`相關課程推薦:《8周LabVIEW視覺項目編程實戰特訓營》上面這張是效果圖編寫這樣一個界面可以使用到多種不同的思路和技巧,我會按照從簡到繁的順序,分幾次來介紹幾個不同的方法。 講由NI 軟件工程師阮奇楨為您講解。llabview黑白棋
發表于 11-23 15:44
Python 開發接豆人小游戲 TurnipBit
Python 開發接豆人小游戲 TurnipBit最近入手了一款MicroPython的開發板-TurnipBit,這個板子比較適合單片機入門,以及青少年編程,因為它有配備的在線圖形編程準備工作
發表于 12-18 12:58
Micropython TurnipBit 吃豆小人
`4.吃豆小人小游戲4.1實驗目的:2TurnipBit顯示滾動數字和靜態數字的幾種方法2用代碼的形式實現靜態數字4.2實驗器材:2TurnipBit開發板 1塊2下載數據線 1條接入互聯網的電腦
發表于 05-18 19:47
C語言零基礎項目:連連看小游戲!
連連看小游戲速度節奏快,畫面清晰可愛,適合細心的玩家。豐富的道具和公共模式的加入,增強游戲的競爭性。多樣式的地圖,使玩家在各個游戲水平都可以尋找到挑戰的目標,長期地保持游戲的新鮮感。
C語言項目:礦井逃生游戲(密室)!詳細思路+源碼分享
密室逃脫相信大部分都玩過了吧?本游戲就是一種用C語言寫的類似的游戲,因為用手電筒照明找路,所以有點像礦工的樣子,還是叫它礦井逃生吧!(以下是游戲
評論