C++实现贪吃蛇小游戏带颜色
时间: 2023-09-24 20:12:48 浏览: 93
贪吃蛇小游戏 C++实现
5星 · 资源好评率100%
这里提供一份使用Windows API实现的C++贪吃蛇小游戏,带有颜色。主要使用了控制台颜色和键盘输入事件的处理。
```c++
#include <iostream>
#include <conio.h>
#include <windows.h>
using namespace std;
// 定义控制台颜色
const int COLOR_RED = 12;
const int COLOR_GREEN = 10;
const int COLOR_YELLOW = 14;
const int COLOR_WHITE = 7;
// 定义每个方块的大小
const int BLOCK_SIZE = 20;
// 定义窗口的大小
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
// 定义蛇的最大长度
const int MAX_SNAKE_LENGTH = 100;
// 定义蛇的初始位置和大小
const int INIT_SNAKE_X = 300;
const int INIT_SNAKE_Y = 300;
const int INIT_SNAKE_LENGTH = 3;
// 定义食物的大小
const int FOOD_SIZE = 20;
// 定义游戏的速度
const int GAME_SPEED = 100;
// 定义方向常量
const int DIR_UP = 1;
const int DIR_DOWN = 2;
const int DIR_LEFT = 3;
const int DIR_RIGHT = 4;
// 定义结构体表示蛇的每个方块
struct SnakeBlock {
int x, y;
};
// 定义全局变量
int g_direction = DIR_UP;
int g_snakeLength = INIT_SNAKE_LENGTH;
SnakeBlock g_snake[MAX_SNAKE_LENGTH];
int g_foodX, g_foodY;
// 初始化蛇
void initSnake() {
for (int i = 0; i < INIT_SNAKE_LENGTH; i++) {
g_snake[i].x = INIT_SNAKE_X;
g_snake[i].y = INIT_SNAKE_Y + i * BLOCK_SIZE;
}
}
// 绘制方块
void drawBlock(int x, int y, int color) {
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
COORD pos = {x, y};
SetConsoleCursorPosition(hConsole, pos);
SetConsoleTextAttribute(hConsole, color);
cout << " ";
}
// 绘制蛇
void drawSnake() {
for (int i = 0; i < g_snakeLength; i++) {
drawBlock(g_snake[i].x, g_snake[i].y, COLOR_GREEN);
}
}
// 擦除蛇
void eraseSnake() {
for (int i = 0; i < g_snakeLength; i++) {
drawBlock(g_snake[i].x, g_snake[i].y, COLOR_WHITE);
}
}
// 移动蛇
void moveSnake() {
// 记录蛇尾位置,用于后面擦除
int tailX = g_snake[g_snakeLength - 1].x;
int tailY = g_snake[g_snakeLength - 1].y;
// 后面的方块依次移到前面的方块的位置
for (int i = g_snakeLength - 1; i > 0; i--) {
g_snake[i].x = g_snake[i - 1].x;
g_snake[i].y = g_snake[i - 1].y;
}
// 根据方向移动蛇头
switch (g_direction) {
case DIR_UP:
g_snake[0].y -= BLOCK_SIZE;
break;
case DIR_DOWN:
g_snake[0].y += BLOCK_SIZE;
break;
case DIR_LEFT:
g_snake[0].x -= BLOCK_SIZE;
break;
case DIR_RIGHT:
g_snake[0].x += BLOCK_SIZE;
break;
}
// 如果蛇头和食物重合,蛇长度加1
if (g_snake[0].x == g_foodX && g_snake[0].y == g_foodY) {
g_snakeLength++;
// 随机生成新的食物位置
g_foodX = rand() % (WINDOW_WIDTH / BLOCK_SIZE) * BLOCK_SIZE;
g_foodY = rand() % (WINDOW_HEIGHT / BLOCK_SIZE) * BLOCK_SIZE;
}
// 擦除蛇尾
drawBlock(tailX, tailY, COLOR_WHITE);
}
// 绘制食物
void drawFood() {
drawBlock(g_foodX, g_foodY, COLOR_RED);
}
// 处理键盘输入事件
void handleInput() {
if (_kbhit()) {
char ch = _getch();
switch (ch) {
case 'w':
case 'W':
if (g_direction != DIR_DOWN) {
g_direction = DIR_UP;
}
break;
case 's':
case 'S':
if (g_direction != DIR_UP) {
g_direction = DIR_DOWN;
}
break;
case 'a':
case 'A':
if (g_direction != DIR_RIGHT) {
g_direction = DIR_LEFT;
}
break;
case 'd':
case 'D':
if (g_direction != DIR_LEFT) {
g_direction = DIR_RIGHT;
}
break;
}
}
}
// 判断游戏是否结束
bool isGameOver() {
// 如果蛇头超出边界,游戏结束
if (g_snake[0].x < 0 || g_snake[0].x >= WINDOW_WIDTH || g_snake[0].y < 0 || g_snake[0].y >= WINDOW_HEIGHT) {
return true;
}
// 如果蛇头和蛇身重合,游戏结束
for (int i = 1; i < g_snakeLength; i++) {
if (g_snake[0].x == g_snake[i].x && g_snake[0].y == g_snake[i].y) {
return true;
}
}
return false;
}
int main() {
// 隐藏光标
HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cursorInfo = {1, false};
SetConsoleCursorInfo(hConsole, &cursorInfo);
// 设置窗口大小
HWND hwnd = GetConsoleWindow();
RECT rect;
GetWindowRect(hwnd, &rect);
MoveWindow(hwnd, rect.left, rect.top, WINDOW_WIDTH, WINDOW_HEIGHT, true);
// 初始化随机数种子
srand(GetTickCount());
// 初始化蛇和食物
initSnake();
g_foodX = rand() % (WINDOW_WIDTH / BLOCK_SIZE) * BLOCK_SIZE;
g_foodY = rand() % (WINDOW_HEIGHT / BLOCK_SIZE) * BLOCK_SIZE;
// 游戏循环
while (true) {
// 绘制蛇和食物
drawSnake();
drawFood();
// 处理键盘输入事件
handleInput();
// 移动蛇
moveSnake();
// 判断游戏是否结束
if (isGameOver()) {
break;
}
// 等待一段时间,控制游戏速度
Sleep(GAME_SPEED);
// 擦除蛇
eraseSnake();
}
// 显示游戏结束信息
COORD pos = {WINDOW_WIDTH / 2 - 5, WINDOW_HEIGHT / 2};
SetConsoleCursorPosition(hConsole, pos);
SetConsoleTextAttribute(hConsole, COLOR_YELLOW);
cout << "Game Over" << endl;
return 0;
}
```
注意,在Windows下使用控制台颜色时,需要使用Windows API中的相关函数。例如,`GetStdHandle`用于获取标准输出句柄,`SetConsoleCursorPosition`用于设置控制台光标位置,`SetConsoleTextAttribute`用于设置控制台文本属性(包括颜色)。
阅读全文