24点求解和生成题目

24点小游戏,是一款益智游戏,通过给出的四个数,通过加减乘除混合运算,使得等式成立结果为24即可

锻炼大脑思维逻辑,值得学习

一下是借鉴了很多大佬写的程序

综合所用

由星空露珠工作室制作汇总

作者:韩永旗

作者迷你号:247312290

 

 

 

15a57fca5a894c62a40d705bb7d64a33.jpg

 

--24点游戏制作
--星空露珠工作室出品
local flag=false
  local operator={'+','-','*','/'}
  local number,number0,numbernew={},{},{}
  local tb1,tb0,tbl0,tbl1,tbl2={},{},{},{},{}
--运算两个数返回运算值
  local function calcute(number1,number2,operator0) 
    --print(number1,number2,operator0)
     if     operator0=='+' then return number1+number2
     elseif operator0=='-' then return number1-number2
     elseif operator0=='*' then return number1*number2
     elseif operator0=='/' and number2~=0 then return number1/number2
     else return -1 
     end
  end

  --获取重复数组个数 
  local function chackmain(tbl)
    local tbl0={}
    local tbl1={}
    local tbl2={}
    for k0,v0 in ipairs(tbl)
      if tbl0[v0]==nil then tbl1[#tbl1+1]=v0 tbl0[v0]=1 else tbl0[v0]=tbl0[v0]+1 end
    end
     if     #tbl1==1 then           tbl2={tbl1[1],tbl1[1],tbl1[1],tbl1[1]}   
     elseif #tbl1==3 then  
       if     tbl0[tbl1[1]]==2 then tbl2={tbl1[2],tbl1[3],tbl1[1],tbl1[1]}   
       elseif tbl0[tbl1[2]]==2 then tbl2={tbl1[1],tbl1[3],tbl1[2],tbl1[2]}   
       elseif tbl0[tbl1[3]]==2 then tbl2={tbl1[1],tbl1[2],tbl1[3],tbl1[3]}   
       end     
     elseif #tbl1==2 then
       if     tbl0[tbl1[1]]==2 then tbl2={tbl1[1],tbl1[1],tbl1[2],tbl1[2]}   
       elseif tbl0[tbl1[1]]==1 then tbl2={tbl1[1],tbl1[2],tbl1[2],tbl1[2]}   
       elseif tbl0[tbl1[1]]==3 then tbl2={tbl1[2],tbl1[1],tbl1[1],tbl1[1]}   
       end    
     elseif #tbl1==4 then           tbl2={tbl1[1],tbl1[2],tbl1[3],tbl1[4]}   
     end
    return tbl1,tbl0,tbl2
  end

--进行运算组合
  local function chackmain2(num1,num2,num3,num4)
    for i=1,4 do
      operator1=operator[i]
      firstResult =calcute(num1,num2,operator1)
      midResult   =calcute(num2,num3,operator1)
      tailResult  =calcute(num3,num4,operator1)
     for j=1,4 do
      operator2=operator[j]
      firstMidResult = calcute(firstResult,num3,operator2)
      firstTailResult= calcute(num3,num4,operator2)
      midFirstResult = calcute(num1,midResult,operator2)
      midTailResult  = calcute(midResult,num4,operator2)
      tailMidResult  = calcute(num2,tailResult,operator2)
      for k=1,4 do
       operator3=operator[k]
         if calcute(firstMidResult,num4,operator3)==24 then
                        str="(("..num1..operator1..num2..")"..operator2..num3..")"..operator3..num4
                        --results.add(expression)
                        flag = true  print(str)
         end
         if calcute(firstResult,firstTailResult,operator3) == 24
                        str= "("..num1..operator1..num2..")"..operator3.."("..num3..operator2..num4..")"
                        --results.add(expression)
                        flag = true  print(str)
         end            
         if calcute(midFirstResult,num4,operator3) == 24
                        str= "("..num1..operator2.."("..num2..operator1..num3.."))"..operator3..num4
                        --results.add(expression)
                        flag = true  print(str)
         end
         if calcute(num1,midTailResult,operator3) == 24
                        str= num1..operator3.."(("..num2..operator1..num3..")"..operator2..num4..")"
                        --results.add(expression)
                        flag = true  print(str)
         end                    
         if calcute(num1,tailMidResult,operator3) == 24
                        str= num1..operator3.."("..num2..operator2.."("..num3..operator1..num4.."))"
                        --results.add(expression)
                        flag = true  print(str)
         end         
      end
     end 
    end
  end
  


--各种排序组合
  local function chackmain1(numbernew)
    local tb1,tb0={},{}  
    local number={}
    local tb1,tb0,number=chackmain(numbernew)     
    --print(unpack(tb1))
    --print(unpack(number)) 
    
     if     #tb1==1 then      chackmain2(number[1],number[2],number[3],number[4])
     elseif #tb1==3 then      chackmain2(number[1],number[2],number[4],number[4])
                              chackmain2(number[1],number[4],number[2],number[4])
                              chackmain2(number[1],number[4],number[4],number[2])
                              chackmain2(number[2],number[1],number[4],number[4])
                              chackmain2(number[2],number[4],number[1],number[4])
                              chackmain2(number[2],number[4],number[4],number[1])
                              chackmain2(number[4],number[4],number[2],number[1])
                              chackmain2(number[4],number[2],number[4],number[1])
                              chackmain2(number[4],number[4],number[1],number[2])
                              chackmain2(number[4],number[1],number[4],number[2])
                              chackmain2(number[4],number[1],number[2],number[4])
                              chackmain2(number[4],number[2],number[1],number[4])
     elseif #tb1==2 then
       if math.abs(tb0[tb1[1]]-tb0[tb1[2]])==0 then 
                              chackmain2(number[2],number[2],number[4],number[4])
                              chackmain2(number[2],number[4],number[2],number[4])
                              chackmain2(number[2],number[4],number[4],number[2])
                              chackmain2(number[4],number[2],number[2],number[4])
                              chackmain2(number[4],number[2],number[4],number[2])
                              chackmain2(number[4],number[4],number[2],number[2])        
       elseif math.abs(tb0[tb1[1]]-tb0[tb1[2]])==2 then 
                              chackmain2(number[1],number[4],number[4],number[4])
                              chackmain2(number[4],number[1],number[4],number[4])
                              chackmain2(number[4],number[4],number[1],number[4])
                              chackmain2(number[4],number[4],number[4],number[1])    
       end    
     elseif #tb1==4 then
        for i=1,4 do 
          for j=1,4 do
           if i~=j then 
            for m=1,4 do
             if m~=i and m~=j then               
              for n=1,4 do
               if n~=i and n~=j and n~=m then                  
                chackmain2(number[i],number[j],number[m],number[n])
                --print(number[i],number[j],number[m],number[n])
                end
              end
            end
           end
          end
         end
        end     
     end
   end

--全部题目生成 也可不需要生成,生成时判断可否有解
  local function main0()
   local number={}
   for i=1,13 do
     for j=i,13 do
       for m=j,13 do
         for n=m,13 do  
           flag = false
          local number={i,j,m,n}         
           chackmain1(number)
           if  flag==true then  
           print(unpack(number))
           end
         end      
       end
     end
   end
  end

--main0()    --生成全部
chackmain1({3,3,5,6})  --输入求解

          
          
  
  

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值