GITHUB:https://github.com/MonogatariL/Tetris_Qt_C
1、基本游戏界面+键盘操作指令

操作指令:
①← ↓ →:分别移动方块向左/下/右移动一格。
②X:立刻下落。
③Z:将方块进行顺时针90°旋转。

2、游戏功能实现思路

①游戏布局:
采用标准的俄罗斯方块规则,游戏布局为10*20,实际游戏布局为10*21,意味着在除了能够观测到的界面最高层上还有隐藏的一层,当有任何方块确定落下后处于该隐藏层,这意味着游戏结束。
在代码层面,我选择用了

QVector<QVector<QPair<bool,bool>>>block;

二维数组便是我们游戏的布局模拟,而QPair<bool,bool>的考虑为:
-first为当前位置是否有方块。
-second为当前位置的方块是否为正在操作的方块。

②方块预设
俄罗斯方块的七种方块O、I、W、S、Z、J、L:
有的只有一种变换形态:O。
有的只有两种变换形态:I、S、Z。
剩余则是四种变换形态:W、J、L。
这意味着一共有20种形态。
例子:方块O(正方形方块)的预设:

if(block[0][5].first==false){block[0][5].first=true;block[0][5].second=true;}else{game_over();return;}
if(block[0][4].first==false){block[0][4].first=true;block[0][4].second=true;}else{game_over();return;}
if(block[1][5].first==false){block[1][5].first=true;block[1][5].second=true;}else{game_over();return;}
if(block[1][4].first==false){block[1][4].first=true;block[1][4].second=true;}else{game_over();return;}

在每次预设好一个方块后,我在程序层里使用一个QPair<int,int>对象进行记录。

QPair<int,int>status;

这一对象非常重要、这可以直接让程序知道,我们当前操作的图形是什么样的结构,这使得程序可以直接跳过判断其结构而进行变换、下落检测等操作,如在程序里规定status.first为方块的类型,0-6分别对应O、I、W、S、Z、J、L,而status.second则对应first所指向方块的角度。

③判断方块碰撞
游戏是随着定时器不断进行的,定时器初设为1s,也就是1s过后,当前操作方块就要做一次下落,而下落函数的判断规则如下:
-首先找到当前操作的方块,判断其下一格的状态。
-下一格的状态为空(也就是.first的值为false),则说明可以进行向下操作。有
-方块是一个整体,所以我们要探寻四个方块是否都可以进行向下操作,如果有任何一个方块下方已经有确定了的方块,无法执行向下操作时,则所有方块都无法向下,于是乎当前操作的这个方块已经固定,按顺序执行以下步骤(判断是否有一整行可以消除、预设新的方块)。

④方块变化
俄罗斯方块的方块变化规律是顺时针\逆时针 旋转90°,在这里我的规定是将方块设置为顺时针90°旋转,旋转的规则有以下几点:
-方块的旋转不能改变方块的相对位置!!!才开始写方块变化的时候最大的问题就是没有想过方块的位置在旋转的过程中时候相对改变,简单的例子就是按住Z不放旋转方块时候,方块会出现左移、右移、甚至是向上移动的趋向,向上移则完全破坏了游戏规则,而向左向右则会在游玩过程中影响游戏体验。
-第一条是方块旋转的必要设计,至于这一条基础规则则不用多说,方块进行90°旋转必须能够满足模拟旋转,在无法旋转的场景中甚至是无处置放旋转后的方块的场景中肯定是不能进行旋转的。
-紧接上一条,我们知道在模拟旋转的过程中如果无法完成旋转方块是无法做出改变的,但在有些场合我们规定方块可以进行转变。


⑤得分和难度上升
定时器的初设为1s,随着玩家消除的方块增多,定时器的计时会越来越短,从而提升游戏难度。
Timer:1000ms
score:0
每消除一行方块获得100分,每1200分,定时器的时间缩短为Timer=Timer0.9。

3、游戏细节及其他功能

①下一个!
每次需要新方块的时候,系统会生成两个随机数,第一个随机数0-6决定该方块的类型,第二个随机数0-3决定对应方块的对应方向(正方形方块没有其他变化,只有两个变化方向的方块则将随机数%2)。
在俄罗斯方块游戏中基本都会有下一个出现方块的预测,这将给玩家提供一些处理当前方块的思路,为下一个方块的位置做预留和准备。

为了实现这个功能,我们另开一个类似上面的记录对象,改变一下思路,每次随机数的值由status_next储存,当status需要新的数值时候,我们直接将status_next的值给它而不是取随机生成的值。

QPair<int,int>status_next

②下落预坠
“没有幻影坦克的俄罗斯方块是没有灵魂的”
按TAB开启下落预坠:

“方块一格一格的下落太慢了,有没有办法让它们快一点”<方向键↓>

“我已经确定这个方块的位置了,没有必要在浪费时间”<X>

“我认为我已经对好方块的位置,只是…不太确定”
TAB:开启下落预坠,从此只看屏幕底端,没有一个方块能让我操作超过1秒。

GITHUB:https://github.com/MonogatariL/Tetris_Qt_C

[C++][QT]俄罗斯方块相关推荐

  1. linux qt 俄罗斯方块,使用Qt开发俄罗斯方块游戏

    使用Qt开发俄罗斯方块游戏,可能大家都比较感兴趣吧.那么就快看下面的详细讲解吧! 其实在QtCreator中已经有了俄罗斯方块的例子,大家可以在帮助中搜索Tetrix进行查看.其内容如下: 但是对于初 ...

  2. linux qt 俄罗斯方块,Qt5之QGraphicsItem编写Tetris俄罗斯方块游戏

    背景 使用Qt5.12.9的QGraphicsItem来实现俄罗斯方块,现在是C++版本,下来还会有python版本,以及方便的接口,来接入算法,由机器人玩俄罗斯方块. 思路CustomGraphBa ...

  3. QT项目一:俄罗斯方块游戏

    1,简介 初学QT大约两个星期时,想做点什么东西锻炼下,大约1个下午加晚上完成的,比较简单. 其中运行流程算法都是自己想的,没有百度,是想训练下逻辑思维能力. 2022.10.11更新: 重新整理了一 ...

  4. 多人联机的俄罗斯方块游戏(C++),游戏规则模仿任天堂Tetris99,基于qt,kcp,protobuf,qslog。

    目录 Tetris 游戏截图 游戏菜单 1v1对战 9人对局 游戏特性细节介绍 攻击机制 Tetris标准特性 Super Rotation System(超级旋转系统) 7 bag system ( ...

  5. 小游戏:俄罗斯方块(Qt 5.9.8)

    小游戏:俄罗斯方块 游戏介绍 过程 设计思路 实现过程 1.Block类 2.Tetris类 3.Box类 4.NextBox类 5.MainWindow类 6.main函数 结果 分析 遇到的问题 ...

  6. 分享一个Qt实现的AI版俄罗斯方块

    一直在网上伸手,也回馈一下. 程序以Qt官方提供的Tetrix俄罗斯方块为基础,进行扩展. AI算法为:Pierre Dellacherie. Pierre Dellacherie算法的参考链接:ht ...

  7. Qt版双人俄罗斯方块游戏

    Qt版双人俄罗斯方块游戏 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907     之前写过<VC版双人俄罗斯方块>,将其在Qt下又重写了一遍,核 ...

  8. Qt做的俄罗斯方块游戏

    最近一直在用Qt折腾一个简单的俄罗斯方块游戏,期间断断续续经过将近一个月的折腾,终于完成啦,挂在这里,供大家评阅,第一次做游戏,肯定会有很多的不足之处,希望大家指正. 其实做这个游戏主要是想学学多层控 ...

  9. C++俄罗斯方块源码(Qt版)

    文章以及源码均为原创,当然欢迎转载,转载请加说明 用VS编写的Qt项目,欢迎阅读讨论,源码如下 tetris.h #ifndef TETRIS_H #define TETRIS_H#include & ...

最新文章

  1. 其实我们不需要那么大的房子
  2. 使用别名访问MSSQL Express
  3. win7笔记本电脑如何分割和重命名磁盘
  4. unity3d 绘制小地图_老师!我想用Tilemap做元气骑士款地图!
  5. 各种排序笔记---基于比较排序部分
  6. java中关于线程的状态属性_深入理解Java多线程与并发框(第①篇)——线程的状态...
  7. IntelliJ IDEA 快捷键说明大全(中英对照、带图示详解)
  8. php 如何限制手机型号,修改Android设备信息,如修改手机型号为iPhone7黄金土豪版!_PHP教程...
  9. nowcoder16638 carpet
  10. 小A与小姐姐给气球涂色[dp + 快速幂]
  11. 3DES加密,苹果、Java 、安卓 平台一致的加密工具
  12. RecyclerView报错:Scrapped or attached views may not be recycled. isScrap:false isAttached:true
  13. 使用AndroidViewModel初始化报错
  14. 2022-2027年中国教育云行业市场调研及未来发展趋势预测报告
  15. 纯CSS写个绿荫足球场,为世界杯喝彩
  16. Java网页编程与设计——javascript语言
  17. 26个咨询顾问常用的分析模型
  18. 【手把手带你Godot游戏开发】FlappyBird:9.2 天下没有不OVER的GAME(下)
  19. java返回浏览器预览PDF_如何实现springmvc将返回的给前端的pdf文件放在浏览器里预览?...
  20. Bugku——可爱的故事

热门文章

  1. 如何获取L2股票行情数据接口连接量化交易?
  2. Python-邮件批量处理-已读状态或移动
  3. html怎么设置页面半透明,css怎么将背景颜色设置成半透明
  4. HackMyvm(二十七)Hommie,系列文章持续更新
  5. PYNQ_Z2从vivado到SDK的PS到PL点灯以及固化流程
  6. 炒美股史考特(Scottrade)开户准备及如何获取免费交易(最新2017版)
  7. ZYNQ控制SI5351例程
  8. WORDPRESS WOOCOMMERCE购物网站安装AB跳转支付插件接口的教程
  9. 中级经济师专业考试特点
  10. JavaEE是什么?学了之后就业前景如何