html 三阶魔方最少记忆法 自动还原 纯原生js实现

效果图:

20907

直接上代码:
3dcube.html

<!DOCTYPE html>
<html lang="zh-cn">
<head>
<title>3 step</title>
<meta charset="UTF-8">
<style>
b{width:25px;height:25px;text-align:center;line-height:25px;display:inline-block;}
#s3view b{margin:0 1px 1px 0;}
.left{float:left;border:1px solid #000;}

.cubes{position:relative;z-index:0;left:-70px;top:110px;transform-style: preserve-3d;transform: rotateX(-30deg) rotateY(-30deg);}
.cube {position:absolute;width: 200px;height: 200px;transform-style: preserve-3d;animation-iteration-count:1;animation-fill-mode:forwards;}
.cube span {box-sizing:border-box;border:5px solid #000;border-radius:10px;display: block;width: 100px;height: 100px;position: absolute;top: 50px;left: 50px;font-size:30px;text-align:center;line-height:100px;cursor:default;}
.cube .in_front {background:green;transform: rotateY(0deg) translateZ(50px);color:#fff;}
.cube .in_back {background:yellow;transform: translateZ(-50px) rotateY(180deg);}
.cube .in_left {background:cyan;transform: rotateY(-90deg) translateZ(50px);}
.cube .in_right {background:#fcf;transform: rotateY(90deg) translateZ(50px);}
.cube .in_top {background:purple;translateY(50px);transform: rotateX(90deg) translateZ(50px);color:#fff;}
.cube .in_bottom {background:red;transform: rotateX(-90deg) translateZ(50px);color:#fff}
/*动画*/
/*z轴旋转操作*/
@keyframes rotatez00{from{transform:rotateZ(0deg)}to{transform:rotateZ(90deg)}}
@keyframes rotatez01{from{transform:rotateZ(90deg)}to{transform:rotateZ(180deg)}}
@keyframes rotatez02{from{transform:rotateZ(180deg)}to{transform:rotateZ(270deg)}}
@keyframes rotatez03{from{transform:rotateZ(270deg)}to{transform:rotateZ(360deg)}}
@keyframes rotatez10{from{transform:rotateZ(0deg) translateZ(-100px)}to{transform:rotateZ(90deg) translateZ(-100px)}}
@keyframes rotatez11{from{transform:rotateZ(90deg) translateZ(-100px)}to{transform:rotateZ(180deg) translateZ(-100px)}}
@keyframes rotatez12{from{transform:rotateZ(180deg) translateZ(-100px)}to{transform:rotateZ(270deg) translateZ(-100px)}}
@keyframes rotatez13{from{transform:rotateZ(270deg) translateZ(-100px)}to{transform:rotateZ(360deg) translateZ(-100px)}}
@keyframes rotatez20{from{transform:rotateZ(0deg) translateZ(-200px)}to{transform:rotateZ(90deg) translateZ(-200px)}}
@keyframes rotatez21{from{transform:rotateZ(90deg) translateZ(-200px)}to{transform:rotateZ(180deg) translateZ(-200px)}}
@keyframes rotatez22{from{transform:rotateZ(180deg) translateZ(-200px)}to{transform:rotateZ(270deg) translateZ(-200px)}}
@keyframes rotatez23{from{transform:rotateZ(270deg) translateZ(-200px)}to{transform:rotateZ(360deg) translateZ(-200px)}}
/*y轴旋转操作*/
@keyframes rotatey000{from{transform:rotateY(0deg)}to{transform:rotateY(90deg)}}
@keyframes rotatey001{from{transform:rotateY(0deg) translateZ(-100px)}to{transform:rotateY(90deg) translateZ(-100px)}}
@keyframes rotatey002{from{transform:rotateY(0deg) translateZ(-200px)}to{transform:rotateY(90deg) translateZ(-200px)}}
@keyframes rotatey010{from{transform:rotateY(90deg)}to{transform:rotateY(180deg)}}
@keyframes rotatey011{from{transform:rotateY(90deg) translateZ(-100px)}to{transform:rotateY(180deg) translateZ(-100px)}}
@keyframes rotatey012{from{transform:rotateY(90deg) translateZ(-200px)}to{transform:rotateY(180deg) translateZ(-200px)}}
@keyframes rotatey020{from{transform:rotateY(180deg)}to{transform:rotateY(270deg)}}
@keyframes rotatey021{from{transform:rotateY(180deg) translateZ(-100px)}to{transform:rotateY(270deg) translateZ(-100px)}}
@keyframes rotatey022{from{transform:rotateY(180deg) translateZ(-200px)}to{transform:rotateY(270deg) translateZ(-200px)}}
@keyframes rotatey030{from{transform:rotateY(270deg)}to{transform:rotateY(360deg)}}
@keyframes rotatey031{from{transform:rotateY(270deg) translateZ(-100px)}to{transform:rotateY(360deg) translateZ(-100px)}}
@keyframes rotatey032{from{transform:rotateY(270deg) translateZ(-200px)}to{transform:rotateY(360deg) translateZ(-200px)}}
@keyframes rotatey100{from{transform:rotateY(0deg)}to{transform:rotateY(90deg)}}
@keyframes rotatey101{from{transform:rotateY(0deg) translateZ(-100px)}to{transform:rotateY(90deg) translateZ(-100px)}}
@keyframes rotatey102{from{transform:rotateY(0deg) translateZ(-200px)}to{transform:rotateY(90deg) translateZ(-200px)}}
@keyframes rotatey110{from{transform:rotateY(90deg)}to{transform:rotateY(180deg)}}
@keyframes rotatey111{from{transform:rotateY(90deg) translateZ(-100px)}to{transform:rotateY(180deg) translateZ(-100px)}}
@keyframes rotatey112{from{transform:rotateY(90deg) translateZ(-200px)}to{transform:rotateY(180deg) translateZ(-200px)}}
@keyframes rotatey120{from{transform:rotateY(180deg)}to{transform:rotateY(270deg)}}
@keyframes rotatey121{from{transform:rotateY(180deg) translateZ(-100px)}to{transform:rotateY(270deg) translateZ(-100px)}}
@keyframes rotatey122{from{transform:rotateY(180deg) translateZ(-200px)}to{transform:rotateY(270deg) translateZ(-200px)}}
@keyframes rotatey130{from{transform:rotateY(270deg)}to{transform:rotateY(360deg)}}
@keyframes rotatey131{from{transform:rotateY(270deg) translateZ(-100px)}to{transform:rotateY(360deg) translateZ(-100px)}}
@keyframes rotatey132{from{transform:rotateY(270deg) translateZ(-200px)}to{transform:rotateY(360deg) translateZ(-200px)}}
@keyframes rotatey200{from{transform:rotateY(0deg)}to{transform:rotateY(90deg)}}
@keyframes rotatey201{from{transform:rotateY(0deg) translateZ(-100px)}to{transform:rotateY(90deg) translateZ(-100px)}}
@keyframes rotatey202{from{transform:rotateY(0deg) translateZ(-200px)}to{transform:rotateY(90deg) translateZ(-200px)}}
@keyframes rotatey210{from{transform:rotateY(90deg)}to{transform:rotateY(180deg)}}
@keyframes rotatey211{from{transform:rotateY(90deg) translateZ(-100px)}to{transform:rotateY(180deg) translateZ(-100px)}}
@keyframes rotatey212{from{transform:rotateY(90deg) translateZ(-200px)}to{transform:rotateY(180deg) translateZ(-200px)}}
@keyframes rotatey220{from{transform:rotateY(180deg)}to{transform:rotateY(270deg)}}
@keyframes rotatey221{from{transform:rotateY(180deg) translateZ(-100px)}to{transform:rotateY(270deg) translateZ(-100px)}}
@keyframes rotatey222{from{transform:rotateY(180deg) translateZ(-200px)}to{transform:rotateY(270deg) translateZ(-200px)}}
@keyframes rotatey230{from{transform:rotateY(270deg)}to{transform:rotateY(360deg)}}
@keyframes rotatey231{from{transform:rotateY(270deg) translateZ(-100px)}to{transform:rotateY(360deg) translateZ(-100px)}}
@keyframes rotatey232{from{transform:rotateY(270deg) translateZ(-200px)}to{transform:rotateY(360deg) translateZ(-200px)}}
/*x轴旋转操作*/
@keyframes rotatex000{from{transform:rotateX(360deg)}to{transform:rotateX(270deg)}}
@keyframes rotatex001{from{transform:rotateX(360deg) translateZ(-100px)}to{transform:rotateX(270deg) translateZ(-100px)}}
@keyframes rotatex002{from{transform:rotateX(360deg) translateZ(-200px)}to{transform:rotateX(270deg) translateZ(-200px)}}
@keyframes rotatex010{from{transform:rotateX(270deg)}to{transform:rotateX(180deg)}}
@keyframes rotatex011{from{transform:rotateX(270deg) translateZ(-100px)}to{transform:rotateX(180deg) translateZ(-100px)}}
@keyframes rotatex012{from{transform:rotateX(270deg) translateZ(-200px)}to{transform:rotateX(180deg) translateZ(-200px)}}
@keyframes rotatex020{from{transform:rotateX(180deg)}to{transform:rotateX(90deg)}}
@keyframes rotatex021{from{transform:rotateX(180deg) translateZ(-100px)}to{transform:rotateX(90deg) translateZ(-100px)}}
@keyframes rotatex022{from{transform:rotateX(180deg) translateZ(-200px)}to{transform:rotateX(90deg) translateZ(-200px)}}
@keyframes rotatex030{from{transform:rotateX(90deg)}to{transform:rotateX(0deg)}}
@keyframes rotatex031{from{transform:rotateX(90deg) translateZ(-100px)}to{transform:rotateX(0deg) translateZ(-100px)}}
@keyframes rotatex032{from{transform:rotateX(90deg) translateZ(-200px)}to{transform:rotateX(0deg) translateZ(-200px)}}
@keyframes rotatex100{from{transform:rotateX(360deg)}to{transform:rotateX(270deg)}}
@keyframes rotatex101{from{transform:rotateX(360deg) translateZ(-100px)}to{transform:rotateX(270deg) translateZ(-100px)}}
@keyframes rotatex102{from{transform:rotateX(360deg) translateZ(-200px)}to{transform:rotateX(270deg) translateZ(-200px)}}
@keyframes rotatex110{from{transform:rotateX(270deg)}to{transform:rotateX(180deg)}}
@keyframes rotatex111{from{transform:rotateX(270deg) translateZ(-100px)}to{transform:rotateX(180deg) translateZ(-100px)}}
@keyframes rotatex112{from{transform:rotateX(270deg) translateZ(-200px)}to{transform:rotateX(180deg) translateZ(-200px)}}
@keyframes rotatex120{from{transform:rotateX(180deg)}to{transform:rotateX(90deg)}}
@keyframes rotatex121{from{transform:rotateX(180deg) translateZ(-100px)}to{transform:rotateX(90deg) translateZ(-100px)}}
@keyframes rotatex122{from{transform:rotateX(180deg) translateZ(-200px)}to{transform:rotateX(90deg) translateZ(-200px)}}
@keyframes rotatex130{from{transform:rotateX(90deg)}to{transform:rotateX(0deg)}}
@keyframes rotatex131{from{transform:rotateX(90deg) translateZ(-100px)}to{transform:rotateX(0deg) translateZ(-100px)}}
@keyframes rotatex132{from{transform:rotateX(90deg) translateZ(-200px)}to{transform:rotateX(0deg) translateZ(-200px)}}
@keyframes rotatex200{from{transform:rotateX(360deg)}to{transform:rotateX(270deg)}}
@keyframes rotatex201{from{transform:rotateX(360deg) translateZ(-100px)}to{transform:rotateX(270deg) translateZ(-100px)}}
@keyframes rotatex202{from{transform:rotateX(360deg) translateZ(-200px)}to{transform:rotateX(270deg) translateZ(-200px)}}
@keyframes rotatex210{from{transform:rotateX(270deg)}to{transform:rotateX(180deg)}}
@keyframes rotatex211{from{transform:rotateX(270deg) translateZ(-100px)}to{transform:rotateX(180deg) translateZ(-100px)}}
@keyframes rotatex212{from{transform:rotateX(270deg) translateZ(-200px)}to{transform:rotateX(180deg) translateZ(-200px)}}
@keyframes rotatex220{from{transform:rotateX(180deg)}to{transform:rotateX(90deg)}}
@keyframes rotatex221{from{transform:rotateX(180deg) translateZ(-100px)}to{transform:rotateX(90deg) translateZ(-100px)}}
@keyframes rotatex222{from{transform:rotateX(180deg) translateZ(-200px)}to{transform:rotateX(90deg) translateZ(-200px)}}
@keyframes rotatex230{from{transform:rotateX(90deg)}to{transform:rotateX(0deg)}}
@keyframes rotatex231{from{transform:rotateX(90deg) translateZ(-100px)}to{transform:rotateX(0deg) translateZ(-100px)}}
@keyframes rotatex232{from{transform:rotateX(90deg) translateZ(-200px)}to{transform:rotateX(0deg) translateZ(-200px)}}
</style>
<head>
<body>
<br>四位数:第一位:颜色(面);第二位:位置;第三位:数字;第四位:方向
<br>颜色代码:
<br>1:红色(底面)2:绿色(前面)3:白色(右面)
<br>4:黄色(背面)5:青色(左面)6:紫色(上面)
<br>位置:1 ~ 9 每个面的块位置
<br>块值:1 ~ 9, A ~ Z
<br>方向:1:→, 2:↓, 3:←, 4:↑<br><br>
<button onclick="$('byall').style.display='block';$('byone').style.display='none';">文本输入</button><button onclick="$('byall').style.display='none';$('byone').style.display='block';">手动输入</button>
<button onclick="init();">最终结果</button><button onclick="autoS3data()">打乱魔方</button><button onclick="runall();viewbyall();">自动执行</button><br>
<button onclick="FTR();viewbyall();">FTR&nbsp;</button><button onclick="FMR();viewbyall();">FMR&nbsp;</button><button onclick="FBR();viewbyall();">FBR&nbsp;</button>
<button onclick="FLB();viewbyall();">FLB&nbsp;</button><button onclick="FMB();viewbyall();">FMB&nbsp;</button><button onclick="FRB();viewbyall();">FRB&nbsp;</button>
<button onclick="RLB();viewbyall();">RLB&nbsp;</button><button onclick="RMB();viewbyall();">RMB&nbsp;</button><button onclick="RRB();viewbyall();">RRB&nbsp;</button>
<br>
<button onclick="FTRo();viewbyall();">FTR'</button><button onclick="FMRo();viewbyall();">FMR'</button><button onclick="FBRo();viewbyall();">FBR'</button>
<button onclick="FLBo();viewbyall();">FLB'</button><button onclick="FMBo();viewbyall();">FMB'</button><button onclick="FRBo();viewbyall();">FRB'</button>
<button onclick="RLBo();viewbyall();">RLB'</button><button onclick="RMBo();viewbyall();">RMB'</button><button onclick="RRBo();viewbyall();">RRB'</button>

<br>
<div style="display:none;" id=byall>
  <textarea id="fall" name="fall" cols=50 rows=10 onchange="getTAdata()"></textarea>
</div>
<div style="display:none" id=byone>
  <div style="clear:both">
    <div class="left">
    第一面(底面):<br>
    <input size=4 type=text name=f11 id=f11 onChange="view(this.value,this.id)"><b id=f11b></b>
    <input size=4 type=text name=f12 id=f12 onchange="view(this.value,this.id)"><b id=f12b></b>
    <input size=4 type=text name=f13 id=f13 onchange="view(this.value,this.id)"><b id=f13b></b><br>
    <input size=4 type=text name=f14 id=f14 onchange="view(this.value,this.id)"><b id=f14b></b>
    <input size=4 type=text name=f15 id=f15 onchange="view(this.value,this.id)"><b id=f15b></b>
    <input size=4 type=text name=f16 id=f16 onchange="view(this.value,this.id)"><b id=f16b></b><br>
    <input size=4 type=text name=f17 id=f17 onchange="view(this.value,this.id)"><b id=f17b></b>
    <input size=4 type=text name=f18 id=f18 onchange="view(this.value,this.id)"><b id=f18b></b>
    <input size=4 type=text name=f19 id=f19 onchange="view(this.value,this.id)"><b id=f19b></b><br>
    </div>
    <div class="left">
    第二面(前面):<br>
    <input size=4 type=text name=f21 id=f21 onchange="view(this.value,this.id)"><b id=f21b></b>
    <input size=4 type=text name=f22 id=f22 onchange="view(this.value,this.id)"><b id=f22b></b>
    <input size=4 type=text name=f23 id=f23 onchange="view(this.value,this.id)"><b id=f23b></b><br>
    <input size=4 type=text name=f24 id=f24 onchange="view(this.value,this.id)"><b id=f24b></b>
    <input size=4 type=text name=f25 id=f25 onchange="view(this.value,this.id)"><b id=f25b></b>
    <input size=4 type=text name=f26 id=f26 onchange="view(this.value,this.id)"><b id=f26b></b><br>
    <input size=4 type=text name=f27 id=f27 onchange="view(this.value,this.id)"><b id=f27b></b>
    <input size=4 type=text name=f28 id=f28 onchange="view(this.value,this.id)"><b id=f28b></b>
    <input size=4 type=text name=f29 id=f29 onchange="view(this.value,this.id)"><b id=f29b></b><br>
    </div>
    <div class="left">
    第三面(右面):<br>
    <input size=4 type=text name=f31 id=f31 onchange="view(this.value,this.id)"><b id=f31b></b>
    <input size=4 type=text name=f32 id=f32 onchange="view(this.value,this.id)"><b id=f32b></b>
    <input size=4 type=text name=f33 id=f33 onchange="view(this.value,this.id)"><b id=f33b></b><br>
    <input size=4 type=text name=f34 id=f34 onchange="view(this.value,this.id)"><b id=f34b></b>
    <input size=4 type=text name=f35 id=f35 onchange="view(this.value,this.id)"><b id=f35b></b>
    <input size=4 type=text name=f36 id=f36 onchange="view(this.value,this.id)"><b id=f36b></b><br>
    <input size=4 type=text name=f37 id=f37 onchange="view(this.value,this.id)"><b id=f37b></b>
    <input size=4 type=text name=f38 id=f38 onchange="view(this.value,this.id)"><b id=f38b></b>
    <input size=4 type=text name=f39 id=f39 onchange="view(this.value,this.id)"><b id=f39b></b><br>
    </div>
  </div>
  <div style="clear:both">
    <div class="left">
    第四面(背面):<br>
    <input size=4 type=text name=f41 id=f41 onChange="view(this.value,this.id)"><b id=f41b></b>
    <input size=4 type=text name=f42 id=f42 onchange="view(this.value,this.id)"><b id=f42b></b>
    <input size=4 type=text name=f43 id=f43 onchange="view(this.value,this.id)"><b id=f43b></b><br>
    <input size=4 type=text name=f44 id=f44 onchange="view(this.value,this.id)"><b id=f44b></b>
    <input size=4 type=text name=f45 id=f45 onchange="view(this.value,this.id)"><b id=f45b></b>
    <input size=4 type=text name=f46 id=f46 onchange="view(this.value,this.id)"><b id=f46b></b><br>
    <input size=4 type=text name=f47 id=f47 onchange="view(this.value,this.id)"><b id=f47b></b>
    <input size=4 type=text name=f48 id=f48 onchange="view(this.value,this.id)"><b id=f48b></b>
    <input size=4 type=text name=f49 id=f49 onchange="view(this.value,this.id)"><b id=f49b></b><br>
    </div>
    <div class="left">
    第五面(左面):<br>
    <input size=4 type=text name=f51 id=f51 onchange="view(this.value,this.id)"><b id=f51b></b>
    <input size=4 type=text name=f52 id=f52 onchange="view(this.value,this.id)"><b id=f52b></b>
    <input size=4 type=text name=f53 id=f53 onchange="view(this.value,this.id)"><b id=f53b></b><br>
    <input size=4 type=text name=f54 id=f54 onchange="view(this.value,this.id)"><b id=f54b></b>
    <input size=4 type=text name=f55 id=f55 onchange="view(this.value,this.id)"><b id=f55b></b>
    <input size=4 type=text name=f56 id=f56 onchange="view(this.value,this.id)"><b id=f56b></b><br>
    <input size=4 type=text name=f57 id=f57 onchange="view(this.value,this.id)"><b id=f57b></b>
    <input size=4 type=text name=f58 id=f58 onchange="view(this.value,this.id)"><b id=f58b></b>
    <input size=4 type=text name=f59 id=f59 onchange="view(this.value,this.id)"><b id=f59b></b><br>
    </div>
    <div class="left">
    第六面(上面):<br>
    <input size=4 type=text name=f61 id=f61 onchange="view(this.value,this.id)"><b id=f61b></b>
    <input size=4 type=text name=f62 id=f62 onchange="view(this.value,this.id)"><b id=f62b></b>
    <input size=4 type=text name=f63 id=f63 onchange="view(this.value,this.id)"><b id=f63b></b><br>
    <input size=4 type=text name=f64 id=f64 onchange="view(this.value,this.id)"><b id=f64b></b>
    <input size=4 type=text name=f65 id=f65 onchange="view(this.value,this.id)"><b id=f65b></b>
    <input size=4 type=text name=f66 id=f66 onchange="view(this.value,this.id)"><b id=f66b></b><br>
    <input size=4 type=text name=f67 id=f67 onchange="view(this.value,this.id)"><b id=f67b></b>
    <input size=4 type=text name=f68 id=f68 onchange="view(this.value,this.id)"><b id=f68b></b>
    <input size=4 type=text name=f69 id=f69 onchange="view(this.value,this.id)"><b id=f69b></b><br>
    </div>
  </div>
</div><br clear=all>

<div id="rlt" style="width:500px;max-height:500px;overflow:auto;"></div>

<div id=s3view style="border:1px solid red;height:260px;width:340px;background:#ccc;position:absolute;right:0;top:50px;">
<button onclick="clearall()">清空</button><button onclick="fortest();viewbyall();">恢复数据</button><button onclick="showstep();">显示当前魔方数据</button><span id="runtime"></span><br>

<b style="width:85px;height:25px;">&nbsp;</b><b id=f61v></b><b id=f62v></b><b id=f63v></b><br>
<b style="width:85px;height:25px;">&nbsp;</b><b id=f64v></b><b id=f65v></b><b id=f66v></b><br>
<b style="width:85px;height:25px;">&nbsp;</b><b id=f67v></b><b id=f68v></b><b id=f69v></b><br>
<div style="height:2px;font-size:2px;line-height:2px;"></div>
<b id=f51v></b><b id=f52v></b><b id=f53v></b>&nbsp;<b id=f21v></b><b id=f22v></b><b id=f23v></b>&nbsp;<b id=f31v></b><b id=f32v></b><b id=f33v></b>&nbsp;<b id=f41v></b><b id=f42v></b><b id=f43v></b><br>
<b id=f54v></b><b id=f55v></b><b id=f56v></b>&nbsp;<b id=f24v></b><b id=f25v></b><b id=f26v></b>&nbsp;<b id=f34v></b><b id=f35v></b><b id=f36v></b>&nbsp;<b id=f44v></b><b id=f45v></b><b id=f46v></b><br>
<b id=f57v></b><b id=f58v></b><b id=f59v></b>&nbsp;<b id=f27v></b><b id=f28v></b><b id=f29v></b>&nbsp;<b id=f37v></b><b id=f38v></b><b id=f39v></b>&nbsp;<b id=f47v></b><b id=f48v></b><b id=f49v></b><br>
<div style="height:2px;font-size:2px;line-height:2px;"></div>
<b style="width:85px;height:25px;">&nbsp;</b><b id=f11v></b><b id=f12v></b><b id=f13v></b><br>
<b style="width:85px;height:25px;">&nbsp;</b><b id=f14v></b><b id=f15v></b><b id=f16v></b><br>
<b style="width:85px;height:25px;">&nbsp;</b><b id=f17v></b><b id=f18v></b><b id=f19v></b><br>
</div>

<div style="border:1px solid red;height:340px;width:340px;background:#ccc;position:absolute;right:0;top:330px;">
  <div style="transform:scale(0.7);"><div class="cubes" id="cubes"></div></div>
</div>

<script type="text/javascript" src="data.js"></script>
<script type="text/javascript" src="turn.js"></script>
<script type="text/javascript" src="run.js"></script>
<script type="text/javascript" src="3dcube.js"></script>
</body>
</html>

data.js

function $(id){return(document.getElementById(id));}
var s3=new Array(54);
var s3old = null; //缓存用
for(var i=0;i<54;i++){s3[i]="";}

var col=new Array("red","green","#fff","#ff0","#0ff","purple");
var der=new Array("→","↓","←","↑");

init();

function view(da,id){
  if(da!=""){
    var clrt=parseInt(da.charAt(0));
    //alert(col[clrt-1]);
    var fn=parseInt(da.charAt(1));
    $(id+"b").style.background=col[clrt-1];
    $(id+"b").innerHTML=da.charAt(2)+"<font size=1>"+der[parseInt(da.charAt(3))-1]+"</font>";
    $(id+"v").style.background=col[clrt-1];
    $(id+"v").innerHTML=da.charAt(2)+"<font size=1>"+der[parseInt(da.charAt(3))-1]+"</font>";
    s3[(parseInt(id.charAt(1))-1)*9+parseInt(id.charAt(2))-1]=da;
    //alert((parseInt(id.charAt(1))-1)*9+parseInt(id.charAt(2))-1);
  }else{
    $(id+"b").style.background="";
    $(id+"b").innerHTML="";
    $(id+"v").style.background="";
    $(id+"v").innerHTML="";
    s3[(clrt-1)*9+fn-1]="";
  }
}

function init(){
  var da_done="11A1,12B1,13C1,14D1,15E1,16F1,17G1,18H1,19I1,2193,2283,2373,2463,2553,2643,2733,2823,2913,3193,3283,3373,3463,3553,3643,3733,3823,3913,4193,4283,4373,4463,4553,4643,4733,4823,4913,51X2,52V2,53S2,54Y2,55*2,56T2,57Z2,58W2,59U2,67R3,64Q3,61P3,68O3,65N3,62M3,69L3,66K3,63J3";
  s3=da_done.split(",");
  viewbyall();
}

function viewbyall(){
  var j,k;
  for(var i=0;i<54;i++){
      j=Math.floor(i/9)+1;k=i%9+1;
      if(s3[i]!=""){//alert("f"+j+k+"v");
        $("f"+j+k+"v").style.background=col[parseInt(s3[i].charAt(0))-1];
        $("f"+j+k+"v").innerHTML=s3[i].charAt(2)+"<font size=1>"+der[parseInt(s3[i].charAt(3))-1]+"</font>";
      }else{
        $("f"+j+k+"v").style.background="";
        $("f"+j+k+"v").innerHTML="";
      }
  }
}

function clearall(){
  for(var i=0;i<54;i++){
    s3[i]="";
    id='f'+((parseInt(i/9)+1)*10+i%9+1);
    $(id).value='';
    $(id+'b').innerHTML='';
    $(id+"b").style.background='';
  }
  $('fall').value = '';
  viewbyall();
}

String.prototype.replaceAll=function(s1,s2){return this.replace(new RegExp(s1,"gm"),s2);}

function getTAdata(){
  var da=document.getElementById("fall").innerText;
  da=da.replaceAll("\r\n\r\n",",");
  da=da.replaceAll("\r\n",",");
  var data=da1.split(",");
  for(var i=0;i<data.length;i++){
      s3[i]=data[i];
  }
  viewbyall();
}

function fortest(){
  /*var da="59U4,58W4,63J2,54Y2,4551,2643,13C3,4281,53S1,4934,56T1,57Z4,18H2,15E1,4461,11A4,14D4,3191,4911,52V2,3373,3641,3552,2822,2371,3462,69L2,4193,38X1,57X3,12B4,65N4,2284,2192,64Q1,2913,63R3,3283,19I4,66K4,55*4,4822,3733,4644,2732,4172,16F4,61P3,62M1,2552,68O1,3714,2462,17G4";
  var data=da.split(",");
  for(var i=0;i<data.length;i++){
      s3[i]=data[i];
  }*/
  for(var i=0;i<s3old.length;i++){
      s3[i]=s3old[i];
  }
  s3old = null;
}

function showstep(){
  var str = '';
  for(var i=0;i<54;i++){
      y = i % 9 + 1;
      x = parseInt(i / 9) + 1;
      id = 'f' + (x * 10 + y);
      $(id).value = s3[i];
      view(s3[i], id);
      str += s3[i] + ",";
  }
  $('fall').value = str;
  $('byall').style.display = 'block';
  $('byone').style.display = 'block';
}

function autoS3data(){
  if(s3[0] == "") return;
  var allturn="";
  var orders=new Array("FTR();","FTRo();","FMR();","FMRo();","FBR();","FBRo();","FLB();","FLBo();","FMB();","FMBo();","FRB();","FRBo();","RLB();","RLBo();","RMB();","RMBo();","RRB();","RRBo();","allFR();","allFRo();","allFB();","allFBo();","allRB();","allRBo();");
  var times = Math.floor(Math.random() * 50 + 50);
  $("runtime").innerHTML=times+"次";
  for(var i=0;i<times;i++){
      allturn+=orders[Math.floor(Math.random() * 23)];
  }
  eval(allturn);
  viewbyall();
  s3old = new Array(s3.length);
  for(i=0; i<s3.length; i++) s3old[i] = s3[i];
}

turn.js

var side=new Array(12);
var face=new Array(9);
var logflag = 1;
var br = true;
var stepNum = 1;

function log(msg){
 if(br && msg) msg = '第'+ (stepNum++) +'步: ' + msg;
 if(logflag) $('rlt').innerHTML += msg + (br ? '<br>' : '');
}


function clearArray(){
 for(var i=0;i<12;i++){side[i]="";}
 for(var j=0;j<9;j++){face[j]="";}
}

function chgp(){
 for(var i=0;i<54;i++){
     s3[i]=s3[i].charAt(0)+(i%9+1)+s3[i].charAt(2)+s3[i].charAt(3);
 }
}
//旋转操作
function FTRo(){log('FTRo->');br=false;FTR();FTR();FTR();br=true;log('');}
function FTR(){//前面顶层向右转90度
 log('FTR,');
 ftr3d();
 clearArray();
 var i=0,j=0;
 for(i=0;i<12;i++){//savedata
     j=(Math.floor(i/3)+1)*9+i%3;
     side[i]=s3[j];   
 }
 for(i=0;i<12;i++){
     j=((Math.floor(i/3)+1)%4+1)*9+i%3;
     s3[j]=side[i];
 }
 for(i=0;i<9;i++){face[i]=s3[45+i];}
 {//方阵顶面逆转90度:a[i][j]与a[n-i][j]互换后a[i][j]与a[j][i]互换
     s3[45+0]=face[2];s3[45+1]=face[5];s3[45+2]=face[8];
     s3[45+3]=face[1];s3[45+4]=face[4];s3[45+5]=face[7];
     s3[45+6]=face[0];s3[45+7]=face[3];s3[45+8]=face[6];
     for(i=0;i<9;i++){//数值方向也改
       j=parseInt(s3[45+i].charAt(3));
       var k=(j-1-1+4)%4+1;
       s3[45+i]=s3[45+i].charAt(0)+s3[45+i].charAt(1)+s3[45+i].charAt(2)+k;
     }
 }
 //chgp();
}

function FMRo(){log('FMRo->');br=false;FMR();FMR();FMR();br=true;log('');}
function FMR(){//前面中间层向右转90度
 log('FMR,');
 fmr3d();
 clearArray();
 var i=0,j=0;
 for(i=0;i<12;i++){//savedata
     j=(Math.floor(i/3)+1)*9+i%3+3;
     side[i]=s3[j];   
 }
 for(i=0;i<12;i++){
     j=((Math.floor(i/3)+1)%4+1)*9+i%3+3;
     s3[j]=side[i];
 }
 //chgp();
}

function FBRo(){log('FBRo->');br=false;FBR();FBR();FBR();br=true;log('');}
function FBR(){//前面底层向右转90度
 log('FBR,');
 fbr3d();
 clearArray();
 var i=0,j=0;
 for(i=0;i<12;i++){//savedata
     j=(Math.floor(i/3)+1)*9+i%3+6;
     side[i]=s3[j];   
 }
 for(i=0;i<12;i++){
     j=((Math.floor(i/3)+1)%4+1)*9+i%3+6;
     s3[j]=side[i];
 }
 for(i=0;i<9;i++){face[i]=s3[i];}
 {//方阵底面顺转90度:a[i][j]与a[j][i]互换后a[i][j]与a[n-i][j]互换
     s3[0]=face[6];s3[1]=face[3];s3[2]=face[0];
     s3[3]=face[7];s3[4]=face[4];s3[5]=face[1];
     s3[6]=face[8];s3[7]=face[5];s3[8]=face[2];
     for(i=0;i<9;i++){//数值方向也改
       j=parseInt(s3[i].charAt(3));
       var k=(j-1+1+4)%4+1;
       s3[i]=s3[i].charAt(0)+s3[i].charAt(1)+s3[i].charAt(2)+k;
     }
 }
 //chgp();
}

function FLBo(){log('FLBo->');br=false;FLB();FLB();FLB();br=true;log('');}
function FLB(){//前面左层向下转90度
 log('FLB,');
 fld3d();
 clearArray();
 var i=0,j=0;
 {
     side[0]=s3[0];side[1]=s3[3];side[2]=s3[6];
     side[3]=s3[9];side[4]=s3[12];side[5]=s3[15];
     side[6]=s3[45];side[7]=s3[48];side[8]=s3[51];
     side[9]=s3[29];side[10]=s3[32];side[11]=s3[35];
 }
 for(i=9;i<15;i++){
     j=parseInt(side[i%12].charAt(3));
     var k=(j-1+2+4)%4+1;
     side[i%12]=side[i%12].charAt(0)+side[i%12].charAt(1)+side[i%12].charAt(2)+k;
 }
 {
     s3[0]=side[3];s3[3]=side[4];s3[6]=side[5];
     s3[9]=side[6];s3[12]=side[7];s3[15]=side[8];
     s3[45]=side[11];s3[48]=side[10];s3[51]=side[9];
     s3[29]=side[2];s3[32]=side[1];s3[35]=side[0];
 }
 for(i=0;i<9;i++){face[i]=s3[36+i];}
 {//方阵左面顺转90度
     s3[36+0]=face[6];s3[36+1]=face[3];s3[36+2]=face[0];
     s3[36+3]=face[7];s3[36+4]=face[4];s3[36+5]=face[1];
     s3[36+6]=face[8];s3[36+7]=face[5];s3[36+8]=face[2];
     for(i=0;i<9;i++){//数值方向也改
       j=parseInt(s3[36+i].charAt(3));
       var k=(j-1+1+4)%4+1;
       s3[36+i]=s3[36+i].charAt(0)+s3[36+i].charAt(1)+s3[36+i].charAt(2)+k;
     }
 }
 //chp();
}

function FMBo(){log('FMBo->');br=false;FMB();FMB();FMB();br=true;log('');}
function FMB(){//前面中间层向下转90度
 log('FMB,');
 fmd3d();
 clearArray();
 var i=0,j=0;
 {
     side[0]=s3[1+0];side[1]=s3[1+3];side[2]=s3[1+6];
     side[3]=s3[1+9];side[4]=s3[1+12];side[5]=s3[1+15];
     side[6]=s3[1+45];side[7]=s3[1+48];side[8]=s3[1+51];
     side[9]=s3[1+27];side[10]=s3[1+30];side[11]=s3[1+33];
 }
 for(i=9;i<15;i++){
     j=parseInt(side[i%12].charAt(3));
     var k=(j-1+2+4)%4+1;
     side[i%12]=side[i%12].charAt(0)+side[i%12].charAt(1)+side[i%12].charAt(2)+k;
 }
 {
     s3[1+0]=side[3];s3[1+3]=side[4];s3[1+6]=side[5];
     s3[1+9]=side[6];s3[1+12]=side[7];s3[1+15]=side[8];
     s3[1+45]=side[11];s3[1+48]=side[10];s3[1+51]=side[9];
     s3[1+27]=side[2];s3[1+30]=side[1];s3[1+33]=side[0];
 }
 //chgp();
}

function FRBo(){log('FRBo->');br=false;FRB();FRB();FRB();br=true;log('');}
function FRB(){//前面右层向下转90度
 log('FRB,');
 frd3d();
 clearArray();
 var i=0,j=0;
 {
     side[0]=s3[2+0];side[1]=s3[2+3];side[2]=s3[2+6];
     side[3]=s3[2+9];side[4]=s3[2+12];side[5]=s3[2+15];
     side[6]=s3[2+45];side[7]=s3[2+48];side[8]=s3[2+51];
     side[9]=s3[27];side[10]=s3[30];side[11]=s3[33];
 }
 for(i=9;i<15;i++){
     j=parseInt(side[i%12].charAt(3));
     var k=(j-1+2+4)%4+1;
     side[i%12]=side[i%12].charAt(0)+side[i%12].charAt(1)+side[i%12].charAt(2)+k;
 }
 {
     s3[2+0]=side[3];s3[2+3]=side[4];s3[2+6]=side[5];
     s3[2+9]=side[6];s3[2+12]=side[7];s3[2+15]=side[8];
     s3[2+45]=side[11];s3[2+48]=side[10];s3[2+51]=side[9];
     s3[27]=side[2];s3[30]=side[1];s3[33]=side[0];
 }
 for(i=0;i<9;i++){face[i]=s3[18+i];}
 {//方阵右面逆转90度
     s3[18+0]=face[2];s3[18+1]=face[5];s3[18+2]=face[8];
     s3[18+3]=face[1];s3[18+4]=face[4];s3[18+5]=face[7];
     s3[18+6]=face[0];s3[18+7]=face[3];s3[18+8]=face[6];
     for(i=0;i<9;i++){//数值方向也改
       j=parseInt(s3[18+i].charAt(3));
       var k=(j-1-1+4)%4+1;
       s3[18+i]=s3[18+i].charAt(0)+s3[18+i].charAt(1)+s3[18+i].charAt(2)+k;
     }
 }
 //chgp();
}

function RLBo(){log('RLBo->');br=false;RLB();RLB();RLB();br=true;log('');}
function RLB(){//右面左层向下转90度
 log('RLB,');
 rld3d();
 clearArray();
 var i=0,j=0;
 {
     side[0]=s3[0];side[1]=s3[1];side[2]=s3[2];
     side[3]=s3[18];side[4]=s3[21];side[5]=s3[24];
     side[6]=s3[51];side[7]=s3[52];side[8]=s3[53];
     side[9]=s3[38];side[10]=s3[41];side[11]=s3[44];
 }
 for(i=0;i<12;i++){//数值方向也改
     j=parseInt(side[i].charAt(3));
     var k=(j-1+1+4)%4+1;
     side[i]=side[i].charAt(0)+side[i].charAt(1)+side[i].charAt(2)+k;
 }
 {
     s3[0]=side[5];s3[1]=side[4];s3[2]=side[3];
     s3[18]=side[6];s3[21]=side[7];s3[24]=side[8];
     s3[51]=side[11];s3[52]=side[10];s3[53]=side[9];
     s3[38]=side[0];s3[41]=side[1];s3[44]=side[2];
 }
 for(i=0;i<9;i++){face[i]=s3[9+i];}
 {//方阵前面顺转90度
     s3[9+0]=face[6];s3[9+1]=face[3];s3[9+2]=face[0];
     s3[9+3]=face[7];s3[9+4]=face[4];s3[9+5]=face[1];
     s3[9+6]=face[8];s3[9+7]=face[5];s3[9+8]=face[2];
     for(i=0;i<9;i++){//数值方向也改
       j=parseInt(s3[9+i].charAt(3));
       var k=(j-1+1+4)%4+1;
       s3[9+i]=s3[9+i].charAt(0)+s3[9+i].charAt(1)+s3[9+i].charAt(2)+k;
     }
 }
 //chgp();
}

function RMBo(){log('RMBo->');br=false;RMB();RMB();RMB();br=true;log('');}
function RMB(){//右面中间层向下转90度
 log('RMB,');
 rmd3d();
 clearArray();
 var i=0,j=0;
 {
     side[0]=s3[3+0];side[1]=s3[3+1];side[2]=s3[3+2];
     side[3]=s3[1+18];side[4]=s3[1+21];side[5]=s3[1+24];
     side[6]=s3[-3+51];side[7]=s3[-3+52];side[8]=s3[-3+53];
     side[9]=s3[-1+38];side[10]=s3[-1+41];side[11]=s3[-1+44];
 }
 for(i=0;i<12;i++){//数值方向也改
     j=parseInt(side[i].charAt(3));
     var k=(j-1+1+4)%4+1;
     side[i]=side[i].charAt(0)+side[i].charAt(1)+side[i].charAt(2)+k;
 }
 {
     s3[3+0]=side[5];s3[3+1]=side[4];s3[3+2]=side[3];
     s3[1+18]=side[6];s3[1+21]=side[7];s3[1+24]=side[8];
     s3[-3+51]=side[11];s3[-3+52]=side[10];s3[-3+53]=side[9];
     s3[-1+38]=side[0];s3[-1+41]=side[1];s3[-1+44]=side[2];
 }
 //chgp();
}

function RRBo(){log('RRBo->');br=false;RRB();RRB();RRB();br=true;log('');}
function RRB(){//右面右层向下转90度
 log('RRB,');
 rrd3d();
 clearArray();
 var i=0,j=0;
 {
     side[0]=s3[6+0];side[1]=s3[6+1];side[2]=s3[6+2];
     side[3]=s3[2+18];side[4]=s3[2+21];side[5]=s3[2+24];
     side[6]=s3[-6+51];side[7]=s3[-6+52];side[8]=s3[-6+53];
     side[9]=s3[-2+38];side[10]=s3[-2+41];side[11]=s3[-2+44];
 }
 for(i=0;i<12;i++){//数值方向也改
     j=parseInt(side[i].charAt(3));
     var k=(j-1+1+4)%4+1;
     side[i]=side[i].charAt(0)+side[i].charAt(1)+side[i].charAt(2)+k;
 }
 {
     s3[6+0]=side[5];s3[6+1]=side[4];s3[6+2]=side[3];
     s3[2+18]=side[6];s3[2+21]=side[7];s3[2+24]=side[8];
     s3[-6+51]=side[11];s3[-6+52]=side[10];s3[-6+53]=side[9];
     s3[-2+38]=side[0];s3[-2+41]=side[1];s3[-2+44]=side[2];
 }
 for(i=0;i<9;i++){face[i]=s3[27+i];}
 {//方阵后面逆转90度
     s3[27+0]=face[2];s3[27+1]=face[5];s3[27+2]=face[8];
     s3[27+3]=face[1];s3[27+4]=face[4];s3[27+5]=face[7];
     s3[27+6]=face[0];s3[27+7]=face[3];s3[27+8]=face[6];
     for(i=0;i<9;i++){//数值方向也改
       j=parseInt(s3[27+i].charAt(3));
       var k=(j-1-1+4)%4+1;
       s3[27+i]=s3[27+i].charAt(0)+s3[27+i].charAt(1)+s3[27+i].charAt(2)+k;
     }
 }
 //chgp();
}
function allFR(){log('allFR->');br=false;FTR();FMR();FBR();br=true;log('');}
function allFRo(){log('allFRo->');br=false;FTRo();br=false;FMRo();br=false;FBRo();br=true;}
function allFB(){log('allFB->');br=false;FLB();FMB();FRB();br=true;log('');}
function allFBo(){log('allFBo->');br=false;FLBo();br=false;FMBo();br=false;FRBo();br=true;}
function allRB(){log('allRB->');br=false;RLB();RMB();RRB();br=true;log('');}
function allRBo(){log('allRBo->');br=false;RLBo();br=false;RMBo();br=false;RRBo();br=true;}

run.js

//本算法用的是“最少记忆法”,具体介绍可
//参考http://www.rubik.com.cn/new.htm
function runall(){
  stepNum = 1; //在turn.js中定义
  $('rlt').innerHTML = '';
  var d=new Date();
  tFC();//底层十字
  tFX();//底层四角
  //第一层完成
  tSC();//中层位置和方向
  tSX();//中层四角
  //第二层完成
  tTC();//顶层十字
  tTX();//顶层四角/**/
  $("runtime").innerHTML=((new Date())-d)+"毫秒";
  viewbyall();
}

function findPos(v){//找出当前要转的数在什么位置
var i=0;
for(i=0;i<54;i++){
    if(v.length==1){if(s3[i].charAt(2)==v)break;}
    else{if(s3[i].charAt(2)==v.charAt(1)&&s3[i].charAt(0)==v.charAt(0))break;}
}
if(i==54){alert("此值不存在,请检查输入是否正确!");return(0);}
return(s3[i]+(Math.floor(i/9)+1));
}

function tFC(){//turn first corse转好第一层十字
var flr1C=new Array("B","F","H","D");
var v="",i=0,j=0,k=0;
//将“E”转到底面,并对好方向
v=findPos("E");
f=v.charAt(4);
if(f=="2"){FMB();}
if(f=="6"){FMB();FMB();}
if(f=="4"){FMBo();}
if(f=="3"){RMB();}
if(f=="5"){RMBo();}
f1=s3[4].charAt(3);
if(f1=="4"){FBR();}
if(f1=="3"){FBR();FBR();}
if(f1=="2"){FBRo();}
//E校对完毕
for(i=0;i<4;i++){//十字
    if(i!=0){FBRo();}
    chgp();
    v=findPos(flr1C[i]);
    f=v.charAt(4);
    f1=v.charAt(1);
    if(f=="6"){//如果在顶面
      var topfC=new Array("8","4","2","6");//顶层顺时针位置
      if(f1=="4"){FTR();}
      if(f1=="2"){FTR();FTR();}
      if(f1=="6"){FTRo();}
      RLB();RLB();
    }else if(f=="2"||f=="3"||f=="4"||f=="5"){//在侧面
      //侧面分为三种情况
      if(f1=="2"){//上层
        for(k=0;k<parseInt(f)-2;k++){FTRo();}
        RLBo();FMR();RLB();
      }else if(f1=="8"){//下层
        for(k=0;k<parseInt(f)-2;k++){FBRo();}
        RLB();FMRo();RLBo();
        for(k=0;k<parseInt(f)-2;k++){FBR();}
        RLBo();FMR();FMR();RLB();
      }else{//中层
        for(k=0;k<parseInt(f)-2;k++){FMRo();}
        if(f1=="4"){FMR();RLB();}
        if(f1=="6"){FMRo();RLBo();}
      }
    }else if(f=="1"){//在底面
      if(f1!="2"){//不在正确位置
        var footfC=new Array("2","4","8","6");//底层逆时针
        for(k=0;k<4;k++){
          if(f1==footfC[k]){
            for(j=0;j<k;j++){FBR();}
            RLB();RLB();
            for(j=0;j<k;j++){FBRo();}
            RLB();RLB();
          }
        }
      }
    }
}FBRo();
//alert("FCdone");
}

function tFX(){//转好第一层四角
var flr1X=new Array("A","C","I","G");
var v="",f="",f1="",i=0,j=0,k=0;
for(i=0;i<4;i++){//四角
    if(i>0){FBRo();}
    chgp();
    v=findPos(flr1X[i]);
    f=v.charAt(4);
    f1=v.charAt(1);
    //viewbyall();alert(v);
    if(f=="6"){//如果在顶面
      var topf=new Array("7","1","3","9");//顶层顺时针位置
      for(k=0;k<4;k++){
        if(topf[k]==f1){for(j=0;j<k;j++){FTR();}break;}
     }//左上,上左,左下,上180(上右二次),左上,上右,左下
      FLBo();FTRo();FLB();FTR();FTR();FLBo();FTR();FLB();
    }else if(f=="2"||f=="3"||f=="4"||f=="5"){//在侧面
      //四角四种情况
      if(f1=="1"){//上层左
        for(k=0;k<parseInt(f)-2;k++){FTRo();}
        FTR();FLBo();FTRo();FLB();
      }else if(f1=="3"){//上层右
        for(k=0;k<(parseInt(f)-1)%4;k++){FTRo();}
        FLBo();FTR();FLB();
      }else if(f1=="7"){//下层左
        for(k=0;k<parseInt(f)-2;k++){FBRo();}
        RLB();FTRo();RLBo();FTR();
        for(k=0;k<parseInt(f)-2;k++){FBR();}
        i=i-1;if(i!=-1){FBR();}
      }else if(f1=="9"){//下层右
        for(k=0;k<(parseInt(f)-1)%4;k++){FBRo();}
        FLBo();FTR();FLB();FTRo();
        for(k=0;k<(parseInt(f)-1)%4;k++)FBR();
        i=i-1;if(i!=-1){FBR();}
      }
    }else if(f=="1"){//在底面
      if(f1!="1"){//不在正确位置
        var footfX=new Array("1","7","9","3");//底层逆时针
        for(k=1;k<4;k++){
          if(footfX[k]==f1){
            for(j=0;j<k;j++){FBR();}
            RLB();FTR();RLBo();
            for(j=0;j<k;j++){FBRo();}
            i=i-1;if(i!=-1){FBR();}
          }
        }
      }
    }
}FBRo();
//alert("FXdone");
}

function tSC(){//对好第二层中间位置和方向
var i=0,j=0;
for(i=0;i<4;i++){if(s3[13].charAt(0)=="2"&&s3[13].charAt(2)=="5"){break;}FMRo();}
for(i=1;i<5;i++){//对方向
    var p1=parseInt(s3[i*9+4].charAt(3));
    var p2=parseInt(s3[i*9+7].charAt(3));
    var p=(p2-p1-1+4)%4+1;
    if(p1!=p2){
      for(j=0;j<i-1;j++){allFRo();}
      RLB();RLB();FTR();FTR();
      for(j=0;j<p;j++){RLB();}
      FTR();FTR();RLB();RLB();
      for(j=0;j<i-1;j++){allFR();}
    }
}
}

function tSX(){//对中层四角
var flr2X=new Array("26","5Y","46","36");
var v="",f="",f1="",i=0,j=0,k=0;
for(i=0;i<4;i++){
    if(i>0){FMR();}
    chgp();
    v=findPos(flr2X[i]);
    f=v.charAt(4);
    f1=v.charAt(1);
    //viewbyall();alert(v);
    if(f=="6"){//如果在顶面
      var topf=new Array("2","6","8","4");//顶层顺时针位置
      for(k=0;k<4;k++){if(topf[k]==f1){break;}FTR();}
      RLB();FTR();RLBo();FTR();
      FLBo();FTRo();FLB();
    }else if(f=="2"||f=="3"||f=="4"||f=="5"){
      if(f1=="2"){
        if(f=="2"){FTR();}
        if(f=="4"){FTRo();}
        if(f=="5"){FTR();FTR();}
      }else if(f1=="4"&&f!="2"){
        if(f=="3"){FMRo();}
        if(f=="4"){FMR();FMR();}
        if(f=="5"){FMR();}
      }else if(f1=="6"){
        if(f=="2"){FMRo();}
        if(f=="3"){FMR();FMR();}
        if(f=="4"){FMR();}
      }
      if((f=="2"&&f1=="4")!=1){
        FLBo();FTRo();FLB();FTRo();
        RLB();FTR();RLBo();
      }
      if(f1=="4"&&f!="2"){
        if(f=="3"){FMR();}
        if(f=="4"){FMR();FMR();}
        if(f=="5"){FMRo();}
        i=i-1;if(i!=-1){FMRo();}
      }
      if(f1=="6"){
        if(f=="2"){FMR();}
        if(f=="3"){FMR();FMR();}
        if(f=="4"){FMRo();}
        i=i-1;if(i!=-1){FMRo();}
      }
    }
}FMR();
}

function tTC(){//对顶层十字
var flr3C=new Array("K","O","Q","M");
var v="",f="",f1="",i=0,j=0,k=0;
for(i=0;i<4;i++){if(s3[49].charAt(3)=="1"){break;}FTR();}
for(i=0;i<4;i++){
    if(i>0){FTR();}
    chgp();
    v=findPos(flr3C[i]);
    f=v.charAt(4);
    f1=v.charAt(1);
    //viewbyall();alert(v);
    if(f=="6"&&f1!="2"){//在顶层
      if(f1=="6"){FTR();}
      if(f1=="8"){FTR();FTR()}
      if(f1=="4"){FTRo();}
      RRBo();
      if(f1=="6"){FTRo();}
      if(f1=="8"){FTR();FTR()}
      if(f1=="4"){FTR();}
      RRB();
    }else if(f=="2"||f=="3"||f=="4"||f=="5"){
      if(f1=="4"){//在中层的二种情况
        FTRo();FRB();FTR();FRBo();
      }else if(f1=="6"){
        RRBo();FTR();RRB();FTRo();
      }else{//在顶层侧面
        if(f=="2"){FTR();RRBo();FTR();RRB();FTR();FRB();FTR();FRBo();}
        if(f=="3"){RRBo();FTR();RRB();FTR();FTR();FRB();FTR();FRBo();}
        if(f=="4"){FTRo();RRBo();FTR();RRB();FTRo();FRB();FTRo();FRBo();FTR();FTR();}
        if(f=="5"){RRBo();FTRo();RRB();FRB();FTRo();FRBo();FTR();FTR();}
      }
    }
}FTR();
}

function tTX(){//对顶层四角
var flr3X=new Array("P","J","L","R");
var v="",f="",f1="",i=0,j=0,k=0,sinal=0;
for(i=0;i<4;i++){
    if(i>1){//判断是否出现只剩二个没对好的情况
    //转完二次后,只有三个位置不确定的,这时候可能会出现
    //三个都已经好了,或者有其中一个好了,出现这些情况就
    //需要另作处理,不能再循环操作下去,会把原先转好的破坏
      if(s3[45].charAt(2)=="L"){sinal+=1;}
      if(s3[47].charAt(2)=="R"){sinal+=1;}
      if(s3[26].charAt(0)=="2"&&s3[26].charAt(2)=="1"&&
        s3[33].charAt(0)=="3"&&s3[33].charAt(2)=="3"&&
        s3[8].charAt(0)=="1"&&s3[8].charAt(2)=="I"){sinal+=1;}
      if(sinal>0){break;}
    }
    if(i>0){FTR();}
    chgp();
    v=findPos(flr3X[i]);
    f=v.charAt(4);
    f1=v.charAt(1);
    //viewbyall();alert(v);
    if(f=="6"&&f1!="7"){
      if(f1=="1"){FTR();}
      if(f1=="3"){FTR();FTR();}
      if(f1=="9"){FTRo();}
      FLB();FBR();FBR();FLBo();
      if(f1=="1"){FTRo();}
      if(f1=="3"){FTR();FTR();}
      if(f1=="9"){FTR();}
      FLB();FBR();FBR();FLBo();
    }else if(f=="3"&&f1=="9"){//右下后
      RLBo();FBR();FBR();RLB();FTR();RLBo();FBR();FBR();RLB();FTRo();
    }else if(f=="4"&&f1=="7"){//后下左
      FLB();FBR();FBR();FLBo();FTR();FLB();FBR();FBR();FLBo();FTRo();
    }else if(f=="1"&&f1=="9"){//在底面
      FTR();FLB();FBR();FBR();FLBo();
      FTRo();FLB();FBR();FBR();FLBo();
      i=i-1;if(i!=-1){FTRo();}
    }else{//在顶层侧面
      if(f1=="1"){
        if(f=="2"){FTR();RLBo();FBR();FBR();RLB();FTRo();RLBo();FBR();FBR();RLB();}
        if(f=="3"){RLBo();FBR();FBR();RLB();FTRo();RLBo();FBR();FBR();RLB();FTR();}
        if(f=="4"){RLBo();FBR();FBR();RLB();FTR();FTR();RLBo();FBR();FBR();RLB();FTR();FTR();}
        if(f=="5"){RLBo();FBR();FBR();RLB();FTR();RLBo();FBR();FBR();RLB();FTRo();}
        FLB();FBR();FBR();FLBo();FTR();FLB();FBR();FBR();FLBo();FTRo();
      }
      if(f1=="3"){
        if(f=="2"){FLB();FBR();FBR();FLBo();FTRo();FLB();FBR();FBR();FLBo();FTR();}
        if(f=="3"){FLB();FBR();FBR();FLBo();FTR();FTR();FLB();FBR();FBR();FLBo();FTR();FTR();}
        if(f=="4"){FLB();FBR();FBR();FLBo();FTR();FLB();FBR();FBR();FLBo();FTRo();}
        if(f=="5"){FTR();FLB();FBR();FBR();FLBo();FTRo();FLB();FBR();FBR();FLBo();}
        RLBo();FBR();FBR();RLB();FTR();RLBo();FBR();FBR();RLB();FTRo();
      }
     
    }
}
if(sinal==1){
    if(s3[45].charAt(2)=="L"||s3[47].charAt(2)=="R"){
      if(s3[45].charAt(2)=="L"&&s3[47].charAt(2)!="R"){FTR();}
      FLB();FMB();FRB();
      if(s3[51].charAt(0)=="6"){
        FLB();FBR();FBR();FLBo();RLBo();FBR();FBR();RLB();FTR();FTR();
        RLBo();FBR();FBR();RLB();FLB();FBR();FBR();FLBo();FTR();FTR();
      }else{
        RLBo();FBR();FBR();RLB();FLB();FBR();FBR();FLBo();FTR();FTR();
        FLB();FBR();FBR();FLBo();RLBo();FBR();FBR();RLB();FTR();FTR();
      }
      FLBo();FMBo();FRBo();
    }else{alert(2);
      FLB();FLB();FMB();FRB();
      if(s3[51].charAt(0)=="2"){
        FLB();FBR();FBR();FLBo();RLBo();FBR();FBR();RLB();FTR();FTR();
        RLBo();FBR();FBR();RLB();FLB();FBR();FBR();FLBo();FTR();FTR();
      }else{
        RLBo();FBR();FBR();RLB();FLB();FBR();FBR();FLBo();FTR();FTR();
        FLB();FBR();FBR();FLBo();RLBo();FBR();FBR();RLB();FTR();FTR();
      }
      FLBo();FMBo();FRBo();FLBo();
    }
}
for(i=0;i<4;i++){if(s3[49].charAt(3)=="3"){break;}FTR();}
}

3dcube.js (这个没有完成, 能力有限)

var tmpl = `<div class="cube" id="{ID}"><span class="in_front">{F}</span><span class="in_back">{B}</span><span class="in_left">{L}</span><span class="in_right">{R}</span><span class="in_top">{T}</span><span class="in_bottom">{M}</span></div>`;

function $(id){return document.getElementById(id);}

var mousex = -1, mousey = -1, mousepid = '';
$('cubes').onmousedown = function(e){
  //console.log(e.clientX,e.clientY);
  var tag = e.target.tagName.toLowerCase();
  var pid = e.target.parentNode.id;
  if((tag == 'span') && (pid.substring(0,4) == 'cube')){
    mousex = e.clientX - $('cubes').parentNode.parentNode.getBoundingClientRect().left;
    mousey = e.clientY - $('cubes').parentNode.parentNode.getBoundingClientRect().top;
    mousepid = pid;
  }
}
$('cubes').onmouseup = function(e){
  if(mousex < 0 || mousey < 0) return; //不在魔方内
  var x = e.clientX - $('cubes').parentNode.parentNode.getBoundingClientRect().left - mousex;
  var y = e.clientY - $('cubes').parentNode.parentNode.getBoundingClientRect().top - mousey;
  if((Math.abs(x) < 5) && (Math.abs(y) < 5)) return; //小范围移动当成点击
  var d, f, a, b, c; //方向,面, abc临时变量
  var pid = parseInt(mousepid.replace('cube',''));
  f = chkInRect(mousex,mousey);
  if(Math.abs(x) <= Math.abs(y)) {
    if(y < 0){ d = 'u'; } else { d = 'd'; } //上下移动
    //if(pid > 9) return;
    a = pid % 3;
    b = parseInt(pid / 9);
    //console.log(pid,f,a,b);
    if(f == '') return;
    if(f == 'f'){
      if(a == 0){ p = 'l'; }
      if(a == 1){ p = 'm'; }
      if(a == 2){ p = 'r'; }
    }
    if((f == 'r')){
      if(b == 0){ p = 'l'; }
      if(b == 1){ p = 'm'; }
      if(b == 2){ p = 'r'; }
    }
    exec = ''+f+p+'d3d();';
    if(d=='d'){eval(exec);}else{eval(exec+exec+exec);}
  }else{
    if(x > 0){ d = 'r'; } else { d = 'l'; } //左右移动
    c = parseInt((pid % 9) / 3);
    if(c == 0){ p = 't'; }
    if(c == 1){ p = 'm'; }
    if(c == 2){ p = 'b'; }
    exec = ''+f+p+'r3d();';
    if(d=='r'){eval(exec);}else{eval(exec+exec+exec);}
  }
  mousex = mousey = -1;
  mousepid = '';
}

function chkInRect(x, y){
  var arrf = [[33,105],[209,155],[209,330],[33,280]]; //front
  var arrr = [[217,156],[315,70],[315,240],[217,326]]; //right
  if((x > arrf[0][0]) && (x < arrf[1][0])){ //front
    y0 = parseInt(arrf[0][1] + (arrf[1][1] - arrf[0][1]) * (x - arrf[0][0]) / (arrf[1][0] - arrf[0][0]));
    y1 = parseInt(arrf[2][1] - (arrf[2][1] - arrf[3][1]) * (arrf[2][0] - x) / (arrf[2][0] - arrf[3][0]));
    if((y >= y0) && (y <= y1)) return 'f';
  } else if((x > arrr[0][0]) && (x < arrr[1][0])){ //right
    y0 = parseInt(arrr[0][1] - (arrr[0][1] - arrr[1][1]) * (x - arrr[0][0]) / (arrr[1][0] - arrr[0][0]));
    y1 = parseInt(arrr[3][1] - (arrr[3][1] - arrr[2][1]) * (x - arrr[3][0]) / (arrr[2][0] - arrr[3][0]));
    if((y >= y0) && (y <= y1)) return 'r';
  }
  return '';
}

var str = '';
var txts = {
      '020' : '9←', '050' : '6←', '080' : '3←', '120' : '8←', '150' : '5←', '180' : '2←', '220' : '7←', '250' : '4←', '280' : '1←', // white
      '001' : 'S↓', '031' : 'T↓', '061' : 'U↓', '101' : 'V↓', '131' : '*↓', '161' : 'W↓', '201' : 'X↓', '231' : 'Y↓', '261' : 'Z↓', // cyan
      '002' : 'L←', '012' : 'K←', '022' : 'J←', '102' : 'O←', '112' : 'N←', '122' : 'M←', '202' : 'R←', '212' : 'Q←', '222' : 'P←', // purple
      '063' : 'A→', '073' : 'B→', '083' : 'C→', '163' : 'D→', '173' : 'E→', '183' : 'F→', '263' : 'G→', '273' : 'G→', '283' : 'I→', // red
      '004' : '9←', '014' : '8←', '024' : '7←', '034' : '6←', '044' : '5←', '054' : '4←', '064' : '3←', '074' : '2←', '084' : '1←', // green
      '225' : '9←', '215' : '8←', '205' : '7←', '255' : '6←', '245' : '5←', '235' : '4←', '285' : '3←', '275' : '2←', '265' : '1←'  // yellow
    };
for(i=0; i<27; i++){
    x = parseInt(i / 9);
    y = i % 9;
    l = y % 3;
    t = parseInt(y / 3);
    id = "cube"+ i +"\" rotatex='0' rotatey='0' rotatez='0' style=\"z-index:"+((2-x)*10+9-(2-l)-t*3)+";left:"+(l*100)+"px;top:"+(t*100)+"px;transform:translateZ(-"+(100*x)+"px);";
    str += tmpl.replace("{ID}", id).replace("{F}",txts[''+x+y+'4']?txts[''+x+y+'4']:'').replace("{B}",txts[''+x+y+'5']?txts[''+x+y+'5']:'').replace("{L}",txts[''+x+y+'1']?txts[''+x+y+'1']:'').replace("{R}",txts[''+x+y+'0']?txts[''+x+y+'0']:'').replace("{T}",txts[''+x+y+'2']?txts[''+x+y+'2']:'').replace("{M}",txts[''+x+y+'3']?txts[''+x+y+'3']:'');
}
$('cubes').innerHTML = str;
$('cubes').onselectstart = function(){return false;}

function rotate90(arr){
    n = 3;
    var arr1 = [];
    for(i=0; i<n; i++){
    for(j=0; j<n; j++){
        arr1[j * n + n - 1 - i] = arr[i * n + j];
    }}
    return arr1;
}

//x面操作
function fld3d(){
  var elsn = [0,9,18,3,12,21,6,15,24];
  roundx(elsn, 0);
}
function fmd3d(){
  var elsn = [1,10,19,4,13,22,7,16,25];
  roundx(elsn, 1);
}
function frd3d(){
  var elsn = [2,11,20,5,14,23,8,17,26];
  roundx(elsn, 2);
}

//y面操作
function ftr3d(){
  var elsn = [0,1,2,9,10,11,18,19,20];
  roundy(elsn, 0);
}
function fmr3d(){
  var elsn = [3,4,5,12,13,14,21,22,23];
  roundy(elsn, 1);
}
function fbr3d(){
  var elsn = [6,7,8,15,16,17,24,25,26];
  roundy(elsn, 2);
}

//z面操作
function rld3d(){
    var elsn = [0,1,2,3,4,5,6,7,8];
    roundz(elsn, 0);
}
function rmd3d(){
    var elsn = [9,10,11,12,13,14,15,16,17];
    roundz(elsn, 1);
}
function rrd3d(){
    var elsn = [18,19,20,21,22,23,24,25,26];
    roundz(elsn, 2);
}

function roundx(elsn, goZ){
    var zis = [];
    var lt = [];
    for (var i=0; i<elsn.length; i++){
        zis[i] = $('cube'+elsn[i]).style.zIndex;
        lt[i] = [parseInt($('cube'+elsn[i]).style.left.replace('px','')),parseInt($('cube'+elsn[i]).style.top.replace('px',''))];
    }
    //zis = rotate90(zis);
    for (var i=0; i<elsn.length; i++){
      const newDiv = $('cube'+elsn[i]);
      goX = (200-lt[i][0])+'px';
      goY = (200-lt[i][1])+'px';
      newDiv.style.transformOrigin = goX+" "+goY + " -100px";
      var rx = parseInt(newDiv.getAttribute('rotatex')) % 4;
      newDiv.setAttribute('rotatex', (rx+1)%4); 
      newDiv.style.animation = 'rotatex'+goZ+rx+parseInt(i%3)+' 0.3s linear infinite';
      newDiv.style.animationIterationCount = 1; // 动画只执行一次
      newDiv.style.animationFillMode = 'forwards'; //动画结束后停留在最后一帧
    }
}

function roundy(elsn, goZ){
    var zis = [];
    var lt = [];
    for (var i=0; i<elsn.length; i++){
        zis[i] = $('cube'+elsn[i]).style.zIndex;
        lt[i] = [parseInt($('cube'+elsn[i]).style.left.replace('px','')),parseInt($('cube'+elsn[i]).style.top.replace('px',''))];
    }
    //zis = rotate90(zis);
    for (var i=0; i<elsn.length; i++){
      const newDiv = $('cube'+elsn[i]);
      goX = (200-lt[i][0])+'px';
      goY = (200-lt[i][1])+'px';
      newDiv.style.transformOrigin = goX+" "+goY + " -100px";
      var ry = parseInt(newDiv.getAttribute('rotatey')) % 4;
      newDiv.setAttribute('rotatey', (ry+1)%4); 
      newDiv.style.animation = 'rotatey'+goZ+ry+parseInt(i/3)+' 0.3s linear infinite';
      newDiv.style.animationIterationCount = 1; // 动画只执行一次
      newDiv.style.animationFillMode = 'forwards'; //动画结束后停留在最后一帧
    }
}

function roundz(elsn, goZ){
    var zis = [];
    var lt = [];
    for (var i=0; i<elsn.length; i++){
        zis[i] = $('cube'+elsn[i]).style.zIndex;
        lt[i] = [parseInt($('cube'+elsn[i]).style.left.replace('px','')),parseInt($('cube'+elsn[i]).style.top.replace('px',''))];
    }
    //zis = rotate90(zis);
    for (var i=0; i<elsn.length; i++){
      const newDiv = $('cube'+elsn[i]);
      goX = (200-lt[i][0])+'px';
      goY = (200-lt[i][1])+'px';
      newDiv.style.transformOrigin = goX+" "+goY;
      var rz = parseInt(newDiv.getAttribute('rotatez')) % 4;
      newDiv.setAttribute('rotatez', (rz+1)%4); 
      newDiv.style.animation = 'rotatez'+goZ+rz+' 0.3s linear infinite';
      newDiv.style.animationIterationCount = 1; // 动画只执行一次
      newDiv.style.animationFillMode = 'forwards'; //动画结束后停留在最后一帧
    }
}
posted @ 2025-08-19 11:45  hankerstudio  阅读(14)  评论(0)    收藏  举报