#!/usr/bin/env python import sys import select import time import threading import random tmout = 3.0 class Empty: def __init__(self, dic={}): self.to_attr(dic) def to_attr(self, dic): for (k, v) in dic.items(): setattr(self, k, v) return self def str_div(s, delim, all_if_not=True): if delim in s: i = s.index(delim) return ( s[:i], s[i+len(delim):] ) return (s, '') if all_if_not else ('', s) split_from = lambda s: str_div(s, '> ', all_if_not=False) readable = lambda fd: select.select([fd], [], [], tmout)[0] == [fd] lock = threading.RLock() def out(s): lock.acquire() sys.stdout.write(s + '\n') sys.stdout.flush() lock.release() def inp(): s = None if readable(sys.stdin): s = sys.stdin.readline().strip() return s def out_to(s, to): out(s + ' >' + to) vstr = lambda v: 'cho' if v else 'han' def toba_new(): rests = {} deals = { True: {}, False: {} } def deals_clear(): deals[True] = {} deals[False] = {} e = Empty() e.stat = 'DEAL' e.oya = 0 def deal(f, s): v = True if 'cho' in s else False if 'han' in s else None if v == None: out_to('? ' + s, f) return n = 1 try: n = int( ''.join( filter( lambda c: c.isdigit(), s ) ) ) except: pass if f not in rests: rests[f] = 20 rest = rests.get(f) n = min(n, rest) if n == 0: out('no, you have {}'.format(rest), f) return deal = deals.get(v) if f in deal: n += deal.get(f) deal[f] = n rests[f] -= n out_to('deal {} {}, you have {}'.format(vstr(v), n, rests.get(f)), f) th_quit = threading.Event() def func_inp(): while not th_quit.wait(0): s = inp() if not s: continue (f, s) = split_from(s) if not f or f == 'srv': continue if e.stat == 'DEAL': deal(f, s) else: out_to('no !, shimekittayo', f) th = threading.Thread( target=func_inp ) th.daemon = True sum_v = lambda v: sum( deals.get(v).values() ) sums = lambda : ( sum_v(True), sum_v(False) ) is_nobody = lambda : max( sums() ) == 0 def aori(): def nokori(sec): out('nokori {} sec'.format(sec)) def msg(rsec, wsec): (sum_t, sum_f) = sums() if sum_t < sum_f: out('cho kata naika ?') elif sum_t > sum_f: out('han kata naika ?') else: out('cho or han, hatta hatta !') nokori(rsec) time.sleep(wsec) return rsec - wsec rsec = 30 rsec = msg(rsec, 10) rsec = msg(rsec, 10) rsec = msg(rsec, 5) for i in range(rsec, 0, -1): out('nokori {} sec'.format(i-1)) time.sleep(1) e.stat = 'SYOUBU' def syoubu(): out('deal cho') for (k, v) in deals.get(True).items(): out(' {}: {}'.format(k, v)) out('deal han') for (k, v) in deals.get(False).items(): out(' {}: {}'.format(k, v)) if is_nobody(): out('no game, retry') return out('syoubu !') time.sleep(3) a = random.randrange(6) + 1 b = random.randrange(6) + 1 ss = [ [ ' ', ' ()', ' ()', '() ()', '() ()', '() ()' ], [ ' () ', ' ', ' () ', ' ', ' () ', '() ()' ], [ ' ', '() ', '() ', '() ()', '() ()', '() ()' ], ] for i in range(3): s = '|' + ss[i][a-1] + '| |' + ss[i][b-1] + '|' out(s) v = (a + b) % 2 == 0 out(vstr(v) + '!') for (k, v) in deals.get(v).items(): rests[k] += v * 2 e.oya += sum_v(not v) - sum_v(v) * 2 deals_clear() for (k, v) in sorted( rests.items(), key=lambda kv: -kv[1]): out('{}: {}'.format(k, v)) out('oya: {}'.format(e.oya)) def main(): th.start() for i in range(20): aori() syoubu() time.sleep(3) e.stat = 'DEAL' th_quit.set() th.join() return e.to_attr( locals() ) if __name__ == "__main__": toba = toba_new() toba.main() # EOF