简单 C++ 贪吃蛇游戏(控制台版)
基于控制台实现的贪吃蛇游戏,核心功能包括:方向控制、食物生成、碰撞检测、分数统计,适合新手学习循环、数组、逻辑控制的实战案例。
开发环境
编译器:支持 C++11 及以上(Dev-C++、Code::Blocks、VS Code 均可)
依赖:Windows 系统(使用windows.h实现控制台控制,Linux/Mac 需微调)
完整代码
include
include
include
include <windows.h>
include <conio.h> // 用于获取键盘输入(无需回车)
using namespace std;
// 游戏常量定义
const int WIDTH = 40; // 游戏区域宽度
const int HEIGHT = 20; // 游戏区域高度
// 全局变量(简化逻辑,新手易理解)
int x, y; // 蛇头坐标
int fruitX, fruitY; // 食物坐标
int score; // 分数
int nTail; // 蛇身长度
int tailX[100], tailY[100]; // 蛇身坐标数组(最多支持100节)
// 方向枚举(避免魔法数字)
enum Direction { STOP = 0, LEFT, RIGHT, UP, DOWN };
Direction dir;
// 初始化游戏
void Setup() {
dir = STOP; // 初始静止
x = WIDTH / 2; // 蛇头初始位置(屏幕中心)
y = HEIGHT / 2;
// 随机生成食物(确保在游戏区域内,且不是边界)
srand(time(0)); // 设置随机数种子
fruitX = rand() % (WIDTH - 2) + 1;
fruitY = rand() % (HEIGHT - 2) + 1;score = 0;
nTail = 0;
}
// 绘制游戏界面
void Draw() {
system("cls"); // 清空控制台(Windows),Linux/Mac用 "clear"
// 绘制上边界
for (int i = 0; i < WIDTH; i++)cout << "#";
cout << endl;// 绘制左右边界和游戏区域
for (int i = 0; i < HEIGHT; i++) {for (int j = 0; j < WIDTH; j++) {if (j == 0 || j == WIDTH - 1) // 左右边界cout << "#";else if (i == y && j == x) // 蛇头cout << "O";else if (i == fruitY && j == fruitX) // 食物cout << "F";else { // 绘制蛇身bool drawTail = false;for (int k = 0; k < nTail; k++) {if (tailX[k] == j && tailY[k] == i) {cout << "o";drawTail = true;}}if (!drawTail)cout << " ";}}cout << endl;
}// 绘制下边界
for (int i = 0; i < WIDTH; i++)cout << "#";
cout << endl;// 显示分数
cout << "Score: " << score << endl;
cout << "Controls: W(Up) S(Down) A(Left) D(Right) | X(Quit)" << endl;
}
// 处理键盘输入
void Input() {
if (_kbhit()) { // 检测是否有键盘输入
switch (_getch()) { // 获取按键(无需回车)
case 'a': case 'A':
if (dir != RIGHT) dir = LEFT; // 防止反向移动
break;
case 'd': case 'D':
if (dir != LEFT) dir = RIGHT;
break;
case 'w': case 'W':
if (dir != DOWN) dir = UP;
break;
case 's': case 'S':
if (dir != UP) dir = DOWN;
break;
case 'x': case 'X':
exit(0); // 退出游戏
break;
}
}
}
// 游戏逻辑更新
void Logic() {
// 蛇身跟随(后一节复制前一节的坐标)
int prevX = tailX[0];
int prevY = tailY[0];
int prev2X, prev2Y;
tailX[0] = x;
tailY[0] = y;
for (int i = 1; i < nTail; i++) {
prev2X = tailX[i];
prev2Y = tailY[i];
tailX[i] = prevX;
tailY[i] = prevY;
prevX = prev2X;
prevY = prev2Y;
}
// 蛇头移动
switch (dir) {case LEFT:x--;break;case RIGHT:x++;break;case UP:y--;break;case DOWN:y++;break;default:break;
}// 边界碰撞检测(撞墙游戏结束)
if (x <= 0 || x >= WIDTH - 1 || y <= 0 || y >= HEIGHT - 1) {cout << "\nGame Over! Final Score: " << score << endl;cout << "Press any key to exit..." << endl;_getch();exit(0);
}// 蛇身碰撞检测(撞自己游戏结束)
for (int i = 0; i < nTail; i++) {if (tailX[i] == x && tailY[i] == y) {cout << "\nGame Over! Final Score: " << score << endl;cout << "Press any key to exit..." << endl;_getch();exit(0);}
}// 吃食物逻辑
if (x == fruitX && y == fruitY) {score += 10; // 分数+10nTail++; // 蛇身增长一节// 重新生成食物(避免生成在蛇身上)bool fruitOnSnake;do {fruitOnSnake = false;fruitX = rand() % (WIDTH - 2) + 1;fruitY = rand() % (HEIGHT - 2) + 1;// 检查食物是否在蛇头或蛇身上if (fruitX == x && fruitY == y)fruitOnSnake = true;for (int i = 0; i < nTail; i++) {if (fruitX == tailX[i] && fruitY == tailY[i])fruitOnSnake = true;}} while (fruitOnSnake);
}
}
// 主函数(游戏循环)
int main() {
Setup(); // 初始化
while (true) { // 无限循环(游戏主循环)
Draw(); // 绘制界面
Input(); // 处理输入
Logic(); // 更新逻辑
Sleep(100); // 控制游戏速度(数值越小越快,单位:毫秒)
}
return 0;
}
游戏说明
- 操作方式
W/↑:向上移动
S/↓:向下移动
A/←:向左移动
D/→:向右移动
X:退出游戏 - 核心功能解析
功能 实现逻辑
蛇身移动 用数组存储每节蛇身坐标,移动时后一节复制前一节坐标,蛇头按方向更新位置
食物生成 随机生成坐标,确保在游戏区域内且不与蛇身重叠(do-while 循环检测)
碰撞检测 边界碰撞(蛇头触碰到#边界)、自身碰撞(蛇头与蛇身坐标重合)
分数统计 吃一个食物得 10 分,蛇身增长一节
游戏速度 Sleep(100)控制帧率,数值越小速度越快(可修改为 80、60 等调整难度) - 编译运行步骤
打开 Dev-C++/Code::Blocks,新建 C++ 项目;
将代码复制粘贴到源文件中;
编译(Ctrl+F9)并运行(Ctrl+F10);
若在 Linux/Mac 下运行,需修改两处:
system("cls") → system("clear");
_kbhit()/_getch() → 替换为getchar()相关逻辑(或安装ncurses库)。
新手拓展建议
增加难度等级:得分每 100 分,Sleep数值减 10(速度加快);
优化食物:随机生成不同分值的食物(如红色 F 得 20 分,绿色 F 得 10 分);
增加围墙:在游戏区域内随机生成固定障碍物;
记录最高分:将最高分存储到文件中,下次启动游戏时显示;
美化界面:用不同字符表示蛇头(■)、蛇身(□)、食物(●)。
这个项目涵盖了 C++ 基础中的数组、循环、条件判断、枚举、函数调用等核心知识点,同时涉及简单的游戏逻辑设计,非常适合巩固入门阶段的编程能力!