# 基于Qt与C++的俄罗斯方块游戏
作者:GoldenSea
## 问题描述
俄罗斯方块是一款经典的益智游戏,由俄罗斯的游戏设计师阿列克谢·帕吉特诺夫于 1984 年发明,很快风靡全球。这款游戏的游戏玩法非常简单,主要是要玩家控制四种由方块组成的不同形状的方块,让它们从游戏界面的顶部往下落,落到底部前组成一条完整的横向线。玩家可以操纵方块的旋转和移动,以使方块组成的横向线不断积累。如果积累的方块超出了游戏界面,游戏就会结束。
本项目利用Qt和C++复现了这一经典游戏,并且给予用户极大的自定义权限。支持设置棋盘大小,方块颜色,游戏音乐,下落速度,游戏键位等多种配置。支持多玩家存档的切换,任意游戏记录的读取和保存。提供游戏介绍页面,和排行榜功能,使用了独特的PTT(潜力值)积分算法以确保计分合理性。独创的日/夜间模式切换能够让游戏画面更加美观。
## 系统设计说明
### 数据结构说明
接下来将从窗口,游戏,存档三方面介绍数据结构
#### 窗口数据结构:
- 本软件共有5个窗口,主窗口,游戏窗口,设置窗口,加载游戏窗口,排行榜窗口,均继承 **QWidget** 类。主窗口场景创建指向剩下四个场景的指针,并且承担各个页面切换和数据交换的职能。
#### 游戏数据结构:
1. 对主体游戏而言,方块类 **Block** 是所有骨牌的抽象基类,包含骨牌的中心位置,颜色代号,各方块坐标等属性。其子类如BlockL,BlockO等七个具体方块**继承**Block并重写其构造函数,用来不同地初始化骨牌四个方块坐标。在游戏中,由基类指针Block*指向不同的子类以实现**多态**。
2. 棋盘类 **Checkerboard** 内含一个二维的QVector<QVector<int>>类型数组,用来显示“空白块”(int 0) “固定块”(int 9)和七种“移动块”(int 1-7)在游戏板上的情况,包含棋盘长宽的初始化和调整,固定块和移动块的清除,调整,刷新等行为。
3. 游戏管理类 **Gamemanager** 提供了一系列检测游戏状态的方法,如判断方块是否能移动,棋盘是否能消除,通过PTT算法计算积分增加的数字等。
#### 存档数据结构:
1. 本游戏的存档树状结构如下图所示:
```mermaid
graph TD
A[All_Users] --> B((User1))
A --> C((User2))
A --> D((...))
B((User1)) --> H(Record1)
B --> I(Record2)
B --> J(...)
```
2. 每一次游戏被称为一次 **记录** (Record),其中存储着ID,世界,棋盘数组,当前块和下一个块数据,游戏是否结束,分数等数据,以结构体存储。
3. 同一个玩家的多个 **记录** 可以组成一份 **用户存档** ,由QVector<Record>存储记录数据,其中额外记录了玩家的名字,ID信息
4. 多个玩家的 **用户存档** 组成了本游戏的 **存档文件** ,该文件以JSON格式保存所有数据至用户的本地目录下,由全局变量存档管理者(ProfileManager)进行管理
### 任务功能说明
本程序实现了任务书中所有功能,并且创新设计了部分功能。
#### 基本要求:
1.本程序采用面向对象的思想实现,对于方块类使用了继承和多态的思想(详见游戏数据结构)。**类设计图** 如下:
![类设计图](ClassDesign.png)
本程序的类设计主要分为四部分,游戏部分,存档部分,场景部分与自定义控件。对游戏部分,Block和Checkerboard记录了方块与棋盘的物理属性与行为,Game Manager对其进行管理,并且判定游戏胜负问题与积分计算。场景部分管理不同的场景,存档部分负责游戏的存读档(详见存档数据结构),自定义控件封装了部分接口,用来更便利的设计设置界面。
#### 任务一(全部完成):
得益于Qt方便的UI设计功能,游戏提供了友好的操作界面。在棋盘顶部能够随机产生各种方块,并通过右侧的预告板提前预告给玩家。共设置了7种不同的方块类型。
方块能自动下降,也可以手动加速下落。能通过键盘控制方块的移动和旋转并摆放在合适的位置,对于不同的棋盘大小,不会出现数组越界或者方块重叠等漏洞。当底部有被方块填满的行后,要能够及时消去对应的方块。
游戏流程图如下:
![流程图](GameProcess.png)
### 创新点
- 可以看到,在游戏顶部有一条【警示红线】,当方块接近顶部时,警示线会被高亮以提示用户。
- 方块消除的计分算法并非是简单的消除行数*10,为了鼓励用户连续消除多行,积分算法如下。
$$
游戏分数 = \sum_{i=1}^{消除次数} {5}{n(n-1)}
$$
其中n为第i次消除的行数。当用户消除1行,只能得到10分,但连续消除4行,则可以得到100分。鼓励用户连续消除多行。
#### 任务二(全部完成):
1. 本程序支持临时暂停与恢复游戏。
2. 本程序能够保存多玩家游戏进度,并能够从上次存档中恢复游戏。
### 创新点
- 本游戏在启动时,会自动在本地创建 **Json文件** (/profile.json)存储多玩家游戏进度,通过设置界面可以选择任意用户存档,在游戏加载界面可以加载该用户 **任意一次未结束的游戏记录** (点击返回按钮时提醒用户是否保存)。在本地存储的Json文件格式如下:
```JSON
[
{
"id": 0,
"name": "admin",
"record": [
{
"checkerboard": [] //省略
"gamespeed": 70,
"id": 0,
"isGameOver": false,
"nextblock": 1,
"presentblock": 6,
"score": 10,
"time": "2023-07-10 18:16:26"
}
]
}
]
```
该存档功能具体实现详见 *存档数据结构*
#### 任务三(全部完成):
1.本程序可以自定义游戏参数,如棋盘长宽,下落速度等。(当读取存档时,其仍然沿用该存档的游戏参数)以下是部分游戏设置场景。
2.本游戏可以用合理的方式计算分数,出具排行榜。
### 创新点
- 本游戏的用户排行榜,排名依据并不是简单的使用各次游戏分数之和,或者最高分数,考虑到不同棋盘长宽,不同下落速度对游戏难度的综合影响,本游戏采取了PTT分数计算法(仿音乐游戏Arcaea)。
- 普遍认为,棋盘越“瘦高”越简单,越“矮胖”越困难,游戏速度越快越难。因此,用户的PTT(潜力值)从最近的30次游戏计算而来,计算公式如下。
$$
用户潜力值Ptt = \sum_{i=1}^{30} {(游戏分数+100)(游戏速度)\frac{(棋盘宽度)^2}{棋盘高度}}
$$
通过`UserProfile::getProfilePTT()`计算不同用户的潜力值,给出游戏排行榜(最多显示靠前的4名用户)。
#### 任务四(绝大部分完成,部分内容有增删):
1. 本程序可以在主界面显示游戏规则简介,可以选择方块样式和切换背景,可播放与切换背景音乐,支持任意按键设置与快捷键设置;恢复默认设置;删除存档。
2. 设置界面主要分为四个板块:通用,图像,键盘,存档。
3. 图像界面,能够提供方块颜色的预览和设置,并且能够给出颜色的RGB代号,当颜色过暗,则为白色字体,否则为黑色。具体设置调用了QColorDialog进行颜色选择。
4. 键位设置,设置了相关函数以判断键位是否重复,若重复则会给出提醒。
5. 删除存档时,若只剩下**最后一个用户**,或者**清空存档**时,会强制用户创建一个新用户,不会出现“空用户”情况。同时该页面上方和加载游戏页面会实时显示当前用户。
### 创新点
- 本程序在切换背景时,创新性地开发了【�
没有合适的资源?快使用搜索试试~ 我知道了~
c++课程大作业,基于c++与QT的俄罗斯方块游戏源代码+项目文档,支持多玩家存档的切换,任意游戏记录的读取和保存
共67个文件
h:29个
cpp:22个
ui:8个
1.该资源内容由用户上传,如若侵权请联系客服进行举报
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
2.虚拟产品一经售出概不退款(资源遇到问题,请及时私信上传者)
版权申诉
0 下载量 165 浏览量
2023-07-12
14:15:42
上传
评论
收藏 461KB ZIP 举报
温馨提示
本项目利用Qt和C++复现了这一经典游戏,并且给予用户极大的自定义权限。支持设置棋盘大小,方块颜色,游戏音乐,下落速度,游戏键位等多种配置。支持多玩家存档的切换,任意游戏记录的读取和保存。提供游戏介绍页面,和排行榜功能,使用了独特的PTT(潜力值)积分算法以确保计分合理性。独创的日/夜间模式切换能够让游戏画面更加美观。 游戏数据结构: 对主体游戏而言,方块类 Block 是所有骨牌的抽象基类,包含骨牌的中心位置,颜色代号,各方块坐标等属性。其子类如BlockL,BlockO等七个具体方块继承Block并重写其构造函数,用来不同地初始化骨牌四个方块坐标。在游戏中,由基类指针Block*指向不同的子类以实现多态。 棋盘类 Checkerboard 内含一个二维的QVector<QVector>类型数组,用来显示“空白块”(int 0) “固定块”(int 9)和七种“移动块”(int 1-7)在游戏板上的情况,包含棋盘长宽的初始化和调整,固定块和移动块的清除,调整,刷新等行为。 游戏管理类 Gamemanager 提供了一系列检测游戏状态的方法,如判断方块是否能移动,棋盘是否能消除,通过P
资源推荐
资源详情
资源评论
收起资源包目录
Tetris_Golden-master.zip (67个子文件)
Tetris_Golden-master
loadgamescene.cpp 4KB
blockJ.cpp 730B
loadgamescene.h 767B
block.h 801B
blockZ.h 129B
blockO.h 128B
blockJ.h 129B
mainscene.ui 5KB
userprofile.h 1KB
ui_mainscene.h 6KB
keyoptionblock.cpp 2KB
blockI.cpp 728B
keyoptionblock.ui 2KB
keyoptionblock.h 681B
GameProcess.png 54KB
gamemanager.h 1KB
optionblock.ui 2KB
Tetris.pro 2KB
optionblock.h 636B
intro_Icon.png 6KB
ui_rankingsscene.h 17KB
rank_Icon.png 15KB
blockZ.cpp 730B
settingscene.ui 15KB
ui_settingscene.h 17KB
database.cpp 865B
coloroptionblock.ui 1KB
mainscene.cpp 5KB
main.cpp 170B
loadgamescene.ui 9KB
profilemanager.cpp 7KB
profilemanager.h 788B
userprofile.cpp 2KB
coloroptionblock.h 509B
ui_coloroptionblock.h 3KB
settingscene.h 851B
blockT.h 129B
gamescene.ui 6KB
optionblock.cpp 1KB
rankingsscene.ui 19KB
ui_loadgamescene.h 9KB
blockL.h 129B
blockI.h 129B
blockS.cpp 730B
blockT.cpp 728B
coloroptionblock.cpp 2KB
gamescene.cpp 12KB
ClassDesign.png 276KB
blockL.cpp 730B
ui_optionblock.h 3KB
block.cpp 1KB
gamescene.h 2KB
res.qrc 163B
blockS.h 129B
checkerboard.h 1KB
ui_gamescene.h 7KB
moon_Icon.png 138KB
database.h 589B
README.md 12KB
rankingsscene.cpp 3KB
rankingsscene.h 564B
settingscene.cpp 9KB
gamemanager.cpp 3KB
ui_keyoptionblock.h 3KB
blockO.cpp 730B
mainscene.h 675B
checkerboard.cpp 3KB
共 67 条
- 1
资源评论
程序员柳
- 粉丝: 6049
- 资源: 1123
下载权益
C知道特权
VIP文章
课程特权
开通VIP
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功