我的电脑用的是虚拟机模拟,你们的正常吗?
#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;
}