小白入門——easyx界面版“貪吃蛇”的C語言實現(xiàn)(詳細(xì))作者:頑石 前言:C語言初學(xué)者都是在控制臺上開發(fā)一些小游戲什么,由于沒有界面(比如圖片、音樂,不能做出擁有自己風(fēng)格的程序)學(xué)起來比較乏味,很難堅持下去。所以我在這里就教大家使用簡單的圖形化工具——easyx圖形界面庫,開發(fā)貪吃蛇小游戲,讓初學(xué)者也能感受界面的魅力。做的不是很完善,希望大家可以自己動手完善它! 我們開始說思路。 1,我們需要一張地圖,圖形庫初始化的窗口是自帶坐標(biāo)的(左上角為0,0)。 2,我們需要一條蛇,這條蛇由蛇頭和蛇身組成(這里我們初始化三節(jié)蛇)。 3,我們需要食物,并且在蛇吃掉食物之后將蛇的身體變長,而且重新生成一個食物。 4,蛇需要移動,這應(yīng)該是最難實現(xiàn)的(實現(xiàn)蛇身坐標(biāo)的傳值,除蛇頭以外,每一節(jié)蛇的坐標(biāo)都是上節(jié)蛇的上一次運動之前的坐標(biāo),有點繞~)。 5,蛇撞到墻或者撞到自己的身體就會死亡(判斷坐標(biāo)是否重合就可以)。 6,我們需要能用鍵盤控制蛇的運動方向,這個會和蛇的移動有一些聯(lián)系。 下面我們來寫代碼。 首先是頭文件snake.h部分,我們把一些函數(shù)的申明,和結(jié)構(gòu)體的定義放在頭文件中: #define _CRT_SECURE_NO_WARNINGS #ifndef __SNAKE_H_ #define __SNAKE_H_ #define MAX 500 #pragma message("我的貪吃蛇!") #include<stdio.h> #include<conio.h> #include<time.h> //初始化蛇 void insnake(); //繪制蛇 void inisnake(); //蛇的移動 void way(); //蛇的方向 void snakemove(); //蛇的食物 void foodxy(); //食物繪制 void inifood(); //判斷蛇是否吃掉食物 void eatfood(); //判斷蛇是否吃掛掉 void snakedie(); //游戲過程中,按 空格 可以對游戲進(jìn)行暫停、開始 void again(); //存儲蛇的坐標(biāo)的結(jié)構(gòu)體 typedef struct coor { int x; int y; }coor; //蛇的基本屬性 struct snake { int num;//蛇的總節(jié)數(shù) coor xy[MAX];//存儲蛇的坐標(biāo)的結(jié)構(gòu)體數(shù)組 char way; }snake; //食物的基本屬性 struct food { coor fdxy; int flag=0; int eatgrade = 0; }food; //方向枚舉 enum way { right=72, left=75, down=77, up=80 }; #endif OK,頭文件部分完畢,接下來進(jìn)入snake.cpp代碼編寫環(huán)節(jié)。 (圖形庫需要在xxx.CPP下編寫,在xxx.C可能會出錯) #include"snake.h" #include<graphics.h>//easyx圖形庫頭文件 #define Azure 0xA4D3EE//自己定義的一個顏色 忘記了... int main() { srand((unsigned int)time(NULL));//隨機(jī)數(shù)種子,后面隨機(jī)產(chǎn)生蛇的食物要用到 insnake(); while (1) { cleardevice(); if (food.flag == 0) { foodxy(); } inifood(); inisnake(); snakedie(); eatfood(); way(); Sleep(100); while (_kbhit())//這里是按上下左右鍵控制蛇的移動 { again(); snakemove(); } } while (1); closegraph(); return 0; } //初始化蛇 void insnake(){ initgraph(640, 480); setbkcolor(Azure); snake.xy[2].x = 0; snake.xy[2].y = 0; snake.xy[1].x = 10; snake.xy[1].y = 0; snake.xy[0].x = 20; snake.xy[0].y = 0; snake.num = 3; snake.way = right; food.flag = 0; } //繪制蛇 void inisnake() { for (int i = 0; i < snake.num; i++) { setlinecolor(BLUE); setfillcolor(YELLOW); fillrectangle(snake.xy[i].x, snake.xy[i].y, snake.xy[i].x + 10, snake.xy[i].y + 10); } } //蛇的移動 void way() { //除了第一節(jié)蛇,后面每節(jié)都是前面一節(jié)蛇的前一次坐標(biāo) for (int i = snake.num-1; i >0; i--) { snake.xy[i].x = snake.xy[i-1].x; snake.xy[i].y = snake.xy[i-1].y; } switch (snake.way) { case right: snake.xy[0].x += 10; break; case left: snake.xy[0].x -= 10; break; case down: snake.xy[0].y += 10; break; case up: snake.xy[0].y -= 10; break; default: break; } } //蛇的方向控制 void snakemove() { char ch = 0; ch = _getch(); switch (ch) { case 72: if (snake.way != down) snake.way = up; break; case 75: if (snake.way != right) snake.way = left; break; case 77: if (snake.way != left) snake.way = right; break; case 80: if (snake.way != up) snake.way = down; break; default: break; } } //食物坐標(biāo)獲取 void foodxy() { //蛇坐標(biāo) 0 10 20 30 n*10 //食物 如果 rand() % 650 那么坐標(biāo)0 1 2 3 4 蛇將吃不到食物 坐標(biāo)重合低 food.fdxy.x = rand() % 65 * 10; food.fdxy.y = rand() % 48 * 10; food.flag = 1; for (int i = 0; i > snake.num; i++) { if (food.fdxy.x == snake.xy[i].x && food.fdxy.y == snake.xy[i].y) { food.fdxy.x = rand() % 65 * 10; food.fdxy.y = rand() % 48 * 10; } } } //繪制食物 void inifood() { fillrectangle(food.fdxy.x, food.fdxy.y, food.fdxy.x + 10, food.fdxy.y + 10); } //吃食物的判斷 void eatfood() { if (snake.xy[0].x == food.fdxy.x && snake.xy[0].y == food.fdxy.y) { snake.num++; food.eatgrade += 10; food.flag = 0; } } //判斷蛇是否死亡 void snakedie() { { //分?jǐn)?shù) char grade[100] = { 0 }; sprintf(grade, "%d", food.eatgrade); setbkmode(0);//文字背景透明 outtextxy(570, 20, "分?jǐn)?shù):"); outtextxy(610, 20, grade); } if (snake.xy[0].x > 640 || snake.xy[0].x < 0 || snake.xy[0].y > 480 || snake.xy[0].y<0) { outtextxy(240, 320, "撞墻了,游戲結(jié)束!加C/C++學(xué)習(xí)交流Qun:231662552"); MessageBox(0, "撞墻了!游戲結(jié)束!加C/C++學(xué)習(xí)交流Qun:231662552", "暴力提示!", 0); getchar(); } for (int i = 1; i < snake.num; i++) { if (snake.xy[0].x == snake.xy[i].x &&snake.xy[0].y == snake.xy[i].y) { outtextxy(240, 320, "你咬死了自己,游戲結(jié)束!加C/C++學(xué)習(xí)交流Qun:231662552"); getchar(); } } } void again() { if (_getch() == 32) { while (getch() != 32); } } 好了貪吃蛇代碼寫完了,我們來看一下效果: 蛇開始是一直向右運動的!我們按下下方向鍵: 看見沒有,我順便完了兩下,吃了食物蛇是不是變長了! 來,我們?nèi)プ蚕聣Α酒?span lang="EN-US">~】: 哎呀,我去,本來是撞墻的,結(jié)果自己咬死了自己! 好了,還沒看過癮的,趕快自己去編寫實現(xiàn)吧!有問題或要圖形庫的可以加上面圖片里的交流qun!拜拜! |
|