经典俄罗斯方块代码(转javascript代码)

这篇具有很好参考价值的文章主要介绍了经典俄罗斯方块代码(转javascript代码)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

在网上发现一篇60行javascript超经典俄罗斯方块代码,值得学习,转为Delphi如下,有详细注释,不再另讲解:

unit Block_Unit;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.Grids, Vcl.ExtCtrls;

type
  TBlockForm = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormPaint(Sender: TObject);
  private
    procedure WMMyKey(var Msg: TWMKeyDown); message WM_KEYDOWN;
  public
  end;
type
  TIntArr=array of TArray<Integer>;
type TBlock=record
  x,y,s:Integer;
  fk:array [0..3] of Integer;//fk记录方块,4X4二进制矩阵
end;
var
  BlockForm: TBlockForm;
  Map:array  of Integer;
  Tetris: TIntArr= [[$6600],//方块,二进制数据显示方块
                    [$2222, $0f00],//I型
                    [$c600, $2640],//Z型
                    [$6c00, $4620],//反Z型
                    [$4460, $2e0, $6220, $740],//L型
                    [$2260, $0e20, $6440, $4700], //反L型
                    [$2620, $720, $2320, $2700]]; //T型;
  pos,bak:TBlock;//pos当前方块数据,bak备份当前方块数据
  dia:TArray<Integer>;
  rs:TResourceStream;
procedure Rotate(r:Integer);
procedure GameStart;
procedure UpdateMap(b:Boolean);
function HaveBlock:Boolean;
procedure BlockMove(r:Integer);
implementation
  uses Vcl.Imaging.jpeg;
var
  Green,Red:TJPEGImage;
{$R *.dfm}
{此游戏的核心思路是用二进制来记录整个界面的变化,
每个方块设定为4X4的二进制矩阵,整个游戏界面设定为10列、22行。}
{初始化方块}
procedure GameStart;
begin
  dia:=Tetris[Random(7)];//随机方块类别
  pos.x:=4;//初始位置
  pos.y:=0;
  pos.s:=Random(Length(dia));//随机方块形态
  bak:=pos;
  Rotate(0);
end;
{方块旋转}
procedure Rotate(r:Integer);
var
  f,i:Integer;
begin
  //根据方块的形态多少来依次旋转方块
  pos.s:=(pos.s+r) mod Length(dia);
  f:=dia[pos.s];
  for i:= 0 to 3 do
  //旋转变换
      pos.fk[i]:=(f shr (12-i*4) and $F) shl (8-pos.x);
  updateMap(HaveBlock);
end;
{更新界面}
procedure UpdateMap(b:Boolean);
begin
  if b=False then
  begin
    bak:=pos;
    BlockForm.Repaint;
  end;
end;
{判断障碍物}
function HaveBlock:Boolean;
var
  i:Integer;
begin
  Result:=False;
  for I := 0 to 3 do
    if pos.fk[i] and Map[pos.y+i]<>0 then
    begin
      pos:=bak;
      Result:=True;
      Break;
    end;
end;
{游戏结束}
procedure GameOver;
begin
  BlockForm.Timer1.Enabled:=False;
  ShowMessage('GameOver!');
end;
{游戏运行,关键代码}
procedure BlockDown;
begin
  Inc(pos.y);
  if HaveBlock then
  begin
     for var  i:Integer:= 0 to 3 do
     begin
       if  pos.y+i>=22 then Break;
       Map[pos.y+i]:=Map[pos.y+i] or pos.fk[i];//“或”操作来改变数据
       if Map[pos.y+i]=$FFF then//二进制表示满行
       begin
         Delete(Map,pos.y+i,1);//消除满行
         Insert([$801],Map,0);//插入空行
       end;
     end;
    if Map[1]<>$801 then//第一行不为空游戏结束
       GameOver;
     GameStart;
  end;
  UpdateMap(False);
end;
{方块左右移动,-1为左,1为右}
procedure BlockMove(r:Integer);
var
 i:Integer;
begin
  Inc(pos.x,r);
  for I := 0 to 3 do
  begin
    if r=1 then
       pos.fk[i]:=pos.fk[i] shr 1
    else
       pos.fk[i]:=pos.fk[i] shl 1;
  end;
  UpdateMap(HaveBlock);
end;
procedure TBlockForm.Button1Click(Sender: TObject);
begin
  //$801的二进制为100000000001
  for var I:Integer := 0 to 21 do Map[i]:=$801;
  Map[22]:=$FFF;
  //以上代码利用二进制初始化游戏界面,即为
  //100000000001
  //100000000001
  //............
  //111111111111
  GameStart;
  Button1.Enabled:=False;
end;

procedure TBlockForm.FormCreate(Sender: TObject);
var
 st:TMemoryStream;
begin
  DoubleBuffered:=True;
  SetLength(Map,23);//设定共23行,其中最后一行为判断是否触底用
  Randomize;
  rs := TResourceStream.Create(HInstance, 'Green', RT_RCDATA);
  Green:=TJPEGImage.Create;
  Red:=TJPEGImage.Create;
  Green.LoadFromStream(rs);
  rs.Free;
  rs:=TResourceStream.Create(HInstance, 'Red', RT_RCDATA);
  Red.LoadFromStream(rs);
  rs.Free;
end;
procedure TBlockForm.WMMyKey(var Msg: TWMKeyDown);
begin
  //输入法要切换成英文,只能发送给有焦点的Form来响应
  if (Msg.CharCode=VK_UP)or(Msg.CharCode=ord('W')) then Rotate(1);
  if (Msg.CharCode=VK_DOWN)or(Msg.CharCode =ord('S') ) then BlockDown;
  if (Msg.CharCode=VK_LEFT)or(Msg.CharCode = 65) then BlockMove(-1);
  if (Msg.CharCode=VK_RIGHT)or(Msg.CharCode =ord('D')) then BlockMove(1);
  if Msg.CharCode=VK_ESCAPE then //使Button起作用
  begin
    Button1.Enabled:=true;
    Button1.SetFocus;
  end;

end;

procedure TBlockForm.FormPaint(Sender: TObject);
var
  i,j,k:Integer;
begin
  Canvas.Brush.Style:=bsSolid;
  Canvas.Brush.Color:=RGB(255,255,255);
  Canvas.FillRect(Rect(0,0,150,330));
  for I := 0 to 21 do
  begin
    for j := 0 to 9 do
    begin
      k:=Map[i] shr (10-j) and 1;//判断是否触底,触底则变绿
      if k=1 then
        //Canvas.FillRect(Rect(j*15+1,i*15+1,j*15+14,i*15+14));
        Canvas.Draw(j*15+1,i*15+1,Green);
    end;
  end;
  Canvas.Brush.Color:=RGB(255,0,0);
  for I :=0 to 3 do
  begin
    for j := 0 to 9 do
    begin
      k:=bak.fk[i] shr (10-j) and 1;
      if k=1 then//不触底则以红色来画方块
        Canvas.Draw(j*15+1,(i+bak.y)*15+1,Red);
        //Canvas.FillRect(Rect(j*15+1,(i+bak.y)*15+1,j*15+14,(i+bak.y)*15+14));
    end;
  end;
end;

procedure TBlockForm.Timer1Timer(Sender: TObject);
begin
  BlockDown;
end;

end.
//其中Red、Green两个图片大小为15X15像素的资源,如不用资源文件,可以去掉Draw,改用FillRect。

  文章来源地址https://www.toymoban.com/news/detail-807405.html

到了这里,关于经典俄罗斯方块代码(转javascript代码)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Python小项目俄罗斯方块代码基于pygame编写

    python实习作业或者期末作业,俄罗斯方块,基于pygame编写 有很多小伙伴想要找一些小项目练练手,下面是我在闲暇时写的一个俄罗斯方块的一个小游戏,它是基于pygame板块来实现的 这是它的首页界面 然后这里是它的运行界面 总共有四个速度等级,分别对应四种不同的速度,

    2023年04月08日
    浏览(39)
  • Java实现俄罗斯方块小游戏。(附完整源代码)

    大家好,我是百思不得小赵。 创作时间:2022 年 5 月 12 日 博客主页: 🔍点此进入博客主页 —— 新时代的农民工 🙊 —— 换一种思维逻辑去看待这个世界 👀 今天是加入CSDN的第1167天。觉得有帮助麻烦👏点赞、🍀评论、❤️收藏 目录 一、游戏背景 二、功能实现 三、效果

    2024年02月03日
    浏览(72)
  • 基于Python+Pygame实现一个俄罗斯方块小游戏【完整代码】

    俄罗斯方块,一款起源于上世纪80年代的经典电子游戏,凭借简单的规则和独特的魅力,一跃成为全球家喻户晓的经典。你知道其实只需要一些基础的编程知识,就可以自己实现它吗?今天,我们将使用Python的Pygame库,一步步带你构建属于自己的俄罗斯方块小游戏! 游戏初始

    2024年02月04日
    浏览(50)
  • 免费分享一套Python俄罗斯方块源码 PyQt5俄罗斯方块源码,太好玩了~

    大家好,我是java1234_小锋老师,看到一个不错的Python俄罗斯方块源码 PyQt5俄罗斯方块源码,分享下哈。 【免费】Python俄罗斯方块源码 PyQt5俄罗斯方块源码 Python小游戏源码_哔哩哔哩_bilibili 【免费】Python俄罗斯方块源码 PyQt5俄罗斯方块源码 Python小游戏源码项目来自互联网,免

    2024年01月25日
    浏览(47)
  • 编写一个俄罗斯方块

    编写俄罗斯方块 思路。 1、创建容器数组,方块, 2、下落,左右移动,旋转,判断结束,消除。  定义一个20行10列的数组表示游戏区。初始这个数组里用0填充,1表示有一个方块,2表示该方块固定了, 然后随机出一个方块,操作左右转,触底变2后,再随机下一个方块,循

    2024年02月12日
    浏览(53)
  • pygame俄罗斯方块游戏

    1.安装python 2.引入游戏库pygame 3.引入随机数 俄罗斯方块初始形状 这里使用一个二维数组 用来标记俄罗斯相对应的方块形状 代码如下: 游戏移动方向是否可能判断 这里为了不让他出现穿墙,跨过方块下落 都做对应的碰撞判断 具体代码如下: 俄罗斯方块旋转变形代码实现 俄

    2024年02月08日
    浏览(46)
  • c语言——俄罗斯方块

    俄罗斯方块是久负盛名的游戏,它也和贪吃蛇,扫雷等游戏位列经典游戏的⾏列。 《俄罗斯方块》(Tetris,俄文:Тетрис)是一款由俄罗斯人阿列克谢·帕基特诺夫于1984年6月发明的休闲游戏。 该游戏曾经被多家公司代理过。经过多轮诉讼后,该游戏的代理权最终被任天堂

    2024年02月05日
    浏览(46)
  • python制作俄罗斯方块

    作者简介 :一名后端开发人员,每天分享后端开发以及人工智能相关技术,行业前沿信息,面试宝典。 座右铭 :未来是不可确定的,慢慢来是最快的。 个人主页 :极客李华-CSDN博客 合作方式 :私聊+ 这个专栏内容 :BAT等大厂常见后端java开发面试题详细讲解,更新数目10

    2024年02月12日
    浏览(51)
  • 用Pygame写俄罗斯方块

    此文章参考的是吃饭超人的文章 首先我们先打开cmd输入如下令命 然后打开python或者pycharm 输入如下代码

    2024年02月12日
    浏览(39)
  • 用python制作俄罗斯方块

    代码如下,可以直接运行:

    2024年02月11日
    浏览(53)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包