Heim  >  Artikel  >  Backend-Entwicklung  >  Teilen Sie den Prozess der Implementierung des Happy Xiaoxiaole-Algorithmus in PHP

Teilen Sie den Prozess der Implementierung des Happy Xiaoxiaole-Algorithmus in PHP

黄舟
黄舟Original
2017-10-13 09:38:361715Durchsuche

Happy Xiaoxiaole sollte jedem bekannt sein. Der folgende Artikel stellt Ihnen hauptsächlich die relevanten Informationen zur Verwendung von PHP zur Implementierung des Happy Xiaoxiaole-Algorithmus vor Wert für das Studium oder die Arbeit aller Freunde, die es brauchen, können dem Herausgeber folgen, um gemeinsam zu lernen.

Vorwort

Dieser Artikel stellt hauptsächlich vor, wie PHP den fröhlichen Xiaoxiaole-Algorithmus implementiert, den wir alle kennen, und teilt ihn als Referenz. Ich werde im Folgenden nicht viel mehr sagen, werfen wir einen Blick auf die ausführliche Einführung.

1. Anforderungsbeschreibung:

1. Erscheinen zufällig 5 Farben in einem 8*8-Matrixquadrat.

2. Wenn drei oder mehr Farbblöcke horizontal oder vertikal verbunden sind, entfernen Sie diese Farbblöcke.

3. Nachdem die Farbblöcke entfernt wurden, bewegen sich die oberen Farbblöcke nach unten und zufällige Farbblöcke fallen herunter, um die freien Stellen in der Matrix zu füllen.

4. Wiederholen Sie die Schritte 2 und 3.

5. Das Eliminieren von 3 Blöcken derselben Farbe fügt 10 Punkte hinzu, 4 fügt 15 Punkte hinzu, 5 fügt 20 Punkte hinzu, 6 fügt 30 Punkte hinzu, 7 fügt 40 Punkte hinzu und 8 fügt 70 Punkte hinzu, 9 Punkte fügt 100 Punkte hinzu, 10 Punkte ergeben 150 Punkte und jeder weitere bringt 50 Punkte mehr als der vorherige.

2. Laden Sie den Code hoch


<?php
//所有图形初始化数据,key代表位置,value代表颜色
$xxl = array(
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
 array(&#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;, &#39;&#39;),
);
$point = play($xxl, $point);//开始游戏
echo "\n共获得积分数量:{$point}";

/*开始消除
 *$xxl  array 所有图形集合
 *$point int  获得积分数量
*/
$bu = 0;
function play($xxl, $point){
 global $bu;
 $bu ++;
 echo &#39;=================================开始第&#39;.$bu.&#39;步==================================&#39;;
 $color = array(1 => &#39;red&#39;,2 => &#39;green&#39;,3 => &#39;yellow&#39;,4 => &#39;blue&#39;,5 => &#39;black&#39;);//代表5种颜色
 $samCol = array();//列上相连色块集合
 $nowCol = array();//列上相连色块指针
 $samArr = array();//相连色块总集合
 $group = 1;//组指针

 //随机填充颜色,并获得行上相连色块start
 foreach($xxl as $k1 => $v1){
  $sam = array();//行上相连色块集合
  $now = 1;//行上相连色块指针
  foreach($v1 as $k2 => $v2){
   if(empty($v2) || $v2 == &#39; &#39;){
    $v2 = $xxl[$k1][$k2] = array_rand($color);//随机填充颜色
   }
   if(!isset($nowCol[$k2])){
    $nowCol[$k2] = 1;
   }
   if($k1 === 0){
    $samCol[$k2][$nowCol[$k2]][$k1 .&#39;-&#39;. $k2] = array($k1, $k2, $v2, $k1 .&#39;-&#39;. $k2 .&#39;-&#39;. $v2);
   }else{
    if($v2 != $xxl[$k1-1][$k2]){//同一列上和前一个颜色不一样
     $nowCol[$k2] ++;
    }
    $samCol[$k2][$nowCol[$k2]][$k1 .&#39;-&#39;. $k2] = array($k1, $k2, $v2, $k1 .&#39;-&#39;. $k2 .&#39;-&#39;. $v2);
   }


   if($k2 === 0){
    $sam[$now][$k1 .&#39;-&#39;. $k2] = array($k1, $k2, $v2, $k1 .&#39;-&#39;. $k2 .&#39;-&#39;. $v2);
   }else{
    if($v2 != $xxl[$k1][$k2-1]){//同一行上和前一个颜色不一样
     $now++;
    }
    $sam[$now][$k1 .&#39;-&#39;. $k2] = array($k1, $k2, $v2, $k1 .&#39;-&#39;. $k2 .&#39;-&#39;. $v2);
   }
  }
  //获得行上相连色块start
  foreach($sam as $x => $y){
   if(count($y) > 2){
    $key = &#39;R-&#39;.$group;
    foreach($y as $x2 => $y2){
     $y[$x2][&#39;group&#39;][&#39;r&#39;] = $key;
    }
    $samArr += $y;
    $group ++;
   }
  }
  //获得行上相连色块end
 }
 //随机填充颜色,并获得行上相连色块end

 //获得列上相连色块start
 $group = 1;
 foreach($samCol as $k => $v){
  foreach($v as $x => $y){
   if(count($y) > 2){
    $key = &#39;L-&#39;.$group;
    foreach($y as $x2 => $y2){
     $y[$x2][&#39;group&#39;][&#39;l&#39;] = $key;
     if(isset($samArr[$x2][&#39;group&#39;][&#39;r&#39;])){//判断本点是否已出现在横向组里
      $samArr[$x2][&#39;group&#39;][&#39;l&#39;] = $key;
     }
    }
    $samArr += $y;
    $group ++;
   }
  }
 }
 //获得列上相连色块end

 //查找相连色块start
 $res = array();//相连色块集合
 $hasRes = array();
 foreach($samArr as $k => $v){
  if(isset($hasRes[$k])){
   continue;
  }
  $arr = array();
  seek($samArr, $v, $arr);
  $res[] = array_keys($arr);
  $hasRes += $arr;
 }
 //查找相连色块end
 show($xxl);//打印消除前的图形
 if(empty($res)){//如果没有相连色块则退出递归
  echo &#39;=================================消除完毕!==================================&#39;;
  return $point;
 }
 $thisPoint = countPoint($res);//计算本次消除获得积分
 $point += $thisPoint;//累计到总积分

 //消除相连色块start
 $next = $xxl;
 foreach($res as $k => $v){
  foreach($v as $k2 => $v2){
   $y = $samArr[$v2][0];
   $x = $samArr[$v2][1];
   $xxl[$y][$x] = &#39;*&#39;;
   unset($next[$y][$x]);
  }
 }
 //消除相连色块end

 show($xxl);//打印消除时的图形
 $next = step($next);
 show($next);//打印消除后的图形
 echo "本次消除获得积分数量:{$thisPoint}\n";
 return play($next, $point);
}

/*计算获得积分数量
 *$xxl  array 相连色块集合
 */
function countPoint($xxl){
 //初始化积分配置start
 $config = array(3 => 10, 4 => 15, 5 => 20, 6 => 30, 7 => 40, 8 => 70, 9 => 100);
 for($i = 10; $i <= 64; $i++){
  $config[$i] = 100 + ($i - 9) * 50;
 }
 //初始化积分配置end
 $point = 0;
 foreach($xxl as $v){
  $key = count($v);
  $point += $config[$key];
 }
 return $point;
}

/*消掉并左移
 *$xxl  array 所有图形集合
 */
function step($xxl){
 foreach($xxl as $k => $v){
  $temp = array_merge($v);
  $count = count($temp);
  if($count == 8){
   continue;
  }
  for($i = $count; $i <= 7; $i++){
   $temp[$i] = &#39; &#39;;
  }
  $xxl[$k] = $temp;
 }
 return $xxl;
}

/*找相邻点
 *$xxl  array 相连图形集合
 *$one   array 某一个点
 *$arr   array 图形集合里的相邻的点
*/
function seek($xxl, $one, &$arr){
// global $i;
 $near = array();
 $near[&#39;up&#39;] = ($one[0] - 1).&#39;-&#39;.$one[1];//上面的点
 $near[&#39;down&#39;] = ($one[0] + 1).&#39;-&#39;.$one[1];//下面的点
 $near[&#39;left&#39;] = $one[0].&#39;-&#39;.($one[1] - 1);//左面的点
 $near[&#39;right&#39;] = $one[0].&#39;-&#39;.($one[1] + 1);//右面的点
 foreach($near as $v){
  if(isset($xxl[$v]) && $xxl[$v][2] == $one[2]){//找到相邻点
   $xj = array_intersect($one[&#39;group&#39;], $xxl[$v][&#39;group&#39;]);
   if(empty($xj)){//如果相邻的点不是本组的就跳过
    continue;
   }
   if(isset($arr[$v])){//如果该点已被遍历过则跳过
    continue;
   }
   $arr[$v] = $xxl[$v];
   seek($xxl, $xxl[$v], $arr);//继续找相邻的点
  }
 }
}

/*打印图形
 *$xxl  array 所有图形集合
 */
function show($xxl){
 //顺时针旋转矩阵start
 $arr = array();
 foreach($xxl as $k => $v){
  foreach($v as $k2 => $v2){
   $arr[7-$k2][$k] = $v2;
  }
 }
 ksort($arr);
 //顺时针旋转矩阵end
 $str = &#39;&#39;;
 foreach($arr as $v){
  foreach($v as $v2){
   $str .= &#39; &#39;.$v2;
  }
  $str .= "\n";
 }
 echo "\n".$str;
}

Die Laufergebnisse lauten wie folgt:

12345 repräsentiert jeweils 5 Farben.


=================================开始第1步==================================
 3 3 2 2 1 1 1 4
 4 3 4 3 4 1 1 3
 3 1 4 1 1 4 1 2
 2 3 4 3 1 2 4 4
 4 2 4 2 2 2 1 4
 3 3 2 1 2 3 1 1
 5 2 1 3 2 1 4 5
 3 4 5 1 3 2 3 3

 3 3 2 2 * * * 4
 4 3 * 3 4 1 * 3
 3 1 * 1 1 4 * 2
 2 3 * 3 1 2 4 4
 4 2 * * * * 1 4
 3 3 2 1 * 3 1 1
 5 2 1 3 * 1 4 5
 3 4 5 1 3 2 3 3

 3 3   4
 4 3 2  3
 3 1 3 1 2
 2 3 1 4 4 4
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3
本次消除获得积分数量:55
=================================开始第2步==================================
 3 3 2 2 3 3 2 4
 4 3 3 2 1 3 3 3
 3 1 3 3 4 1 4 2
 2 3 5 1 2 4 4 4
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3

 3 3 2 2 3 3 2 4
 4 3 3 2 1 * * *
 3 1 3 3 4 1 4 2
 2 3 5 1 2 * * *
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3

 3 3 2 2 3  
 4 3 3 2 1  
 3 1 3 3 4 3 2 4
 2 3 5 1 2 1 4 2
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3
本次消除获得积分数量:20
=================================开始第3步==================================
 3 3 2 2 3 4 1 3
 4 3 3 2 1 4 2 5
 3 1 3 3 4 3 2 4
 2 3 5 1 2 1 4 2
 4 2 2 3 4 2 1 4
 3 3 2 1 1 3 1 1
 5 2 1 3 1 1 4 5
 3 4 5 1 3 2 3 3
=================================消除完毕!==================================
共获得积分数量:75

Zusammenfassung

Das obige ist der detaillierte Inhalt vonTeilen Sie den Prozess der Implementierung des Happy Xiaoxiaole-Algorithmus in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn