运行在裸机上的俄罗斯方块游戏

操作系统课的第一个大实验…

Github:https://github.com/wx-csy/OSLab0-Tetris

因为关于硬件的具体细节都在AM里面封装好了,所以写起来和写正常的程序并没有太大的区别,只是轮子得重新再造一遍…

玩法说明

运行make run,进入游戏。注意,工程的Makefile文件已经被修改,请运行修改过后的Makefile文件。

进入qemu后,首先运行自检程序,并在终端中打印当前机器的基本情况、设备信息和时间信息。随后,播放Splash界面(可按return键跳过)。按C键进入游戏。

左右键控制当前方块的位置,上键顺时针旋转当前方块,下键逆时针旋转当前方块,空格键加速下落。消除单行可获得1分,单次消除2行获得3分,单次消除3行获得5分,单次消除4行可获得8分。其他规则和经典的俄罗斯方块游戏基本一致。由于Wall kick系统尚未实现,诸如L-spin等骚操作暂时无法使用…

主要技术说明

图片和文字

游戏中的图片素材,除ProjectN的logo外,均使用GIMP工具制作。

使用GIMP的export功能,可将图片导出为C源代码格式,然后逐点绘制在屏幕上即可。

文字使用点阵字模。每个ASCII文字的形状以16*8点阵的形式存储在程序中,绘制时根据字模数据逐点绘制即可。

Splash界面的渐变效果

绘制图片时,可以附加一个透明度参数$\alpha$,使得绘制出的颜色满足下式

\[
\begin{cases}
r = r_f \alpha + r_b (1 – \alpha) \\
g = g_f \alpha + g_b (1 – \alpha) \\
b = b_f \alpha + b_b (1 – \alpha)
\end{cases}
\]

其中$r_f, g_f, b_f$为图像颜色的三个分量,$r_b, g_b, b_b$为背景色的三个分量。

在播放渐变动画时,只需要将$alpha$从0逐渐调整为1,就可实现渐变效果。

Gameover界面的变灰效果

在绘制图片时,还可附加一个颜色矩阵$M$。$M$是$3\times3$的矩阵,用于对颜色的三个分量进行线性变换:

\[
\begin{cases}
r’ = rM_{11} + gM_{12} + bM_{13} \\
g’ = rM_{21} + gM_{22} + bM_{23} \\
b’ = rM_{31} + gM_{32} + bM_{33}
\end{cases}
\]

其中,$M_I = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix}$ 表示恒等变换,
$M_G = \begin{bmatrix} 0.33 & 0.59 & 0.11 \\ 0.33 & 0.59 & 0.11 \\ 0.33 & 0.59 & 0.11 \end{bmatrix}$表示灰度变换(即将彩色图片变换为黑白图片)。

这样,只需设置一个混合因子$\lambda$,并且使用$\lambda M_G + (1-\lambda)M_I$绘制图片,同时将$\lambda$从0逐渐调整为1,即可实现逐渐变灰的效果。

发表评论

电子邮件地址不会被公开。 必填项已用*标注