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