基于C語言實現(xiàn)創(chuàng)意多彩貪吃蛇游戲
一、部分代碼截圖和游戲截圖
這里是部分代碼截圖,僅僅200行左右
這里是游戲截圖:
二、制作前的準(zhǔn)備工作
1、準(zhǔn)備開發(fā)環(huán)境
我使用的是Visual Stduio 2022
和 easyx
配合的開發(fā)環(huán)境:
1.首先在官網(wǎng)下載VS2022社區(qū)版
2.然后在 easyx官網(wǎng)下載EasyX
3.打開下載的Easyx軟件,他會自動檢測你的VS版本,選擇對應(yīng)版本安裝即可
2、修改項目屬性
1.按照圖示打開項目屬性頁
2.選擇高級 ——字符集——改為多字節(jié)字符集——點擊確定
3.在C/C++常規(guī)里找到SDL檢查并設(shè)置為否
三、貪吃蛇游戲源碼
源碼如下:
/* 項目名稱:貪吃蛇 作者: 微涼秋意 開發(fā)環(huán)境:VS2022+easyx */ #include<time.h> //輔助生成隨機數(shù)種子 #include<stdio.h> //C語言標(biāo)準(zhǔn)輸入輸出庫 #include<conio.h> //鍵盤輸入 #include<graphics.h> //easyx圖像庫,提供函數(shù),繪圖和貼圖 #define MAX_SNAKE 500 //蛇的最大節(jié)數(shù) #define WIN_WIDTH 640 //游戲窗口的寬度 #define WIN_HEIGHT 480 //游戲窗口的高度 //枚舉 enum Dir { //枚舉,從上往下代表0,1,2,3 UP, DOWN, LEFT, RIGHT }; //食物結(jié)構(gòu)體 struct Food { int x; int y; DWORD color; bool flag; //是否被吃掉,決定是否重新生成 }food; //蛇每個節(jié)點的位置和顏色 struct P { int x; int y; DWORD color;//DWORD是數(shù)據(jù)類型,可包含字符串 }; //設(shè)計蛇的結(jié)構(gòu)體 struct Snake { int num; //當(dāng)前節(jié)數(shù) int dir; //方向 int score; //得分 int size; //蛇的寬和高 int speed; //移動速度 struct P coor[MAX_SNAKE]; //表示每節(jié)蛇的坐標(biāo),數(shù)組表示 }snake; //初始化游戲函數(shù) void GameInit() { //設(shè)置隨機數(shù)種子 srand((unsigned int)time(NULL)); snake.num = 3; snake.dir = RIGHT;//初識移動方向為右 snake.score = 0; snake.size = 10; snake.speed = 10; //初始化蛇有三個節(jié)點 snake.coor[0].x = 320; snake.coor[0].y = 240; snake.coor[0].color = (RGB(rand()%256, rand() % 256, rand() % 256));//隨機生成顏色 snake.coor[1].x = 310; snake.coor[1].y = 240; snake.coor[1].color = (RGB(rand()%256, rand() % 256, rand() % 256));//隨機生成顏色 snake.coor[2].x = 300; snake.coor[2].y = 240; snake.coor[2].color = (RGB(rand()%256, rand() % 256, rand() % 256));//隨機生成顏色 //初始化食物 food.x = rand() % (WIN_WIDTH/10)*10;//這樣寫的目的是讓食物坐標(biāo)為10的倍數(shù) food.y = rand() % (WIN_HEIGHT/10)*10; food.color = RGB(rand() % 256, rand() % 256, rand() % 256);//隨機生成食物顏色 food.flag = true; } //繪制游戲所需資源 void DrawGame() { cleardevice();//刷新窗口 //繪制蛇 for (int i = 0; i < snake.num; i++) { //設(shè)置圖形填充顏色 setfillcolor(snake.coor[i].color); //畫矩形 fillrectangle(snake.coor[i].x, snake.coor[i].y, snake.coor[i].x + 10, snake.coor[i].y+10); } //繪制食物(橢圓) if (food.flag) { setfillcolor(food.color); solidellipse(food.x, food.y, food.x + 10, food.y + 10); } //繪制分?jǐn)?shù) char temp[20] = " "; sprintf(temp, "分?jǐn)?shù):%d", snake.score); outtextxy(10, 10, temp);//報錯的話是因為字符集問題 /*解決方案如下: * 1、打開項目屬性,把常規(guī)改為多字節(jié) * 2、打開項目屬性,C/C++常規(guī)設(shè)置里把SDL檢查關(guān)掉 */ } //蛇移動 void MoveSnake() { //從尾部開始移動 for (int i =snake.num-1 ;i > 0;i--) { snake.coor[i].x = snake.coor[i - 1].x; snake.coor[i].y = snake.coor[i - 1].y; } switch (snake.dir) { case UP: snake.coor[0].y -= snake.speed; if (snake.coor[0].y < 0) { snake.coor[0].y = WIN_HEIGHT; } break; case DOWN: snake.coor[0].y += snake.speed; if (snake.coor[0].y > WIN_HEIGHT) { snake.coor[0].y = 0; } break; case LEFT: snake.coor[0].x -= snake.speed; if (snake.coor[0].x < 0) { snake.coor[0].x = WIN_WIDTH; } break; case RIGHT: snake.coor[0].x += snake.speed; if (snake.coor[0].x > WIN_WIDTH) { snake.coor[0].x = 0; } break; } } void GameControl() { //獲取鍵盤輸入,_getch();不回顯函數(shù): char key = _getch(); switch (key) { //72代表上,80代表下,75代表左,77代表右 case 72: if (snake.dir!=DOWN)//如果正在往下,則不能掉頭往上 { snake.dir = UP; } break; case 80: if (snake.dir != UP)//如果正在往上,則不能掉頭往下 { snake.dir = DOWN; } break; case 75: if (snake.dir !=RIGHT)//如果正在往右,則不能掉頭往左 { snake.dir = LEFT; } break; case 77: if (snake.dir != LEFT)//如果正在往左,則不能掉頭往右 { snake.dir = RIGHT; } break; } } //吃食物 void CreatFood() { if (!food.flag) { food.x = rand() % (WIN_WIDTH / 10) * 10;//這樣寫的目的是讓食物坐標(biāo)為10的倍數(shù) food.y = rand() % (WIN_HEIGHT / 10) * 10; food.color = RGB(rand() % 256, rand() % 256, rand() % 256);//隨機生成食物顏色 food.flag = true; } } void EatFood() { //食物存在且坐標(biāo)對應(yīng),吃掉后節(jié)數(shù)加一,食物變?yōu)椴淮嬖? if (food.flag && snake.coor[0].x == food.x && snake.coor[0].y == food.y) { food.flag = false; snake.num++; snake.score += 10; snake.coor[snake.num].color = food.color; CreatFood(); } } int main(void) { //1.創(chuàng)建窗口,initgraoh初始化 graphics 圖形窗口 initgraph(WIN_WIDTH,WIN_HEIGHT); setbkcolor(RGB(190,190,190));//設(shè)置顏色 cleardevice(); //刷新窗口 GameInit(); //調(diào)用初始化 while (1) { DrawGame(); MoveSnake(); if (_kbhit()) { //_kbhit檢測是否有鍵盤輸入 GameControl(); } EatFood(); Sleep(75); } getchar();//防止閃退 return 0; }
到此這篇關(guān)于基于C語言實現(xiàn)創(chuàng)意多彩貪吃蛇游戲的文章就介紹到這了,更多相關(guān)C語言貪吃蛇游戲內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中關(guān)于Crt的內(nèi)存泄漏檢測的分析介紹
本篇文章介紹了,在C++中關(guān)于Crt的內(nèi)存泄漏檢測的分析說明。需要的朋友參考下2013-04-04C++ 標(biāo)準(zhǔn)模板庫 STL 順序容器詳解
這篇文章主要介紹了C++ 標(biāo)準(zhǔn)模板庫 STL 順序容器詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-05-05C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法
C++ 標(biāo)準(zhǔn)庫沒有提供所謂的日期類型,C++ 繼承了C語言用于日期和時間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法,需要的朋友可以參考下2021-12-12