俄罗斯方块4399的基本方块是怎么计算出来的

20280人阅读
C#开发(37)
&&&&& 根据上节我们规划好的开发过程,这节我们来实现一个简单的俄罗斯方块程序。当然完成俄罗斯方块的Demo是我们这节课的最终目标。在实现这个目标的同时,我还要跟大家一起去分析俄罗斯方块的需求、算法、具体开发的步骤。并且最终选择C#语言来实现这个demo。下面废话少说,翠花,上内容!
第一步、&& 思考俄罗斯方块的游戏规则:
&&&&& 任何时候我们去开发或者设计一个项目,首先需要思考的就是需求。
&&&&& 俄罗斯方块中,我们要做一个俄罗斯方块的游戏,那么俄罗斯方块游戏的游戏规则就是我们的需求。所以我们必须深入了解俄罗斯方块游戏的游戏规则。俄罗斯方块游戏可能产生下面五种形状的方块。这些方块有我们的方向键的控制可以产生旋转,左右移动和加速前进等,往下掉,只到遇到下面已经有方块挡住停下来。如果一行完全排列满,则会消掉,如果排列到了顶部,则会失败。
第二步、把我们的&需求&从计算机的角度去分析:
&&&& 我们对任何一个项目的最初的需求是从使用者的角度去描述这个项目的,这种描述基本上涵盖了使用者可能用到的功能和要求。我们在做一个项目,特别是为一个非计算机专业做一个项目的时候,客户的描述,或者业务人员承接到项目的时候,他们和客户的沟通,基本上是基于这种初级的需求的,这种初级的需求的有点是:客户和业务人员比较容易理解,沟通起来非常的方便。但是他的缺点是非计算机专业用语,不够规范和严谨。不能拿这个文档和需求来直接要求开发人员。需要一个对市场(客户)比较了解,同时又是资深的程序员把这个需求编程一个专业开发人员相对比较容易理解的需求。甚至直接编程开发的具体思路。然后有开发人员去实现。我们的小游戏实在是太小了,不可能分出来业务人员、项目规划人员、项目架构、程序开发。。。。所以这一切也都有我们开发者一个人独揽了。不过麻雀虽小,五脏俱全哦。我们不是说了嘛,通过学习俄罗斯方块掌握项目开发的经验呢。所以希望各位看客认真的看这些个步骤,如果我哪里说错了,欢迎拍砖。
&&&& a、关于俄罗斯方块游戏中方块的产生。我们假设产生四种方块。实际上俄罗斯方块产生的方块要多余四个。但是咱们这节课是做一个Demo,所以先做四个,具体的四个请见图片1。(因为CSDN不能上传图片,我上传到下载中去了。大家可以下载使用,期待csdn可以正常的上传图片)。
&&& b、俄罗斯方块当需要变化方块的时候,每个方块需要顺时针旋转90&,具体可能产生的形状也见图一。
从数学,或者计算机的角度来看:我们根据图1来看,我们可以把所有的方块看成一个4*4的二维数组。把有&砖&的地方表示为1,没有&砖&的地方表示为0,所以所有的的方块都可以表示为图二的样式。
&&& c、我们也可以把背景看成是14*20的二维数组。
&&&&&& 那么俄罗斯方块的需求,站在程序员的角度上就可以变成:我们随机从方块的4个4*4的矩阵中挑选出来一个,并且随机的挑选一个他的初始化状态(关于状态变化,我们同样可以把他们表示在一个4*4的矩阵中)。然后这个被挑选的矩阵,在一个14*20的矩阵中不断的按照一种速度进行往下运动。我们同时可以使用方向键,对这个举证进行控制,使得它可以左右运动,同时可以循环的变化他的状态。如果这个矩阵在运动的方向上遇到了数值为1的时候则停止运动,在左右运动上表现为不能移动,在往下运动的时候则表现为这个方块运动的结束。把这个矩阵的数值复制到背景矩阵中去。这个时候检查背景矩阵,如果背景矩阵中有一个行全部为1,那么在y轴上比该行小的所有行向下移动一行,用户得分增加100。同理,检查所有的行,并且做同样动作。检查完成后,进入下个方块的随机挑选,下落。当某个方块下落完成的时候。他的y坐标在背景中为0的时候。游戏结束。作为游戏的界面,我们需要在游戏的状态发生改变的时候,把背景矩阵和运动矩阵都绘制出来。数值为0的地方不绘图,数值为1的地方绘制图片。
---------------------------------------------------------------------------
到此为止。我们的游戏已经用人类语言。从计算机的角度来说分析完成了。剩下的就是使用计算机语言表达出来了,不管你是学习的C#,C语言,C++,Delphi,Java,python,Js,VB,&&(汇编我不懂,暂时不包括吧)。只要你能理解了上述的&思路&。那么你可以用任何语言来写出来。我真希望用所有的语言都给大家写写,把IT老祖宗的那句:&编程靠的是思想(想法,思路),语言不重要。"的真理来验证下,可怜CSDN的blog写起来太麻烦了,而且我老婆催着我赶紧回家过年的,所以这次就暂时使用C#来给大家实现下。我们就从一个C#盲来开始看看需要如何学习,如何实现。
&&&&&& 首先、确定我们要用的语言是C#,矩阵的运算需要多是多维数组,数组的运算多需要循环。另外对多种情况的判断需要if,switch等分支判断语句,我们的方块定时运动,需要用到timer控件。所以在开始咱们的项目前,请确保,你已经对C#的语法有了基本的了解,尤其对数组的操作、if语句,for循环语句,switch语句要会用。同时对基本的button、timer控件进行基本的了解。如果你在使用其他语言编程,找你所使用的语言中的类似的东西。其他的东西至少这个项目中不会经常用到。即时用到,查查即可。这个可能就是所谓的&语言没有思想重要吧&。如果你还不懂,去看看&C#入门经典吧&.
&&&&&&& 其次、俄罗斯方块需要绘制图形,这个需要你对C# GDI+有所了解。在其他语言中可能是GDI或者API了,这个你只需要google下即可。如果GDI+编程你还不懂,那么来下载个教程吧。我已经给大家上传到:
&&&&&& 上面的两个条件如果你已经具有了。那么开始我们的C#俄罗斯方块的代码之旅途吧。
&&&&&& 不过在代码开始之前,还是先看看我们的界面吧。请看界面图;
&&&&&& 下面我们来看代码。首先定义我们的砖块和背景吧。
#region 定义砖块int[i,j,y,x] Tricks:i为那块砖,j为状态,y为列,x为行
private int[, , ,] Tricks = {{
{1,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,0,0,0},
{1,1,0,0},
{0,1,0,0},
{0,1,1,0},
{1,1,0,0},
{0,0,0,0},
{1,0,0,0},
{1,1,0,0},
{0,1,0,0},
{0,1,1,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,0,1,0},
{1,1,1,0},
{0,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,1,0,0},
{1,1,1,0},
{1,0,0,0},
{0,0,0,0},
#endregion
#region 定义背景
private int[,] bgGraoud ={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0}
#endregion
砖块定义好了,我们还需要定义几个系统在变化的时候需要的全局变量。我在注视中写清楚了,不絮叨了。
private int[,] CurrentTrick = new int[4, 4]; //当前的砖块
//CurrentTrickNum当前砖块的数目, CurrentStatusNum当前状态, CurrentX当前x, CurrentY当前y, Sorce分数
private int CurrentTrickNum, CurrentStatusNum, CurrentX, CurrentY, S
private int TricksNum = 4;
private int StatusNum = 4;
private Image myI
private Random rand = new Random();
定义好了变量,我们来想想我们的几个函数吧。首先是变化砖块,变化砖块其实就是变化砖块的状态,把砖块数组中的状态位进行循环变化即可:
/// &summary&
/// 变化方块
/// &/summary&
private void ChangeTricks()
if (CurrentStatusNum & 3)
CurrentStatusNum++;
CurrentStatusNum = 0;
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
CurrentTrick[y, x] = Tricks[CurrentTrickNum, CurrentStatusNum, y, x];
再接着是检测砖块是否可以向下移动、向左移动、向右移动。思路很简单。看看他的要运动的方向的背景下个位置是不是为1.如果不是。那么就返回true.否则是false:
/// &summary&
/// 检测是否可以向下了
/// &/summary&
/// &returns&&/returns&
private bool CheckIsDown()
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
//超过了背景
if (y + CurrentY + 1 &= 20)
if (x + CurrentX &= 14)
CurrentX = 13 -
if (bgGraoud[y + CurrentY + 1, x + CurrentX] == 1)
/// &summary&
/// 检测是否可以左移
/// &/summary&
/// &returns&&/returns&
private bool CheckIsLeft()
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
if (x + CurrentX - 1 & 0)
if (bgGraoud[y + CurrentY, x + CurrentX - 1] == 1)
/// &summary&
/// 检测是否可以右移
/// &/summary&
/// &returns&&/returns&
private bool CheckIsRight()
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
if (x + CurrentX + 1 &= 14)
if (bgGraoud[y + CurrentY, x + CurrentX+1] == 1)
下面是绘制函数:没啥思路,循环画出即可
&private void Draw()
Graphics g = Graphics.FromImage(myImage);
g.Clear(this.BackColor);
for (int bgy = 0; bgy & 20; bgy++)
for (int bgx = 0; bgx & 14; bgx++)
if (bgGraoud[bgy, bgx] == 1)
g.FillRectangle(new SolidBrush(Color.Blue), bgx * 20, bgy * 20, 20, 20);
//绘制当前的图片
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
g.FillRectangle(new SolidBrush(Color.Blue), (x + CurrentX) * 20, (y + CurrentY) * 20, 20, 20);
Graphics gg = panel1.CreateGraphics();
gg.DrawImage(myImage, 0, 0);
下面的一个函数是比较重要的。向下运动函数。因为基本上向下运动的函数决定了下落的位置:基本思路其实很简单的。先检测是否可以向下下落,如果可以下落就下落了,如果不可以下落,那说明到底了。首先检测当前的坐标是不是为0,如果是,那么说明游戏结束了。否则。检测下。是否有满行的。如果有的,行平移然后并且可以增加积分,这一切完成以后,然后开始下个方块。
/// &summary&
/// 下落方块
/// &/summary&
private void DownTricks()
if (CheckIsDown())
CurrentY++;
if (CurrentY == 0)
timer1.Stop();
MessageBox.Show("哈哈,你玩玩了");
//下落完成,修改背景
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
bgGraoud[CurrentY + y, CurrentX + x] = CurrentTrick[y, x];
CheckSore();
BeginTricks();
好像忘记了如何开始向下落的哦。看代码:太容易了,不解释了。
private void BeginTricks()
//随机生成砖码和状态码
int i = rand.Next(0, TricksNum);
int j = rand.Next(0, StatusNum);
CurrentTrickNum =
CurrentStatusNum =
//分配数组
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
CurrentTrick[y,x] = Tricks[i,j,y,x];
CurrentX = 0;
CurrentY = 0;
timer1.Start();
下面我们看看是如何检测方块的背景中是否有满行的,如果满行了把他上面的平移下去。这个是很多初学者感觉到难以解决的地方,其实就是循环。这个循环还有得优化,但是我想想还是把他放在下一个篇的优化篇上讲解吧。看代码,我们说思路。其实思路很简单的,循环看看是否有满行的,如果存在一个为0,说明没满行,继续下个循环,如果没有0,则说明满行了,增加分数,然后比这个y小的矩阵向下平移,当前的坐标=(x,y-1)即可。然后继续循环本行(因为本很是上一行又下来的)。
&private void CheckSore()
for (int y = 19; y & -1; y--)
bool isFull =
for (int x = 13; x & -1; x--)
if (bgGraoud[y, x] == 0)
if (isFull)
//增加积分
Sorce = Sorce + 100;
for (int yy = yy & 0; yy--)
for (int xx = 0; xx & 14; xx++)
int temp = bgGraoud[yy - 1, xx];
bgGraoud[yy, xx] =
label1.Text = Sorce.ToString(); ;
还有几个函数大家都可以看懂的,我就不讲解了。我把所有的代码都贴一遍。另外把所有的图片和源文件打包后上传到csdn,请大家下载。
代码下载地址:
using System.Collections.G
using System.D
using System.D
using System.L
using System.T
using System.Windows.F
namespace Tetris
public partial class Form1 : Form
public Form1()
InitializeComponent();
#region 定义砖块int[i,j,y,x] Tricks:i为那块砖,j为状态,y为列,x为行
private int[, , ,] Tricks = {{
{1,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,1,1,1},
{0,0,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{1,1,0,0},
{0,0,0,0},
{1,0,0,0},
{1,1,0,0},
{0,1,0,0},
{0,1,1,0},
{1,1,0,0},
{0,0,0,0},
{1,0,0,0},
{1,1,0,0},
{0,1,0,0},
{0,1,1,0},
{1,1,0,0},
{0,0,0,0},
{1,1,0,0},
{0,1,0,0},
{0,1,0,0},
{0,0,1,0},
{1,1,1,0},
{0,0,0,0},
{1,0,0,0},
{1,0,0,0},
{1,1,0,0},
{1,1,1,0},
{1,0,0,0},
{0,0,0,0},
#endregion
#region 定义背景
private int[,] bgGraoud ={
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0},
{0,0,0,0,0,0,0,0,0,0,0,0,0,0}
#endregion
private int[,] CurrentTrick = new int[4, 4]; //当前的砖块
//CurrentTrickNum当前砖块的数目, CurrentStatusNum当前状态, CurrentX当前x, CurrentY当前y, Sorce分数
private int CurrentTrickNum, CurrentStatusNum, CurrentX, CurrentY, S
private int TricksNum = 4;
private int StatusNum = 4;
private Image myI
private Random rand = new Random();
private void Form1_Load(object sender, EventArgs e)
myImage = new Bitmap(panel1.Width, panel1.Height);
Sorce = 0;
protected override void OnPaint(PaintEventArgs e)
base.OnPaint(e);
private void button1_Click(object sender, EventArgs e)
for (int y = 0; y & 20; y++)
for (int x = 0; x & 14; x++)
bgGraoud[y, x] = 0;
timer1.Interval = 1000;
BeginTricks();
this.Focus();
/// &summary&
/// 随机生成方块和状态
/// &/summary&
private void BeginTricks()
//随机生成砖码和状态码
int i = rand.Next(0, TricksNum);
int j = rand.Next(0, StatusNum);
CurrentTrickNum =
CurrentStatusNum =
//分配数组
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
CurrentTrick[y,x] = Tricks[i,j,y,x];
CurrentX = 0;
CurrentY = 0;
timer1.Start();
/// &summary&
/// 变化方块
/// &/summary&
private void ChangeTricks()
if (CurrentStatusNum & 3)
CurrentStatusNum++;
CurrentStatusNum = 0;
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
CurrentTrick[y, x] = Tricks[CurrentTrickNum, CurrentStatusNum, y, x];
/// &summary&
/// 下落方块
/// &/summary&
private void DownTricks()
if (CheckIsDown())
CurrentY++;
if (CurrentY == 0)
timer1.Stop();
MessageBox.Show("哈哈,你玩玩了");
//下落完成,修改背景
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
bgGraoud[CurrentY + y, CurrentX + x] = CurrentTrick[y, x];
CheckSore();
BeginTricks();
/// &summary&
/// 检测是否可以向下了
/// &/summary&
/// &returns&&/returns&
private bool CheckIsDown()
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
//超过了背景
if (y + CurrentY + 1 &= 20)
if (x + CurrentX &= 14)
CurrentX = 13 -
if (bgGraoud[y + CurrentY + 1, x + CurrentX] == 1)
/// &summary&
/// 检测是否可以左移
/// &/summary&
/// &returns&&/returns&
private bool CheckIsLeft()
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
if (x + CurrentX - 1 & 0)
if (bgGraoud[y + CurrentY, x + CurrentX - 1] == 1)
/// &summary&
/// 检测是否可以右移
/// &/summary&
/// &returns&&/returns&
private bool CheckIsRight()
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
if (x + CurrentX + 1 &= 14)
if (bgGraoud[y + CurrentY, x + CurrentX+1] == 1)
private void Draw()
Graphics g = Graphics.FromImage(myImage);
g.Clear(this.BackColor);
for (int bgy = 0; bgy & 20; bgy++)
for (int bgx = 0; bgx & 14; bgx++)
if (bgGraoud[bgy, bgx] == 1)
g.FillRectangle(new SolidBrush(Color.Blue), bgx * 20, bgy * 20, 20, 20);
//绘制当前的图片
for (int y = 0; y & 4; y++)
for (int x = 0; x & 4; x++)
if (CurrentTrick[y, x] == 1)
g.FillRectangle(new SolidBrush(Color.Blue), (x + CurrentX) * 20, (y + CurrentY) * 20, 20, 20);
Graphics gg = panel1.CreateGraphics();
gg.DrawImage(myImage, 0, 0);
private void timer1_Tick(object sender, EventArgs e)
DownTricks();
private void Form1_KeyDown(object sender, KeyEventArgs e)
if (e.KeyCode == Keys.W)
ChangeTricks();
else if (e.KeyCode == Keys.A)
if (CheckIsLeft())
CurrentX--;
else if (e.KeyCode == Keys.D)
if (CheckIsRight())
CurrentX++;
else if (e.KeyCode == Keys.S)
timer1.Stop();
timer1.Interval = 10;
timer1.Start();
private void Form1_KeyUp(object sender, KeyEventArgs e)
if (e.KeyCode == Keys.S)
timer1.Stop();
timer1.Interval = 1000;
timer1.Start();
private void CheckSore()
for (int y = 19; y & -1; y--)
bool isFull =
for (int x = 13; x & -1; x--)
if (bgGraoud[y, x] == 0)
if (isFull)
//增加积分
Sorce = Sorce + 100;
for (int yy = yy & 0; yy--)
for (int xx = 0; xx & 14; xx++)
int temp = bgGraoud[yy - 1, xx];
bgGraoud[yy, xx] =
label1.Text = Sorce.ToString(); ;
private void button2_Click(object sender, EventArgs e)
if (button2.Text == "暂停游戏")
button2.Text = "开始游戏";
timer1.Stop();
button2.Text = "暂停游戏";
timer1.Start();
在接下来的内容中,我们把这个DEMO做成一个三维的俄罗斯方块。
详情请打开:
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:639547次
积分:7218
积分:7218
排名:第2416名
原创:111篇
转载:12篇
评论:1424条
我最近在做有需要做的朋友欢迎联系我。CSDN博客如果在乱删我的博客,我就不再更新了,建议大家去博客园看看我的博客 /henrui/
(1)(1)(1)(1)(9)(1)(2)(1)(3)(2)(8)(5)(6)(2)(1)(4)(1)(6)(2)(3)(4)(5)(7)(6)(1)(4)(6)(2)(3)(5)(3)(2)(3)(6)(4)(2)(1)求自动玩方块算法想让更进一步让电脑自动玩,但想了N了久没想出具体算法建议你去这里问:http://bbs.bccn.net/um-5-1.html中,用的比较浅些吧。特别是游戏时代,毕竟人工智能不能创造利润。这是最初级的&&&&要是想高端点就搞个树&&把后几个块的情况都展开&&然后加点剪枝策略&&&应该就像模像样了&&&不过估计和高手还是差点~~~&&俄罗斯方块(俄罗斯开发经典游戏)_百度百科
?俄罗斯开发经典游戏
俄罗斯方块
(俄罗斯开发经典游戏)
《俄罗斯方块》(Tetris, 俄文:Тетрис)是一款由俄罗斯人于1984年6月发明的休闲游戏。该游戏曾经被多家公司代理过。经过多轮诉讼后,该游戏的代理权最终被获得。[1]
对于俄罗斯方块来说意义重大,因为将它与搭配在一起后,获得了巨大的成功。[1]
《俄罗斯方块》的基本规则是移动、旋转和摆放游戏自动输出的各种方块,使之排列成完整的一行或多行并且消除得分。
俄罗斯方块名字起源
顾名思义,
俄罗斯方块
俄罗斯方块自然是俄罗斯人发明的。这人叫(Алексей Пажитнов 英文:Alexey Pazhitnov)。俄罗斯方块原名是俄语Тетрис(英语是Tetris),这个名字来源于希腊语tetra,意思是“四”,而游戏的作者最喜欢网球(tennis)。于是,他把两个词tetra和tennis合而为一,命名为Tetris,这也就是俄罗斯方块名字的由来。
俄罗斯方块游戏规则
由小方块组成的不同形状的板块陆续从屏幕上方落下来,玩家通过调整板块的位置和方向,使它们在屏幕底部拼出完整的一条或几条。这些完整的横条会随即消失,给新落下来的板块腾出空间,与此同时,玩家得到分数奖励。没有被消除掉的方块不断堆积起来,一旦堆到屏幕顶端,玩家便告输,游戏结束。
1、一个用于摆放小型正方形的平面虚拟场地,其标准大小:行宽为10,列高为20,以每个小正方形为单位。2、一组由4个小型正方形组成的规则图形,英文称为Tetromino,中文通称为方块共有7种,分别以S、Z、L、J、I、O、T这7个字母的形状来命名。
I:一次最多消除四层
J(左右):最多消除三层,或消除二层
L:最多消除三层,或消除二层
O:消除一至二层
S(左右):最多二层,容易造成孔洞
Z (左右):最多二层,容易造成孔洞
T:最多二层
(1)部分游戏有单格方块,
七喜安卓网
可以穿透固定的方块到达最下层空位。其他的改版中出现更多特别的造型。
方块会从区域上方开始缓慢继续落下。
(2)玩家可以做的操作有:以90度为单位旋转方块,以格子为单位左右移动方块,让方块加速落下。
(3)方块移到区域最下方或是着地到其他方块上无法移动时,就会固定在该处,而新的方块出现在区域上方开始落下。
(4)当区域中某一列横向格子全部由方块填满,则该列会消失并成为玩家的得分。同时删除的列数越多,得分指数上升。
(5)当固定的方块堆到区域最上方而无法消除层数时,则游戏结束。
(6)一般来说,游戏还会提示下一个要落下的方块,熟练的玩家会计算到下一个方块,评估要如何进行。由于游戏能不断进行下去对商业用游戏不太理想,所以一般还会随着游戏的进行而加速提高难度。
3、通过设计者预先设置的随机发生器不断地输出单个方块到场地顶部,以一定的规则进行移动、旋转、下落和摆放,锁定并填充到场地中。每次摆放如果将场地的一行或多行完全填满,则组成这些行的所有小正方形将被消除,并且以此来换取一定的积分或者其他形式的奖励。而未被消除的方块会一直累积,并对后来的方块摆放造成各种影响。
4、如果未被消除的方块堆放的高度超过场地所规定的最大高度(并不一定是20或者玩家所能见到的高度),则游戏结束。
具体到每一款不同的游戏,其中的细节规则都可能有千差万别,但是以上的基本规则是相同的。
俄罗斯方块操作方法
1、按游戏界面的&开始&按钮或者F2键来开始游戏,自己使用右边的窗口,对手使用左边的窗口。
俄罗斯方块
2、键盘操作:系统缺省设置使用右边的窗口,用光标操作,&←&左移一格;&→&右移一格;&↑&旋转方块;↓ 方块丢下(方块下落到底),&End&健可以一格格的下落,用户还可以自定义习惯的按键来操作游戏。
3、计分牌显示的内容:
“分数”为双方本局的分数,计分标准为下落一个块10分,一次消一行100分、2行200分、3行400分、4行800分。
“等级”为双方的游戏设置等级,当分数达到一定的值,等级就会提升、速度加快。
“行数”第一行为双方消的行数,第二行是送给对方的行数。
“比分”为双方赢的局数。
俄罗斯方块历史沿革
俄罗斯方块授权给任天堂
1984年6月,在俄罗斯科学院计算机中心工作的数学家帕基特诺夫利用空闲时间编出一个游戏程序,用来测试当时一种计算机的性能。帕基特诺夫爱玩拼图,从拼图游戏里得到灵感,设计出了俄罗斯方块。
1985年,他把这个程序移植到个人电脑上,俄罗斯方块从此开始传播开来。
1988年,罗杰斯在美国拉斯韦加斯的一个展览上看到了俄罗斯方块,觉得非常好玩,并且发现他问到的人也都喜欢玩。作为一个生于荷兰、在美国受教育、在日本从事视频游戏业的专业人士,罗杰斯立刻嗅到了巨大商机。他与日本游戏厂商达成口头协议,然后出发前往莫斯科。帕基特诺夫把俄罗斯方块授权给了他工作的计算机中心,使其成为公有财产,所以罗杰斯面对的谈判对象是当时苏联政府的代表。
1989年,谈判过程充满了文化、价值观和工作方式上的磨合,最终罗杰斯代表取得了俄罗斯方块在家用机上的授权。罗杰斯与帕基特诺夫因这次谈判而相识,并且成了好朋友,这奠定了此后许多年中他们围绕俄罗斯方块进行密切合作的基础。
1990年苏联解体后,帕基特诺夫在罗杰斯的帮助下移居美国,继续从事游戏开发。
1996年,帕基特诺夫拿回了俄罗斯方块的知识产权,与罗杰斯一起成立了蓝色行星软件公司,该公司独家代理俄罗斯方块向各游戏厂商授予版权的事务。
2002年,一名过分沉迷的英国玩家不听机组人员的劝阻,在飞机上用手机玩俄罗斯方块,结果被判刑入狱4个月。
2009年,小方块的魅力经久不衰,俄罗斯方块发售了1.25亿份,受到50多个国家和地区的玩家喜爱,有超过50种语言的版本,运行在几十种游戏平台上,从掌机、街机、个人电脑,到手机和PDA。罗杰斯说,移动设备已经成为俄罗斯方块新的主要平台,该领域的发售量已超过7500万份,并且还在快速增长。在俄罗斯方块网络版的北美和欧洲官方网站上,每天超过100万人次玩这个游戏。
日,帕基特诺夫及其合作伙伴宣布,Tetris,俄罗斯方块诞生25周年庆祝活动在美国洛杉矶举办的电子娱乐展上启动。25年过去了,电脑业和电子游戏业都发生了巨大变化,拥有华丽画面、震撼音效和丰富剧情的大型游戏包括网络游戏纷纷出现,开辟并占据了新的市场。
俄罗斯方块产权纠纷
俄罗斯方块戏,在日后因版权等问题引发了一场不小的风波。先后有多家公司卷入了这场官司,有的后来赚了大钱,有的却因此倒闭。其中的恩恩怨怨,一言难尽。
1988年1月 Tetris在电脑平台的热销,一时造成“洛阳纸贵”的局面。而当CBS晚报采访了俄罗斯方块之父帕基特诺夫之后,斯坦恩盗窃版权的计划彻底泡汤了。一个新的公司ELORG(Electronorgtechinca,苏联一家软件公司)开始和斯坦恩就游戏程序问题进行协商。ELORG的负责人亚历山大·阿列欣科( Alexander Alexinko)知道斯坦恩虽然没有版权,但是会以手中的游戏开发程序为筹码威胁中断谈判。
1988年5月 经过几个月的争吵之后,筋疲力尽的斯坦恩终于和ELORG签定了PC俄罗斯方块版权的合约。当时的合约禁止开发街机版和掌机版的方块游戏,而电脑版的Tetris则成为当时最畅销的游戏。
1988年7月 斯坦恩与阿列欣科商谈开发街机版俄罗斯方块的问题。阿列欣科当时尚未从斯坦恩那里拿到一分钱的版权费,但是同时的Spectrum 和 Mirrorsoft已经开始向电子游戏商出售了俄罗斯方块的版权。Spectrum 将Tetris的游戏机和PC在日本的版权卖给了Bullet-Proof Software (和版俄罗斯方块的制作商),而Mirrorsoft则把它在日本和北美的版权卖给了美国的Atari。这样一来两家公司的矛盾就开始了。1988年11月,BPS在FC上发行的俄罗斯方块(大家不很熟悉的俄罗斯方块1)在日本发售,销量达200万份。
1988年11月 随着GB的开发,NOA(美国分公司)的经理(山内溥老爷子的女婿)希望将Tetris做成上的游戏。于是他联系了BPS的总裁亨克·罗杰斯(Henk Rogers),罗杰斯再与斯坦恩联系的时候却吃了闭门羹。于是他直接去莫斯科购买版权。而斯坦恩觉察出风头,也乘飞机前往莫斯科;与此同时,Spectrum的负责人罗伯特·麦克斯韦(Robert Maxwell)的儿子凯文·麦克斯韦(Kevin Maxwell) 也在向莫斯科进发。就这样,三路人马几乎在同时赶到了冰天雪地的红色都市。
日 罗杰斯首先会见了ELORG的代表叶甫盖尼·别里科夫(Evgeni Belikov,和那个“装在套子里的人”同名)。他给帕基特诺夫等苏联人留下了深刻印象,并且签了手掌机方块游戏的版权。之后他向俄国人展示了版Tetris,这使别里科夫极为震惊。因为他并没有授予罗杰斯家用机的版权!罗杰斯则向他们说这是向TENGEN购买的版权,但是别里科夫也从来听说过TENGEN这个公司的名字。罗杰斯为了缓和尴尬的局面,将斯坦恩隐瞒的事实如数告诉了别里科夫,并且答应付给苏联方面更多支票作为已经卖出的FC版俄罗斯方块的版权费用。这时罗杰斯发现自己有机会买到Tetris全部机种的版权(但是当时还没买),虽然Atari会对他虎视眈眈,但是别忘了,他和BPS的背后还有这个大靠山给自己撑腰。
注意:罗伯特·斯坦恩原先所签的协议只是电脑版Tetris的版权,其他的版权并不是他的。
后来,斯坦恩和ELORG重新签署了协议。别里科夫强迫他重签的合约中修改的内容是:“电脑的定义:包含有中央处理器,监视器,磁盘驱动器,键盘和操作系统的机器”。而斯坦恩当时却没有仔细看这些定义。后来他才意识到这是罗杰斯从自己手中抢走版权而耍的花招。但是为时已晚。第二天他被告知虽然签署的文件已经不能改过来,但是他还可以得到街机版Tetris的开发权。三天之后,他签下了街机版的协议。
日 凯文·麦克斯韦访问了ELORG。别里科夫拿出罗杰斯给他的游戏卡向他询问这件事情。麦克斯韦在卡带上看到了Mirrorsoft的名字后才想起他的公司已经把部分版权倒卖给了Atari。当他想继续谈街机和手掌机版权的问题的时候,却发现他自己能够签的,就只有除电脑,街机,家用机和掌机以外的协议了。在糊涂之余这家伙灵机一动,告诉别里科夫说此卡带为盗版,然后也要签家用机的协议。
最后的结果是:凯文·麦克斯韦只带走一张白纸,罗伯特·斯坦恩带走了街机协议书。由于麦克斯韦声称所有的卡都是盗版,ELORG保留了家用机的版权,没卖给任何人。假如麦克斯韦想获得家用机版权的话,就必须出价比任天堂高才行。亨克·罗杰斯买到了掌机的版权,并且通知了荒川实。BPS就制作GB版Tetris向达成交易:这笔交易额高大500万-1000万美元。
日 亨克·罗杰斯回到莫斯科,并且代表出巨资收购家用机版Tetris的版权。版权费的价格虽然没有向外界透露,但是这个数字将是Mirrorsoft永远拿不出来的。连荒川实和NOA的首席执行官霍华德·林肯(Howard Lincoln)都亲自前往苏联助阵。
日 ELORG和的家用机协议终于达成。方面坚持加入一款声明,在协议签定之后,如果和其他出现法律纠纷,苏联方面必须派人去美国的法庭上做证。实际上,这种法律上的争端将是不可避免的。据说ELORG仅仅得到的定金有300-500万美元之多。别里科夫向Mirrorsoft通知,说Mirrorsoft, Andromeda和Tengen都没有家用机的版权,版权都归所有。当天晚上任天堂和BPS的头目们在莫斯科酒店里举行了庆祝party。
(也就是说,家用机和掌机的版权已经被和BPS分别掌握在手中。无论是Atari还是Tengen都没有权利制作FC版的俄罗斯方块。)
日 霍华德·林肯向Atari发去最后通牒(传真),告诉他们立刻停止(NES)版的俄罗斯方块游戏。这使得Atari和麦克斯韦都十分震怒。他们以Tengen的名义回信说在4月7日那天他们就已经享有家用机俄罗斯方块的版权了。
日 Tengen撰写了一份申请书,要求拥有Tetris的“影音作品,源程序和游戏音乐”版权。但是申请书中并没有提及阿列克谢·帕基特诺夫和的游戏版权问题。
与此同时,麦克斯韦利用自己掌握的媒体势力,企图夺回Tetris的阵地。甚至搬出了苏联与英国政府,对俄罗斯方块版权问题进行干预。结果挑起了苏共与ELORG之间的矛盾。甚至连戈尔巴乔夫都向麦克斯韦保证“以后不用担心日本公司的问题”。
在4月晚些时候,回到莫斯科的时候,发现ELORG已经在苏联政府的打压下抬不起头来,而就在那天半夜,NOA方面给他打电话,说Tengen已经起诉了任天堂。
第二天,他面会了别里科夫,帕基特诺夫和其他几位ELORG的成员,以确保他们能够为的官司佐证。(这回合同里的条款可生效了)随后NOA立刻反诉Tengen,并且开始收集证据。
日 Tengen在USA Today上登载了大幅Tetris广告,虽然法庭大战已经迫在眉睫。
1989年6月 Tengen与的案子终于开庭审理。论战主要围绕一个议题展开:NES(FC)究竟是电脑,还是电子游戏机……Atari认为NES是电脑系统,因为它拥有扩展机能,而且日本的Famicom也有网络功能存在。而的证据则更加切题:ELORG中的苏联人从来没有意向出售Tetris的家用机版权,而所谓的“电脑”的概念则早在和斯坦恩的协议中提到了。
日 法庭召开听证会,讨论关于和Tengen互相命令对方终止生产和销售各自的Tetris软件的行为。法官福恩·史密斯(Fern Smith)宣布Mirrorsoft 与 Spectrum Holobyte均没有家用机版权,因此他们提供给Tengen的权利也不能生效。任天堂的请求最后得到了许可。
日 Tengen版的俄罗斯方块全部撤下了货架,该游戏卡带的生产也被迫中止。数十万份软件留在包装盒里,封存在仓库中。
1989年7月 任天堂版Tetris在美国发售。全美销量大约300万。与此同时,和版Tetris捆绑销售的席卷美国,美利坚大地上刮起一阵方块旋风。
关于Tetris的混战此时已经告一段落。而和Tengen之间的法庭纠纷则一直持续到1993年。
俄罗斯方块产权争议
俄罗斯方块纠纷
俄罗斯方块
俄罗斯方块的由前苏联的外国贸易协会(ELORG)持有,现由The Tetris Company继承。虽然大型机器上贩售的俄罗斯方块游戏多取得授权,但因为其规则简单、容易开发,事实上很多未授权品也散布着。
1990年代初期,全世界流行大量的小型游戏机,多半为类似俄罗斯方块的游戏,都不是授权产品。甚至,很多故意不用Tetris名称之类似俄罗斯方块的游戏机器在著作权官司中事实上都获得了胜诉。这意味着俄罗斯方块这类单纯数学性质的游戏,权利人在著作权诉讼中也很有可能居于弱势,这对游戏开发厂商来说是很大的冲击。是故,很多游戏开发厂商都有不太愿意开发这类数学性质游戏的倾向。
俄罗斯方块收购
PC版俄罗斯方块在匈牙利的布达佩斯被当地的一群电脑专家移植到了Apple II 和 Commodore 64 上,这些版本的软件引起了当时英国一个叫Andromeda的游戏公司经理罗伯特·斯坦恩(Robert Stein)的注意,他向帕基特诺夫以及匈牙利的电脑专家们收购了俄罗斯方块的版权,并且在买到版权之前把它们倒手卖给了英国的Mirrorsoft 以及美国的Spectrum Holobyte。
俄罗斯方块谈判
斯坦恩和帕基特诺夫经过谈判,就版权收购问题未取得成果。斯坦恩甚至直接飞到莫斯科和帕基特诺夫面谈,但是空手而归。由于俄罗斯人对于已经在西方兴起的电子游戏产业知道不多,斯坦恩决定窃取Tetris的版权,于是他放出谣言说这是匈牙利人开发的游戏。
与此同时,PC版的俄罗斯方块已经由英国的Mirrorsoft出品并且在欧洲销售,受到当时人们的极大关注。不仅仅因为这个游戏好玩,而且这是“第一个来自铁幕国家的游戏。”当时的游戏宣传海报上有浓郁的色彩,比如战争画面,太空飞行等。而斯坦恩仍然没有正式合法的版权。
1987年6月斯坦恩最终取得了在IBM-PC及其兼容机上的的版权,版权机种包括“其他任何电脑系统”。但是,他没有和苏联方面签署协议,也就是说,这个版权是不完全的。(译者注: 这个“其他任何电脑系统”在原文中的描述是“any other computer system”,这种说法在当时看来也很不严密,从而为后来的产权之争埋下了伏笔)
俄罗斯方块结果
Atari Games仍然开发了街机版的Tetris,共卖出约2万台机器。Atari Games 被 Williams/WMS收购,而那些封存在仓库里的NES版Tetris的命运则没人知道。Tengen不能从其他途径把它们处理掉,所以估计这些软件都被销毁了。但是据说仍然有约10万份Tengen版的Tetris流入了市场。
罗伯特·斯坦恩,这个版权问题的始作俑者,在Tetris上总共只赚了25万美元。本来他可以挣多点钱的,但是Atari和Mirrorsoft在付他版税的时候没有给足。
Spectrum Holobyte 则需要和ELORG重新协商,
简单俄罗斯方块游戏
以确保电脑版Tetris的版权。罗伯特·麦克斯韦的媒体堡垒在混战中逐渐分崩离析,老麦克斯韦在做生意时做幕后黑手的事实也在调查中,而他却突然暴病身亡。Mirrorsoft 英国公司也惨淡地退出了历史舞台。真正的大赢家是BPS的总裁亨克·罗杰斯,还有幕后的。俄罗斯方块究竟为任天堂赚了多少银子呢?答案恐怕永远说不清了。想一想吧,在美国GB都是和Tetris,以增加GB的出货量……然后因为Tetris买了GB的人还会买其他的GB卡······要是这么算起来的话,那利润简直就像滚雪球一样了。GB版的Tetris总共生产了3000万张,成为不朽之作。
至于苏联方面,除了苏联政府,谁也没有从Tetris那里得到多少好处。苏联解体之后,原ELORG的人员都四散到了全国乃至世界各地,许多人继续开发游戏(比方说帕基特诺夫)。
阿列克谢·帕基特诺夫几乎没有从Tetris上赚到一分钱
双人俄罗斯方块游戏
。ELORG本来打算给他Tetris的销售权,但是旋即取消了这笔交易。不过帕基特诺夫仍然为自己能够制作出这么一个世界闻名的优秀游戏而欣慰。他从科学院里得到一台286(当时在苏联可是了不起的电脑)作为奖励。而且分到了比同事们家宽敞明亮的房子。在1996年,亨克·罗杰斯支付给他一笔报酬,帕基特诺夫组建了Tetris Company LLC 公司,终于能够自己创作游戏,并且收取版权费了。
所有经The Tetris Company官方授权许可的正统俄罗斯方块游戏,都会注明&Authentic Tetris& Game&的商标。
俄罗斯方块社会评价
谈到俄罗斯方块成功的奥妙表示
游戏俄罗斯方块
,可能在于这个游戏非常简单,而且拼图的过程有“从混乱中寻找秩序”的成就感。(创造者帕基特诺夫)
俄罗斯方块还很有前途。俄罗斯方块是一个休闲游戏,它面对的是那些没有精力或兴趣玩大型游戏的玩家,这些人需要一类简单好玩的游戏,拿起来就能进入状态,在忙碌的生活中寻求片刻放松。(创造者帕基特诺夫)
将对俄罗斯方块进行改进,使人们能够更容易从中获得休闲乐趣。罗杰斯说,今后的努力方向包括发展俄罗斯方块的竞技性,开发能够适应玩家特点的“智能”俄罗斯方块,并使来自世界各地、说不同语言的人们能够一起娱乐,通过这个游戏寻求共同点。(创造者帕基特诺夫)
俄罗斯方块是一个建设性的游戏,这一点与中国的围棋相似,“国际象棋就是杀杀杀,围棋则重视构建领地,是建设性的,俄罗斯方块也是”。(开发者罗杰斯)
对于中国市场,正在与中国腾讯公司商谈,研究将俄罗斯方块集成到即时通讯软件QQ中去的事宜。他还参加2006年7月份举行的中国国际数码互动娱乐展览会,与联众等中国游戏企业探讨合作前景。(开发者罗杰斯)
俄罗斯方块获得荣誉
俄罗斯方块获得许多奖励,在多项评选中被评为最经典游戏之一。它还创造了一些世界纪录,比如它是在最多平台上运行的视频游戏,也是直接连累玩家坐牢时间最长的游戏。
俄罗斯方块开发作者
阿列克谢·帕基特诺夫
俄罗斯方块的开发者是,他被称为俄罗斯方块之父。
阿列克谢·帕基特诺夫(Алексей Пажитнов,1956年-),俄罗斯人。他是一位前苏联电脑工程师。1985年6月工作于莫斯科科学计算机中心的阿列克谢·帕基特诺夫在玩过一个拼图游戏之后受到启发,从而制作了一个以Electronica 60(一种计算机)为平台的俄罗斯方块的游戏。后来经瓦丁·格拉西莫夫(Vadim Gerasimov)移植到PC上,并且在莫斯科的电脑界传播,帕基特诺夫因此开始小有名气。
俄罗斯方块影视应用
游戏和玩具被改编成电影大家见得多了,如《》、《》等等,围绕着《俄罗斯方块》编一个好故事是电影版成败的关键。有人早就拍过一部短片《》(Pixels),其中摩天大楼以俄罗斯方块的方式被消除、摧毁实在是让人印象深刻。那部短片已经被好莱坞拍摄成为一部同名电影长片,相信《俄罗斯方块》也从那部《像素》中汲取了不少的灵感。
Threshold娱乐公司的CEO拉瑞卡萨诺夫(Larry Kasanoff)表示,他们的计划是把“俄罗斯方块”打造成一个娱乐品牌,不仅会拍电影,还会推出其他媒体产品,以及同名。
俄罗斯方块正式下架
2014年的最后一天,在人们忙着跨年的时候,一件大事悄然发生:任天堂正式下架《俄罗斯方块》。
俄罗斯方块拥有 9 项吉尼斯世界纪录,包括通过手提电话下载次数最多的游戏、被移植次数最多的游戏等等。
GameBoy 版《俄罗斯方块》终于从任天堂商店中下架,代表着整整一个时代的结束,这款经典作品也就彻底退出了历史舞台。不过,《俄罗斯方块》可不会消失,它势必将会以更多全新的姿态继续活跃着。
.新浪网[引用日期]

我要回帖

更多关于 俄罗斯方块小游戏 的文章

 

随机推荐