自己写的,可能比较蠢哈,勿喷。
求意见,资瓷壶关。
差不多有点像贪吃蛇吧。
#include <iostream>
#include <vector>
#include <ctime>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
using namespace std;
// 定义游戏区域的大小
const int WIDTH = 20;
const int HEIGHT = 20;
// 蛇的身体部分结构体
struct Point {
int x;
int y;
};
// 初始化游戏区域
vector<vector<char>> board(HEIGHT, vector<char>(WIDTH,' '));
// 蛇的身体
vector<Point> snake;
// 食物的位置
Point food;
// 蛇的移动方向
enum Direction { UP, DOWN, LEFT, RIGHT };
Direction dir = RIGHT;
// 得分
int score = 0;
// 当前关卡
int level = 1;
// 每个关卡的目标得分
const int LEVEL_UP_SCORE = 30;
// 是否开启计时模式
bool isTimedMode = false;
// 计时模式剩余时间(秒)
int remainingTime = 120;
// 函数声明
void setup();
void draw();
void input();
void logic();
bool isGameOver();
void showInstructions();
void generateFood();
void showStartMenu();
int main() {
showStartMenu();
showInstructions();
setup();
time_t startTime = time(nullptr);
while (!isGameOver()) {
draw();
input();
logic();
// 根据关卡调整游戏速度
Sleep(150 - (level - 1) * 20);
if (isTimedMode) {
time_t currentTime = time(nullptr);
int elapsedTime = static_cast<int>(currentTime - startTime);
remainingTime = 120 - elapsedTime;
if (remainingTime <= 0) {
break;
}
}
}
cout << "游戏结束!你的得分是:" << score << ",你通过了 " << level - 1 << " 个关卡。" << endl;
if (isTimedMode) {
cout << "你在计时模式下完成了游戏。" << endl;
}
return 0;
}
// 显示开始菜单,让玩家选择是否开启计时模式
void showStartMenu() {
cout << "欢迎来到贪吃蛇游戏!" << endl;
cout << "是否开启计时模式?(y/n): ";
char choice;
cin >> choice;
if (choice == 'y' || choice == 'Y') {
isTimedMode = true;
} else {
isTimedMode = false;
}
}
// 显示游戏玩法与规则
void showInstructions() {
cout << "游戏玩法与规则:" << endl;
cout << "1. 使用 'w' 键控制蛇向上移动。" << endl;
cout << "2. 使用 's' 键控制蛇向下移动。" << endl;
cout << "3. 使用 'a' 键控制蛇向左移动。" << endl;
cout << "4. 使用 'd' 键控制蛇向右移动。" << endl;
cout << "5. 蛇吃到食物会增长身体并获得 10 分。" << endl;
cout << "6. 当得分达到 " << LEVEL_UP_SCORE << " 分,将进入下一关,游戏速度会加快。" << endl;
cout << "7. 蛇撞到边界或自己的身体,游戏结束。" << endl;
if (isTimedMode) {
cout << "计时模式已开启,你有 2 分钟时间,看看能得多少分!" << endl;
}
cout << "按任意键开始游戏..." << endl;
_getch();
}
// 初始化函数
void setup() {
srand(static_cast<unsigned int>(time(0))); // 初始化随机数种子
// 初始化蛇,从屏幕中间开始,长度为 3
snake.push_back({WIDTH / 2, HEIGHT / 2});
snake.push_back({WIDTH / 2 - 1, HEIGHT / 2});
snake.push_back({WIDTH / 2 - 2, HEIGHT / 2});
// 生成食物
generateFood();
}
// 绘制函数
void draw() {
system("cls"); // 清屏
// 绘制游戏区域
for (int i = 0; i < HEIGHT; ++i) {
for (int j = 0; j < WIDTH; ++j) {
if (i == 0 || i == HEIGHT - 1 || j == 0 || j == WIDTH - 1) {
board[i][j] = '#'; // 边界
} else {
board[i][j] =' '; // 内部区域
}
}
}
// 绘制蛇
for (const auto& p : snake) {
board[p.y][p.x] = 'O';
}
// 绘制食物
board[food.y][food.x] = 'X';
// 输出游戏区域和得分、关卡信息
for (int i = 0; i < HEIGHT; ++i) {
for (int j = 0; j < WIDTH; ++j) {
cout << board[i][j];
}
cout << endl;
}
cout << "得分: " << score << ",当前关卡: " << level;
if (isTimedMode) {
cout << ",剩余时间: " << remainingTime << " 秒";
}
cout << endl;
}
// 输入处理函数
void input() {
if (_kbhit()) { // 检查是否有键盘输入
switch (_getch()) {
case 'w':
if (dir != DOWN) dir = UP;
break;
case's':
if (dir != UP) dir = DOWN;
break;
case 'a':
if (dir != RIGHT) dir = LEFT;
break;
case 'd':
if (dir != LEFT) dir = RIGHT;
break;
}
}
}
// 游戏逻辑函数
void logic() {
// 计算新的蛇头位置
Point newHead = snake.front();
switch (dir) {
case UP:
newHead.y--;
break;
case DOWN:
newHead.y++;
break;
case LEFT:
newHead.x--;
break;
case RIGHT:
newHead.x++;
break;
}
// 检查是否吃到食物
if (newHead.x == food.x && newHead.y == food.y) {
snake.insert(snake.begin(), newHead); // 增长蛇的长度
// 生成新的食物
generateFood();
score += 10; // 得分加 10 分
// 检查是否可以升级关卡
if (score % LEVEL_UP_SCORE == 0) {
level++;
cout << "恭喜你,进入第 " << level << " 关!" << endl;
Sleep(1000);
}
} else {
// 移动蛇
snake.insert(snake.begin(), newHead);
snake.pop_back();
}
}
// 检查游戏是否结束
bool isGameOver() {
// 检查是否撞到边界
Point head = snake.front();
if (head.x == 0 || head.x == WIDTH - 1 || head.y == 0 || head.y == HEIGHT - 1) {
return true;
}
// 检查是否撞到自己
for (size_t i = 1; i < snake.size(); ++i) {
if (snake[i].x == head.x && snake[i].y == head.y) {
return true;
}
}
return false;
}
// 生成食物,确保食物不在边界上
void generateFood() {
do {
food.x = rand() % (WIDTH - 2) + 1;
food.y = rand() % (HEIGHT - 2) + 1;
} while (
[&]() {
for (const auto& p : snake) {
if (p.x == food.x && p.y == food.y) {
return true;
}
}
return false;
}()
);
}
最后就是本人新建了一个团,欢迎喜欢写c++小游戏的大佬加入,有意向请私信。
凡是提出有意义的意见或加入团队者,皆关注,谢谢!