mirror of
https://gitea.com/SweetSea-ButImNotSweet/tromi_mobile.git
synced 2025-01-08 17:33:09 +08:00
149 lines
4.7 KiB
Lua
149 lines
4.7 KiB
Lua
local Object = require 'libs.classic'
|
|
|
|
local Randomizer = Object:extend()
|
|
|
|
local highest_count = 0
|
|
|
|
function Randomizer:new(always, seed)
|
|
self.always = always
|
|
if seed ~= nil then
|
|
self.seed = seed
|
|
else
|
|
self.seed = love.math.random(1, 9007199254740991)
|
|
end
|
|
self.drought = {
|
|
I = 0,
|
|
J = 0,
|
|
L = 0,
|
|
T = 0,
|
|
S = 0,
|
|
Z = 0,
|
|
O = 0
|
|
}
|
|
self.droughted_deals = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}
|
|
self.piece_counts = {
|
|
I = 0,
|
|
J = 0,
|
|
L = 0,
|
|
T = 0,
|
|
S = 0,
|
|
Z = 0,
|
|
O = 0
|
|
}
|
|
self.piece_round = 0
|
|
self:initialize()
|
|
end
|
|
|
|
function Randomizer:nextPiece()
|
|
return self:generatePiece()
|
|
end
|
|
|
|
function Randomizer:runTest()
|
|
local i_distance = 0
|
|
local highest_distance = 0
|
|
local distance_total = 0
|
|
local i_appearances = 0
|
|
local dupe = 0
|
|
local trip = 0
|
|
local quad = 0
|
|
local quin = 0
|
|
local lastpiece = 0
|
|
local lastpiece2 = 0
|
|
local lastpiece3 = 0
|
|
local lastpiece4 = 0
|
|
local pieceseq_rep = 0
|
|
local pieceseq = {}
|
|
local last_pieceseq = {}
|
|
local highest_discrepancy = 0
|
|
local discrepancy = self.piece_counts[table.highest(self.piece_counts)] - self.piece_counts[table.lowest(self.piece_counts)]
|
|
local total_chance = 0
|
|
for i=0, 750000 do
|
|
piece = self:generatePiece()
|
|
if #pieceseq < 7 then
|
|
table.insert(pieceseq, piece)
|
|
else
|
|
--print(table.concat(pieceseq))
|
|
if table.concat(pieceseq) == table.concat(last_pieceseq) then
|
|
pieceseq_rep = pieceseq_rep + 1
|
|
end
|
|
last_pieceseq = copy(pieceseq)
|
|
pieceseq = {}
|
|
end
|
|
if piece == lastpiece then dupe = dupe + 1 end
|
|
if piece == lastpiece and piece == lastpiece2 then trip = trip + 1 end
|
|
if piece == lastpiece and piece == lastpiece2 and piece == lastpiece3 then quad = quad + 1 end
|
|
if piece == lastpiece and piece == lastpiece2 and piece == lastpiece3 and piece == lastpiece4 then quin = quin + 1 end
|
|
if piece == 'I' then
|
|
distance_total = distance_total + i_distance
|
|
i_appearances = i_appearances + 1
|
|
i_distance = 0
|
|
else i_distance = i_distance + 1 end
|
|
if highest_distance < i_distance then highest_distance = i_distance end
|
|
lastpiece4 = lastpiece3
|
|
lastpiece3 = lastpiece2
|
|
lastpiece2 = lastpiece
|
|
lastpiece = piece
|
|
--if self.piece_round <= 750 then print(discrepancy) end
|
|
local new_discrepancy = self.piece_counts[table.highest(self.piece_counts)] - self.piece_counts[table.lowest(self.piece_counts)]
|
|
if new_discrepancy > discrepancy then highest_discrepancy = new_discrepancy end
|
|
discrepancy = new_discrepancy
|
|
local chance = 0
|
|
for piece,drought in pairs(self.drought) do
|
|
local piece_chance = 0.14/( ((self.drought[table.highest(self.drought)]+1)-drought) / (self.drought[table.highest(self.drought)]) )
|
|
chance = chance + piece_chance
|
|
end
|
|
chance = chance / 7
|
|
total_chance = total_chance + chance
|
|
end
|
|
--something = something / 750000
|
|
print(string.format('dupes: %d, trips: %s, quads: %s, quins: %s, highest i distance: %d, average i distance: %f, pieceseq reps: %d, highest discrepancy:%d, average chance:%f\ndrought lengths dealt: %s', dupe, trip, quad, quin, highest_distance, distance_total/i_appearances, pieceseq_rep, highest_discrepancy, total_chance/750000, table.concat(self.droughted_deals, '-')))
|
|
for piece,count in pairs(self.piece_counts) do
|
|
print(piece..' '..count)
|
|
end
|
|
end
|
|
|
|
function Randomizer:initialize()
|
|
local start_pieces = {"I", "J", "L", "T"}
|
|
local shapes = {"I", "J", "L", "T", "S", "Z", "O"}
|
|
love.math.setRandomSeed(self.seed)
|
|
self.drought[table.remove(shapes, love.math.random(1, 4))] = 10
|
|
for i=4,9 do
|
|
self.drought[table.remove(shapes, love.math.random(1, #shapes))] = i
|
|
end
|
|
|
|
--self:runTest()
|
|
end
|
|
|
|
function Randomizer:generatePiece(always)
|
|
if self.always then
|
|
return "I"
|
|
end
|
|
|
|
local shapes = {"I", "J", "L", "T", "S", "Z", "O"}
|
|
local new_piece = shapes[love.math.random(1,7)]
|
|
local chance = love.math.random(0,self.drought[table.highest(self.drought)])
|
|
while self.drought[new_piece] < chance do
|
|
new_piece = shapes[love.math.random(1,7)]
|
|
end
|
|
for piece,drought in pairs(self.drought) do
|
|
if drought >= 10 then
|
|
new_piece = piece
|
|
end
|
|
end
|
|
generated_piece = new_piece
|
|
|
|
for piece,drought in pairs(self.drought) do
|
|
if new_piece ~= piece then self.drought[piece] = self.drought[piece] + 1
|
|
else
|
|
if drought < #self.droughted_deals then self.droughted_deals[drought+1] = self.droughted_deals[drought+1] + 1 end
|
|
self.piece_counts[piece] = self.piece_counts[piece] + 1
|
|
self.drought[piece] = 0
|
|
end
|
|
end
|
|
self.piece_round = self.piece_round + 1
|
|
|
|
return generated_piece
|
|
end
|
|
|
|
return Randomizer
|