mirror of
https://gitea.com/SweetSea-ButImNotSweet/tromi_mobile.git
synced 2025-01-08 17:33:09 +08:00
first commit
This commit is contained in:
148
game/randomizer.lua
Normal file
148
game/randomizer.lua
Normal file
@@ -0,0 +1,148 @@
|
||||
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
|
||||
Reference in New Issue
Block a user