zoukankan      html  css  js  c++  java
  • 连连看地图生成算法

    元素个数:n行*m列;元素种类有c种

    数组 touchObject[n][m];  //连连看元素数组

    数组 objectTypeBeenUsedCount[c] //连连看元素类型使用统计

    方式1:末尾补全法

    随机生成数组touchObject里前m*n-c个元素,对应的objectTypeBeenUsedCount[c]++

    遍历objectTypeBeenUsedCount,找出其中为奇数的元素类型,补全在touchObject最后c个空余位置

    补全touchObject空余的元素,为了简单,用同种元素补全,并打乱

    方式2: 根据奇数*2 =偶数的原则

    1:随机生成touchObject一半的元素,将其拷贝到另外一半(用于确保元素都为偶数)

    2:遍历数组,打乱位置

    下面给出方式1的lua实现

    function generateRow(rowAmount,ColumnAmount,TypeAmount)
    
      math.randomseed(os.time())
    
      local touchObjectArray={}
      local typeUsedAmountArray = {}
      local totalAmount = rowAmount*ColumnAmount-TypeAmount
      local currentItemAmount=0
      local swapTempValue=0
    
      for i=1,rowAmount do
         for j=1,ColumnAmount do
            local currentType = math.random(TypeAmount)
    
            currentItemAmount = currentItemAmount+1
            touchObjectArray[currentItemAmount]= currentType
    
            local currentTypeUsedAmount = typeUsedAmountArray[currentType] or 0
            currentTypeUsedAmount = currentTypeUsedAmount+1
            typeUsedAmountArray[currentType] = currentTypeUsedAmount
    
            if currentItemAmount>totalAmount then
               break
            end
         end
      end
    
      for i,v in ipairs(typeUsedAmountArray) do
    
         if v %2 >0 then
           currentItemAmount = currentItemAmount+1
           touchObjectArray[currentItemAmount] = i
         end
      end
    
      local leftAmount = totalAmount+TypeAmount-currentItemAmount
    
      if leftAmount>0 then
         local paddingType = math.random(TypeAmount)
    
          for i=1, leftAmount do
           --remix the padding value
           local indexToSwap = math.random(currentItemAmount)
           swapTempValue =touchObjectArray[indexToSwap]
           touchObjectArray[indexToSwap]=paddingType
    
           currentItemAmount = currentItemAmount+1
           touchObjectArray[currentItemAmount]=swapTempValue
          end
      end
    
      return touchObjectArray
    end
    
    
    local lianLianKanMapArray =generateRow(4,5,4)
    
    for i=1,#lianLianKanMapArray do
        print(lianLianKanMapArray[i])
    end
  • 相关阅读:
    nginx配置反向代理
    hyperchain HVM使用java编写智能合约的编译、部署流程
    leetcode 140单词拆分Ⅱ
    bomblab phase5
    bomb lab 二三阶段
    2021暑假算法学习笔记(基础复习)#2
    2021暑假算法学习笔记(基础复习)#1
    O(logn)最长上升子序列并输出
    A Daily Topic # 7 阶乘的和(二进制/枚举)
    A Daily Topic # 6 星期几(模拟)
  • 原文地址:https://www.cnblogs.com/kimmy/p/3622349.html
Copyright © 2011-2022 走看看