从18个形状、5个颜色、是否旋转3个维度设计一个独一无二的游戏数据

这篇具有很好参考价值的文章主要介绍了从18个形状、5个颜色、是否旋转3个维度设计一个独一无二的游戏数据。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

规则说明:

  1. 只有一个图块只出现一次,其他图块至少出现2次;
  2. 需要控制出现的颜色、形状、旋转来控制难度

设计思路

  1. 首先定义好所有的形状和颜色
  2. 根据配置的形状数量和颜色数量,组成一个图形合集A(静止的图形)
  3. 根据配置的旋转方向和最大旋转种类数,跟图形合集合并成一个完整的图形合集B(包含静止和旋转的图形),将合集打乱,第一个元素为独一无二的图块A,将图块A中合集B中删除
  4. 根据需要的图块数量,计算出最多需要生成的干扰项数量最大值(因为干扰图块至少有2个图块,故干扰数量最大值=图块数量/2并向下取整)
  5. 干扰数量最小值可以动态配置,最小值不可大于最大值;从干扰数量的最小值和最大值中随机取一个数字当作干扰数量,用图块数量-干扰数量
  6. 根据配置的最大旋转图块数量和独一无二的图块是否是旋转,计算出干扰图块中的旋转数量的最大值(如果旋转数量大于干扰数量,那旋转数量最大值等于干扰数量),从1-旋转数量最大值中随机取一个当作旋转的干扰图块数量
  7. 如果图形合集B的数量与干扰数量相等,那就直接把图形合集B当作最终的图形合集C
  8. 如果没有旋转的干扰图块,那就直接从图形合集A中取出干扰数量对应的图块当作最终的图形合集C
  9. 如果需要旋转的干扰图块,首先从图形合集B中的旋转图形中选取旋转的干扰图块数量放入图形合集C中,如果干扰数量不足,就从图形合集A中获取补充合集D(如果图形合集A中的图块不足,就取出A中所有的图块;),将补充合集D的所有图块(非独一无二的图块A,如果有多余的就补充,没有就算了)都放入图形合集C中
  10. 每个图块最少出现2次,那么会有(图块数量-1-(图形合集C的数量*2))个随机图形,每个随机图形从图形合集C中随机抽取一个。

代码实现

框架语言说明:Laravel 6.x,PHP7.2.25文章来源地址https://www.toymoban.com/news/detail-510558.html

    /**
     *
     * @param int $maxShapes 最多几个形状
     * @param int $maxColors 最多几个颜色
     * @param int $maxRotations 最大旋转种类
     * @param int $rotation 是否旋转
     * @param int $interferenceCount 图块数量
     * @return void
     */
    public function createDywe($maxShapes,$maxColors,$maxRotations,$rotation,$interferenceCount)
    {

      $shapeMap = array('shape1','shape2','shape3','shape4','shape5','shape6','shape7','shape8','shape9','shape10','shape11','shape12','shape13','shape14','shape15','shape16','shape17','shape18'); // 数字到形状的映射
      $colorMap = array('red', 'blue', 'green', 'orange', 'purple'); // 数字到颜色的映射
      // $rotationMap = array('0' => '静止', '1' => '顺时针', '2' => '逆时针'); // 数字到旋转方向的映射


      shuffle($shapeMap);
      shuffle($colorMap);
      $allMaps = [];
      foreach ($shapeMap as $key => $shape) {
        if($key < $maxShapes){
            foreach ($colorMap as $k => $color) {
              if($k < $maxColors){
                $allMaps[] = $shape.'-'.$color;
              }
            }
        }
      }
      $finalMaps = $allMaps;
        // 干扰图形的种类最多有多少种
      $maxCount = (int) floor(($interferenceCount - 1) / 2);
      $minCount = (int) ceil($maxCount / 2);
      if ($minCount < 1) {
          $minCount = 1;
      }
      //  干扰图形的数量
      $ganraoNum = rand($minCount, $maxCount);
      // 干扰图形种有几个旋转图形呢
      $rotaNum = 0;
      if ($rotation > 0) {
          $minRota = 1;
          // 旋转图形的数量
          $maxRota = $maxRotations > $ganraoNum ? $ganraoNum : $maxRotations;
          $rotaNum = rand($minRota, $maxRota);
      }
      // 多余的可以随机抽的
      $randNum = $interferenceCount - 1 - $ganraoNum * 2;
      // 加上旋转
      if($rotaNum > 0){
          switch ($rotation) {
            case 1:
                // 单方向旋转
                $fangxiang = rand(1,2);
                foreach ($allMaps as $map) {
                    $finalMaps[] = $map.'-'.$fangxiang;
                }
                break;
            case 2:
                // 多方向旋转
                // 单方向旋转
                foreach ($allMaps as $map) {
                    $fangxiang = rand(1,2);
                    $finalMaps[] = $map.'-'.$fangxiang;
                }
                break;
            default:
                break;
        }
      }



      $result = [];
      // 随机打乱
      shuffle($finalMaps);
      // 第一个就是独一无二的
      $result[] = $finalMaps[0];
      $answer = $finalMaps[0];
      unset($finalMaps[0]);
      shuffle($finalMaps);

      if(strpos($answer,'-1') !== false || strpos($answer,'-2') !== false ){
          if($rotaNum > 0){
            $rotaNum--;
          }
      }
      // 如果只有干扰项与元素一致
      if(count($finalMaps) === $ganraoNum){
        $maps = $finalMaps;
      }else{
        if($rotaNum > 0){
          // 有旋转的
          $rotationMaps = Arr::where($finalMaps,function($val){
            return count(explode('-',$val)) === 3;
          });
          $maps = [];
          shuffle($rotationMaps);
          // 取旋转干扰项
          foreach ($rotationMaps as $idx => $map) {
              if ($idx >= $rotaNum) {
                  break;
              }
              $maps[] = $map;
          }

          if($ganraoNum > count($maps) ){
            if(count($allMaps)< $ganraoNum - count($maps)){
              $randNum +=$ganraoNum - count($maps) -count($allMaps);
              $maps2 = $allMaps;
            }else{
              $maps2 = Arr::random($allMaps,$ganraoNum - count($maps));
            }
              foreach ($maps2 as $map) {
                 if($map === $answer){
                    // 再取一个新的
                    $maps3 = array_diff($allMaps,$maps2);
                    if(count($maps3) === 0){
                      continue;
                    }
                    $maps3 = array_values($maps3);
                    shuffle($maps3);
                    $map = $maps3[0];
                 }
                 $maps[] = $map;
              }
          }


        }else{
          // 没旋转的
          if(count($finalMaps)< $ganraoNum){
            $randNum +=$ganraoNum -count($finalMaps);
            $maps = $finalMaps;
          }else{
            $maps = Arr::random($finalMaps,$ganraoNum);
          }
        }
      }

      // 先把至少2个弄进去
      foreach ($maps as $map) {
          $result[] = $map;
          $result[] = $map;
      }
      // 实际测试过程中发现最终生成的数量不对,在重新 调整下
      if(count($result) + $randNum !== $interferenceCount){
        $randNum = $interferenceCount - count($result);
      }
      // 再把随机的弄进去
      for ($i = $randNum; $i > 0; $i--) {
          $rand = rand(0, count($maps) - 1);
          $result[] = $maps[$rand];
      }
      return $result;

    }

到了这里,关于从18个形状、5个颜色、是否旋转3个维度设计一个独一无二的游戏数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 基于OpenCV的图像颜色与形状识别的原理2

    基于OpenCV的图像颜色与形状识别通常涉及以下几个步骤: 图像读取:使用OpenCV的cv2.imread()函数读取图像。 预处理:可能包括图像的灰度转换、二值化、滤波等,以减少噪声和无关信息。 颜色识别: 颜色空间转换:将图像从RGB颜色空间转换为HSV(色调、饱和度、值)或HSL(色

    2024年02月02日
    浏览(58)
  • Echarts:legend 图例形状,图例文字颜色与图例一致及图例文字多种颜色的配置

    本文详细讲解了如何使用ECharts进行图例配置,包括图例形状的选择(如circle, rect等)、图例文字颜色与图例形状一致性的设置,以及如何实现图例文字多种颜色的配置。

    2024年02月06日
    浏览(54)
  • 用颜色表示数据的第三个维度

    横纵坐标显示时间和空间后,第三个数据的特征有时就不好表示了,3d图有的时候看起来更复杂。对于某些情况,用颜色来表示更加简洁。 这里展示的效果图有点像烟花,所以选了这张,但是换其他的cmap才能使得数据展示更加直观 先放一个快捷简洁版本,后面将细节(高级

    2024年02月13日
    浏览(54)
  • 13. unity粒子特效--发射模块、各种发射器形状、粒子渐变(颜色/大小)

    1. 发射模块(Emission) 匀速发射 : Rate over Time :每秒钟发射的粒子数 Rate over Distance :每移动一米发射的粒子个数 两者可指定其一:若仅指定 Rate over Time ,则粒子根据时间的变化进行发射,若仅指定 Rate over Distance ,则粒子系统每词移动时才发射,不移动不发射 爆发式发射

    2024年02月15日
    浏览(49)
  • 即时设计:打造独一无二的头像,让设计师的创意之路更轻松愉快

    头像仓库 更多内容 在这个追求个性化的时代,个性头像已经成为了展示个人品味和风格的重要元素。然而,对于设计师来说,创作独特的头像往往需要耗费大量时间和精力。今天,我们向您推荐一款神奇的软件,它可以帮助设计师轻松生成好看的头像,还支持自定义修改头

    2024年02月03日
    浏览(43)
  • 个性化纹身设计,Midjourney带你探索独一无二的艺术之美

    hello,大家好,欢迎回来。 在当今社会,纹身已经变得非常常见。 在寻求与众不同的个性化纹身时,你是否曾经为了找不到独特的设计而苦恼? 现在,Midjourney将为你打开一扇全新的艺术之门,引领你探索纹身设计的无穷魅力。 我们深知每一个纹身都承载着个人的故事和情感

    2024年02月22日
    浏览(51)
  • Java设计模式之单例模式详解--独一无二的事物

    本文主要讲述 单例模式 ,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。 单例模式是23种设计模式中 创建型模式 的一种,通过单例模式的方法创建的类在当前进程或者线程中只有一个实例。单例模式有两种比较常见的实现方式: 饿汉式

    2024年02月07日
    浏览(45)
  • Java课堂|独一无二的事物(设计模式之单例模式)

    本文主要讲述 单例模式 ,文中使用通俗易懂的案例,使你更好的学习本章知识点并理解原理,做到有道无术。 单例模式是23种设计模式中 创建型模式 的一种,通过单例模式的方法创建的类在当前进程或者线程中只有一个实例。单例模式有两种比较常见的实现方式: 饿汉式

    2024年02月07日
    浏览(44)
  • 【Python】Python高校图书馆书籍管理系统(登录、注册、功能源码设计)【独一无二】

    👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术 本文是基于PyQT5开发的一款Python高校图书馆书籍管理系统,源码可以关注公众号,后台回复: 高校图书馆管理系统 获

    2024年02月08日
    浏览(44)
  • 【MATLAB实验】MATLAB矩阵与数组及改变矩阵形状(rot90函数逆时针旋转、矩阵转置)

    目录 Matlab矩阵 矩阵除法 矩阵乘方 数组的乘和除 数组的乘方 数据的输出格式  常用函数的应用  矩阵的建立 冒号表达式 结构矩阵和单元矩阵 结构矩阵: 单元矩阵: 矩阵元素的引用方式 利用冒号表达式来获取子矩阵 利用空矩阵删除矩阵中的元素  改变矩阵的形状(使用

    2024年01月18日
    浏览(50)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包