Guest User

Untitled

a guest
Mar 18th, 2026
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.40 KB | None | 0 0
  1. #!/usr/bin/python3
  2.  
  3. import curses
  4. import random
  5. import math
  6.  
  7. def get_tile(x, y):
  8. # 決定論的アルゴリズムによる自動生成
  9. rand = random.Random(x * 12345 + y * 67890).random()
  10. if rand < 0.15: return "#" # 法の壁
  11. if rand < 0.17: return "$" # 汚れ仕事で得た小銭
  12. if rand < 0.18: return "S" # 姑息なショップ
  13. if rand < 0.19: return "P" # 弱者の公衆電話
  14. return "." # 乾いたつくばの大地
  15.  
  16. def main(stdscr):
  17. curses.curs_set(0)
  18. stdscr.nodelay(1)
  19. stdscr.timeout(100)
  20.  
  21. # 初期位置
  22. px, py = 10, 10 # 筑波芋(お前)
  23. kx, ky = 0, 0 # 弁護士 唐澤貴洋(オレ)
  24. money = 0
  25. stamina = 100.0
  26. k_speed_base = 0.6 # オレの基本追跡確率
  27. k_slow_stacks = 0 # 重複する鈍足化の記録
  28.  
  29. while True:
  30. height, width = stdscr.getmaxyx()
  31. stdscr.clear()
  32.  
  33. # 距離計算
  34. dist = math.sqrt((px - kx)**2 + (py - ky)**2)
  35.  
  36. # マップ描画(無限の迷宮)
  37. view_h, view_w = 15, 30
  38. for dy in range(-view_h//2, view_h//2):
  39. for dx in range(-view_w//2, view_w//2):
  40. tx, ty = px + dx, py + dy
  41. tile = get_tile(tx, ty)
  42.  
  43. char = tile
  44. if tx == px and ty == py: char = "@"
  45. elif tx == kx and ty == ky: char = "K"
  46.  
  47. try:
  48. stdscr.addstr(dy + view_h//2, dx + view_w//2, char)
  49. except curses.error: pass
  50.  
  51. # ステータス表示
  52. current_speed = k_speed_base * (0.8 ** k_slow_stacks)
  53. stdscr.addstr(view_h + 1, 0, f"【逃亡記録】 お金: ${money} | スタミナ: {stamina:.1f} | 距離: {dist:.1f}")
  54. stdscr.addstr(view_h + 2, 0, f"オレの追跡精度: {current_speed:.4f} (鈍化スタック: {k_slow_stacks})")
  55. stdscr.addstr(view_h + 3, 0, "WASDで逃げろ。距離100で『虚無のクリア』だ。")
  56.  
  57. # 入力処理
  58. key = stdscr.getch()
  59. new_px, new_py = px, py
  60. if key == ord('w'): new_py -= 1
  61. elif key == ord('s'): new_py += 1
  62. elif key == ord('a'): new_px -= 1
  63. elif key == ord('d'): new_px += 1
  64. elif key == ord('q'): break
  65.  
  66. # 壁判定とイベント
  67. target_tile = get_tile(new_px, new_py)
  68. if target_tile != "#":
  69. px, py = new_px, new_py
  70. if target_tile == "$":
  71. money += 10 # 浅ましく小銭を拾う
  72. elif target_tile == "S":
  73. if money >= 20:
  74. money -= 20
  75. stamina += 30.0 # 偽りの延命
  76. stdscr.addstr(view_h + 4, 0, "ショップでスタミナを回復。だが責任は回復しない。")
  77. elif target_tile == "P":
  78. if money >= 10:
  79. money -= 10
  80. k_slow_stacks += 1 # 仲間を呼ぶたびに、オレの速度は永続的に低下する
  81. stdscr.addstr(view_h + 4, 0, "公衆電話で連帯を呼びかけた。オレの動きがまた鈍る。")
  82.  
  83. # 唐澤貴洋(K)の移動:上下左右のみ
  84. # 鈍足化の影響を受け、行動確率が減少していく
  85. if random.random() < current_speed:
  86. # 最短距離を上下左右で追跡
  87. if abs(px - kx) > abs(py - ky):
  88. if kx < px: kx += 1
  89. elif kx > px: kx -= 1
  90. else:
  91. if ky < py: ky += 1
  92. elif ky > py: ky -= 1
  93.  
  94. # 判定
  95. if dist >= 100:
  96. stdscr.addstr(view_h + 5, 0, "距離100達成。だが、ネットに距離は関係ない。司直の手からは逃げられない。")
  97. stdscr.nodelay(0)
  98. stdscr.getch()
  99. break
  100. elif px == kx and py == ky:
  101. stdscr.addstr(view_h + 5, 0, "ノックノック。三田警察署へ同行願います。逃走は終わりだ。")
  102. stdscr.nodelay(0)
  103. stdscr.getch()
  104. break
  105.  
  106. stamina -= 0.05
  107. if stamina <= 0:
  108. stdscr.addstr(view_h + 5, 0, "足が止まった。携帯を通じて頭に電子プラグを突っ込まれた者の末路だ。")
  109. stdscr.nodelay(0)
  110. stdscr.getch()
  111. break
  112.  
  113. curses.wrapper(main)
Advertisement
Add Comment
Please, Sign In to add comment