【C++进阶实战】打砖块小游戏

news/2024/11/22 2:20:33/

游戏规则

  • 玩家控制底部的一个挡板,反弹球击碎上方排列的砖块。
  • 如果球掉到底部,则游戏结束。
  • 如果所有砖块都被击碎,则玩家胜利。

安装 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;
}

代码说明

  1. 初始化:使用 initgraph 初始化图形窗口,并设置窗口大小。
  2. 初始化砖块initMap 函数随机初始化砖块数组。
  3. 绘制砖块drawMap 函数绘制当前的砖块状态。
  4. 绘制挡板drawPaddle 函数绘制挡板。
  5. 绘制球drawBall 函数绘制球。
  6. 移动挡板movePaddle 函数处理玩家的键盘输入,移动挡板。
  7. 移动球moveBall 函数处理球的移动和碰撞检测。
  8. 检查游戏结束checkGameOver 函数检查球是否掉到底部。
  9. 检查游戏胜利checkGameWin 函数检查所有砖块是否都被击碎。
  10. 主循环:在 main 函数中,使用一个无限循环来处理游戏逻辑,直到游戏结束或胜利。

http://www.ppmy.cn/news/1548914.html

相关文章

git使用流程梳理

之前觉得git比较麻烦&#xff0c;还是习惯本地使用而没有推送至远程&#xff0c;自从不小心rm -rf清空所有代码后&#xff0c;幡然醒悟。后续梳理一下相关使用方法 整体过程 1 建立库&#xff0c;建立远程连接 2 本地创建分支并查看分支 (假定本地分支名字为test) git che…

高级网络安全——IP 安全(week5)

加粗样式 文章目录 一、前言二、重点概念IP 安全概述IPSec的应用IPSec概述:典型场景IPSec安全协议AH与ESP的功能对比IPSec协议与加密算法IPSec模式AH协议:传输模式与隧道模式完整性检查值(ICV)AH协议的ICV计算封装安全载荷(ESP)协议IPSec的策略导向方法IPSec策略IPSec策略…

《Python浪漫的烟花表白特效》

一、背景介绍 烟花象征着浪漫与激情&#xff0c;将它与表白结合在一起&#xff0c;会创造出别具一格的惊喜效果。使用Python的turtle模块&#xff0c;我们可以轻松绘制出动态的烟花特效&#xff0c;再配合文字表白&#xff0c;打造一段专属的浪漫体验。 接下来&#xff0c;让…

基于YOLOv8深度学习的医学影像肝病检测系统研究与实现(PyQt5界面+数据集+训练代码)

本研究提出了一种基于YOLOv8深度学习算法的医学影像肝病检测系统&#xff0c;旨在通过先进的图像处理与深度学习技术提高肝病的检测效率和准确性。系统采用YOLOv8作为核心算法模型&#xff0c;其具备快速高效的物体检测能力&#xff0c;能够精确定位肝脏区域&#xff0c;并对可…

Jenkins下载安装、构建部署到linux远程启动运行

Jenkins详细教程 Winodws下载安装Jenkins一、Jenkins配置Plugins插件管理1、汉化插件2、Maven插件3、重启Jenkins&#xff1a;Restart Safely插件4、文件传输&#xff1a;Publish Over SSH5、gitee插件6、清理插件&#xff1a;workspace cleanup system系统配置1、Gitee配置2、…

Excel超级处理器:高效实现2种批量生成二维码方式

在Excel数据处理中&#xff0c;二维码的批量生成是一个常见且重要的需求。借助Excel超级处理器这一强大的插件&#xff0c;用户可以轻松实现二维码的两种主要批量生成方式&#xff1a;直接在单元格中显示二维码图片&#xff0c;以及直接生成二维码图片并保存在文件夹中。超级处…

【大数据技术基础 | 实验十一】Hive实验:新建Hive表

文章目录 一、实验目的二、实验要求三、实验原理四、实验环境五、实验内容和步骤&#xff08;一&#xff09;启动Hive&#xff08;二&#xff09;创建表&#xff08;三&#xff09;显示表&#xff08;四&#xff09;显示表列&#xff08;五&#xff09;更改表&#xff08;六&am…

【MYSQL】Where和Having的区别

假设我们有一个 Orders 表&#xff0c;包含以下数据&#xff1a; idcustomer_idamount1110021200321504330053250645074100 1. 使用 WHERE 子句 目标 查询每个客户的总订单金额&#xff0c;并且只考虑订单金额大于 150 的订单。 查询 sqlSELECT customer_id, SUM(amount)…