[游戏] console mode 决战俄罗斯方块

楼主: descent (“雄辩是银,沉默是金”)   2017-07-04 21:59:49
组译器实在太无聊了, 整天和 elf section, x86 machine code 搏斗, 真苦! 我写了太
多练功型的程式, 这些程式大多是帮助我理解某个概念, 实用性不高, 成就感也不大, 我
决定先暂停组译器, 来写个自己也会用的程式。
就是你了, 皮卡丘, 阿, 不是 ... 是俄罗斯方块。
俄罗斯方块大家都会玩, 但不是每个人都会写俄罗斯方块, 稍微思考后, 觉得还蛮难的,
没有任何突破点, 丝毫无法下手写程式。
( https://goo.gl/v7epTz )
fig 0. 决战俄罗斯
这个程式我 200x 年就想写了, 不过直到最近 (201706) 我才真的动手, 大概是练功型程
式我真的有点腻了, fig 0 是决战俄罗斯, 我想写的是这个版本, 和一般的俄罗斯方块有
什么不同呢? 他有一些特殊方块, 会有特殊功能。我很喜欢那些特殊功能的方块, 能增加
游戏性, 当然还有其双人的对战功能, 也很有趣, 在同一个萤幕上就可以 2 人对战, 不
用透过网络。
俄罗斯方块要完成好多部份, 把目标简化很重要, 这个步骤我已经非常熟悉, 第一个想到
的就是, 先来实作移动方块吧! 这样感觉简单了一些, 但其实还是没方向 ...
俄罗斯方块有很多不同的方块, 英文术语是 - Tetromino ( https://goo.gl/2QH42E ),
我决定先实作 z Tetromino。
( https://goo.gl/2EGPPi ): two stacked horizontal dominoes with the top
one offset to the left.
最后的成果就是 fig 1。
( https://goo.gl/MDmSa1 )
fig 1. 移动 z Tetromino
这个 console mode 程式应该吓坏你了, 怎么这么丑, 但他包含了整个概念, 把绘制漂亮
的 UI 功能抽离出来, 这样会比较容易专住在主要核心上, 要画出好看的图形可不是件容
易的事情, 先不把焦点放在图形处理上。只要 c++ 标准程式库就可以执行了, 其中用到
了 sleep, 这个可能不是标准, 但用 for loop 也可以完成 delay 的动作。
z Tetromino 可以顺利的移动, 也可以旋转, 并且不会超过边界。这一回合就只做这件
事, 感觉简单了一些, 但实际上我在笔记本上画了不少方块图, 才得以想到方法, 完成这
个功能。
( https://goo.gl/kVzrmN )
fig 2. z Tetromino 设计方式
一个方块是由 4 个点构成, 只要好好的描述好这 4 个点, 就可以完成移动、旋转。
z Tetromino 由 fig 2 那 4 个点构成, p0, p1, p2, p3:
p0: (2,3)
p1: (3,3)
p2: (3,4)
p3: (4,4)
往右移动就是在改变 p0, p1, p2, p3 这些座标, 你一定也想到要怎么做了吧! 把所有点
的 x 加 1 就搞定了。
p0: (3,3)
p1: (4,3)
p2: (4,4)
p3: (5,4)
换成程式码就是这样:
int right()
{
++p0_.x_;
++p1_.x_;
++p2_.x_;
++p3_.x_;
}
简单到不用说明, 上、下、左也是一样的道理。
再来要怎么画出画面呢? 宣告 2X2 array container_[10][20] 来处理, 把
p0: (2,3)
p1: (3,3)
p2: (3,4)
p3: (4,4)
的座标标成 1, 其他标 0, 就会有类似的东西:
1111111111
1000000001
1000000001
1011000001
1001100001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1000000001
1111111111
程式只要去检查这个 array 所有值, 是 1 的就画 1, 0 的就画 0, 这样就可以画出整个
俄罗斯方块的画面。
另外一个难题是碰撞侦测, 我怎么知道方块到底了, 外围的 1 是我的边框, 在 down()
的函式会更新 4 个点的座标, 检查新座标的位置是不是 1, 若是, 就表示遇到边框或是
其他方块, 原理就是这样。
下次再来谈谈旋转, 其实也一样, 把 4 个点的座标改动而已。
我本来打算参考 fig 3 的书来实做俄罗斯方块, 不过我收到时, 已经做出 2 个方块可以
移动、旋转, 也可以消掉方块的版本了, 尽管如此, 此书还是有不少可以参考的地方,
厄 ... 这本书是使用 trubo pascal 完成俄罗斯方块。
不过我也不打算看别人的想法, 我要自己想出来怎么写俄罗斯方块。
( https://goo.gl/XxS4VE )
fig 3. 2017/06/20 09:23:17 订购于 https://tw.bid.yahoo.com/item/100125001955,
0170623 收到 200+80
目前的版本:
可以2人一起玩了。
一人玩 2 个部份还真的有点手忙脚乱。
画面是用 printf 印出来的。
这个程式用到了 c++17, 所以要用 g++-7 编译。
而画面绘制用到了 coroutine。
支援3种特殊方块, 2 种普通方块。
画面:
https://goo.gl/photos/KgsrChwmZoPYdDDJ8
// 本文使用 Blog2BBS 自动将Blog文章转成缩址的BBS纯文字 http://goo.gl/TZ4E17 //
作者: pttworld (批踢踢世界)   2017-07-05 21:32:00
Tetris和Snake Off都是初学游戏编程的练习题目
作者: cjcat2266 (CJ Cat)   2017-07-05 22:40:00
推认真,我记得旋转模式有两种的样子,日本某个竞技版可让玩家选,其中一个好像可以透过旋转让方块往上爬一格,看到强者快速用这招会看到眼花
作者: GALINE (天真可爱CQD)   2017-07-07 08:35:00
console 录影推荐用 asciinema~

Links booklink

Contact Us: admin [ a t ] ucptt.com