举报

你们用的电脑摁esc能退出游戏吗?

0

我的电脑用的是虚拟机模拟,你们的正常吗?

#include <graphics.h>  // EasyX 图形库
#include <conio.h>     // 用于 _kbhit() 和 _getch()
#include <iostream>

// ======================
// 游戏常量定义
// ======================
const int WINDOW_WIDTH = 800;
const int WINDOW_HEIGHT = 600;
const int PADDLE_WIDTH = 15;
const int PADDLE_HEIGHT = 100;
const int BALL_SIZE = 15;
const int PADDLE_SPEED = 8;
const int BALL_SPEED_X = 5;
const int BALL_SPEED_Y = 5;

// ======================
// 游戏对象结构体
// ======================
struct Paddle
{
    int x, y;
    int speed;
};

struct Ball
{
    int x, y;
    int speedX, speedY;
};

// ======================
// 全局游戏变量
// ======================
Paddle leftPaddle = { 30, WINDOW_HEIGHT / 2 - PADDLE_HEIGHT / 2, PADDLE_SPEED };
Paddle rightPaddle = { WINDOW_WIDTH - 30 - PADDLE_WIDTH, WINDOW_HEIGHT / 2 - PADDLE_HEIGHT / 2, PADDLE_SPEED };
Ball   ball = { WINDOW_WIDTH / 2, WINDOW_HEIGHT / 2, BALL_SPEED_X, BALL_SPEED_Y };
int    leftScore = 0;
int    rightScore = 0;

// ======================
// 函数:重置弹球位置 ✅(先定义,再调用)
// ======================
void ResetBall()
{
    ball.x = WINDOW_WIDTH / 2;
    ball.y = WINDOW_HEIGHT / 2;
    ball.speedX = (rand() % 2 == 0) ? BALL_SPEED_X : -BALL_SPEED_X;
    ball.speedY = BALL_SPEED_Y;
}

// ======================
// 函数:初始化游戏窗口
// ======================
void InitGame()
{
    initgraph(WINDOW_WIDTH, WINDOW_HEIGHT);
    setbkcolor(BLACK);
    cleardevice();
}

// ======================
// 函数:绘制游戏界面
// ======================
void DrawGame()
{
    cleardevice();

    // 绘制中线
    setlinecolor(WHITE);
    line(WINDOW_WIDTH / 2, 0, WINDOW_WIDTH / 2, WINDOW_HEIGHT);

    // 绘制左侧挡板
    setfillcolor(WHITE);
    fillrectangle(leftPaddle.x, leftPaddle.y, leftPaddle.x + PADDLE_WIDTH, leftPaddle.y + PADDLE_HEIGHT);

    // 绘制右侧挡板
    fillrectangle(rightPaddle.x, rightPaddle.y, rightPaddle.x + PADDLE_WIDTH, rightPaddle.y + PADDLE_HEIGHT);

    // 绘制弹球
    fillcircle(ball.x, ball.y, BALL_SIZE);

    // 绘制分数
    settextcolor(WHITE);
    settextstyle(40, 0, _T("Arial"));

    TCHAR leftScoreText[10] = { 0 };
    TCHAR rightScoreText[10] = { 0 };
    _stprintf_s(leftScoreText, _T("%d"), leftScore);
    _stprintf_s(rightScoreText, _T("%d"), rightScore);

    outtextxy(WINDOW_WIDTH / 4, 50, leftScoreText);
    outtextxy(3 * WINDOW_WIDTH / 4, 50, rightScoreText);
}

// ======================
// 函数:更新游戏逻辑
// ======================
void UpdateGame()
{
    // 移动弹球
    ball.x += ball.speedX;
    ball.y += ball.speedY;

    // 弹球碰撞上下边界
    if (ball.y <= BALL_SIZE || ball.y >= WINDOW_HEIGHT - BALL_SIZE)
    {
        ball.speedY = -ball.speedY;
    }

    // 弹球碰撞左侧挡板
    if (ball.x <= leftPaddle.x + PADDLE_WIDTH + BALL_SIZE &&
        ball.y >= leftPaddle.y && ball.y <= leftPaddle.y + PADDLE_HEIGHT &&
        ball.speedX < 0)
    {
        ball.speedX = -ball.speedX;
    }

    // 弹球碰撞右侧挡板
    if (ball.x >= rightPaddle.x - BALL_SIZE &&
        ball.y >= rightPaddle.y && ball.y <= rightPaddle.y + PADDLE_HEIGHT &&
        ball.speedX > 0)
    {
        ball.speedX = -ball.speedX;
    }

    // 弹球越过左侧边界 -> 右侧得分
    if (ball.x < 0)
    {
        rightScore++;
        ResetBall();  // ✅ 调用 ResetBall()
    }

    // 弹球越过右侧边界 -> 左侧得分
    if (ball.x > WINDOW_WIDTH)
    {
        leftScore++;
        ResetBall();  // ✅ 调用 ResetBall()
    }

    // AI 控制右侧挡板
    if (rightPaddle.y + PADDLE_HEIGHT / 2 < ball.y)
    {
        rightPaddle.y += PADDLE_SPEED / 2;
    }
    else
    {
        rightPaddle.y -= PADDLE_SPEED / 2;
    }

    if (rightPaddle.y < 0)
    {
        rightPaddle.y = 0;
    }
    if (rightPaddle.y > WINDOW_HEIGHT - PADDLE_HEIGHT)
    {
        rightPaddle.y = WINDOW_HEIGHT - PADDLE_HEIGHT;
    }

    // 玩家控制左侧挡板
    if (_kbhit())
    {
        char key = _getch();
        if (key == 'w' || key == 'W')
        {
            leftPaddle.y -= PADDLE_SPEED;
        }
        else if (key == 's' || key == 'S')
        {
            leftPaddle.y += PADDLE_SPEED;
        }
    }

    if (leftPaddle.y < 0)
    {
        leftPaddle.y = 0;
    }
    if (leftPaddle.y > WINDOW_HEIGHT - PADDLE_HEIGHT)
    {
        leftPaddle.y = WINDOW_HEIGHT - PADDLE_HEIGHT;
    }
}

// ======================
// 主函数
// ======================
int main()
{
    InitGame();

    while (true)
    {
        DrawGame();
        UpdateGame();

        if (_kbhit())
        {
            char key = _getch();
            if (key == 27)  // ESC
            {
                break;
            }
        }

        Sleep(10);
    }

    closegraph();
    return 0;
}
ava
子益

2025-9-16

举报
0

因为你多处使用了 _getch()  esc 被拦截处理,所以会失效

ava
xiongfj ◑◑

2025-9-17

技术讨论社区