1
0
Fork 0
mirror of https://github.com/shlomif/PySolFC.git synced 2025-04-05 00:02:29 -04:00
PySolFC/scripts/mahjongg_utils.py

209 lines
5 KiB
Python
Executable file

#!/usr/bin/env python
# -*- mode: python; coding: utf-8; -*-
import os
import sys
alpha = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'
def decode_layout(layout):
# decode tile positions
assert layout[0] == "0"
assert (len(layout) - 1) % 3 == 0
tiles = []
for i in range(1, len(layout), 3):
n = alpha.find(layout[i])
level, height = n / 7, n % 7 + 1
tx = alpha.find(layout[i+1])
ty = alpha.find(layout[i+2])
assert n >= 0 and tx >= 0 and ty >= 0
for tl in range(int(level), int(level) + int(height)):
tiles.append((tl, tx, ty))
tiles.sort()
return tiles
def encode_layout(layout):
# encode positions
s = '0'
# layout.sort()
x_max = max([t[1] for t in layout])
y_max = max([t[2] for t in layout])
for x in range(x_max+1):
for y in range(y_max+1):
mylist = [t[0] for t in layout if t[1] == x and t[2] == y]
if not mylist:
continue
i_0 = i_n = mylist[0]
for i in mylist[1:]:
if i == i_n+1:
i_n = i
continue
s += alpha[i_0*7+(i_n-i_0)] + alpha[x] + alpha[y]
i_0 = i_n = i
s += alpha[i_0*7+(i_n-i_0)] + alpha[x] + alpha[y]
# for tl, tx, ty in layout:
# s += alpha[tl*7]+alpha[tx]+alpha[ty]
return s
def parse_kyodai(filename):
# Kyodai (http://www.kyodai.com/)
fd = open(filename)
fd.readline()
fd.readline()
s = fd.readline()
i = 0
y = 0
z = 0
layout = []
while True:
ss = s[i:i+34]
if not ss:
break
x = 0
for c in ss:
if c == '1':
layout.append((z, x, y))
x += 1
y += 1
if y == 20:
y = 0
z += 1
i += 34
layout.sort()
return normalize(layout)
def parse_ace(filename):
# Ace of Penguins (http://www.delorie.com/store/ace/)
mylist = open(filename).read().replace('\n', '').split(',')
mylist.reverse()
layout = []
layer = 0
while True:
x = int(mylist.pop())
if x == 127:
break
if x <= 0:
x = -x
y, z = int(mylist.pop()), int(mylist.pop())
if layer < z:
layer = z
layout.append((z, x, y))
layout.sort()
return normalize(layout)
def parse_kmahjongg(filename):
# KMahjongg
fd = open(filename)
fd.readline()
lines = fd.readlines()
level = 0
n = 0
layout = []
for s in lines:
i = 0
while True:
i = s.find('1', i)
if i >= 0:
layout.append((level, i, n))
i += 1
else:
break
n += 1
if n == 16:
n = 0
level += 1
layout.sort()
return normalize(layout)
def parse_xmahjongg(filename):
if open(filename).readline().startswith('Kyodai'):
return parse_kyodai(filename)
fd = open(filename)
layout = []
for s in fd:
s = s.strip()
if not s:
continue
if s.startswith('#'):
continue
row, col, lev = s.split()
layout.append((int(lev), int(col), int(row)))
layout.sort()
return normalize(layout)
def normalize(mylist):
minx = min([i[1] for i in mylist])
if minx:
mylist = [(i[0], i[1]-minx, i[2]) for i in mylist]
miny = min([i[2] for i in mylist])
if miny:
mylist = [(i[0], i[1], i[2]-miny) for i in mylist]
return mylist
if __name__ == '__main__':
gameid = 5200
usage = '''usage:
%s TYPE FILE ...
where TYPE are:
k | kyodai - parse kyodai file
x | xmahjongg - parse xmahjongg file
m | kmahjongg - parse kmahjongg file
a | ace - parse ace of penguins file
''' % sys.argv[0]
if len(sys.argv) < 3:
sys.exit(usage)
if sys.argv[1] in ['k', 'kyodai']:
parse_func = parse_kyodai
elif sys.argv[1] in ['x', 'xmahjongg']:
parse_func = parse_xmahjongg
elif sys.argv[1] in ['m', 'kmahjongg']:
parse_func = parse_kmahjongg
elif sys.argv[1] in ['a', 'ace']:
parse_func = parse_ace
else:
sys.exit(usage)
for filename in sys.argv[2:]:
layout = parse_func(filename)
layout = normalize(layout)
# print filename, len(layout)
s = encode_layout(layout)
# check
lt = decode_layout(s)
if lt != layout:
print('*** ERROR ***')
else:
# print s
gamename = os.path.split(filename)[1].split('.')[0]
# classname = gamename.replace(' ', '_')
# classname = 'Mahjongg_' + re.sub('\W', '', classname)
ncards = len(layout)
if ncards != 144:
print('''r(%d, "%s", ncards=%d, layout="%s")
''' % (gameid, gamename, ncards, s))
else:
print('''r(%d, "%s", layout="%s")
''' % (gameid, gamename, s))
gameid += 1