基于C語言實現(xiàn)創(chuàng)意多彩貪吃蛇游戲
一、部分代碼截圖和游戲截圖
這里是部分代碼截圖,僅僅200行左右


這里是游戲截圖:


二、制作前的準備工作
1、準備開發(fā)環(huán)境
我使用的是Visual Stduio 2022 和 easyx配合的開發(fā)環(huán)境:
1.首先在官網(wǎng)下載VS2022社區(qū)版
2.然后在 easyx官網(wǎng)下載EasyX
3.打開下載的Easyx軟件,他會自動檢測你的VS版本,選擇對應版本安裝即可
2、修改項目屬性
1.按照圖示打開項目屬性頁

2.選擇高級 ——字符集——改為多字節(jié)字符集——點擊確定

3.在C/C++常規(guī)里找到SDL檢查并設置為否

三、貪吃蛇游戲源碼
源碼如下:
/*
項目名稱:貪吃蛇
作者: 微涼秋意
開發(fā)環(huán)境:VS2022+easyx
*/
#include<time.h> //輔助生成隨機數(shù)種子
#include<stdio.h> //C語言標準輸入輸出庫
#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
};
//食物結構體
struct Food
{
int x;
int y;
DWORD color;
bool flag; //是否被吃掉,決定是否重新生成
}food;
//蛇每個節(jié)點的位置和顏色
struct P
{
int x;
int y;
DWORD color;//DWORD是數(shù)據(jù)類型,可包含字符串
};
//設計蛇的結構體
struct Snake
{
int num; //當前節(jié)數(shù)
int dir; //方向
int score; //得分
int size; //蛇的寬和高
int speed; //移動速度
struct P coor[MAX_SNAKE]; //表示每節(jié)蛇的坐標,數(shù)組表示
}snake;
//初始化游戲函數(shù)
void GameInit()
{
//設置隨機數(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;//這樣寫的目的是讓食物坐標為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++) {
//設置圖形填充顏色
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);
}
//繪制分數(shù)
char temp[20] = " ";
sprintf(temp, "分數(shù):%d", snake.score);
outtextxy(10, 10, temp);//報錯的話是因為字符集問題
/*解決方案如下:
* 1、打開項目屬性,把常規(guī)改為多字節(jié)
* 2、打開項目屬性,C/C++常規(guī)設置里把SDL檢查關掉
*/
}
//蛇移動
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;//這樣寫的目的是讓食物坐標為10的倍數(shù)
food.y = rand() % (WIN_HEIGHT / 10) * 10;
food.color = RGB(rand() % 256, rand() % 256, rand() % 256);//隨機生成食物顏色
food.flag = true;
}
}
void EatFood()
{
//食物存在且坐標對應,吃掉后節(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));//設置顏色
cleardevice(); //刷新窗口
GameInit(); //調用初始化
while (1)
{
DrawGame();
MoveSnake();
if (_kbhit()) {
//_kbhit檢測是否有鍵盤輸入
GameControl();
}
EatFood();
Sleep(75);
}
getchar();//防止閃退
return 0;
}
到此這篇關于基于C語言實現(xiàn)創(chuàng)意多彩貪吃蛇游戲的文章就介紹到這了,更多相關C語言貪吃蛇游戲內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法
C++ 標準庫沒有提供所謂的日期類型,C++ 繼承了C語言用于日期和時間操作的結構和函數(shù),這篇文章主要給大家介紹了C++類和對象實戰(zhàn)之Date類的實現(xiàn)方法,需要的朋友可以參考下2021-12-12

