C++编写简单的俄罗斯方块游戏
C++编写简单的俄罗斯方块游戏
使用C++编写一个简单的俄罗斯方块游戏。
1 环境要求
使用C++图形库SFML,官网下载地址为https://www.sfml-dev.org/download.php
-
解压安装
假设安装路径为:C:\Program Files\SFML
-
VS配置
- 新建项目以后,选中项目右击选中属性
- 在左上方的平台选择:X64
- 左边的配置属性选择:VC++ 目录,在右边方框可以看到,可执行目录、包含目录等等
- 可执行目录中添加 C:\Program Files\SFML\SFML-2.4.2\bin(添加的路径已本教程 SFML 的解压路径相应来写的,看官自己的路径对照着来就行了)
- 包含目录添加:C:\Program Files\SFML\SFML-2.4.2\include
- 库目录添加:C:\Program Files\SFML\SFML-2.4.2\lib
- 选择连接器–输入–附加依赖项,添加:
sfml-graphics-d.lib
sfml-window-d.lib
sfml-audio-d.lib
sfml-network-d.lib
2 项目目录结构
就一个.cpp
文件,同目录下有两个文件夹:用来描绘背景的图片素材的images
和 音乐素材的 audio
。
3. 游戏逻辑结构
整个代码分为简单的5个模块:计时器、检查、转换、消除、新块生成
-
计时器
游戏运行核心、设置 delay 值后,计时器每到delay值,处理游戏的检查、消除和新块生成逻辑
//// Timer 逻辑 while(window.isOpen()) // SFML 窗口 { timer += time; // time是上次计时到本次的时间 if(timer>delay){ // check // transpose // new block timer = 0; } }
-
检查
检查主要检查两样东西:1是检查是否当前块落地,2是检查构成消除条件的行。
1.检查是否落地
砖块描述存储在
int field[20][10]
中,每次有砖块落地,都会将该砖块的对应的位置赋值,后续砖块在下落过程中遇到有值的场地,则停止下落。检查落地用 check 描述bool check() { for (int i = 0; i<4; i++) if (a[i].x<0 || a[i].x >= N || a[i].y >= M) return 0; else if (field[a[i].y][a[i].x]) return 0; return 1; };
2.检查消除行
当满足一行的field值都不为0的时候,构成消除行,消除逻辑由 checkline 描述
int k = M - 1; for (int i = M - 1; i>0; i--) { int count = 0; for (int j = 0; j<N; j++) { if (field[i][j]) count++; field[k][j] = field[i][j]; } if (count < N) { k--; } else { score += 1; } }
-
新块生成
新块生成无非是rand一个颜色和砖块样式。对于砖块样式,罗列在下:
用位置描述所有类型的俄罗斯砖块。之后再转换为坐标即可。
-
画图
只要窗口打开着,就需要画图,画图用draw描述:
/////////draw////////// window.clear(Color::White); window.draw(background); for (int i = 0; i<M; i++) for (int j = 0; j<N; j++) { if (field[i][j] == 0) continue; s.setTextureRect(IntRect(field[i][j] * 18, 0, 18, 18)); s.setPosition(j * 18, i * 18); s.move(28, 31); //offset window.draw(s); } for (int i = 0; i<4; i++) { s.setTextureRect(IntRect(colorNum * 18, 0, 18, 18)); s.setPosition(a[i].x * 18, a[i].y * 18); s.move(28, 31); //offset window.draw(s); } // next box nextBox.setTextureRect(IntRect(0, 0, 72, 108)); nextBox.setPosition(240, 20); window.draw(nextBox); // draw next item for (int i = 0; i<4; i++) { s.setTextureRect(IntRect(colorNum_next * 18, 0, 18, 18)); s.setPosition(240+18+a[i].x_next * 18, 20+18+a[i].y_next* 18); //s.move(28, 31); //offset window.draw(s); } window.draw(frame); window.display();
4. 运行演示
C++编写简单的俄罗斯方块游戏
注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· Windows编程----内核对象竟然如此简单?