package com.data
{
 import mx.controls.Button;

/**
  * 格子数据
  **/
 public class DataItem extends Button
 {
  public static const TYPES:Array = [1, 2, 3, 4, 5, 6, 7];
  public static const WIDTH:uint = 50;
  public static const HEIGHT:uint = 50;
  
  private var _type:int;
  private var _px:int;
  private var _py:int;
  private var _initXY:Boolean;
  public function DataItem()
  {
   super();
   this.width = DataItem.WIDTH;
   this.height = DataItem.HEIGHT;
   this._initXY = false;
   select();
  }

public function get type():int
  {
   return _type;
  }

public function set type(value:int):void
  {
   _type = value;
   this.label = String(value);
  }

public function isSame(item:DataItem):Boolean{
   return this._type == item._type;
  }

public function get px():int
  {
   return _px;
  }

public function set px(value:int):void
  {
   _px = value;
  }

public function get py():int
  {
   return _py;
  }

public function set py(value:int):void
  {
   _py = value;
  }

public function get initXY():Boolean
  {
   return _initXY;
  }

public function set initXY(value:Boolean):void
  {
   _initXY = value;
  }
  
  public function select(sign:Boolean = false):void{
   if(sign){
    this.alpha = 1;
   }else{
    this.alpha = 0.2;
   }
  }

}
}

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

package com.data
{
 import flash.events.Event;
 import flash.events.MouseEvent;
 import flash.events.TimerEvent;
 import flash.utils.Timer;
 
 import mx.containers.Panel;

/**L
  * 对对碰容器管理
  **/
 public class DataManager extends Panel
 {
  private var _data:Array;
  private var _rows:uint;
  private var _cols:uint;
  private var _deletes:Array;
  
  private var _selectItem:DataItem;
  private var _timer:Timer;
  private var _item1:DataItem;
  private var _item2:DataItem;
  private var _active:Boolean = false;
  private var _unselect:Boolean = false;
  
  public function DataManager(rows:uint, cols:uint)
  {
   super();
   this.layout = "absolute";
   _data = new Array();
   _rows = rows;
   _cols = cols;
   _deletes = new Array();
   
   var i:uint = 0;
   var j:uint = 0;
   var item:DataItem = null;
   var array:Array = null;
   for(i = 0; i < rows; i++){
    array = new Array();
    _data.push(array);
    for(j = 0; j < cols; j++){
     item = createDataItem();
     array.push(fillDataItem(i, j, item));
     this.addChild(item);
     initItemDataXY(item, item.px * DataItem.WIDTH, item.py * DataItem.HEIGHT);
    }
   }
   
   initDeletes();
   if(_deletes.length > 0){
    removeDeletes();
   }
  }
  
  private function initItemDataXY(item:DataItem, x:int, y:int):void{
   item.x = x;
   item.y = y;
   item.initXY = true;
  }
  
  /**
   * 生成随机类型的数据
   **/
  private function createDataItem():DataItem{
   var item:DataItem = new DataItem();
   item.type = int(Math.round(Math.random() * DataItem.TYPES.length));
   item.addEventListener(MouseEvent.CLICK, click);
   return item;
  }
  
  private function removeDeletes():void{
   _unselect = true;
   _timer = new Timer(200, 5);
   _timer.addEventListener(TimerEvent.TIMER, deleteAnimate);
   _timer.addEventListener(TimerEvent.TIMER_COMPLETE, deleteAnimateEnd);
   _timer.start();
  }
  
  /**
   * 初始化消除数据
   **/
  private function initDeletes():void{
   _deletes.length = 0;
   var array:Array = null;
   var i:uint = 0;
   var j:uint = 0;
   var k:uint = 0;
   var n:uint = 1;
   var item1:DataItem = null;
   var item2:DataItem = null;
   /**横向消除*/
   for(i = 0; i < _rows; i++){
    array = _data[i] as Array;
    item1 = array[0] as DataItem;
    n = 1;
    for(j = 1; j < _cols; j++){
     item2 = array[j] as DataItem;
     if(item1.isSame(item2)){
      n++;
     }else{
      if(n >= 3){
       for(k = j - n; k < j; k++){
        addDelete(array[k] as DataItem);
       }
      }
      n = 1;
      item1 = item2;
     }
    }
    if(n >= 3){
     for(k = j - n; k < j; k++){
      addDelete(array[k] as DataItem);
     }
    }
   }
   /**纵向消除*/
   for(i = 0; i < _cols; i++){
    array = _data[0] as Array;
    item1 = array[i];
    n = 1;
    for(j = 1; j < _rows; j++){
     array = _data[j] as Array;
     item2 = array[i] as DataItem;
     if(item1.isSame(item2)){
      n++;
     }else{
      if(n >= 3){
       for(k = j - n; k < j; k++){
        array = _data[k] as Array;
        addDelete(array[i] as DataItem);
       }
      }
      n = 1;
      item1 = item2;
     }
    }
    if(n >= 3){
     for(k = j - n; k < j; k++){
      array = _data[k] as Array;
      addDelete(array[i] as DataItem);
     }
    }
   }
  }
   
  /**
    * 添加消除数据
    **/
  private function addDelete(item:DataItem):void{
   var temp:DataItem = null;
   for(var i:uint = 0; i < _deletes.length; i++){
    temp = _deletes[i] as DataItem;
    if(temp == item){
     break;
    }else{
     temp = null;
    }
   }
   if(temp == null){
    _deletes.push(item);
   }
  }
  
  /**
   * 填充已经消除掉的数据
   **/
  private function fillDeletes():void{
   _unselect = true;
   var delItem:DataItem = null;
   var deep:int = -1;
   var newItem:DataItem = null;
   var array:Array = null;
   var remaings:Array = new Array();
   var addIndex:int = 0;
   for(var i:int = 0; i < _cols; i++){
    remaings.length = 0;
    deep = -1;
    addIndex = 0;
    for(var j:int = 0; j < _deletes.length; j++){
     delItem = _deletes[j] as DataItem;
     if(delItem.px == i){
      if(delItem.py > deep)
       deep = delItem.py;
     }
    }
    if(deep > -1){
     for(var k:int = deep - 1; k >= 0; k--){
      array = _data[k] as Array;
      newItem = array[i] as DataItem;
      if(newItem != null){
       remaings.push(newItem);
      }
     }
     for(var z:int = remaings.length - 1; z < deep; z++){
      newItem = this.createDataItem();
      initItemDataXY(newItem, i * DataItem.WIDTH, (++addIndex) * DataItem.HEIGHT * -1);
      this.addChild(newItem);
      remaings.push(newItem);
     }
     for(var n:int = 0; n < remaings.length; n++){
      newItem = remaings[n] as DataItem;
      newItem.initXY = false;
      array = _data[deep - n] as Array;
      array[i] = newItem;
      this.fillDataItem(deep - n, i, newItem);
     }
    }
   }
   _timer = new Timer(50, 0);
   _timer.addEventListener(TimerEvent.TIMER, fillAnimate);
   _timer.start();
  }
  
  
  /**
   * 消除动画
   **/
  private function deleteAnimate(e:Event):void{
   var item:DataItem = null;
   for(var i:int = 0; i < _deletes.length; i++){
    item = _deletes[i] as DataItem;
    item.visible = !item.visible;
   }
  }
  
  /**
   * 消除动画结束,删除数据
   **/
  private function deleteAnimateEnd(e:Event):void{
   var delItem:DataItem = null;
   var array:Array = null;
   for(var i:uint = 0; i < _deletes.length; i++){
    delItem = _deletes[i];
    this.removeChild(delItem);
    array = _data[delItem.py] as Array;
    array[delItem.px] = null;
   }
   fillDeletes();
  }
  
  /**
   * 填充动画
   **/
  private function fillAnimate(e:Event):void{
   var array:Array = null;
   var item:DataItem = null;
   var sign:Boolean = false;
   for(var i:uint = 0; i < _rows; i++){
    array = _data[i] as Array;
    for(var j:uint = 0; j < _cols; j++){
     item = array[j] as DataItem;
     if(!item.initXY){
      item.y = item.y + 20;
      if(item.y >= item.py * DataItem.HEIGHT){
       item.initXY = true;
       item.y = item.py * DataItem.HEIGHT;
      }else{
       sign = true;
      }
     }
    }
   }
   if(!sign){
    _timer.stop();
    initDeletes();
    if(_deletes.length > 0){
     removeDeletes();
    }else{
     _unselect = false;
    }
   }
  }
  
  /**
   * 填充数据
   **/
  private function fillDataItem(row:uint, col:uint, item:DataItem):void{
   var array:Array = _data[row];
   array[col] = item;
   item.px = col;
   item.py = row;
  }
  
  public function click(e:Event):void{
   if(!_unselect){
    var item:DataItem = e.target as DataItem;
    if(_selectItem != null){
     if(_selectItem == item){
      selectItem = null;
     }else{
      if((_selectItem.px == item.px && (_selectItem.py - 1 == item.py || _selectItem.py + 1 == item.py))
       || (_selectItem.py == item.py && (_selectItem.px - 1 == item.px || _selectItem.px + 1 == item.px))){
       _active = true;
       changeDataIem(_selectItem, item);
      }else{
       selectItem = item;
      }
     }
    }else{
     selectItem = item;
    }
   }
  }
  
  /**
   * 交换位置
   **/
  public function changeDataIem(item1:DataItem, item2:DataItem):void{
   selectItem = null;
   var px1:uint = item1.px;
   var py1:uint = item1.py;
   var px2:uint = item2.px;
   var py2:uint = item2.py;
   fillDataItem(py1, px1, item2);
   fillDataItem(py2, px2, item1);
   _item1 = item1;
   _item2 = item2;
   this.setChildIndex(_item1, 0);
   this.setChildIndex(_item2, 1);
   _timer = new Timer(50, 0);
   _timer.addEventListener(TimerEvent.TIMER, changeAnimate);
   _timer.start();
  }
  
  /**
   * 调换动画
   **/
  private function changeAnimate(e:Event):void{
   var move1:Boolean = moveAnimate(_item1);
   var move2:Boolean = moveAnimate(_item2);
   if(!move1 && !move2){
    _timer.stop();
    this.setChildIndex(_item1, 0);
    this.setChildIndex(_item2, 0);
    if(_active){
     initDeletes();
     if(_deletes.length > 0){
      removeDeletes();
     }else{
      _active = false;
      changeDataIem(_item2, _item1);
     }
    }else{
     _item1 = null;
     _item2 = null;
    }
   }
  }
  
  private function moveAnimate(item:DataItem):Boolean{
   var move:Boolean = false;
   var x:int = item.px * DataItem.WIDTH;
   var y:int = item.py * DataItem.HEIGHT;
   var speed:int = 0;
   if(item.x != x){
    speed = (x - item.x) / 2;
    if(Math.abs(speed) > 5){
     item.x += speed;
    }else{
     item.x = x;
    }
    move = true;
   }
   if(item.y != y){
    speed = (y - item.y) / 2;
    if(Math.abs(speed) > 5){
     item.y += speed;
    }else{
     item.y = y;
    }
    move = true;
   }
   return move;
  }

public function set selectItem(value:DataItem):void
  {
   if(_selectItem != null){
    _selectItem.select(false);
   }
   _selectItem = value;
   if(_selectItem != null){
    _selectItem.select(true);
   }
  }

}
}

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

测试类:

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" minWidth="955" minHeight="600" creationComplete="init()">
 <mx:Script>
  <![CDATA[
   import com.data.DataManager;
   
   private var manager:DataManager;
   public function init():void{
    manager = new DataManager(8, 8);
    this.addChild(manager);
   }
  ]]>
 </mx:Script>
</mx:Application>

简单的对对碰小游戏源码相关推荐

  1. iOS分段选择器、旅行App、标度尺、对对碰小游戏、自定义相册等源码

    iOS精选源码 企业级开源项目,模仿艺龙旅行App 标签选择器--LeeTagView CSSegmentedControl常用的分段选择器,简单易用! 仿微信左滑删除 IOS左滑返回 输入框 iOS ...

  2. 微信html5小游戏源码70种

    2019独角兽企业重金招聘Python工程师标准>>> 微信html5小游戏源码70种 http://download.csdn.net/detail/csdddn/9419955游 ...

  3. Android 实现扑克牌动画,Android扑克牌猜点小游戏源码

    Android扑克牌猜点小游戏源码分享. 该游戏是简单的猜点游戏, 1点为正确的点数 点重新开始后进行洗牌 每次牌的顺序不同 Java代码: package com.mrzhu.test0109_pr ...

  4. 小游戏|小游戏源码平台、小游戏源码网站有哪些?

    小游戏是近几年非常流行的游戏之一,这类游戏操作简单,不用下载专用app,重要还能投放广告,甚至可以根据自己的品牌设计专属游戏,是一种新兴的市场营销手段,营销效果不仅比传统营销方式效果好,还较大限度节约 ...

  5. 学生学python编程---实现贪吃蛇小游戏+源码

    学生学python编程---实现贪吃蛇小游戏+源码 前言 主要设计 1.蛇的表示 2.蛇怎么移动? 3.玩家控制小蛇移动功能的实现 4.如何判定游戏结束? 应用知识点 1.python知识点 1.1 ...

  6. 100行JS代码实现❤坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript )

    坦克大战js小游戏源码 HTML5坦克大战游戏代码(HTML+CSS+JavaScript ) HTML5坦克大战网页小游戏,完美还原小霸王学习机效果,以坦克战斗及保卫基地为主题,属于策略型类游戏. ...

  7. 【180928】美女贪吃蛇小游戏源码

    本源码是一个简单的c#版美女贪吃蛇小游戏源码,基于winform技术制作.控制方向键即可.右侧有记分板,每走一步都记加分.贪吃蛇身体掠过的地方就会显示背景图片,身体越长,显示的越多,玩家可以将图片换成 ...

  8. 合成大西瓜小程序小游戏源码

    ​ 近日,一款名为[合成大西瓜]的休闲小游戏火爆社交圈.[合成大西瓜]因其玩法简单.充满魔性而频登微博热搜,游戏开发商微伞小游戏在昨日顺势上线了"合成大西瓜"APP. 起初,大家对 ...

  9. 合成大西瓜小程序小游戏源码,仅供学习

    近日,一款名为[合成大西瓜]的休闲小游戏火爆社交圈.[合成大西瓜]因其玩法简单.充满魔性而频登微博热搜,游戏开发商微伞小游戏在昨日顺势上线了"合成大西瓜"APP. 起初,大家对这种 ...

最新文章

  1. 将通讯录导入到摩托罗拉A1800通讯录中
  2. WIN10 关闭驱动签名
  3. 文件上传简介1---上传到指定的目录
  4. vue自定义组件,插槽,自定义事件
  5. ThinkPHP中的find和select的区别
  6. 本实例演示往TreeSet集合中存储自定义对象
  7. Hive与数据库的异同
  8. 计蒜客——回文平方数
  9. Android:屏幕自适应
  10. *[codility]CartesianSequence
  11. 获取当前屏幕高度方法总结
  12. word文字上下间距怎么调_Word表格调整(行高、文字上下间距等)
  13. 5.android系统裁剪
  14. Python ---------列表 集合 字典 深浅拷贝
  15. 偷得浮生半日闲,您有啥事它出马
  16. 上面一个星星下面一个r_谁能告诉我微博那个红色五角星有个R?
  17. VSS配置及使用说明
  18. 若依项目整合eCharts实现图表统计功能
  19. 喜讯:世界首款阿兹海默老年痴呆症治疗药将上市
  20. 从负债累累到老板,00后的逆袭之路

热门文章

  1. 树莓派终端字体放大和缩小
  2. 新员工培训的13条黄金法则
  3. PyTorch中文教程 | (16) DCGAN
  4. 鸿蒙系统 智能手表,华为手表Watch 3即将发布:搭载鸿蒙系统,健康功能大升级...
  5. Android studio环境配置万能方案
  6. access数据违反参照完整_access数据库勾选实施参照完整性报错和解决办法
  7. 会计三大报表的勾稽关系【转】
  8. 【高编 1】 北邮 高级网络程序设计 1.多线程
  9. selenium自动化测试框架——建议收藏
  10. 驾驶证——科目一技巧(三)