Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #!/usr/bin/python3
- import curses
- import random
- import math
- def get_tile(x, y):
- # 決定論的アルゴリズムによる自動生成
- rand = random.Random(x * 12345 + y * 67890).random()
- if rand < 0.15: return "#" # 法の壁
- if rand < 0.17: return "$" # 汚れ仕事で得た小銭
- if rand < 0.18: return "S" # 姑息なショップ
- if rand < 0.19: return "P" # 弱者の公衆電話
- return "." # 乾いたつくばの大地
- def main(stdscr):
- curses.curs_set(0)
- stdscr.nodelay(1)
- stdscr.timeout(100)
- # 初期位置
- px, py = 10, 10 # 筑波芋(お前)
- kx, ky = 0, 0 # 弁護士 唐澤貴洋(オレ)
- money = 0
- stamina = 100.0
- k_speed_base = 0.6 # オレの基本追跡確率
- k_slow_stacks = 0 # 重複する鈍足化の記録
- while True:
- height, width = stdscr.getmaxyx()
- stdscr.clear()
- # 距離計算
- dist = math.sqrt((px - kx)**2 + (py - ky)**2)
- # マップ描画(無限の迷宮)
- view_h, view_w = 15, 30
- for dy in range(-view_h//2, view_h//2):
- for dx in range(-view_w//2, view_w//2):
- tx, ty = px + dx, py + dy
- tile = get_tile(tx, ty)
- char = tile
- if tx == px and ty == py: char = "@"
- elif tx == kx and ty == ky: char = "K"
- try:
- stdscr.addstr(dy + view_h//2, dx + view_w//2, char)
- except curses.error: pass
- # ステータス表示
- current_speed = k_speed_base * (0.8 ** k_slow_stacks)
- stdscr.addstr(view_h + 1, 0, f"【逃亡記録】 お金: ${money} | スタミナ: {stamina:.1f} | 距離: {dist:.1f}")
- stdscr.addstr(view_h + 2, 0, f"オレの追跡精度: {current_speed:.4f} (鈍化スタック: {k_slow_stacks})")
- stdscr.addstr(view_h + 3, 0, "WASDで逃げろ。距離100で『虚無のクリア』だ。")
- # 入力処理
- key = stdscr.getch()
- new_px, new_py = px, py
- if key == ord('w'): new_py -= 1
- elif key == ord('s'): new_py += 1
- elif key == ord('a'): new_px -= 1
- elif key == ord('d'): new_px += 1
- elif key == ord('q'): break
- # 壁判定とイベント
- target_tile = get_tile(new_px, new_py)
- if target_tile != "#":
- px, py = new_px, new_py
- if target_tile == "$":
- money += 10 # 浅ましく小銭を拾う
- elif target_tile == "S":
- if money >= 20:
- money -= 20
- stamina += 30.0 # 偽りの延命
- stdscr.addstr(view_h + 4, 0, "ショップでスタミナを回復。だが責任は回復しない。")
- elif target_tile == "P":
- if money >= 10:
- money -= 10
- k_slow_stacks += 1 # 仲間を呼ぶたびに、オレの速度は永続的に低下する
- stdscr.addstr(view_h + 4, 0, "公衆電話で連帯を呼びかけた。オレの動きがまた鈍る。")
- # 唐澤貴洋(K)の移動:上下左右のみ
- # 鈍足化の影響を受け、行動確率が減少していく
- if random.random() < current_speed:
- # 最短距離を上下左右で追跡
- if abs(px - kx) > abs(py - ky):
- if kx < px: kx += 1
- elif kx > px: kx -= 1
- else:
- if ky < py: ky += 1
- elif ky > py: ky -= 1
- # 判定
- if dist >= 100:
- stdscr.addstr(view_h + 5, 0, "距離100達成。だが、ネットに距離は関係ない。司直の手からは逃げられない。")
- stdscr.nodelay(0)
- stdscr.getch()
- break
- elif px == kx and py == ky:
- stdscr.addstr(view_h + 5, 0, "ノックノック。三田警察署へ同行願います。逃走は終わりだ。")
- stdscr.nodelay(0)
- stdscr.getch()
- break
- stamina -= 0.05
- if stamina <= 0:
- stdscr.addstr(view_h + 5, 0, "足が止まった。携帯を通じて頭に電子プラグを突っ込まれた者の末路だ。")
- stdscr.nodelay(0)
- stdscr.getch()
- break
- curses.wrapper(main)
Advertisement
Add Comment
Please, Sign In to add comment