游戏规则
- 玩家控制底部的一个挡板,反弹球击碎上方排列的砖块。
- 如果球掉到底部,则游戏结束。
- 如果所有砖块都被击碎,则玩家胜利。
安装 EasyX
为了更好的视觉效果,我们将使用 EasyX 图形库。EasyX 是一个适用于 Windows 平台的轻量级图形库。首先,你需要安装 EasyX 图形库。你可以从 EasyX 官方网站 下载并安装。
示例代码
#include <graphics.h>
#include <conio.h>
#include <ctime>
#include <cstdlib>// 定义游戏窗口大小
const int WIDTH = 800;
const int HEIGHT = 600;// 定义砖块属性
const int ROW = 6;
const int COL = 8;
const int BLOCK_WIDTH = 100;
const int BLOCK_HEIGHT = 25;// 定义挡板属性
const int PADDLE_WIDTH = 200;
const int PADDLE_HEIGHT = 25;
const int PADDLE_SPEED = 10;// 定义球属性
const int BALL_RADIUS = 15;
const int BALL_SPEED_X = 8;
const int BALL_SPEED_Y = -8;// 砖块数组
int map[ROW][COL] = {0};// 颜色数组
COLORREF colors[] = {BLACK, LIGHTBLUE, YELLOW, GREEN};// 初始化砖块
void initMap() {srand(time(0));for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {map[i][j] = rand() % 3 + 1;}}
}// 绘制砖块
void drawMap() {cleardevice();for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (map[i][j] != 0) {setfillcolor(colors[map[i][j]]);fillrectangle(j * BLOCK_WIDTH, i * BLOCK_HEIGHT, (j + 1) * BLOCK_WIDTH, (i + 1) * BLOCK_HEIGHT);}}}
}// 绘制挡板
void drawPaddle(int x, int y) {setfillcolor(RGB(220, 255, 255));solidrectangle(x, y, x + PADDLE_WIDTH, y + PADDLE_HEIGHT);
}// 绘制球
void drawBall(int x, int y) {setfillcolor(RED);solidcircle(x, y, BALL_RADIUS);
}// 移动挡板
void movePaddle(int& x, int& y) {if (GetAsyncKeyState('A') || GetAsyncKeyState(VK_LEFT)) {x -= PADDLE_SPEED;}if (GetAsyncKeyState('D') || GetAsyncKeyState(VK_RIGHT)) {x += PADDLE_SPEED;}if (x < 0) x = 0;if (x + PADDLE_WIDTH > WIDTH) x = WIDTH - PADDLE_WIDTH;
}// 移动球
void moveBall(int& ballX, int& ballY, int& ballSpeedX, int& ballSpeedY, int paddleX, int paddleY) {ballX += ballSpeedX;ballY += ballSpeedY;// 碰撞检测if (ballX - BALL_RADIUS <= 0 || ballX + BALL_RADIUS >= WIDTH) {ballSpeedX = -ballSpeedX;}if (ballY - BALL_RADIUS <= 0) {ballSpeedY = -ballSpeedY;}if (ballX >= paddleX && ballX <= paddleX + PADDLE_WIDTH && ballY + BALL_RADIUS >= paddleY) {ballSpeedY = -ballSpeedY;}// 撞击砖块int blockX = ballX / BLOCK_WIDTH;int blockY = (ballY - BALL_RADIUS) / BLOCK_HEIGHT;if (blockY < ROW && blockX < COL && map[blockY][blockX] != 0) {map[blockY][blockX] = 0;ballSpeedY = -ballSpeedY;}
}// 检查游戏结束
bool checkGameOver(int ballY) {return ballY - BALL_RADIUS > HEIGHT;
}// 检查游戏胜利
bool checkGameWin() {for (int i = 0; i < ROW; i++) {for (int j = 0; j < COL; j++) {if (map[i][j] != 0) {return false;}}}return true;
}int main() {initgraph(WIDTH, HEIGHT);// 初始化游戏元素int paddleX = (WIDTH - PADDLE_WIDTH) / 2;int paddleY = HEIGHT - 50;int ballX = paddleX + PADDLE_WIDTH / 2;int ballY = paddleY - BALL_RADIUS - 10;int ballSpeedX = BALL_SPEED_X;int ballSpeedY = BALL_SPEED_Y;initMap();while (true) {cleardevice();drawMap();drawPaddle(paddleX, paddleY);drawBall(ballX, ballY);movePaddle(paddleX, paddleY);moveBall(ballX, ballY, ballSpeedX, ballSpeedY, paddleX, paddleY);if (checkGameOver(ballY)) {MessageBox(GetHWnd(), "Game Over!", "Result", MB_OK | MB_ICONINFORMATION);break;}if (checkGameWin()) {MessageBox(GetHWnd(), "You Win!", "Result", MB_OK | MB_ICONINFORMATION);break;}Sleep(20); // 控制帧率}closegraph();return 0;
}
代码说明
- 初始化:使用
initgraph
初始化图形窗口,并设置窗口大小。 - 初始化砖块:
initMap
函数随机初始化砖块数组。 - 绘制砖块:
drawMap
函数绘制当前的砖块状态。 - 绘制挡板:
drawPaddle
函数绘制挡板。 - 绘制球:
drawBall
函数绘制球。 - 移动挡板:
movePaddle
函数处理玩家的键盘输入,移动挡板。 - 移动球:
moveBall
函数处理球的移动和碰撞检测。 - 检查游戏结束:
checkGameOver
函数检查球是否掉到底部。 - 检查游戏胜利:
checkGameWin
函数检查所有砖块是否都被击碎。 - 主循环:在
main
函数中,使用一个无限循环来处理游戏逻辑,直到游戏结束或胜利。