九宫格拼图AS3.0

由 夕空 撰写于  2021年11月22日
var activeMC:MovieClip;//3*3 MC
//空缺位,可移动位,矩阵数组,正确数量
var move:int,moveArr:Array=[],matrix:Array=[],rightNum:int=8;


//点击交互
function onDown(e:*=null){
var target
if(e){
target=e.target;
}else{
var num=matrix[moveArr[randRange(0,moveArr.length-1)]]
target=activeMC.getChildAt(num) as MovieClip;
}
if(moveArr.indexOf(target.posi) != -1){
//记录操作
var nowmove=move;
//更新
move=target.posi;
listMove();
target.posi=nowmove;
target.x=target.posi%3*135;
target.y=int(target.posi/3)*145;
matrix[move]="kong";//腾出的位置
matrix[nowmove]=target.num;//旧空位的Num
//之前与之后位置值比对
if(move==target.num && target.posi != target.num){
rightNum-=1;
}
if(move!=target.num && target.posi == target.num){
rightNum+=1;
}
gameEnd()
}
}
this.addEventListener(TouchEvent.TOUCH_TAP, onDown)


//判断通关
function gameEnd() {trace(rightNum)
//使用rightNum判断正确性,免去For遍历全部的方式
if(rightNum!=8){
return;
}
if(notEnd){//初始化的过关情况重新来
gameInit();
return;
}
trace('过关')

}

//初始化
var notEnd=true;
function gameInit() {
notEnd=true;
move=rightNum=8;
listMove();
matrix=[];
//activeMC.numChildren
for(var i:int=0;i<8;i++){
var btn=activeMC.getChildAt(i) as MovieClip;
btn.num=i;
btn.posi=i;
btn.x=btn.posi%3*135;
btn.y=int(btn.posi/3)*145;
matrix.push(i)
}
matrix.push("kong");

//随机阵列,初始化可移动块随机点50次
for(var j=0;j<50;j++){
onDown();
}
notEnd=false;

}

// 可移动块计算
function listMove(){
moveArr=[];
move-3>=0?moveArr.push(move-3):"";
(move+1)%3!=0?moveArr.push(move+1):"";
move+3<9?moveArr.push(move+3):"";
(move+1)%3!=1?moveArr.push(move-1):"";
}

function randRange(minNum: Number, maxNum: Number): Number {
return (Math.floor(Math.random() * (maxNum - minNum + 1)) + minNum);
}

gameInit();


逆序数计算

如果纯随机会有一半的概率无法复原拼图,上面的代码初始随机排列模拟的真实点击50次,又发现逆序数的奇偶结果可以判断初始随机是否可以玩。

如2431中,21,43,41,31是逆序,逆序数是4个

付逆序数算法(JavaScript),这里就不整合到代码里了:

function reverseNumber(arr3) {
let a = 0;
console.log(arr3);
for (let i = 0; i < arr3.length; i++) {
let b = arr3[i];
for (let j = i; j < arr3.length; j++) {
let c = arr3[j];
if (b > c) {
a += 1;
}
}
}
if (a % 2 == 0) {//偶数
return "加油~";
} else {
return "你不会成功的!";
}
}
// 获取随机排序数的数组
function randomNum(num) {
var ary = [];
for (var i = 0; i < num; i++) {
ary[i] = i;
}
ary.sort(function () {
return 0.5 - Math.random();//返回随机正负值
});
return ary;//返回数组
}
console.log(reverseNumber(randomNum(9)));



声明:星耀夕空|版权所有,违者必究|如未注明,均为原创|本网站采用BY-NC-SA协议进行授权

转载:转载请注明原文链接 - 九宫格拼图AS3.0


欢迎光顾我的小站!