震惊!C++全程不压缩代码、包括注释实现俄罗斯方块竟只需要150行!
该程序思路和步骤均参考自b站 up主:你已经是大佬了快和萌新们聊天吧 大佬的视频。
在此向大佬表示诚挚的敬意与感谢。
由于被参考源代码的特殊原因和其他原因,本人硬是研究了将近11个小时才算基本了解了该程序的原理!
之后我又用C++根据理解重新写了这个程序,并添加了详细的注释。
这个程序让我深刻认识到了在数据结构和算法上,我还有多么长的路要走…
如果大家急于学习,请忽略以下内容并移步技术环节。
反思:
对于人们平时写程序而言,基本上只需要了解了程序的原理,即可动手写出一个具有这些功能的程序。
我认为,不论这个程序本身是多么的复杂,如果写出来的程序包含有大量重复、冗余代码、极高的时空复杂度以及很多的bug,那么这个程序依旧是一个糟糕的程序。
以我之前写的几个小程序为例,动辄上千行的代码看起来很多,但,我自己知道这里面大多数代码都没有什么技术含量,因为在写程序的过程中,我均采取了最暴力也是傻的解决办法,如,for循环上千次只为寻找到一个值、用很多不符合规范的代码去堵上一个bug等等。
虽然我是因为当时没有更好的解决方案才会去这么写,但我们必须要认识到,这种写法不过只是最低级的程序,如果把这种程序真正当作问题的解决方案来看的话,无疑是错误的。
其实在参考其他人的代码写这个程序之前,我用常规暴力写法几乎已经完成了一个俄罗斯方块程序,但是到最后又需要写一个常规写法需要很多lj代码才能实现的功能的时候,我便放弃了,因为我突然意识到:写简单的程序是没有出路的!
技术环节:
编译环境:Windows Visual Studio 2019
需求:
俄罗斯方块所有基本功能,包括:
7种不同的方块组合自动下落
方块旋转(一个键)
方块组合按键下落
方块组合左右移
一行全部为方块时消行
等
思路:
通过将node二维数组各方块位置组成不同方块组合(形状)与一维map数组的位置对应,且map数组下标加上方块组合距左、上墙的距离,其中距上墙距离用Y*10在一维数组中表示,通过Y每次循环+1即可得到方块组合自动下落,通过接收按键ad,修改X实现左移右移。
通过node数组排成特定规律,再将方块组合编号(形状)与特定相加数字传入move函数,即可与左右移功能使用同一个函数更改得到当前方块组合旋转后的形状,并限制旋转后的碰撞情况。
注意:
文中的“方块组”,是指小方块组成的,所有形状、方向的方块组合。
node数组将所有不同的方块组分别列出。
由于编译器原因,代码中_kbhit()和_getch()函数可能在其他编译器上编译会出现错误,解决办法是去掉函数前面的“_”。
运行效果:
代码:
#include <iostream>
#include <conio.h>
#include <windows.h>
#include <ctime>
using namespace std;
int map[250]; //地图数组
int X = 4, Y = 1; //方块组分别距左墙、上墙的距离
class Square //方块组类
{
private:
int node[28][4] = //节点数组,规律存储各方块组的形状
{
//每四个数存储一个形状的方块组在地图中对应的信息
//其含义可以看作在平面直角坐标系中,但不存在可以随机访问的y轴,而最大X轴为10
//要访问特定y轴的数,就需要对x轴进行加减,x+n大于10的部分会在y+1轴重新计算,反之在y-1
{
-1,0,1,-11 },{
10,0,-10,-9 },{
11,-1,0,1 },{
9,10,0,-10 }, {
-1,0,1,-9 },{
10,11,0,-10 },{
9,-1,0,1 },
{
0,10,-10,-11 }, {
9,10,0,