操控此游戏需要5个手机并接入同一个局域网,其中4个用于4个层的显示,型号最好一样,另外一个用于操控数字6个方向的移动,还原算法目前还是一片空白,大神可以继续研究。
单片机版:https://www.fedcba9876543210.com/thread-229-1-1.html
易语言版:https://www.fedcba9876543210.com/thread-530-1-1.html
源码免费送了,放到服务器器里即可,最好是局域网的:
- <meta name="viewport" content="width=device-width, initial-scale=1.0,maximum-scale=1.0, user-scalable=no"/>
- <?php
- $cmd = @$_GET['cmd']; //命令
- if(!file_exists('l1.txt') || !file_exists('l2.txt') || !file_exists('l3.txt') || !file_exists('l4.txt')){
- file_put_contents("l1.txt","0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15");
- file_put_contents("l2.txt","16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31");
- file_put_contents("l3.txt","32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47");
- file_put_contents("l4.txt","48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63");
- }
- $xyd = array( //拼图板移动方向与0(空白)交换坐标数据,请勿修改否则数字会跳格或无法正常移动。
- 0x04, 0x10, 0x01, 0x10, 0x05, 0x10, 0x02, 0x00, 0x06, 0x10, 0x03, 0x01, 0x07, 0x10, 0x10, 0x02,
- 0x08, 0x00, 0x05, 0x10, 0x09, 0x01, 0x06, 0x04, 0x0A, 0x02, 0x07, 0x05, 0x0B, 0x03, 0x10, 0x06,
- 0x0C, 0x04, 0x09, 0x10, 0x0D, 0x05, 0x0A, 0x08, 0x0E, 0x06, 0x0B, 0x09, 0x0F, 0x07, 0x10, 0x0A,
- 0x10, 0x08, 0x0D, 0x10, 0x10, 0x09, 0x0E, 0x0C, 0x10, 0x0A, 0x0F, 0x0D, 0x10, 0x0B, 0x10, 0x0E
- );
- $l1=explode(",",file_get_contents("l1.txt"));
- $l2=explode(",",file_get_contents("l2.txt"));
- $l3=explode(",",file_get_contents("l3.txt"));
- $l4=explode(",",file_get_contents("l4.txt"));
- $lay = @$_GET['l']; //层
- switch($lay){
- case 1:$title='第一层(最里层)';break;
- case 2:$title='第二层';break;
- case 3:$title='第三层';break;
- case 4:$title='第四层(最外层)';break;
- default:$title='控制面板';break;
- }
- $title = '3D立体数字滑块推盘PHP版 - ' . $title ;
- echo "<title>{$title}</title>";
- if(($lay <1 || $lay > 4) && $lay != "") exit('无效的层');
- if(is_numeric($lay)){
- $l = explode(",",file_get_contents("l".$lay.".txt"));
- out();
- $meta = '<meta name="apple-mobile-web-app-capable" content="yes" />'; //隐藏地址栏
- $meta .= '<meta http-equiv="refresh" content="1">';//这行代码中的1是刷新时间,若不影响显示,可以改成0
- exit($meta);
- } elseif(isset($lay)) {
- exit('无效的层');
- }
- function out_nbr($nbr){ //输出数字 0则空格 小于10补0
- if($nbr == 0){
- return " ";
- } else {
- if($nbr < 10){
- return "0".$nbr;
- } else {
- return $nbr;
- }
- }
- }
- function out(){ //输出拼图数据
- global $l;
- $z=0;
- echo '<table width="100%" height="100%" border="1">';
- for($y=0;$y<4;$y++){
- echo "<tr>";
- for($x=0;$x<4;$x++){
- echo "<td><h1>".out_nbr($l[$z])."</h1></td>";
- $z++;
- }
- echo "</tr>";
- }
- echo "</table>";
- }
- //------------------------3D推盘驱动程序------------------------
- function get_adj_coo($zero_adj,$mov_dir){ //获取相邻坐标
- global $xyd;
- return $xyd[$zero_adj*4+$mov_dir-1];
- }
- function get_0_lay(){ //获取0(空白)所在的层数 返回1~4
- global $l1,$l2,$l3,$l4;
- for($add=0;$add<16;$add++){
- if($l1[$add] == 0)return 1;
- if($l2[$add] == 0)return 2;
- if($l3[$add] == 0)return 3;
- if($l4[$add] == 0)return 4;
- }
- return 0;
- }
- function get_0_pla(){ //获取0(空白)的平面坐标 返回0~15
- global $l1,$l2,$l3,$l4;
- $lay=get_0_lay(); //获取0所在的层数
- for($add=0;$add<16;$add++){
- if($lay == 1){
- if($l1[$add] == 0){
- return $add;
- }
- }
- if($lay == 2){
- if($l2[$add] == 0){
- return $add;
- }
- }
- if($lay == 3){
- if($l3[$add] == 0){
- return $add;
- }
- }
- if($lay == 4){
- if($l4[$add] == 0){
- return $add;
- }
- }
- }
- return 0;
- }
- function pec($s,$a,$b){ //平面交换数字位置 层数:1~4 坐标A 坐标B
- global $l1,$l2,$l3,$l4;
- $ad=0;$bd=0;
- if($a > 15 || $b > 15) return;
-
- if($s == 1){$ad=$l1[$a];$bd=$l1[$b];$l1[$a]=$bd;$l1[$b]=$ad;return;}
- if($s == 2){$ad=$l2[$a];$bd=$l2[$b];$l2[$a]=$bd;$l2[$b]=$ad;return;}
- if($s == 3){$ad=$l3[$a];$bd=$l3[$b];$l3[$a]=$bd;$l3[$b]=$ad;return;}
- if($s == 4){$ad=$l4[$a];$bd=$l4[$b];$l4[$a]=$bd;$l4[$b]=$ad;return;}
- return;
- }
- function up_mov(){ //拼图上移
- $lay0=get_0_lay(); //获取0的坐标所在层数
- $pla0=get_0_pla(); //获取0的平面坐标
- $adj=get_adj_coo($pla0,1); //获取相邻坐标
- pec($lay0,$pla0,$adj); //平面交换数字位置
- }
- function down_mov(){ //拼图下移
- $lay0=get_0_lay(); //获取0的坐标所在层数
- $pla0=get_0_pla(); //获取0的平面坐标
- $adj=get_adj_coo($pla0,2); //获取相邻坐标
- pec($lay0,$pla0,$adj); //平面交换数字位置
- }
- function left_mov(){ //拼图左移
- $lay0=get_0_lay(); //获取0的坐标所在层数
- $pla0=get_0_pla(); //获取0的平面坐标
- $adj=get_adj_coo($pla0,3); //获取相邻坐标
- pec($lay0,$pla0,$adj); //平面交换数字位置
- }
- function right_mov(){ //拼图右移
- $lay0=get_0_lay(); //获取0的坐标所在层数
- $pla0=get_0_pla(); //获取0的平面坐标
- $adj=get_adj_coo($pla0,4); //获取相邻坐标
- pec($lay0,$pla0,$adj); //平面交换数字位置
- }
- function in_mov(){ //拼图里移
- global $l1,$l2,$l3,$l4;
- $lay0=get_0_lay(); //获取0的坐标所在层数
- $pla0=get_0_pla(); //获取0的平面坐标
- if($lay0 < 4){
- if($lay0 == 3){$l3[$pla0]=$l4[$pla0];$l4[$pla0]=0;}
- if($lay0 == 2){$l2[$pla0]=$l3[$pla0];$l3[$pla0]=0;}
- if($lay0 == 1){$l1[$pla0]=$l2[$pla0];$l2[$pla0]=0;}
- }
- }
- function out_mov(){ //拼图外移
- global $l1,$l2,$l3,$l4;
- $lay0=get_0_lay(); //获取0的坐标所在层数
- $pla0=get_0_pla(); //获取0的平面坐标
- if($lay0 > 1){
- if($lay0 == 4){$l4[$pla0]=$l3[$pla0];$l3[$pla0]=0;}
- if($lay0 == 3){$l3[$pla0]=$l2[$pla0];$l2[$pla0]=0;}
- if($lay0 == 2){$l2[$pla0]=$l1[$pla0];$l1[$pla0]=0;}
- }
- }
- function save_lay(){
- global $l1,$l2,$l3,$l4;
- $l1_="";$l2_="";$l3_="";$l4_="";
- for($add=0;$add<16;$add++){
- if($add == 15){
- $l1_ .= $l1[$add];
- $l2_ .= $l2[$add];
- $l3_ .= $l3[$add];
- $l4_ .= $l4[$add];
- } else {
- $l1_ .= $l1[$add].",";
- $l2_ .= $l2[$add].",";
- $l3_ .= $l3[$add].",";
- $l4_ .= $l4[$add].",";
- }
- }
- file_put_contents("l1.txt",$l1_);
- file_put_contents("l2.txt",$l2_);
- file_put_contents("l3.txt",$l3_);
- file_put_contents("l4.txt",$l4_);
- }
- switch($cmd){
- case "up": up_mov();save_lay();break;
- case "down": down_mov();save_lay();break;
- case "left": left_mov();save_lay();break;
- case "right": right_mov();save_lay();break;
- case "in": in_mov();save_lay();break;
- case "out": out_mov();save_lay();break;
- case "reset":
- unlink("l1.txt");
- unlink("l2.txt");
- unlink("l3.txt");
- unlink("l4.txt");
- break;
- case "upset":
- for($add=0;$add<1000;$add++){
- switch(rand(1,6)){
- case 1: up_mov();break;
- case 2: down_mov();break;
- case 3: left_mov();break;
- case 4: right_mov();break;
- case 5: in_mov();break;
- case 6: out_mov();break;
- default:break;
- }
- }
- save_lay();
- break;
- default:break;
- }
- ?>
- <table border="1" width="100%" height="75%">
- <tr><td><h1> </h1></td><td><a href="?cmd=up"><h1><center>上</center></h1></a></td><td><h1> </h1></td><td><h1> </h1></td><td><a href="?cmd=in"><h1><center>里</center></h1></a></td></tr>
- <tr><td><a href="?cmd=left"><h1><center>左</center></h1></a></td><td><h1> </h1></td><td><a href="?cmd=right"><h1><center>右</center></h1></a></td><td><h1> </h1></td><td><h1> </h1></td></tr>
- <tr><td><h1> </h1></td><td><a href="?cmd=down"><h1><center>下</center></h1></a></td><td><h1> </h1></td><td><h1> </h1></td><td><a href="?cmd=out"><h1><center>外</center></h1></a></td></tr>
- </table>
- <a href="?l=1">第一层(最里层)</a>
- <a href="?l=2">第二层</a><br>
- <a href="?l=3">第三层</a>
- <a href="?l=4">第四层(最外层)</a><br>
- <a href="?cmd=reset">复位</a>
- <a href="?cmd=upset">打乱</a>
复制代码
移植不易,送一些好评进来就ok了!!
|