`

flex麻将和牌源代码

    博客分类:
  • game
阅读更多

最简单的和牌方式 AA AAA AAA AAA AAA

思路,找出14张牌中是否有一对,有的话,查看其他剩余的能否组合成4*3(4对)

 判断和牌类

 0-9万

 10-19条

 20-29 饼

 30-37 风(7个)

可以这样测试

var all:Array=new Array(0,1,2,2,3,4,14,14,18,19,20,27,27,27);

WithCard.checkWith(all);//初始化
    
    Alert.show(WithCard.isSuccess()+"::::");//是否和了

package cn.isvi.util
{
	import com.carlcalderon.arthropod.Debug;
	
	import flash.geom.Point;
	
	import mx.collections.ArrayCollection;
	
	public class SerachSame
	{
		public var sameArray:Array=[];//相同的对的数组
		private var arr:Array;//被搜索的数组
		private var temp:Array=[];//临时数组
		public function SerachSame()
		{
		}
		
		public function filerSame(){
			Debug.log("arr.length"+arr.length,Debug.GREEN);
			for(var i:int;i<arr.length;i++){
				//类似map
				if(temp[i]==undefined){
					//throw new Error;
					temp[i]=[];
					temp[i]={index:i,num:0,data:arr[i],previous:arr[i],preIndex:i};//data当前值,previous上一个值
				}else{
					var nums:int=temp[i].num+1;
					var previous:Point=temp[i].previous;
					var preIndex:int=temp[i].preIndex;//上一个值的索引下标
					
					//if(!(nums>=3)){
						throw new Error;
						temp[i]={index:i,num:nums,data:arr[i],previous:previous,preIndex:preIndex};
						com.carlcalderon.arthropod.Debug.log("samess"+arr[i],Debug.GREEN);
				//	}
					
				}
			}
		}
		public function filterSameData(){
			for(var i:int=0;i<arr.length;i++){
				for(var j:int=0;j<arr.length-i-1;j++){
				
					if(arr[j].y==arr[j+1].y){
						var tem=arr[j];
						arr[j]=arr[j+1];
						arr[j+1]=tem;
						Debug.log("same number is"+arr[j].y);
						Debug.log("index::"+j);
						//throw new Error;
						//throw new Error;
						sameArray[i]={index:j+1,num:0,data:arr[i],previous:arr[i],preIndex:j}
					}
				}
			}
		
		}
		
		public function get getSameArray():Array{
			
			this.filterSameData();//过滤不相同
			Debug.log("templength"+temp.length);
			for(var i:int=0;i<temp.length;i++){
				if(temp[i].num==2){
					sameArray.push(temp[i]);
				}
			}
			Debug.log(sameArray.length+"same dui",Debug.BLUE);
			return this.sameArray;
		}
		
	
		public function set arrs(arr:Array):void{
			this.arr=new ArrayCollection(arr).toArray();
		}

	}
}

 

package cn.isvi.util
{
	import cn.isvi.errors.SuccessErrors;
	
	import com.carlcalderon.arthropod.Debug;
	
	import flash.geom.*;
	
	import mx.collections.ArrayCollection;
	import mx.controls.Alert;
	import mx.utils.*;
	public class WithCard
	{
		private static var mah:Array=[];//34张麻将
		public static const SINGLECOUNT=9;//通过除以9跟求于得到指定的麻将
		
		static var wan:Array=[];
		static var tiao:Array=[];
		static var bing:Array=[];
		static var feng:Array=[];
		static var all:Array=new Array(4);//保存 wan bing tiao feng的数组
		static var fourCount:int=0;//AAA有几对
		public function WithCard()
		{
		}
		//查看是否和牌
		//先找 AA 一对,有的话,找剩余的是否能匹配4个 AAA AAA AAA
		public static function checkWith(gameData:Array):Boolean{
			//先把其中的万 饼 条,风分成四组
				var dui:int=0;//对的个数
				//这改了一下
                              wan=[];
				tiao=[];
				bing=[];
				feng=[];
				
				for(var j:int=0;j<gameData.length;j++){
					var point:Point=getAppoint(gameData[j]);
					initEveryArray(point);
					Debug.log(j);
				}
//				all[0]=wan;
//				all[1]=bing;
//				all[2]=tiao;
//				all[3]=feng;
				//依次便利万条饼feng中是否有对,有对的话,查看剩余的12张牌,能否匹配成 3*4
			return false;
		}
		public static function isSuccess():Boolean{
			var success:Boolean=false;
			try{
				checkIsDouble(0,wan);
				Debug.log("wan length"+wan.length,Debug.YELLOW);
				Debug.log("wan",Debug.RED);
				checkIsDouble(1,tiao);
				
				Debug.log("tiao length"+tiao.length,Debug.RED);
				checkIsDouble(2,bing);
				
				
				checkIsDouble(3,feng);
			}catch(err:SuccessErrors){
				success=true;
				Alert.show("和了");
			}
			return success;
		}
		
		public static function checkIsDouble(current:int,arrs:Array):Boolean
		{
			if(arrs==null){
				return false;
			}
			var arr:Array=getNewArray(arrs);
			
			arr.sortOn("y",Array.NUMERIC);
			//冒泡排序式的比较
			var serch:SerachSame=new SerachSame;
			serch.arrs=arr;
			var filterArray:Array=serch.getSameArray;
			out:for(var i:int;i<filterArray.length;i++)
			{
				var arrs:Array=getNewArray(arr);
				var pre:int=filterArray[i].preIndex;
				var now:int=filterArray[i].index;
				arrs.splice(pre,2);
				//arrs.splice(now,1);
				Debug.log("otherIndex"+pre+"_________"+now);
				Debug.log("other"+arrs.toString());
				
				Debug.log("check othr++++++++++++"+checkOtherArray(arrs));
				if(!checkOtherArray(arrs)){ //剩余的牌,除3的余数是否等于0,说明不能组合
//					throw new Error;
					if(i==filterArray.length-1){
						break out;
					}else{
						continue out;
					}
				}else{
//					throw new Error;
					if(checkLeverArray(current)){
						throw new SuccessErrors("糊了");
					} 
				}
				
			
			}
						
					
							
				return false;
			
		}
		//检查剩余的3个数组,是否有匹配的项  
		//current 0 wan
		//current 1 
		public static function checkLeverArray(current:int):Boolean{
			switch(current){
				case 0: return check(tiao)==check(bing)&&check(bing)==check(feng);break;
				case 1: return check(wan)==check(bing)&&check(bing)==check(feng);break;
				case 2: return check(wan)==check(tiao)&&check(tiao)==check(feng);break;
				case 3: return check(wan)==check(tiao)&&check(tiao)==check(bing);break;
			
			}	
			return false;
		}
		
		public static function check(arr:Array):Boolean{
			return checkOtherArray(arr);
		}
		
		public static function checkOtherArray(arr:Array):Boolean{
			var arrs:Array=new ArrayCollection(arr).toArray();
				
			if(arrs.length==0){
			
				return true;
			}
			if(arrs.length%3!=0){
				return false;
			}else{
				arrs.sortOn("y",Array.NUMERIC);//先排序
				
					switch(arrs.length){
						case 3: return checkIsAGroup(arrs);break;
						case 6: return checkIsTwoGroup(arrs);break;
						case 9: return checkIsThreeGroup(arrs);break;
						case 12: return checkIsFourGroup(arrs); break;
					}
				
			}
			return false;
		}
		//3查看这3个中是否有
		public static function checkIsAGroup(arrs:Array):Boolean{
			
			if(arrs[0].y==arrs[1].y&&arrs[1].y==arrs[2].y){
				return true;
			}else if(arrs[0].y+1==arrs[1].y&&arrs[1].y+1==arrs[2].y){
				return true;
			}else{
				//throw new Error;
				return false;
				
			}
		}
		//检查是否是两组
		public static function checkIsTwoGroup(arrs:Array):Boolean{
			//先猜想最简单的情况,想象就是 123 456这种方式
//			Debug.array(arrs.toString());
			//mx.controls.Alert.show(arrs.toString());
			if(checkIsAGroup(arrs)&&checkAroundMatch(arrs)){
				
					return true;
			
			}else{ //123 234(排序后是122334)013,245
			
					// 或者123 123(排序后是112233)024,135
					//122223
					//或者是 111222(排序后是121212)
					
				return checkNumberTwoThing(arrs);
			}
			return false;
			
		}
		//检查是否两组---第2中情况
		public static function checkNumberTwoThing(arrs:Array):Boolean{
			if(checkIsGroupUserIndex(0,1,3,arrs)&&checkIsGroupUserIndex(2,4,5,arrs)){
				return true;
			}else if(checkIsGroupUserIndex(0,2,4,arrs)&&checkIsGroupUserIndex(1,3,5,arrs)){
				return true;
			}else if(checkIndex(0,2,4,arrs)&&checkIndex(1,3,5,arrs)){
				return true;
			}else{
				return false;
			}
		}
		//检查是否是3组
		//错误想法:排序后肯定前3为是111或者123,要不是说明就不能组合成3组,因为还可能是下边说的情况1 情况2
		public static function checkIsThreeGroup(arrs:Array):Boolean{
			Debug.log("shengyu"+arrs.length);
			if(checkIsAGroup(arrs)){
				arrs.splice(0,3);//删除前3个
				return checkIsTwoGroup(arrs);
			 //判断是否 开头是不是AAA
			}else if(arrs[0].y==arrs[1].y){
				 var newArr:Array=getNewArray(arrs);
//				//如果是 AA开头,有可能是123123456或者是123123123(111,222,333)
				if(!checkThreeFirstThing(newArr[0].y,newArr)){
					//还有种情况是123123 456或者是123 123 234(排序后是112223334)反正2和3可定都有2个
					
					//情况1.112223334
					//情况2.112233345;
					//情况3. 11222233//这样不可能组成3组,排除
					//根据上边3组情况得出 假如能排成3组 2可定是数组下标2,数组下标5一定有个3
					//所以check 125是否是一组,然后查看剩余的是否是2组
					/***
					 * A
					 * 
					 * 这可能还有问题
					 * 
					 * */
					var six:Array=new Array(arrs[1],arrs[3],arrs[4],arrs[6],arrs[7],arrs[8]);
					var three:Array=new Array(arrs[0],arrs[2],arrs[5]);
					
					if(checkIsAGroup(three)&&checkIsTwoGroup(six)){
						return true;
					}
				}else{
					return true;
				}
			 //判断开头是否是123 abc
			}else if(arrs[0].y+1==arrs[1].y){
				var newArr:Array=getNewArray(arrs);
				if(!checkThreeFirstThing(newArr[1].y+1,newArr)){
					return false;
				}else{
					return true;
				}
			}else{
				return false;
			}
			return false;
			
		}
		//checkIsThreeGroup的第一种情况
		public static function checkThreeFirstThing(y:int,arrs:Array):Boolean{
			arrs.splice(0,2);//删除前2个元素,查看剩余的值,是否是2组
			var index:int=serachSpecify(y,arrs);//找到指定值的索引值
			if(index!=-1){
				Debug.log("index"+index);
				arrs.splice(index,1);
				Debug.log(arrs.toString(),Debug.BLUE);
				var bo:Boolean=checkIsTwoGroup(arrs);
			//	throw new Error;
				return bo;
				//throw new Error(arrs.toString()+"shengxiade shushi ");
			}else{
				return false;
			}
		}
		//如果是12张牌的话,查看是否是4组
		public static function checkIsFourGroup(arrs:Array):Boolean{
			//throw new Error;
			return checkIsFour(arrs);
		}
		
		public static function checkIsFour(arrs:Array):Boolean{
			//一样先开始看是否是 111 或者 123开头,然后判断剩余的9张牌
			Debug.log(arrs.toString()+"12");
			var nes:Array=getNewArray(arrs);
			nes.splice(0,3);
			if(checkIsAGroup(arrs)){
				//不能checkIsAGroup&&checkIsThreeGroup,否则else可能不对
				return checkIsThreeGroup(nes);
				
			}else{ //否则前两位是 11 ,肯定是相同的
				//剩下就是(123,123,234,234)112 222 333 344的那种方式(极端方式)
				
				var threeIndex:int=serachSpecify(arrs[2].y+1,arrs);//记得是.y
				
				var three:Array=new Array(arrs[0],arrs[2],arrs[threeIndex]);
				var newArray:Array=getNewArray(arrs);
				newArray.splice(threeIndex,1);
				newArray.splice(2,1);
				newArray.splice(0,1);
//				Alert.show("数组下标是"+threeIndex);
//				Alert.show("剩余的牌是"+newArray.toString());
				return checkIsAGroup(three)&&checkIsThreeGroup(newArray);
			}
			return false;
		}
		
		
		public static function filerDouble(in1:int,in2:int,arr:Array){
			
		}
		//初始化每个数组
		public static function initEveryArray(index:Point):void{
			switch(index.x){
						case 0:wan.push(index);Debug.log("ddddd")break;
						case 1:tiao.push(index);break;
						case 2:bing.push(index);break;
						case 3:feng.push(index);break;
			}
		}
		public static function initWan(index:Point):void{
			wan.push(index);
			
		}
		
		//通过数组下标得到指定的麻将是那个,属于什么万还是饼
		
		public static function getAppoint(mahIndex:int):Point{
			var index:int=mahIndex/SINGLECOUNT;
			var yu:int=mahIndex%SINGLECOUNT;
			return new Point(index,yu);
		}
		public static function checkAroundMatch(arr:Array):Boolean{
			if(arr[3].y+1==arr[4].y&&arr[4].y+1==arr[5].y){
//				fourCount+=2;
				return true;
			}else if(arr[3].y==arr[4].y&&arr[4].y==arr[5].y){
//				throw new Error;
				return true;
			}else{	
				// Debug.log(arr[3].y+":"+arr[4].y+":"+arr[5].y)
				 return false;
			}
		
		 }
		 //检查3个数是否连续的
		 public static function checkIsGroupUserIndex(x:int,y:int,z:int,arrs:Array):Boolean{
		 	if(arrs[x].y+1==arrs[y].y&&arrs[y].y+1==arrs[z].y){
		 		return true;
		 	}
		 	return false;
		 }
		 //检查3个数是否相同
		 public static function checkIsGroupSameIndex(x:int,y:int,z:int,arrs:Array):Boolean{
		 	if(arrs[x].y==arrs[y].y==arrs[z].y){
		 		return true;
		 	}
		 	return false;
		 }
		 public static function checkIndex(x:int,y:int,z:int,arrs:Array):Boolean{
		 	if(checkIsGroupUserIndex(x,y,z,arrs)||checkIsGroupSameIndex(x,y,z,arrs)){
		 		Debug.log("buxiangdeng");
		 		return true;
		 	}
		 	return false;
		 }
		 
		 public static function getPointY(i:int,arr:Array){
		 	return arr[i].y;
		 }
		 //查看指定的值在数组中的索引
		 public static function serachSpecify(y:int,arrs:Array):int{
		 	//去掉数组中前两位
//		 	Alert.show("现在的数组顺序是否排序"+arrs.toString());
		 	for(var i:int=0;i<arrs.length;i++){
		 		if(arrs[i].y==y){
		 			return i;
		 		}
		 	}
		 	return -1;
		 }
		 public static function getNewArray(arrs:Array):Array{
		 	return new ArrayCollection(arrs).toArray();
		 }
		 
	}
}

 

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" xmlns:single="cn.isvi.single.*"
	 creationComplete="init()">
	 <mx:VBox>
	 	
	
	<mx:Canvas height="100">
		<mx:HBox id="hb">
			
		</mx:HBox>
	</mx:Canvas>
	<mx:Script>
		<![CDATA[
			import cn.isvi.util.WithCard;
			import mx.controls.Alert;
			import cn.isvi.util.MahSprite;
			import mx.core.UIComponent;
			import flash.system.Security;
			private var dataArray:Array
			
			public function init():void{
				Security.allowDomain("*")
				this.dataArray=single.getDataArray;
				for(var i:int;i<dataArray.length-1;i++){
					for(var j:int=0;j<9;j++){
						var ui:UIComponent=new UIComponent;
						var sp:MahSprite=new MahSprite;
						sp.index=j;
						sp.bitmap=new Bitmap(dataArray[i][j]);
						sp.mahIndex=j+i*9;
						
						ui.x=i*j*30;
						ui.width=30;
						ui.height=50;
						sp.addChild(sp.bitmap);
						ui.addChild(sp);
						
						
						sp.addEventListener(MouseEvent.CLICK,onClick);
						hb.addChild(ui);
					}
				}
				for(var z:int=0;z<7;z++){
					
					var ui1:UIComponent=new UIComponent;
						var sps:MahSprite=new MahSprite;
						sps.index=z;
						
						sps.bitmap=new Bitmap(dataArray[3][z]);
						
						sps.mahIndex=z+3*9;
						
						ui1.x=3*z*30;
						
						ui1.width=30;
						ui1.height=50;
						
						sps.addChild(sps.bitmap);
						ui1.addChild(sps);
						
						
						sps.addEventListener(MouseEvent.CLICK,onClick);
						hb.addChild(ui1);
				}
			}
			private var checkArray:Array=[]
			private function onClick(e:MouseEvent){
				//mx.controls.Alert.show("click");
				var ui:UIComponent=new UIComponent;
				ui.width=30;
				var mahs:MahSprite=(e.target as MahSprite).clone();
				mahs.addChild(new Bitmap(mahs.bitmap.bitmapData));
				ui.addChild(mahs);
				vm.addChild(ui);
				mahs.addEventListener(MouseEvent.CLICK,onClickCheck);
				checkArray.push(mahs.mahIndex);
				
			}
			private function onClickCheck(e:MouseEvent){
					
			}
			import flash.utils.getTimer;
			private function isWith(){
				if(checkArray.length==14){
					cn.isvi.util.WithCard.checkWith(checkArray);
					checkArray.sortOn(Array.NUMERIC);
					Alert.show(checkArray.toString());
					var ti:Number=getTimer();
					if(WithCard.isSuccess()){
						
						mx.controls.Alert.show("糊了 哈哈用时"+(getTimer()-ti));
					}else{
						Alert.show("对不起,不能和");
					}
				}else{
					Alert.show("麻将个数不对");
				}
			}
			private function reset(){
				checkArray=[];
				vm.removeAllChildren();
			}
		]]>
	</mx:Script>
	<mx:Canvas height="100">
		<mx:HBox id="vm">
			
		</mx:HBox>
	</mx:Canvas>
		<mx:Button click="isWith()" label="是否和了">
			
		</mx:Button>
		<mx:Button click="reset()" label="重来">
			
		</mx:Button>
		<mx:LinkButton icon="@Embed('images/mah/1.png')">
			
		</mx:LinkButton>
	 </mx:VBox>
	<single:SingleMahJong id="single">
		
	</single:SingleMahJong>
</mx:Application>

 

分享到:
评论
2 楼 fykyx521 2013-06-04  
ynduck 写道
如何来运行呢?
bu haoysi   wangji le
1 楼 ynduck 2013-06-03  
如何来运行呢?

相关推荐

    Flex源代码 Flexsource flex3源代码 flex3source

    Flex源代码 Flexsource flex3源代码 flex3source 不是反编译的源代码,带注释的源代码 你值得拥有!!! 参见博客:http://blog.csdn.net/wojiao555555/article/details/11650679

    flex完全手册源代码详解3

    flex完全手册源代码详解3希望对大家学习有帮住

    Flex4实战源代码

    "Flex4实战 全部源代码"意味着这份资源可能包含了完整的Flex4项目实例,覆盖了各种功能和应用场景。源代码可以作为学习和参考,帮助开发者理解如何在实际项目中应用上述Flex4特性,解决实际问题。通过研究这些源代码...

    flex源代码资料,一些flex源代码的例子

    Flex是Adobe公司开发的一种用于构建富互联网应用程序(RIA)的开放源代码框架,它基于ActionScript编程语言和MXML标记语言。这些源代码例子可能是针对Flex SDK的不同版本,包括了第9、10、11、12和13章的内容,这...

    flex3扫雷源代码.rar

    Flex3扫雷源代码是一个基于Adobe Flex 3技术实现的经典扫雷游戏的代码库。Flex3是Adobe开发的一个用于构建富互联网应用(RIA)的框架,它基于ActionScript 3编程语言和MXML标记语言。这个源代码可以为开发者提供一个...

    flex简易迷宫源代码

    《Flex简易迷宫源代码解析》 Flex,作为Adobe公司推出的开源富互联网应用程序(RIA)开发框架,以其强大的MXML和ActionScript3.0结合,为开发者提供了构建交互性强、用户体验优秀的Web应用的能力。本资源“flex简易...

    flex 打印源代码

    Flex打印源代码主要涉及到Adobe Flex这一跨平台的富互联网应用程序(RIA)开发框架。Flex是基于ActionScript编程语言和MXML标记语言的,用于构建在Web浏览器中运行的交互式用户界面。在Flex中实现打印功能,开发者...

    flex电子相册源代码

    《Flex电子相册源代码详解》 Flex,作为Adobe公司推出的富互联网应用程序(RIA)开发框架,以其强大的图形渲染能力和丰富的用户交互体验,被广泛应用于各种网页应用和桌面应用的开发,尤其在创建动态和互动的媒体...

    flex音乐播放器源代码

    《Flex音乐播放器源代码详解》 Flex音乐播放器是一款基于Adobe Flex技术开发的多媒体播放软件,它提供了丰富的用户交互功能,包括播放、停止、调整进度、调节音量以及切换播放模式等。本文将深入探讨Flex音乐播放器...

    Flex实际应用源代码

    在“Flex实际应用源代码”这个主题中,我们可以深入探讨Flex在实际开发中的应用,以及通过提供的源代码学习到的相关知识点。 1. **Flex架构与组件库**:Flex提供了一个强大的组件库,包括各种用户界面元素,如按钮...

    flex 人物行走源代码

    在Flex编程领域,人物行走源代码通常涉及到游戏开发或者用户界面中的动态角色动画。Flex是Adobe公司推出的一款基于ActionScript 3.0的开源框架,主要用于构建富互联网应用程序(RIA)。它提供了强大的组件库和MXML...

    郑岩峰,幻想Flex3,源代码5

    《郑岩峰,幻想Flex3,源代码5》是一份重要的IT学习资源,专注于教授如何利用Adobe Flex 3创建令人惊叹的Web界面和Flash应用程序。Flex 3是Adobe开发的一个开源框架,它允许程序员利用MXML和ActionScript 3.0来构建富...

    精通FLEX源代码08

    《精通FLEX源代码08》这一资源主要聚焦于深入理解和掌握Adobe Flex的源代码,Flex是一种基于ActionScript和MXML的开源框架,用于构建富互联网应用程序(RIA)。本资源可能包含一系列章节或实例,旨在帮助开发者提升...

    flex例子可用源代码完整程序

    这个压缩包中的"flex例子可用源代码完整程序"是一份宝贵的资源,适合初学者和有经验的开发者用来深入理解Flex编程。以下是对其中各个文件和概念的详细解释: 1. **AirportCallout.mxml**:这是一个MXML文件,它是...

    Flex地球玩家源代码(www.earthplayer.com)

    《Flex地球玩家源代码解析与应用》 Flex地球玩家源代码是基于Adobe Flex技术构建的,主要用于开发地球玩家应用系统。这个系统集成了强大的后台处理和直观的前台展示,为用户提供了一个互动性强、视觉效果出色的地球...

    flex与bison源代码下载url

    flex与bison 源代码 下载url

    郑岩峰,幻想Flex3,源代码3

    《郑岩峰,幻想Flex3,源代码3》是一份重要的IT学习资源,专注于教授如何通过Adobe Flex3技术实现Web界面的设计与开发。Flex3是一个强大的富互联网应用程序(RIA)框架,它允许程序员构建功能丰富的、具有交互性的...

    微信小程序+Flex布局示例源代码

    在这个"微信小程序+Flex布局示例源代码"中,我们将深入探讨Flex布局在微信小程序中的应用。 Flex布局,全称为Flexible Box布局,是CSS3中的一种新的布局模式,旨在解决传统盒模型在处理复杂或响应式布局时的困难。...

Global site tag (gtag.js) - Google Analytics