100行パズル

100行パズル



ソースコード大体100行くらいでパズルを作ってみました。
画像の分割数はスライダーで調整できます。
shuffleボタンで入れ替えてからゲーム開始(特にエフェクトとかはありません)。


100行パズル


ソースコード

package
{
	import com.bit101.components.*;
	import flash.display.*;
	import flash.events.*;
	import flash.geom.*;
	[SWF(backgroundColor=0x0, width=500, height=600)]
	public class Pazzle extends Sprite
	{
		[Embed(source="Sunset.jpg")]
		private var Picture:Class;
		private var bmp:Bitmap, bmpData:BitmapData;
		private var bmpList:Array=[];
		private var rowsSlider:HSlider, columnSlider:HSlider;
		private var blank:Panel=null;
		
		public function Pazzle()
		{
			//画像をBitmapに
			var picture:Bitmap = new Picture();
			var sx:Number = 400/picture.width, sy:Number = 400/picture.height;
			bmpData = new BitmapData(400, 400);
			bmpData.draw(picture, new Matrix(sx, 0, 0, sy));
			bmp = new Bitmap(bmpData);
			//ボタンとスライダーの生成
			new PushButton(this, 50, 550, "shuffle", shuffle);
			rowsSlider = new HSlider(this, 200, 550, split);
			columnSlider = new HSlider(this, 350, 550, split);
			rowsSlider.maximum = columnSlider.maximum = 10;
			rowsSlider.minimum = columnSlider.minimum = 1;
			rowsSlider.value = columnSlider.value = 3;
			//まずは3x3で分割
			split();
		}
		
		//シャッフル!!
		private function shuffle(e:MouseEvent):void{
			var l:int = bmpList.length;
			var newArr:Array = bmpList;
			while(l--) if(!bmpList[l].visible)bmpList[l].visible=true;
			l = bmpList.length;
			while(l){
				var m:int = Math.floor(Math.random()*l);
				l--;
				var n:Panel = newArr[l];
				newArr[l] = newArr[m];
				var tx:int = n.x, ty:int = n.y, ti:int = n.i, tj:int = n.j;
				n.x = newArr[l].x; n.y = newArr[l].y; n.i = newArr[l].i; n.j = newArr[l].j;
				newArr[l].x = tx;  newArr[l].y = ty; newArr[l].i = ti; newArr[l].j = tj;
				newArr[m] = n;
			}
			//一番左上に来たものを消す
			bmpList[0].visible=false;
			blank = bmpList[0];
			bmpList = newArr;
		}
		
		//分割!
		private function split(e:Event=null):void{
			for(var i:int = 0; i < bmpList.length; i++){
				removeChild(bmpList[i]);
				bmpList[i].removeEventListener(MouseEvent.CLICK, onClick);
			}
			
			bmpList = [];
			var rows:int=rowsSlider.value, columns:int=columnSlider.value;
			var w:int = bmp.width/columns, h:int = bmp.height/rows;
			//画像を分割して配置
			var rect:Rectangle = new Rectangle(0,0,w,h);
			for(i = 0; i < rows; i++){
				for(var j:int = 0; j < columns; j++){
					var bd:BitmapData = new BitmapData(w, h);
					rect.x = j*w; rect.y = i*h;
					bd.copyPixels(bmpData, rect, new Point(0,0));
					var b:Panel = new Panel(bd, i*columns+j, i, j);
					b.addEventListener(MouseEvent.CLICK, onClick);
					b.x = j*w+j*5; b.y = i*h+i*5+50;
					addChild(b);
					bmpList.push(b);
				}
			}
		}
		
		private function onClick(e:MouseEvent):void{
			if(blank==null)return;
			var p:Panel = e.target as Panel;
			//移動可能なら入れ替え
			var d:int = Math.abs(p.i-blank.i)+Math.abs(p.j-blank.j);
			if(d != 1) return;
			swap(p,blank);
		}
		
		//入れ替え!
		private function swap(p1:Panel, p2:Panel):void{
			var tx:int = p1.x, ty:int = p1.y, ti:int = p1.i, tj:int = p1.j;
			p1.x = p2.x; p1.y = p2.y; p1.i = p2.i; p1.j = p2.j;
			p2.x = tx; p2.y = ty; p2.i = ti; p2.j = tj;
			bmpList[p1.i*columnSlider.value+p1.j] = p1;
			bmpList[p2.i*columnSlider.value+p2.j] = p2;
		}
	}
}

import flash.display.*;
class Panel extends Sprite{
	public var id:int, i:int, j:int;
	public function Panel(bmpData:BitmapData, id:int, i:int, j:int){
		addChild(new Bitmap(bmpData));
		this.id = id; this.i = i; this.j = j;
	}
}