貪吃蛇--C++實戰項目(零基礎)

視頻地址:C語言必學項目:貪吃蛇!

貪吃蛇游戲框架
├── 基礎框架
│ ├── 頭文件引入
│ ├── 常量和宏定義
│ └── 窗口初始化

├── 數據結構系統
│ ├── Pos結構體(位置和顏色)
│ ├── Snake結構體(蛇的屬性)
│ ├── Food結構體(食物屬性)
│ └── DIR枚舉(方向控制)

├── 初始化系統
│ ├── 隨機種子設置
│ ├── 蛇屬性初始化
│ ├── 蛇身位置初始化
│ └── 食物生成

├── 繪制系統
│ ├── 清屏操作
│ ├── 蛇身繪制
│ ├── 食物繪制
│ └── 分數顯示

├── 控制系統
│ ├── 鍵盤輸入檢測
│ ├── 方向鍵處理
│ └── 防反向移動邏輯

├── 移動系統
│ ├── 蛇身跟隨算法
│ └── 蛇頭方向移動

├── 食物系統
│ ├── 食物生成算法
│ ├── 碰撞檢測
│ ├── 分數增加
│ └── 蛇身增長

└── 游戲循環
├── 繪制→移動→輸入→檢測
└── 速度控制

游戲實現步驟分析

1. 基礎框架搭建

// 1. 包含必要的頭文件
#include <graphics.h>  // EasyX圖形庫
#include <conio.h>     // 控制臺輸入輸出
#include <iostream>    // 標準輸入輸出
using namespace std;// 2. 定義游戲窗口大小和常量
const int WIDTH = 640;
const int HEIGHT = 480;
#define MAX_SNAKE 500

2. 數據結構設計

// 3. 定義位置結構體
struct Pos {int x;int y;DWORD color;
};// 4. 定義蛇結構體
struct Snake {int num;      // 蛇節數int dir;      // 方向int score;    // 分數int size;     // 尺寸int speed;    // 速度Pos coor[MAX_SNAKE]; // 坐標數組
};// 5. 定義食物結構體
struct Food {int x;int y;DWORD color;bool flag;    // 是否存在
};// 6. 定義方向枚舉
enum DIR { UP, DOWN, LEFT, RIGHT };

3. 游戲初始化

void GameInit() {// 初始化隨機種子srand(GetTickCount());// 設置蛇的初始屬性snake.num = 3;snake.dir = RIGHT;snake.score = 0;snake.size = 10;snake.speed = 10;// 初始化蛇身位置和顏色snake.coor[0].x = 20;snake.coor[0].y = 0;snake.coor[0].color = RGB(rand() % 256, rand() % 256, rand() % 256);// 隨機生產顏色snake.coor[1].x = 10;snake.coor[1].y = 0;snake.coor[1].color = RGB(rand() % 256, rand() % 256, rand() % 256);snake.coor[2].x = 0;snake.coor[2].y = 0;snake.coor[2].color = RGB(rand() % 256, rand() % 256, rand() % 256);// 初始化食物createFood();
}

4. 游戲繪制系統

void GameDraw() {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 + snake.size, snake.coor[i].y + snake.size);}// 繪制食物if (food.flag) {setfillcolor(food.color);solidellipse(food.x, food.y, food.x + 10, food.y + 10);}// 繪制分數char temp[20] = "";sprintf(temp, "分數: %d", snake.score);outtextxy(10, 10, temp);
}

5. 輸入控制系統

void GameController() {if (_kbhit()) {char key = _getch();switch (key) {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;}}
}

6. 移動邏輯實現

void GameMove() {// 蛇身跟隨移動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; break;case DOWN:  snake.coor[0].y += snake.speed; break;case LEFT:  snake.coor[0].x -= snake.speed; break;case RIGHT: snake.coor[0].x += snake.speed; break;}
}

7. 食物系統

void createFood() {food.x = rand() % (WIDTH / 10) * 10;food.y = rand() % (HEIGHT / 10) * 10;food.color = RGB(rand() % 256, rand() % 256, rand() % 256);food.flag = true;
}void EatFood() {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 - 1].color = RGB(rand() % 256, rand() % 256, rand() % 256);createFood();}
}

8. 游戲主循環

int main() {initgraph(WIDTH, HEIGHT);setbkcolor(RGB(207, 214, 229));GameInit();while (true) {GameDraw();        // 繪制GameMove();        // 移動if(_kbhit()) {     // 輸入檢測GameController();}EatFood();         // 食物檢測Sleep(100);        // 控制速度}return 0;
}

9. 完整代碼

// 導入圖形界面庫 EasyX
#include <graphics.h>
//控制鍵盤的頭文件
#include<conio.h>
#include<iostream>
using namespace std;// 定義游戲區域大小
const int WIDTH = 640;
const int HEIGHT = 480;
#define MAX_SNAKE 500  // 常量struct Pos{int x;int y;DWORD color;//DWORD 是 Windows API 中定義的數據類型
};struct Snake{int num;      // 蛇身體的節數int dir;      // 蛇的方向int score;    // 分數int size;     // 蛇的寬和高int speed;    // 蛇的速度// 記錄蛇的坐標數組struct Pos coor[MAX_SNAKE];
};struct Snake snake;//結構體變量struct Food{int x;int y;DWORD color;bool flag; // 是否被吃掉
} food;enum DIR
{UP,DOWN,LEFT,RIGHT
};// 初始化一下數據
void GameInit() {//蛇的身體的顏色隨機變化srand(GetTickCount());snake.num = 3;snake.dir = RIGHT;snake.score = 0;snake.size = 10;snake.speed = 10;// 初始化蛇身位置和顏色for (int i = 0; i < snake.num; i++) {snake.coor[i].x = 20 - i * 10;snake.coor[i].y = 0;snake.coor[i].color = RGB(rand() % 256, rand() % 256, rand() % 256);}// 初始化食物 顏色隨機變化createFood();
}// 畫蛇 畫食物 畫分數
void GameDraw() {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 + snake.size, snake.coor[i].y + snake.size);}// 繪制食物if (food.flag){setfillcolor(food.color);solidellipse(food.x, food.y, food.x + 10, food.y + 10);}// 繪制分數char temp[20] = "";sprintf(temp, "分數: %d", snake.score);outtextxy(10, 10, temp);
}//控制蛇的方向
void GameController() {// 獲取鍵盤char key = _getch();// 控制蛇不能往回走switch (key) {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;}//cout << (int)key << endl;
}// 讓蛇動起來
void GameMove() {// 循環部分 - 控制蛇身移動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部分 - 控制蛇頭移動 [蛇頭控制方向,蛇身跟隨前一個位置]switch (snake.dir) {case UP:snake.coor[0].y -= snake.speed;break;case DOWN:snake.coor[0].y += snake.speed;break;case LEFT:snake.coor[0].x -= snake.speed;break;case RIGHT:snake.coor[0].x += snake.speed;break;}
}// 創建新食物的函數
void createFood() {food.x = rand() % (WIDTH / 10) * 10;food.y = rand() % (HEIGHT / 10) * 10;food.color = RGB(rand() % 256, rand() % 256, rand() % 256);food.flag = true;
}void EatFood() {// 碰撞檢測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 - 1].color = RGB(rand() % 256, rand() % 256, rand() % 256);// 吃完了 在重新創建一個新的食物createFood();}
}
int main() {// 初始化圖形窗口initgraph(WIDTH, HEIGHT);// 設置背景色為淺藍灰色setbkcolor(RGB(207, 214, 229));//清屏再重新繪制所有內容cleardevice();// 初始化蛇的數據GameInit();// 游戲主循環while (true) {GameDraw();GameMove();// 如果按了鍵盤就會執行if(_kbhit()){GameController();}EatFood();Sleep(100);}return 0;
}

10. 改進建議

  1. 添加碰撞檢測 - 檢測撞墻和自身碰撞
  2. 改進輸入處理 - 使用Windows API處理方向鍵
  3. 添加游戲狀態 - 游戲開始、暫停、結束狀態優化
  4. 食物生成 - 避免食物生成在蛇身上添
  5. 加音效 - 吃食物和游戲結束的音效

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919774.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919774.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919774.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

unity資源領取反作弊工具加密器

https://assetstore.unity.com/packages/tools/utilities/anti-cheat-pro-2025-3006260元購碼GUARDINGPEARSOFTWARE

FPGA設計中的信號完整性量化與優化:探索高速數字系統的關鍵路徑

在高速FPGA設計中&#xff0c;信號完整性&#xff08;Signal Integrity, SI&#xff09;已成為確保系統穩定、可靠運行的核心要素之一。隨著數據傳輸速率的不斷提升和電路規模的日益復雜&#xff0c;信號在傳輸過程中受到的干擾和畸變問題日益凸顯。因此&#xff0c;如何有效量…

`strncasecmp` 字符串比較函數

1) 函數的概念與用途 strncasecmp 是 C 語言中一個非常實用的字符串處理函數&#xff0c;它執行不區分大小寫的字符串比較&#xff0c;但只比較前 n 個字符。這個函數的名字來源于"string n case-compare"&#xff08;字符串前n個字符不區分大小寫比較&#xff09;。…

軟件安裝教程(一):Visual Studio Code安裝與配置(Windows)

文章目錄前言一、Visual Studio Code下載二、安裝步驟&#xff08;Windows&#xff09;1. GUI安裝2. 命令行安裝三、首次啟動后建議的快速配置&#xff08;幾分鐘完成&#xff09;四、常見問題 & 小貼士總結前言 Visual Studio Code&#xff08;VS Code&#xff09;是一款…

JavaSSM框架從入門到精通!第三天(MyBatis(二))!

四、Mapper 的動態代理1. 引入 在上面的 CURD 例子中&#xff0c;我們發現&#xff1a;Dao 層的實現類的每一個方法僅僅是通過 SqlSession 對象的相關 API 定位到映射文件 mapper 中的 SQL 語句&#xff0c;真正對數據庫操作的工作實際上是有 Mybatis 框架通過 mapper 中的 SQL…

大模型應用發展與Agent前沿技術趨勢(下)

Agent技術的行業應用與實踐案例 金融領域的Agent應用 金融行業是大模型Agent技術應用最為廣泛的領域之一&#xff0c;涵蓋了風險評估、投資決策、客戶服務等多個方面。在金融風控領域&#xff0c;Agent系統通過結合大模型的語義理解能力和強化學習的決策優化能力&#xff0c;能…

94. 城市間貨物運輸 I, Bellman_ford 算法, Bellman_ford 隊列優化算法

94. 城市間貨物運輸 IBellman_ford 算法Bellman_ford 算法 與 dijkstra算法 相比通用性更強。dijkstra算法解決不了負權邊的問題&#xff0c;因為Dijkstra基于貪心策略&#xff0c;一旦一個節點被從隊列中取出&#xff08;標記為已解決&#xff09;&#xff0c;它就假定已經找到…

如何使用Prometheus + Grafana + Loki構建一個現代化的云原生監控系統

如何使用 Prometheus + Grafana + Loki 構建一個現代化的云原生監控系統。這套組合被譽為監控領域的“瑞士軍刀”,功能強大且生態極佳。 一、核心組件概念介紹 在搭建之前,深刻理解每個組件的角色和職責至關重要。 1. Prometheus(指標監控與時序數據庫) 角色:系統的“核…

JavaScript Object 操作方法及 API

一、對象創建方式1.字面量創建&#xff08;最常用&#xff09;const obj { name: "張三", age: 25 };2.構造函數創建const obj new Object(); obj.name "李四";3.Object.create()&#xff08;指定原型&#xff09;const proto { greet: () > "…

pta乙級題目day1

第1天&#xff1a;輸入輸出與運算&#xff08;6題&#xff09;1001 害死人不償命的(3n1)猜想&#xff08;基礎運算&#xff09;★1006 換個格式輸出整數&#xff08;格式化輸出&#xff09;★1016 部分AB&#xff08;數字提取&#xff09;★★1046 劃拳&#xff08;多輸入處理&…

在VSCode中配置.NET項目的tasks.json以實現清理、構建、熱重載和發布等操作

在 VS Code 中配置 .NET 開發任務的完整指南 引言 重要提醒&#xff1a;對于 .NET 開發&#xff0c;強烈推薦使用 Visual Studio&#xff0c;它提供了最完整和穩定的開發體驗。如果你像我一樣"蛋疼"想要嘗試 VS Code&#xff0c;請確保安裝了 C# 開發擴展包&#x…

EmEditor文本編輯器v25.3.0專業版,專業文本編輯,高亮顯示,無限撤消

[軟件名稱]: EmEditor文本編輯器v25.3.0專業版 [軟件大小]: 37.7 MB [軟件大小]: 夸克網盤 | 百度網盤 軟件介紹 EmEditor 是一款功能強大且非常實用的文本編輯器。它啟動速度快&#xff0c;完全可以替代 Windows 自帶的記事本&#xff0c;輕松應對日常文本編輯任務。它對 …

【spring security】權限管理組件執行流程詳解

&#x1f3af; 權限管理組件執行流程詳解 &#x1f3d7;? 組件架構圖 ┌─────────────────────────────────────────────────────────────┐ │ HTTP請求 …

redis怎么保障雙寫一致性

redis做為緩存&#xff0c;mysql的數據如何與redis進行同步呢&#xff1f;&#xff08;雙寫一致性&#xff09;候選人&#xff1a;嗯&#xff01;就說我最近做的這個項目&#xff0c;里面有xxxx&#xff08;根據自己的簡歷上寫&#xff09;的功能&#xff0c;需要讓數據庫與red…

異常值檢測:孤立森林模型(IsolationForest)總結

目錄一、前言二、孤立森林算法2.1 算法簡介2.2 基本原理2.3 算法步驟2.4 異常分數計算方式2.5 python調用方式三、python代碼示例四、小結五、參考學習一、前言 近期在研究構建壽命預測模型&#xff0c;相信很多數據人都懂建模的過程&#xff0c;其實有80%的時間都是在和數據處…

Docker容器化部署實戰:Tomcat與Nginx服務配置指南

部署Tomcat搜索鏡像 使用以下命令搜索可用的Tomcat鏡像&#xff1a;docker search tomcat拉取鏡像 拉取官方Tomcat鏡像&#xff1a;docker pull tomcat創建專用目錄 為Tomcat配置和數據創建專用目錄&#xff1a;mkdir tomcat運行臨時容器并復制配置文件 啟動臨時容器以復制配置…

Go語言實戰案例-使用SQLite實現本地存儲

在開發工具類軟件、桌面應用或者移動端時&#xff0c;我們經常需要一個輕量級數據庫來做 本地存儲。相比 MySQL、Postgres 等服務型數據庫&#xff0c;SQLite 體積小、零配置、單文件存儲&#xff0c;非常適合這種場景。Go 語言通過 GORM SQLite 驅動 就能輕松實現。本文將帶你…

云計算學習100天-第23天

主機192.168.88.5 安裝nginx#安裝編譯工具&#xff0c;正則表達式依賴包&#xff0c;SSL加密依賴包 yum -y install gcc make pcre-devel openssl-devel tar -xf /root/lnmp_soft.tar.gz cd lnmp_soft/ tar -xf nginx-1.22.1.tar.gz cd nginx-1.22.1/ #指定安裝路徑&…

【生成樹+環】題解:P3907 環的異或_圖論_環_異或_搜索_算法競賽_C++

推銷洛谷博客&#xff1a;https://www.luogu.com.cn/article/znmr9iu9 Link&#xff1a;Luogu - P3907 這里默認題目中指的環都是“簡單環”&#xff08;即沒有“環套環”的情況&#xff09;。 眾所周知&#xff0c;樹是圖的一種特殊情況&#xff0c;且一定無環。如果我們想…

數據庫優化提速(二)排序優化之搜索大數據酒店,進銷存AI—仙盟創夢IDE

在 MySQL 數據庫管理中&#xff0c;排序操作對于數據的有效展示和分析至關重要。本文將以一個實際的 SQL 查詢為例&#xff0c;深入探討排序優化方案&#xff0c;并結合進銷存、酒店、知識庫等大數據場景&#xff0c;闡述這些優化策略的應用價值。原始SELECT 應用編號, 應用序列…