C++利用EasyX編寫貪吃蛇游戲的示例代碼
介紹
graphics.h是針對DOS下的一個C語言圖形庫 (c++也可以)
目前支持下載此頭文件的常用的有兩種:
1. EGE (Easy Graphics Engine)
2. EasyX Graphics Library
EGE, 全名Easy Graphics Engine, 是windows下的簡易繪圖庫,是一個類似BGI(graphics.h)的面向C/C++語言新手的圖形庫
EasyX, 全名EasyX Graphics Library, 是針對 Visual C++ 的免費繪圖庫,支持 VC6.0 ~ VC2022,簡單易用,學習成本極低,應用領(lǐng)域廣泛。目前已有許多大學將 EasyX 應用在教學當中
我建議Visual Studio用EasyX, Dev-C++可以用EGE
解決的方法:去 EasyX官網(wǎng) 下載EasyX的exe程序,點擊后直接對自己使用的VC版本進行安裝就行了,很簡單。.
Graphics.h常用用法:
1.initgraph(width, height)和closegraph()
initgraph可以創(chuàng)建一個寬度為width, 高度為height的圖形界面窗口
運行結(jié)束后可以通過closegraph來關(guān)閉窗口
注, closegraph之前記得用getch()函數(shù)來接收用戶輸入, 防止程序剛繪畫玩就關(guān)閉窗口了
2.line(x1,y1,x2,y2)
從x1,y1坐標畫一條直線到x2,y2坐標
3.setcolor和RGB
setcolor()可以把line畫出來的直線變成另外一種顏色
RGB可以返回setcolor的自定義參數(shù)
RGB(r,g,b)可以修改不同濃度的紅, 綠, 藍
EX:
setcolor(RGB(200,0,0))可以將line畫出來的直線變成紅色
4.circle(x,y,radius)
在x,y坐標點畫一個半徑為radius的圓
EX:
circle(200, 200, 100);
5.setfillcolor, bar(x1,y1,x2,y2)
bar函數(shù)可以畫出一個矩形
范圍為:x坐標從50-300,y坐標從100-200
setfillcolor()可以改變Bar的填充顏色值,參數(shù)也是RGB()函數(shù)的自定義顏色
6.fillellipse(x,y,xr,yr);
畫一個在x, y坐標點的實心橢圓
x軸上的半徑為xr
y軸上的半徑為yr
注:setfillcolor也可以改變其填充顏色值
7.setfontbkcolor(), setfont(12, 0, "宋體")
setfontcolor可以修改創(chuàng)建的文字的背景顏色值
setfont(12,0,"宋體")的第一個參數(shù)是字體的高度
第二個參數(shù)是字體的寬度, 如果填0, 那就會使用默認比例值
第三個參數(shù)是設(shè)置文字的字體樣式
8.outtextxy(x, y, 字符串);
這個函數(shù)可以在坐標x,y坐標點輸出字符串
注:字符串也可以是中文
EX:
outtextxy(100, 150, "中文也是支持的");
小游戲運行效果圖
貪吃蛇游戲源代碼
// 貪吃蛇小游戲.cpp : 定義控制臺應用程序的入口點。 // #include "stdafx.h" #include <graphics.h> #include <Windows.h> #include <time.h> #include <conio.h> #include <stdlib.h> #include <stdio.h> #include "io.h" #define S_LEN 400 //蛇的最大節(jié)數(shù) #define S_SPEED 200 //蛇的速度 #define S_SIZE 20 //蛇的大小 //全局變量 int score = 0; typedef enum Direction { up = 72, down = 80, left = 75, right = 77 }; //蛇的方向 //坐標結(jié)構(gòu)體 struct Coordinate { int x; int y; }; //蛇的結(jié)構(gòu)體 struct Snake { Coordinate sCo[S_LEN]; //每一節(jié)蛇的坐標 int num; //蛇的節(jié)數(shù) Direction direction; //蛇的方向 }snake; //食物的結(jié)構(gòu)體 struct Food { Coordinate fCo; int flag; //食物是否被吃 }food; //函數(shù)聲明 void InitSnake(); //初始化蛇 void Snake_Food(); //食物坐標 void Snake_Food_Paint(); //畫食物 void Snake_Paint(); //畫蛇 void Snake_Move(); //蛇移動 void Snake_Change(); //方向性移動 void Snake_Eat(); //食物是否被吃 void Snake_Break(); //判斷是否撞自己 void Game_Over(); //結(jié)束游戲 int main(int argc, char *argv[]) { InitSnake(); while (true) { while (!_kbhit()) { settextcolor(RED); score = (snake.num - 2) * 100; char s[5]; sprintf(s, "%d", score); outtextxy(500, 60, s); if (food.flag == 0) { Snake_Food(); } Snake_Food_Paint(); Snake_Break(); Snake_Eat(); Snake_Move(); Sleep(S_SPEED); } Snake_Change(); } return 0; } //初始化蛇 void InitSnake() { //初始化圖形界面 initgraph(640, 480); setbkcolor(RGB(168, 168, 168)); cleardevice(); settextcolor(RED); settextstyle(32, 0, "黑體"); outtextxy(510, 20, "貪吃蛇"); settextcolor(BLACK); settextstyle(16, 0, "宋體"); outtextxy(495, 100, "分數(shù):"); outtextxy(500, 400, "By:逃逸的卡路里"); setcolor(RGB(46, 85, 6)); setfillcolor(RGB(46, 85, 6)); fillrectangle(0, 0, 480, 480); setcolor(RGB(199, 177, 163)); setfillcolor(RGB(199, 177, 163)); fillrectangle(40, 40, 440, 440); setcolor(RGB(102, 86, 0)); for (int i = 0; i < 5; i++) { rectangle(39 - i, 39 - i, 441 + i, 441 + i); } setcolor(RGB(168, 147, 130)); for (int i = 60; i < 440; i += 20) { line(i, 40, i, 440); line(40, i, 440, i); } setorigin(40, 40); setcolor(RGB(56, 89, 0)); setfillcolor(RGB(91, 193, 45)); fillcircle(10, 10, 9); //第一節(jié)蛇 setfillcolor(WHITE); fillcircle(8, 5, 2); fillcircle(8, 15, 2); food.flag = 0; //食物被吃 //蛇坐標初始化 snake.sCo[0].x = 0 + S_SIZE; snake.sCo[0].y = 0; snake.sCo[1].x = 0; snake.sCo[0].y = 0; snake.num = 2; snake.direction = right; } //食物坐標 void Snake_Food() { int i; srand((unsigned)time(NULL)); while (true) { int num = 0; food.fCo.x = rand() % (400 / S_SIZE)*S_SIZE; food.fCo.y = rand() % (400 / S_SIZE)*S_SIZE; for (i = 0; i < snake.num; i++) { if (snake.sCo[i].x == food.fCo.x&&snake.sCo[i].y == food.fCo.y) { num++; } } if (num == 0) { break; } } food.flag = 1; } //畫食物 void Snake_Food_Paint() { setcolor(RED); setfillcolor(RED); fillcircle(food.fCo.x + 10, food.fCo.y + 10, 8); } //畫蛇 void Snake_Paint() { for (int i = snake.num - 1; i >= 0; i--) { setcolor(RGB(56, 89, 0)); setfillcolor(RGB(91, 193, 45)); fillcircle(snake.sCo[i].x + 10, snake.sCo[i].y + 10, 9); if (i == 0) { setfillcolor(WHITE); switch (snake.direction) { case up: fillcircle(snake.sCo[i].x + 5, snake.sCo[i].y + 12, 2); fillcircle(snake.sCo[i].x + 15, snake.sCo[i].y + 12, 2); break; case down: fillcircle(snake.sCo[i].x + 5, snake.sCo[i].y + 8, 2); fillcircle(snake.sCo[i].x + 15, snake.sCo[i].y + 8, 2); break; case left: fillcircle(snake.sCo[i].x + 12, snake.sCo[i].y + 5, 2); fillcircle(snake.sCo[i].x + 12, snake.sCo[i].y + 15, 2); break; case right: fillcircle(snake.sCo[i].x + 8, snake.sCo[i].y + 5, 2); fillcircle(snake.sCo[i].x + 8, snake.sCo[i].y + 15, 2); break; } } } setcolor(RGB(199, 177, 163)); setfillcolor(RGB(199, 177, 163)); fillcircle(snake.sCo[snake.num].x + 10, snake.sCo[snake.num].y + 10, 9); } //蛇移動 void Snake_Move() { for (int i = snake.num; i > 0; i--) { snake.sCo[i].x = snake.sCo[i - 1].x; snake.sCo[i].y = snake.sCo[i - 1].y; } switch (snake.direction) { case up: if (snake.sCo[0].y == 0) { snake.sCo[0].y = 400 - S_SIZE; } else { snake.sCo[0].y -= S_SIZE; } break; case down: if (snake.sCo[0].y == 400 - S_SIZE) { snake.sCo[0].y = 0; } else { snake.sCo[0].y += S_SIZE; } break; case left: if (snake.sCo[0].x == 0) { snake.sCo[0].x = 400 - S_SIZE; } else { snake.sCo[0].x -= S_SIZE; } break; case right: if (snake.sCo[0].x == 400 - S_SIZE) { snake.sCo[0].x = 0; } else { snake.sCo[0].x += S_SIZE; } break; } Snake_Paint(); } //方向性移動 void Snake_Change() { int ch; ch = getch(); switch (ch) { case 'w': case 'W': case up: if (snake.direction != down) { snake.direction = up; } break; case 's': case 'S': case down: if (snake.direction != up) { snake.direction = down; } break; case 'a': case 'A': case left: if (snake.direction != right) { snake.direction = left; } break; case 'd': case 'D': case right: if (snake.direction != left) { snake.direction = right; } break; } } //食物是否被吃 void Snake_Eat() { if (snake.sCo[0].x == food.fCo.x&&snake.sCo[0].y == food.fCo.y) { snake.num++; food.flag = 0; } } //判斷是否撞自己 void Snake_Break() { for (int i = snake.num - 1; i > 3; i--) { if (snake.sCo[0].x == snake.sCo[i].x&&snake.sCo[0].y == snake.sCo[i].y) { Game_Over(); } } } //結(jié)束游戲 void Game_Over() { cleardevice(); setcolor(WHITE); outtextxy(200, 160, "GAME OVER!!!"); Sleep(10000); closegraph(); }
以上就是C++利用EasyX編寫貪吃蛇游戲的示例代碼的詳細內(nèi)容,更多關(guān)于C++ EasyX貪吃蛇的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C/C++利用棧和隊列實現(xiàn)停車場管理系統(tǒng)
數(shù)據(jù)結(jié)構(gòu)的課程設(shè)計一般都不是很好理解,今天小編為大家總結(jié)了一下c和c++版本的常見棧和隊列的的停車場管理程序,需要的小伙伴可以參考一下2022-06-06