#!/usr/local/bin/ruby # ******************************************** # * Sega Tetris Mino Generator * # * Usage: segatet.rb outfile * # * 2020.10.30 * # ******************************************** o1file = ARGV.shift if (o1file == nil) puts " Usage: segatet.rb out_file" exit end o1f = open(o1file, "w") p o1file seed = 0x2A6D365A loop = 0x40000 + 0x40000 + 1 # 262144(=0x40000)でミノ周期が一周らしい # # 2周+1回ループさせてみる # for lp in 1..loop do t0 = seed t1 = (seed * 0x29) & 0xffffffff seed = (t1 * 0x10001) & 0xffffffff t2 = ( (t1 / 0x10000) + (t1 % 0x10000) ) | (t0 & 0xffff0000) t3 = (t2 & 0x3f) % 7 case t3 when 0 then mino = "I" when 1 then mino = "Z" when 2 then mino = "S" when 3 then mino = "O" when 4 then mino = "T" when 5 then mino = "L" when 6 then mino = "J" else mino = "ERROR" end o1f.printf("%08X %s\n",seed,mino) end o1f.close ######## url("https://tetris.wiki/Sega_Randomizer") #C.lang# #include #C.lang# #include #C.lang# #C.lang# #define DEFAULT_SEED 0x2A6D365A #C.lang# #define HI(lw) ((lw) & 0xFFFF0000) #C.lang# #define LO(lw) ((lw) & 0xFFFF) #C.lang# #define LW(lw) ((lw) << 16) #C.lang# #define RW(lw) ((lw) >> 16) #C.lang# uint32_t rand(uint32_t *seedp) { #C.lang# uint32_t temp, oldseed; #C.lang# #C.lang# temp = (*seedp == 0u) ? DEFAULT_SEED : *seedp; #C.lang# oldseed = temp; #C.lang# temp *= 41u; #C.lang# *seedp = temp + LW(temp); #C.lang# return (LO(temp) + RW(temp)) | HI(oldseed); #C.lang# } #C.lang# #C.lang# void newsequence(uint8_t *seq, size_t len, uint32_t *seedp) { #C.lang# for (size_t i = 0u; i < len; i++) { #C.lang# seq[i] = (rand(seedp) & 0x3F) % 7; #C.lang# } #C.lang# } #C.lang# #C.lang# void printsequence(uint8_t *seq, size_t len) { #C.lang# for (size_t i = 0u; i < len; i++) { #C.lang# char c; #C.lang# #C.lang# switch (seq[i]) { #C.lang# case 0: c = 'I'; break; #C.lang# case 1: c = 'Z'; break; #C.lang# case 2: c = 'S'; break; #C.lang# case 3: c = 'O'; break; #C.lang# case 4: c = 'T'; break; #C.lang# case 5: c = 'L'; break; #C.lang# case 6: c = 'J'; break; #C.lang# default: c = '?'; break; #C.lang# } #C.lang# putchar(c); #C.lang# } #C.lang# putchar('\n'); #C.lang# }