diff -ur v3/pac.py v4/pac.py --- v3/pac.py 2017-10-17 03:15:30.000000000 +0900 +++ v4/pac.py 2017-10-17 23:00:00.000000000 +0900 @@ -14,6 +14,8 @@ MONS = 'RCMY' MOVES = 'P' + MONS +dot_n = len( pac_buf.poss('.') + pac_buf.poss('O') ) + stat_inf = dict( map( lambda c: ( c, kon.Empty() ), MOVES ) ) stat_get = lambda c: stat_inf.get(c) @@ -71,16 +73,13 @@ mon_price.check() - stat.th.set_hz( get_hz( c, *arr.pos(c) ) ) - - mon_hz_rate = { 'weak': 0.3, 'blink': 0.3, 'ret': 1.5 } warp_rate = { '1': 0.8, '2': 0.6, '3': 0.4, '4': 0.3, 'L': 0.2, 'R': 0.2 } arr_xy_to_show_xy = lambda x, y: (x * 2, y + 1) # for aspect and score (w, h) = pac_buf.size() -bit_cs = MOVES + 'O.=#' +bit_cs = MOVES + 'O.=#B' arr = kon.arr_xy_bit_c_move_new( w, h, bit_cs, arr_xy_to_show_xy) is_warp = lambda x, y, d: ( lambda wc: wc if wc in ('L', 'R') and wc.lower() == d else False )( warp_buf.get(x, y) ) @@ -118,20 +117,20 @@ next_ds = lambda x, y, c: filter( lambda d: is_step(x, y, c, d), DIRS ) def arr_msg_pause(show_lst, x=None, y=None, sec=1.0, xcen=True): - game_ev.set('stop') + ths_stop() (bx, by) = pac_buf.pos('B') x = bx if x == None else x y = by if y == None else y arr.msg_pause(x, y, show_lst, sec, xcen) - game_ev.set('start') + ths_start() def pac_slider(slider): - game_ev.set('stop') + ths_stop() c = 'P' bak = arr.get_sdic(c) arr.set_sdic( c, ('slider', slider) ) slider.wait() - game_ev.set('start') + ths_start() return bak game_ev = kon.evt() @@ -159,13 +158,8 @@ break elif mode != 'ret' and not NO_DIE: mov.en = False - ss = [ '()', '||', ')(', '><', '--', '><', '--', '><', '--', '__', ' ' ] - lsts = map( lambda s: mk_slst(s, 'yellow', True), ss ) - lsts.append( [ SPC ] ) - bak = pac_slider( kon.slider(lsts, 5.0, None, True, repeat=False) ) v = 'over' if spare(-1) == 'over' else 'die' game_ev.set(v) - arr.set_sdic('P', bak) break def get_hz(c, nx, ny): @@ -212,25 +206,79 @@ arr.set_dir( c, kon.bak_dir( arr.get_dir(c) ) ) stat.timer.start( tmr_f, [c], short_sec(15.0) ) +round = kon.gval(1) + +def bonus_new(): + c = 'B' + (x, y) = pac_buf.pos(c) + + cherry = ( [ ('8', 'red', True), ('>', 'green', False) ], 100 ) + strawberry = ( [ ('<', 'magenta', True), ('k', 'green', False) ], 300 ) + orange = ( [ ('O', 'yellow', 'True'), ('-', 'green', False) ], 500 ) + apple = ( [ ('()', 'red', True) ], 700 ) + melon = ( [ ('<>', 'green', True) ], 1000 ) + galaxyan = ( [ ('<', 'red', False), ('<', 'blue', False) ], 2000 ) + bell =( [ ('.>', 'white', True) ], 3000 ) + key = ( [ ('=', 'white', False), ('m', 'cyan', False) ], 5000 ) + + d = { + 1: cherry, 2: strawberry, + 3: orange, 4: orange, + 5: apple, 6: apple, + 7: melon, 8: melon, + 9: galaxyan, 10: galaxyan, + 11: bell, 12: bell, + } + get_inf = lambda: d.get( round(), key ) + get_slst = lambda: get_inf()[0] + + tmr = kon.timer_new() + + e = kon.Empty() + e.eat_cnt = 0 + e.get_v = lambda: get_inf()[1] + + def hide(): + tmr.cancel() + arr.rm(c, flush_f=True) + e.hide = hide + def show(): + hide() + arr.set_sdic( c, ( '', get_slst() ) ) + arr.set( x, y, c, flush_f=True ) + sec = short_sec(15.0) + tmr.start( hide, [], sec ) + e.show = show + def eat(): + e.eat_cnt += 1 + hide() + (vx, vy) = arr_xy_to_show_xy( *pac_buf.size() ) + vx -= 3 * e.eat_cnt + kon.shows(vx, vy, get_slst(), flush_f=True) + e.eat = eat + return e + +bonus = bonus_new() + def try_eat(x, y): - c = '.' if arr.get(x, y, '.') else 'O' if arr.get(x, y, 'O') else '' - if not c: + lst = filter( lambda c: c in '.OB', arr.gets(x, y) ) + if not lst: return - arr.set(x, y, c, False) - stat_get('P').dot -= 1 + c = lst[0] + + if c in '.O': + arr.set(x, y, c, False) + stat_get('P').dot -= 1 + else: + bonus.eat() - score( 50 if c == 'O' else 10 ) + score( 50 if c == 'O' else 10 if c == '.' else bonus.get_v() ) if c == 'O': mon_weak() + if c in '.O' and dot_n - stat_get('P').dot in (70, 170): + bonus.show() if stat_get('P').dot <= 0: mov.en = False - c = '#' - bak = arr.get_sdic(c) - lst = map( lambda col: mk_slst('==', col, False), ('white', 'blue') ) - slider = kon.slider(lst, 4.0, None, True) - arr.set_sdic( c, ('slider', slider) ) - kon.sleep(2.0) - arr.set_sdic(c, bak) game_ev.set('clear') kdir = kon.gval('') @@ -311,7 +359,6 @@ return rand_sel(ds) def th_mon(c): - stat = stat_get(c) (px, py) = arr.pos(c) ds = next_ds(px, py, c) @@ -327,6 +374,8 @@ elif mode == 'ret' and mon_ret_buf.get(nx, ny) == ' ': mon_mode(c, 'cage') + stat_get(c).th.set_hz(hz) + def score_new(): (x, y, lb, col, r) = (0, 0, 'score ', 'white', False) e = kon.Empty() @@ -380,18 +429,43 @@ mon_turn = lambda: map( lambda c: arr.set_dir( c, kon.bak_dir( arr.get_dir(c) ) ), MONS ) run_mode = kon.slider( ['pato', 'chase'], f=mon_turn ) -def work(): +def init_once(): kon.clr() - dot_n = len( pac_buf.poss('.') + pac_buf.poss('O') ) + lst = map( lambda r: mk_slst('O ', 'yellow', r), (False, True) ) + arr.set_sdic( 'O', ( 'slider', kon.slider(lst, 2.0, None, True) ) ) + + arr.set_sdic( 'P', ('func', pac_show) ) + arr.set_sdic( '#', ('func', blk_show) ) + arr.set_sdic( '.', ( '', mk_slst('. ', 'white', False) ) ) + arr.set_sdic( '=', ( '', mk_slst('==', 'yellow', False) ) ) + + kon.th_loop(th_key) + + score() + spare() + + map( lambda c: set( stat_get(c), 'hz', 3.0 if c == 'P' else 3.3 ), MOVES ) + map( lambda c: set( stat_get(c), 'timer', kon.timer_new() ), MONS ) + + for c in MOVES: + stat = stat_get(c) + f = th_pac if c == 'P' else th_mon + stat.th = kon.th_loop(f, [c], stat.hz, run=False) + +ths_start = lambda: map( lambda c: stat_get(c).th.start(), MOVES ) +ths_stop = lambda: map( lambda c: stat_get(c).th.stop(), MOVES ) +ths_timer_cancel = lambda: map( lambda c: stat_get(c).timer.cancel(), MONS ) + +def work(): + init_once() def init_map(): - (w, h) = pac_buf.size() arr.clear() - def f(x, y): - c = pac_buf.get(x, y) - arr.set(x, y, c) + f = lambda x, y: arr.set( x, y, pac_buf.get(x, y) ) + (w, h) = pac_buf.size() kon.loop_xy(w, h, f) + arr.rm('B') flush() def init_stat(clear=False): @@ -415,70 +489,59 @@ run_mode.set_hz( mon_r_hz / 100.0 ) run_mode.restart() - lst = map( lambda r: mk_slst('O ', 'yellow', r), (False, True) ) - arr.set_sdic( 'O', ( 'slider', kon.slider(lst, 2.0, None, True) ) ) - - arr.set_sdic( 'P', ('func', pac_show) ) - arr.set_sdic( '#', ('func', blk_show) ) - arr.set_sdic( '.', ( '', mk_slst('. ', 'white', False) ) ) - arr.set_sdic( '=', ( '', mk_slst('==', 'yellow', False) ) ) - - kon.th_loop(th_key) - score() - spare() - stat_get('P').dot = dot_n - map( lambda c: set( stat_get(c), 'hz', 3.0 if c == 'P' else 3.3 ), MOVES ) - map( lambda c: set( stat_get(c), 'timer', kon.timer_new() ), MONS ) - - for c in MOVES: - stat = stat_get(c) - f = th_pac if c == 'P' else th_mon - stat.th = kon.th_loop(f, [c], stat.hz, run=False) - hdl_ready = lambda: arr_msg_pause( mk_slst('READY!', 'yellow'), *pac_buf.pos('B') ) - hdl_start = lambda: map( lambda c: stat_get(c).th.start(), MOVES ) - hdl_stop = lambda: map( lambda c: stat_get(c).th.stop(), MOVES ) - hdl_timer_cancel = lambda: map( lambda c: stat_get(c).timer.cancel(), MONS ) - hdl_rm = lambda: ( map( lambda c: arr.rm(c), MOVES ), arr.update_all(flush_f=True) )[-1] + def ready_go(): + arr_msg_pause( mk_slst('READY!', 'yellow'), *pac_buf.pos('B') ) + ths_start() + mov.en = True + + def goal(): + ths_stop() + ths_timer_cancel() + kon.sleep(2.0) + map( lambda c: arr.rm(c), MOVES ) + bonus.hide() + arr.update_all(flush_f=True) init_map() init_stat() - hdl_ready() - hdl_start() + ready_go() while True: while not game_ev.wait(1.0): kon.sleep_hz(1.0) # for ^C v = game_ev.get() - if v == 'start': - hdl_start() - elif v == 'stop': - hdl_stop() - - elif v == 'die': - hdl_stop() - hdl_timer_cancel() - kon.sleep(2.0) - hdl_rm() + if v == 'die': + ss = [ '()', '||', ')(', '><', '--', '><', '--', '><', '--', '__', ' ' ] + lsts = map( lambda s: mk_slst(s, 'yellow', True), ss ) + lsts.append( [ SPC ] ) + bak = pac_slider( kon.slider(lsts, 5.0, None, True, repeat=False) ) + + goal() init_stat() - hdl_ready() - hdl_start() - mov.en = True + arr.set_sdic('P', bak) + ready_go() elif v == 'clear': - hdl_stop() - hdl_timer_cancel() - kon.sleep(2.0) - hdl_rm() + c = '#' + bak = arr.get_sdic(c) + lst = map( lambda col: mk_slst('==', col, False), ('white', 'blue') ) + slider = kon.slider(lst, 4.0, None, True) + arr.set_sdic( c, ('slider', slider) ) + kon.sleep(3.0) + arr.set_sdic(c, bak) + + goal() + round( round() + 1 ) init_map() init_stat(clear=True) - hdl_ready() - hdl_start() - mov.en = True + ready_go() elif v == 'over': + (x, y) = pac_buf.pos('B') + arr_msg_pause( mk_slst('GAME OVER', 'red'), x, y, 2.0 ) break game_ev.clear()