AS3.0 俄罗斯方块

Actionscript3.0 俄罗斯方块源码 package { import com.ui.Block; import com.ui.Shape;  import flash.display.Sprite; import flash.events.KeyboardEvent; import flash.events.TimerEvent; import flash.utils.Timer; [SWF(backgroundColor = "0 阅读详情

package {
 import com.ui.Block;
 import com.ui.Shape;
 
 import flash.display.Sprite;
 import flash.events.KeyboardEvent;
 import flash.events.TimerEvent;
 import flash.utils.Timer;
 [SWF(backgroundColor = "0xfffffff", frameRate = "24")]
 /**
  * 俄罗斯方块应用程序
  * 主程序入口
  *
  * **/   
 public class FangKuai extends Sprite{
  
 private const BLOCKWH:uint=15;   //每个矩形的边长
 private const KEY_LEFT:uint=37;   //响应键盘  的值       左
 private const KEY_UP:uint =38;   //上
 private const KEY_RIGHT:uint=39;  //右
 private const KEY_DOWN:uint=40;//下
 
 private var shape:uint = 1;   //形状值。默认为1
 
 private var tempL:int = 0;//方块的左边空白距离
    private var tempR:int = 0;//右边空白距离
    private var tempD:int = 0;//下边空白距离
    private var moveType:String;//存储移动状态
  
 private var timer:Timer;   //计时器
  
 private var tetrisX:int;//Tetris的世界X坐标(不是stage的x)
 private var tetrisY:int;//Tetris的世界y坐标
 
 private var worldArr:Array = new Array();//世界方块数组,由10*20的格子构成世界
 private var tetrisShape:Array;//Tetris的数组(形状)
 private var tetrisBrickArr:Array = [];//所有添加到场景的小格子方块储存到一个数组
 
  public function FangKuai(){//构造
   init();
  }
  
  /*
   *响应键盘事件
   */
  private function keyevent(keyev:KeyboardEvent):void{
   if(keyev.keyCode == KEY_LEFT){
    moveType = "l";
    go( -1, 0);
   }
   if(keyev.keyCode == KEY_RIGHT){
    moveType = "r";
    go( 1, 0);
   }
   if(keyev.keyCode == KEY_DOWN){
    moveType = "d";
    go( 0, 1);
   }
   if(keyev.keyCode == KEY_UP){
    moveType = "ro";
    revolves();
   }
   createStageOfTrtris(); 
  }
   
  /*
  *创建可视化的舞台
  */ 
  private function createStageOfTrtris():void{    
   clearStageOfTrtris();   
   for(var world_x:uint=0;world_x<20;world_x++){
      var clearState:int=0;
    for(var world_y:uint=0;world_y<10;world_y++){
     if(worldArr[world_x][world_y] == 0){  //添加背景方格
      var block:Block = new Block(0xCCCCCC);  //黄
      block.x = world_y * BLOCKWH;
         block.y = world_x * BLOCKWH;
         tetrisBrickArr.push(block);
         stage.addChild(block);
     }
     if(worldArr[world_x][world_y] == 2){ 
      clearState++;
      var block2:Block = new Block(0xff0000);
      block2.x = world_y * BLOCKWH;
      block2.y = world_x * BLOCKWH;
      tetrisBrickArr.push(block2);
      stage.addChild(block2);
     }
     
     if(world_x >= tetrisY &&
          world_x < tetrisY + tetrisShape.length &&
          world_y >= tetrisX  &&
          world_y < tetrisX + tetrisShape.length ){  //将形状数组tetrisShape 变为舞台上的可视图形          
      if(tetrisShape[world_x -tetrisY][world_y-tetrisX] == 1){
       var block1:Block = new Block(0xff0000);
       block1.x = world_y * BLOCKWH;
          block1.y = world_x * BLOCKWH;
          tetrisBrickArr.push(block1);
          stage.addChild(block1);
      }
     }
    }
    if (clearState  >= 10) {    //清屏
                        worldArr.splice(world_x, 1) ;
                        worldArr.unshift([0,0,0,0,0,0,0,0,0,0]);
                }
    
   }
  }
   /*
   *旋转
   */
  private function revolves():void{
    var reShpaeArr:Array = new Array(4);
    for(var a:int=0;a<tetrisShape.length;a++){
     reShpaeArr[a]=new Array(4);
     for(var b:int=0;b<tetrisShape.length;b++){
      reShpaeArr[a][b] = tetrisShape[3-b][a];
     }
    }
     //判断翻转后是否会与原有方块重合,如果重合return,不让翻转
                for ( var i :int= 0; i <4;i++ ) {
                   for ( var j :int= 0; j <4; j++ ) {
                    if (reShpaeArr[i][j] == 1) {
                        if (i+tetrisY>19) return;
                         if (worldArr[i + tetrisY][j + tetrisX] == 2 ) return;
                   }
                }
            }
    this.tetrisShape = reShpaeArr;
    getTempXy();
    //考虑在左右板边翻转超出舞台的情况
             if ( tetrisX + tempL <0 ){
              tetrisX = 0;
             }
             if ( tetrisX + tempL+tetrisShape[0].length-tempR>10 ) {
              tetrisX = 10 - tetrisShape[0].length-tempR;
             }
  }
  /*
  *清除舞台
  * 检测方块是否到达顶部? 如果到达, init();
  */
  private function clearStageOfTrtris():void{
   for (var i:int = 0; i <10;i++ ) { 
    if (worldArr[0][i] == 2
     || worldArr[1][i] == 2
     || worldArr[2][i] == 2
     || worldArr[3][i] == 2) {
     init();
     return;
    }
   }
   if (tetrisBrickArr.length> 0) {
    for ( var j:uint=0; j <tetrisBrickArr.length;j++ ) {
     stage.removeChild(tetrisBrickArr[j]);
    }
    tetrisBrickArr = [];
   }   
  
  }
  /*
  *计时器 函数
  */
  private function run(ev:TimerEvent):void{
   moveType = 'd';//更改移动状态为下
   go(0,1);
   createStageOfTrtris();
  }
  
  /*
  *移动  左   右  下的移动
  */
  private function go(lr:int,ud:int):void{
     getTempXy();
   var hit:Array = hitTest(); 
   if (this.tetrisX+tempL + lr>= 0 &&
       this.tetrisX + lr-tempR <= 10 - tetrisShape[0].length &&
       hit[0]==0) {//左右移动
    this.tetrisX += lr;
   }
   if (hit[0] == 1 && hit[1] == 2 ){
     floor();//判断落地
   }
   if(lr==0 && tetrisY - tempD +3 < 19) {
    this.tetrisY += ud;//在场景内下移动
   }
  }
   
        //计算tetris数组四周的空白距离
        private function getTempXy():void {
            var tempint1:int = 0;
            var tempint2:int = 0;
            var tempint3:int = 0;   
            tempL = 0;
            for ( var j:int= 0; j <2;j++) {
                for (var i:int = 0; i <4; i++ ) {
                    if (tetrisShape[i][j] == 1 ) tempint1++;
                }
                if (tempint1 == 0) tempL ++;
            }          
            tempR = 0;
            for (  j= 3; j>1;j-- ) {
                for ( i = 0; i <4; i++ ) {
                    if (tetrisShape[i][j] == 1 ) tempint2++;
                }
                if (tempint2 == 0) tempR ++;
            }          
            tempD = 0;
            for ( j = 3; j>1;j-- ) {
                for ( i = 0; i <4; i++ ) {
                    if (tetrisShape[j][i] == 1 ) tempint3++;
                }
                if (tempint3 == 0) tempD ++;
            }                              
        }
       
  private function hitTest():Array {
   //检测左右是否有方格
     getTempXy();
   for (var i:int = 0; i <4;i++ ) {
    for (var j:int = 0; j <4;j++ ) {
     if (tetrisShape[i][j] == 1) {
      if (moveType == 'l' || moveType == 'ro') {
       if (this.worldArr[i+tetrisY][j+tetrisX-1]==2) return [1,0];
      }
      if(moveType=='r' || moveType=='ro'){
       if (this.worldArr[i+tetrisY][j+tetrisX+1]==2) return [1,1];
      }
      if (moveType == 'd' || moveType=='ro') {
       if(i+tetrisY+1<20){
        if (this.worldArr[i + tetrisY + 1][j + tetrisX] == 2) return [1, 2];
       }
      }
     }
    }
   }
   //检测是否到下边界
   if (this.tetrisY-tempD  >= 20 - tetrisShape.length &&
        (moveType=="d" || moveType=='ro')) {
    return [1,2];
   }else {
    return [0,0];
   }
  }
  //落地 的检测
  private function floor():void {
   for ( var i:int = 0; i <4;i++ ) {
    for ( var j:int = 0; j <4;j++ ) {
     if (tetrisShape[i][j] == 1) {
      this.worldArr[i + tetrisY ][j + tetrisX] = 2;
     }
    }
   }
   getTrtrisShape();//创建新的tetris
  }
  
  /*
   *获得形状数组
   *随机产生一个形状
   */
  private function getTrtrisShape():void{
   var shape:uint = Math.floor(Math.random()*6 + 1);
   //shape = 2;
   tetrisShape = Shape.getShape(shape);
   tetrisX=0;
   tetrisY=0;
  }
  
  private function init():void{  //初始化
    //对数组worldArr初始化
   for(var world_row:uint=0;world_row<20;world_row++ ){
    worldArr[world_row]=[];
    for(var world_col:uint=0;world_col<10;world_col++){
     worldArr[world_row][world_col]=0; 
    }
   }
   getTrtrisShape();
   timer = new Timer(500);
   timer.addEventListener(TimerEvent.TIMER,run);
   timer.start();
   stage.addEventListener(KeyboardEvent.KEY_DOWN,keyevent);
  }   
  
 }
}
----------------------------------------------------------------------

package com.ui{
 import flash.display.Shape;
 
 /**
  * 工具类
  * 产生格子
  * **/
 public class Block extends Shape{
  public function Block(color:uint){
   this.graphics.lineStyle(1,.8);
   this.graphics.beginFill(0x660099,.8);
   this.graphics.drawRect(0,0,15,15);
   this.graphics.endFill();
  }

 }
}

-----------------------------------------------------------------------------

package com.ui{
 /**
  * 形状类
  * 创建俄罗斯方块(Tetris)的类型,用一个4*4的数组(tetrisType)存储 
  * */
 public class Shape{
  public function Shape(){
  }
  public static function getShape(shape:uint):Array{
   var tetrisShape:Array=[];
   switch(shape){
    case 1:
     tetrisShape = [
     [0,0,0,0],
     [0,1,0,0],
     [0,1,0,0],
     [0,1,1,0]
    ];
      break;
    case 2 :
     tetrisShape = [
     [0,0,0,0],
     [0,1,1,0],
     [0,1,1,0],
     [0,0,0,0]
    ];
    break;
    case  3:
     tetrisShape = [
     [0,1,0,0],
     [0,1,0,0],
     [0,1,0,0],
     [0,1,0,0]
    ];
    break;
    case  4:
     tetrisShape = [
     [0,0,0,0],
     [0,1,0,0],
     [1,1,1,0],
     [0,0,0,0]
    ];
    break;
    case  5:
     tetrisShape = [
     [0,0,0,0],
     [1,1,0,0],
     [0,1,1,0],
     [0,0,0,0]
    ];
    break;
    case  6:
     tetrisShape = [
     [0,0,0,0],
     [0,1,1,0],
     [1,1,0,0],
     [0,0,0,0]
    ];
    break;
    default:
     tetrisShape = [
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0],
     [0, 0, 0, 0]
    ];
    break;
   }
   return tetrisShape;
  }
  
  

 }
}

------------------------------------------------

 

  要求不高,来的留个言..........在此感谢!

python俄罗斯方块教程-100行代码 使用tkinter库实现基础窗体,不加入任何功能只需如下三行代码运行代码生成的窗口如下接下来我们需要在窗体里面,添加一个画布容器用来“装”俄罗斯方块,就是让这个画布作为面板,俄罗斯方块的移动和绘制均在这个画板上实现。这里我们设定一些俄罗斯方块游戏参数行数为R(取20)列数为C(取12)俄罗斯方块的边长为cell_size(取30)通过tkinger的画布类Canvas实现的代码如下运行代码生成的窗口如下,此时界面的长宽就变成我们所需要的了接下来在画板上绘制俄罗斯方块空白位。 阅读详情

相关推荐

在Excel中用VBA制作俄罗斯方块游戏

在Excel中用VBA制作俄罗斯方块游戏 前几天用VBA写了一个俄罗斯方块游戏。 先工作表设置 工作表该填写参数的位置须要填写参数。 效果是这样的: 这里没有把列序数和行序数截取过来,就补标几个项: 游戏区域E1:N20涂黑就行。“y-1 exists”在T8单元格,"type"在Y8单元格,"ColorIndex"在AA1单元格,"knext"在AG6单元格,最后一行最后一列的"7401020...

weixin_43425618的博客 7264

AS3制作的小游戏——俄罗斯方块

当初设计思路有问题,后来被导师拉回来啦,哈哈。 整体来说,思路就是通过二维的Sprite数组,来实现的方块的显示与隐藏。界面设计方面就不BB啦,就总结一下自己方块与逻辑吧,后面附有可运行代码,喜欢的可直接拿走。 首先,可以把方块下落的所有区域当作一个M×N的矩阵,这个时候,就可以通过生成一个Sprite的二维数组来实现了,然后通过一个二维布尔数组来记录每一个方块是否被占用,占用的方块透明值(al...

和产品battle的秃头程序 904

python简易俄罗斯方块

python简易俄罗斯方块前言开始献上代码代码剖析项目github作者 前言 开始 献上代码 from tkinter.messagebox import showinfo as msg from pygame.locals import * import tkinter as tk import pygame import random import time win = tk.Tk() win.withdraw() pygame.init() def render(surf,blocks): for

weixin_42954615的博客 1656

Scratch制作俄罗斯方块消除游戏

俄罗斯方块是一款非常经典的游戏,一旦开始玩了,就不容易停下来了。今天我们来制作简易版本的俄罗斯方块游戏。 那么俄罗斯方块如何消除? 1.用造型来处理,当按旋转按钮的时候,程序只要选造型就好了。 控制这些角色沿着方格来运动的。而且在移动过程中检测碰到其他方块。可以用判断碰到黑色 2.当一个方块落到下面停下来后,怎么实现这方块就停留在下面,而新的同样的角色还在上面? 同理,其实每一步移动距离都是...

u014603907的博客 4936

AS3俄罗斯方块

Flash AS3写的,不是原创,是别人写的,仅供学习,可运行,不能运行的联系我!

俄罗斯方块-as vs java

NULL 博文链接:https://as3.iteye.com/blog/1048664

as3 俄罗斯方块 优化 美化版

最近在研究俄罗斯方块(主要用于怀旧~))。下载了别人的代码来参考,发现一些bug,修改后再进行了一些美化(就是改改颜色,改改格子的形状)。 有问题可以回帖提问!!尽力回答!!希望对你有用。 要点 0.用timer或者enterframe等来计时,每过一定时间就向下移动! 1.数组保存整个游戏的格子。 2.每种形状的格子用数组写死,定义好。另一个数组保存正在下落的形状格子。 3.我通

猫叔压力大 1560

经典俄罗斯方块scratch2的程序

经典俄罗斯方块scratch2的程序,适合scratch编程的朋友学习

好例子网_俄罗斯方块.sb3

Scratch 俄罗斯方块

超级变态版俄罗斯方块3.0

变态版俄罗斯方块,令人发指的出招次序和方式。

Python课程设计之俄罗斯方块

Python课程设计之俄罗斯方块 软件需求:Python环境 压缩包内含:源代码、打包好的可执行文件、文档报告

满天星的博客 1万+

用野火FPGA开发板(EP4CE10)手把手教你实现一个高精度频率计(附完整Verilog代码)

本文详细介绍了基于野火FPGA开发板(EP4CE10)实现高精度频率计的全过程,涵盖等精度测量法的核心原理、Verilog代码实现及优化技巧。通过实际案例演示,帮助开发者掌握1Hz-50MHz范围、精度达0.1%的频率计设计方法,并提供完整的工程代码和实测数据。

weixin_29261711的博客 440

python tkinter实现俄罗斯方块基础版——一、基础界面

本教程为我在b站投稿的视频教程av81480858 对应的文字版,项目最终效果见投稿简介部分,视频部分讲解的比较详细,觉得文字版不够详细的可以去看视频。 本项目最终代码已上传github: https://github.com/BigShuang/Tetris 的1_BASIC文件夹 。其中1234分别对应本项目教程每一部分的最终代码,所以想看完整代码直接看004.py就好。 本项目通过pyt...

大爽老师的博客 1万+

直流有刷电机控制 - 认识电机(一)

电机控制学习

u011030644的博客 917

保姆级教程:Unity编辑器汉化全流程(从下载到配置避坑指南)

本文提供Unity编辑器汉化的保姆级教程,涵盖从下载中文语言包到配置避坑的全流程。详细解析版本适配、文件系统交互及编辑器底层配置逻辑,帮助开发者高效完成汉化,解决常见报错问题,提升工作效率。

weixin_30825581的博客 155

【Python游戏】用Python制作一个俄罗斯方块游戏

本项目基于python3版本开发(如果你的是python2.x,运行可能会有问题)

GLB_0627的博客 3101

国产大模型 coding plan 实战决策指南:GLM、Kimi、豆包、abab 四大模型分层选型与工程落地

大模型辅助编程(coding assistant)正从概念验证走向规模化工程落地,其核心已不再是‘能否生成代码’,而是‘如何在真实开发流程中精准赋能’。理解模型能力边界、匹配技术栈特征、构建分层工作流(L1行级补全/L2函数生成/L3模块重构),是实现稳定提效的关键。GLM系列以工程稳定性见长,适合代码审计与测试生成;Kimi-Max凭借200K超长上下文胜任深度重构与合规审查;豆包响应快、框架适配深,是IDE高频补全的理想选择;abab系列则在IoT固件等跨模态场景中展现独特价值。本文聚焦国产模型在金融、

weixin_32238157的博客 428

强化学习DQN之俄罗斯方块

本项目目的是训练一个基于深度强化学习的俄罗斯方块。

qq128252的博客 3061

Keil uVision5 STM32 startup_stm32f10x_md_vl.s error A3906U Malformed via file target not created..

🏆 本文收录于《全栈Bug调优(实战版)》专栏,致力于分享我在项目实战过程中遇到的各类Bug及其原因,并提供切实有效的解决方案。无论你是初学者还是经验丰富的开发者,本文将为你指引出一条更高效的Bug修复之路,助你早日登顶,迈向财富自由的梦想🚀!同时,欢迎大家关注、收藏、订阅本专栏,更多精彩内容正在持续更新中。让我们一起进步,Up!Up!Up!    备注: 部分问题/难题源自互联网,经过精心筛选和整理,结合数位十多年大厂实战经验资深大佬经验总结所得,数条可行方案供所需之人参考。

**My Coding Family** 2779

Linux LT8912b调试记录(MIPI转LVDS/HDMI)

本文记录了在RK3588平台上使用LT8912B芯片实现MIPI转LVDS/HDMI的调试过程。主要包含设备树配置、驱动代码实现及常见问题解决。调试重点包括:1)正确配置1280x800分辨率的LVDS屏幕参数;2)确保I2C总线正常通信;3)解决花屏、图像抖动、黑屏等问题,涉及lane-rate计算、同步信号极性调整及MIPI模式选择。文中提供了详细的寄存器配置代码和故障排查方法,特别强调了I2C通信验证和电压匹配的重要性。通过参数优化和多种模式测试,最终实现了稳定的视频输出转换。

qq_45147279的博客 1088
上一篇: Actionscript3.0 俄罗斯方块源码
下一篇: Java 俄罗斯方块
HadesCool
博客等级 码龄17年 15粉丝 24原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值