ホームページ  >  記事  >  バックエンド開発  >  PHP で Happy Xiaoxiaole アルゴリズムを実装するプロセスを共有する

PHP で Happy Xiaoxiaole アルゴリズムを実装するプロセスを共有する

黄舟
黄舟オリジナル
2017-10-13 09:38:361738ブラウズ

Happy Xiaoxiaole は誰にとっても馴染みのあるもので、主に PHP を使用して Happy Xiaoxiaole アルゴリズムを実装する方法に関する関連情報が詳しく紹介されています。学習価値を必要とする友人は、編集者をフォローして一緒に学ぶことができます。

はじめに

この記事では主に、誰もが知っている Happy Xiaoxiaole のアルゴリズムを PHP で実装する方法を紹介し、皆さんの参考と学習のために共有します。以下では多くを述べませんが、詳細を見てみましょう。紹介バー。

1. 要件の説明:

1. 5 色のカラーブロックが 8*8 マトリックスの正方形にランダムに表示されます。

2. 縦または横に3つ以上のカラーブロックがつながっている場合、そのカラーブロックを消していきます。

3. カラーブロックが除去されると、上のカラーブロックが下に移動し、ランダムなカラーブロックがドロップしてマトリックスの空きを埋めます。

4. 手順 2 と 3 を繰り返します。

5. 同じ色のブロックを 3 つ消すと 10 ポイント、4 で 15 ポイント、5 で 20 ポイント、6 で 30 ポイント、7 で 40 ポイント、8 で 70 ポイント、9 で 100 ポイント、10 でポイントが追加されます150 ポイントで、1 つ追加されるたびに、前のポイントより 50 ポイントが追加されます。

2. コードをアップロードします


<?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;
}

実行結果は次のとおりです:

12345 はそれぞれ 5 色を表します。


りー

概要

以上がPHP で Happy Xiaoxiaole アルゴリズムを実装するプロセスを共有するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。