自己写的小游戏,求意见(悬关)
  • 板块灌水区
  • 楼主lxc_why
  • 当前回复17
  • 已保存回复17
  • 发布时间2025/2/4 19:59
  • 上次更新2025/2/4 20:34:51
查看原帖
自己写的小游戏,求意见(悬关)
1499574
lxc_why楼主2025/2/4 19:59

自己写的,可能比较蠢哈,勿喷。

求意见,资瓷壶关。

差不多有点像贪吃蛇吧。

#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++小游戏的大佬加入,有意向请私信。

凡是提出有意义的意见或加入团队者,皆关注,谢谢!

2025/2/4 19:59
加载中...