基于C語言實(shí)現(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軟件,他會(huì)自動(dòng)檢測(cè)你的VS版本,選擇對(duì)應(yīng)版本安裝即可
2、修改項(xiàng)目屬性
1.按照?qǐng)D示打開項(xiàng)目屬性頁(yè)
2.選擇高級(jí) ——字符集——改為多字節(jié)字符集——點(diǎn)擊確定
3.在C/C++常規(guī)里找到SDL檢查并設(shè)置為否
三、貪吃蛇游戲源碼
源碼如下:
/* 項(xiàng)目名稱:貪吃蛇 作者: 微涼秋意 開發(fā)環(huán)境:VS2022+easyx */ #include<time.h> //輔助生成隨機(jī)數(shù)種子 #include<stdio.h> //C語言標(biāo)準(zhǔn)輸入輸出庫(kù) #include<conio.h> //鍵盤輸入 #include<graphics.h> //easyx圖像庫(kù),提供函數(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; //蛇每個(gè)節(jié)點(diǎn)的位置和顏色 struct P { int x; int y; DWORD color;//DWORD是數(shù)據(jù)類型,可包含字符串 }; //設(shè)計(jì)蛇的結(jié)構(gòu)體 struct Snake { int num; //當(dāng)前節(jié)數(shù) int dir; //方向 int score; //得分 int size; //蛇的寬和高 int speed; //移動(dòng)速度 struct P coor[MAX_SNAKE]; //表示每節(jié)蛇的坐標(biāo),數(shù)組表示 }snake; //初始化游戲函數(shù) void GameInit() { //設(shè)置隨機(jī)數(shù)種子 srand((unsigned int)time(NULL)); snake.num = 3; snake.dir = RIGHT;//初識(shí)移動(dòng)方向?yàn)橛? snake.score = 0; snake.size = 10; snake.speed = 10; //初始化蛇有三個(gè)節(jié)點(diǎn) snake.coor[0].x = 320; snake.coor[0].y = 240; snake.coor[0].color = (RGB(rand()%256, rand() % 256, rand() % 256));//隨機(jī)生成顏色 snake.coor[1].x = 310; snake.coor[1].y = 240; snake.coor[1].color = (RGB(rand()%256, rand() % 256, rand() % 256));//隨機(jī)生成顏色 snake.coor[2].x = 300; snake.coor[2].y = 240; snake.coor[2].color = (RGB(rand()%256, rand() % 256, rand() % 256));//隨機(jī)生成顏色 //初始化食物 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);//隨機(jī)生成食物顏色 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);//報(bào)錯(cuò)的話是因?yàn)樽址瘑栴} /*解決方案如下: * 1、打開項(xiàng)目屬性,把常規(guī)改為多字節(jié) * 2、打開項(xiàng)目屬性,C/C++常規(guī)設(shè)置里把SDL檢查關(guān)掉 */ } //蛇移動(dòng) void MoveSnake() { //從尾部開始移動(dòng) 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);//隨機(jī)生成食物顏色 food.flag = true; } } void EatFood() { //食物存在且坐標(biāo)對(duì)應(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檢測(cè)是否有鍵盤輸入 GameControl(); } EatFood(); Sleep(75); } getchar();//防止閃退 return 0; }
到此這篇關(guān)于基于C語言實(shí)現(xiàn)創(chuàng)意多彩貪吃蛇游戲的文章就介紹到這了,更多相關(guān)C語言貪吃蛇游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C++中關(guān)于Crt的內(nèi)存泄漏檢測(cè)的分析介紹
本篇文章介紹了,在C++中關(guān)于Crt的內(nèi)存泄漏檢測(cè)的分析說明。需要的朋友參考下2013-04-04C++ 標(biāo)準(zhǔn)模板庫(kù) STL 順序容器詳解
這篇文章主要介紹了C++ 標(biāo)準(zhǔn)模板庫(kù) STL 順序容器詳解,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-05-05實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法
下面小編就為大家?guī)硪黄獙?shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法。小編覺得挺不錯(cuò)的現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01C++類和對(duì)象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法
C++ 標(biāo)準(zhǔn)庫(kù)沒有提供所謂的日期類型,C++ 繼承了C語言用于日期和時(shí)間操作的結(jié)構(gòu)和函數(shù),這篇文章主要給大家介紹了C++類和對(duì)象實(shí)戰(zhàn)之Date類的實(shí)現(xiàn)方法,需要的朋友可以參考下2021-12-12