进阶版贪吃蛇游戏c++

#include <iostream>

#include <conio.h>

#include <windows.h>

#include <ctime>

using namespace std;

bool gameOver;

const int width = 20;

const int height = 20;

int x, y, fruitX, fruitY, score, highScore;

int tailX[100], tailY[100];

int nTail;

enum eDirection { STOP = 0, LEFT, RIGHT, UP, DOWN };

eDirection dir;

char obstacleChar = '*';

int obstacles[width][height];

void Setup() {

    srand(time(0));

    gameOver = false;

    dir = STOP;

    x = width / 2;

    y = height / 2;

    fruitX = rand() % width;

    fruitY = rand() % height;

    score = 0;

    highScore = 0;

    nTail = 0;

    // Initialize obstacles array to 0 (no obstacles)

    for (int i = 0; i < width; ++i) {

        for (int j = 0; j < height; ++j) {

            obstacles[i][j] = 0;

        }

    }

    // Place random obstacles on the map

    int numObstacles = 5; // Number of obstacles

    for (int i = 0; i < numObstacles; ++i) {

        int obsX = rand() % width;

        int obsY = rand() % height;

        // Ensure obstacles are not placed on the snake's starting position or fruit

        if ((obsX != x || obsY != y) && (obsX != fruitX || obsY != fruitY)) {

            obstacles[obsX][obsY] = 1;

        }

    }

}

void Draw() {

    system("cls"); // system("clear") for Linux/Mac

    for (int i = 0; i < width + 2; i++)

        cout << "#";

    cout << endl;

    for (int i = 0; i < height; i++) {

        for (int j = 0; j < width; j++) {

            if (j == 0)

                cout << "#";

            if (i == y && j == x)

                cout << "O";

            else if (i == fruitY && j == fruitX)

                cout << "F";

            else if (obstacles[j][i]) {

                cout << obstacleChar;

            }

            else {

                bool print = false;

                for (int k = 0; k < nTail; k++) {

                    if (tailX[k] == j && tailY[k] == i) {

                        cout << "o";

                        print = true;

                    }

                }

                if (!print)

                    cout << " ";

            }

            if (j == width - 1)

                cout << "#";

        }

        cout << endl;

    }

    for (int i = 0; i < width + 2; i++)

        cout << "#";

    cout << endl;

    cout << "Score:" << score << " | High Score: " << highScore << endl;

}

void Input() {

    if (_kbhit()) {

        switch (_getch()) {

        case 'a':

            dir = LEFT;

            break;

        case 'd':

            dir = RIGHT;

            break;

        case 'w':

            dir = UP;

            break;

        case 's':

            dir = DOWN;

            break;

        case 'x':

            gameOver = true;

            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;

    }

    // Check collision with walls

    if (x >= width) x = 0; else if (x < 0) x = width - 1;

    if (y >= height) y = 0; else if (y < 0) y = height - 1;

    // Check collision with obstacles

    if (obstacles[x][y])

        gameOver = true;

    // Check collision with self

    for (int i = 0; i < nTail; i++)

        if (tailX[i] == x && tailY[i] == y)

            gameOver = true;

    // Eat fruit logic

    if (x == fruitX && y == fruitY) {

        score += 10;

        if (score > highScore) {

            highScore = score;

        }

        fruitX = rand() % width;

        fruitY = rand() % height;

        // Ensure new fruit does not spawn on an obstacle or the snake

        while (obstacles[fruitX][fruitY] || (fruitX == x && fruitY == y)) {

            fruitX = rand() % width;

            fruitY = rand() % height;

        }

        nTail++;

        // Increase difficulty by increasing speed

        Sleep(max(10, 100 - score / 10)); // Reduce sleep time as score increases

    } else {

        Sleep(100); // Default sleep time

    }

}

int main()

{

    Setup();

    while (!gameOver) {

        Draw();

        Input();

        Logic();

    }

    cout << "Game Over! Your final score was: " << score << endl;

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呱呱呱~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值