
あらすじ: プレイヤーたちは同じ大学で生活を送っている. ある日突如現れた支配者"Snow"によって,プレイヤーたちは双六の世界に閉じ込められてしまった. この世界から脱出するには,途中で鬱になってしまわないよう気力(Sanity)を保ちつつ,様々なイベントを通じて技術(Skill)を高めながら,最後に待つ支配者"Snow"に挑み,高い技術を得たことを証明しなければならない. 果たしてプレイヤーたちは技術に堪能なる士君子となれるのだろうか?
遊び方: 1〜4人でプレイでき,1Q(25マス)〜4Q(100マス)まで期間を選ぶことができます. Pythonの実行環境のみで手軽に遊べます. 時にはC3部員お馴染みのイベントが待っていることも...?
コード全体: import random import time
class SnowSugoroku: def init(self, player_names, mode): self.mode = mode # 1, 2, 3, or 4 self.goal_pos = mode * 25 # モードに応じてSnowのHPを決定 self.snow_sanity = mode * 100
self.players = {
name: {"pos": 0, "sanity": 50, "skill": 10, "alive": True, "retired": False}
for name in player_names
}
self.stop_points = [20, 45, 70, 95]
self.winner = None
def log(self, msg):
print(f" > {msg}")
time.sleep(0.4)
def conduct_exam(self, name):
"""期末試験イベント"""
status = self.players[name]
print(f"\n📝 【期末試験】 {name}の運命が決まる({status['pos']}マス目)...")
roll = random.randint(1, 6)
if roll == 6:
self.log("完璧なる100秀! Skill+15, Sanity+15")
status["skill"] += 15; status["sanity"] += 15
elif roll == 5:
self.log("ギリギリ90秀...! Skill+10, Sanity+10")
status["skill"] += 10; status["sanity"] += 10
elif roll == 4:
self.log("まあ健闘の80優。 Skill+5, Sanity+5")
status["skill"] += 5; status["sanity"] += 5
elif roll == 3:
self.log("辛くも70良。何も起こらなかった。")
elif roll == 2:
self.log("57不可。教授にメールすることに。")
input(">> Enterで再判定のダイスを振る...")
re_roll = random.randint(1, 6)
if re_roll >= 5:
self.log(f"🎲 {re_roll}: 57点は間違いで64点でした。 Skill+5, Sanity+5")
status["skill"] += 5; status["sanity"] += 5
else:
self.log(f"🎲 {re_roll}: 57点は間違いで28点でした。そうはならんだろ! Sanity-10")
status["sanity"] -= 10
else:
self.log("絶起してしまい0不可。 Sanity-10")
status["sanity"] -= 10
def trigger_event(self, name):
"""通常移動時のイベント(何も起きない確率を含む)"""
status = self.players[name]
if status["pos"] in self.stop_points:
self.conduct_exam(name)
return
# 1-9: イベント, 10-14: 何も起きない
event_roll = random.randint(1, 14)
if event_roll == 1:
self.log("💻 ハッカソンに参加した!")
r = random.randint(1, 6)
if r == 6: self.log("最優秀賞! Skill+30, Sanity+20"); status["skill"] += 30; status["sanity"] += 20
elif r == 5: self.log("優秀賞! Skill+20, Sanity+10"); status["skill"] += 20; status["sanity"] += 10
elif 3 <= r <= 4: self.log("健闘! Skill+10"); status["skill"] += 10
else: self.log("完成せず… Skill+5, Sanity-10"); status["skill"] += 5; status["sanity"] -= 10
elif event_roll == 2:
self.log("📺 YouTubeで時間を溶かした… Sanity-5"); status["sanity"] -= 5
elif event_roll == 3:
self.log("🍜 太一を食べて元気をチャージ! Sanity+10"); status["sanity"] += 10
elif event_roll == 4:
self.log("🚗 車に煽られた! Sanity-5"); status["sanity"] -= 5
elif event_roll == 5:
self.log("🌌 ダム公園で天体観測。 Sanity+10"); status["sanity"] += 10
elif event_roll == 6:
self.log("🦠 コロナウイルスに感染... Sanity-10"); status["sanity"] -= 10
elif event_roll == 7:
self.log("🎓 学会に出席して刺激をもらう。 Skill+10"); status["skill"] += 10
elif event_roll == 8:
self.log("🎤 部会でLT発表!")
r = random.randint(1, 6)
if r >= 5: self.log("大反響! Skill+10, Sanity+10"); status["skill"] += 10; status["sanity"] += 10
elif 3 <= r <= 4: self.log("良い反応。 Skill+5, Sanity+5"); status["skill"] += 5; status["sanity"] += 5
else: self.log("静まりかえっていた… Sanity-10"); status["sanity"] -= 10
elif event_roll == 9:
self.log("✈️ 海外留学へ!")
r = random.randint(1, 6)
if r >= 5: self.log("とても充実した旅となった。 Skill+20, Sanity+20"); status["skill"] += 20; status["sanity"] += 20
elif 3 <= r <= 4: self.log("成果あり。 Skill+10, Sanity+10"); status["skill"] += 10; status["sanity"] += 10
else: self.log("トラブル続きでボロボロ。 Sanity-10"); status["sanity"] -= 10
else:
self.log("🍃 特に何も起きない、平穏な一日だった。")
def snow_battle(self, name):
"""支配者Snowとの1対1決戦(食事回数制限版)"""
status = self.players[name]
# 食事の累計回数を管理(全プレイヤー共通のSnowの行動としてカウント)
if not hasattr(self, 'dine_count'):
self.dine_count = 0
print(f"\n" + "❄️" * 25)
print(f"Snow が現れた! (Snow HP: {self.snow_sanity})")
print(f"{name} (Skill: {status['skill']}, Sanity: {status['sanity']}) が挑む!")
print("❄️" * 25)
while self.snow_sanity > 0 and status["sanity"] > 0:
input(f"\n-- {name}の対抗ターン (Enter) --")
# --- 行動選択ロジック ---
# 基本は「外部イベント(80%)」と「食事(20%)」
# ただし理性が尽きた(5回を超えた)Snowは誘ってこない
if self.dine_count < 5:
action = "dine" if random.random() < 0.2 else "event"
else:
action = "event" # 5回以降は強制的にイベント
if action == "dine":
self.dine_count += 1
recovery_snow = random.randint(10, 20)
recovery_player = random.randint(5, 15)
self.log(f"🍴 Snowがジョイフルに誘ってきた!({self.dine_count}/5回目)")
self.log(f"SnowのHPが{recovery_snow}回復し、{name}のSanityが{recovery_player}回復した。")
self.snow_sanity += recovery_snow
status["sanity"] += recovery_player
else:
# 外部イベント参戦(前回と同じロジック)
self.log("📢 Snowが外部イベントに参戦させた!")
r = random.randint(1, 6)
if r >= 5:
self.log(f"🎲 {r}: Snowの作品が大盛況! {name}のSanity-20")
status["sanity"] -= mode * 10
elif 3 <= r <= 4:
if status["skill"] > mode * 15:
dmg = status["skill"] - (mode * 15)
self.log(f"🎲 {r}: 技術が光る! Snowに {dmg} ダメージ!")
self.snow_sanity -= dmg
else:
dmg = (mode * 15) - status["skill"]
self.log(f"🎲 {r}: 経験不足… {name}のSanityに {dmg} ダメージ!")
status["sanity"] -= dmg
else:
dmg = status["skill"]
self.log(f"🎲 {r}: {name}の作品が圧倒的! Snowに {dmg} ダメージ!")
self.snow_sanity -= dmg
print(f"STATUS >> Snow: {max(0, self.snow_sanity)} | {name}: {max(0, status['sanity'])}")
# --- 決着判定 ---
if self.snow_sanity <= 0:
self.winner = name
return True
else:
self.log(f"😫 {name}は精神的に限界だ… 「技術に堪能なる士君子」への道は閉ざされた。")
status["alive"] = False
status["retired"] = True
return False
def play(self):
print(f"\n--- {self.mode}Qモード (目標: {self.goal_pos}マス / Snow HP: {self.snow_sanity}) ---")
while not self.winner:
active_players = [n for n, s in self.players.items() if s['alive'] and not s['retired']]
if not active_players:
print("\n🚫 生き残った学生はいなかった。Snowによる新世界が創られる…")
return
for name in active_players:
status = self.players[name]
input(f"\n[{name}の番] Enterで振る (Sanity:{status['sanity']} Skill:{status['skill']})")
dice = random.randint(1, 6)
# 強制停止ロジック
next_pos = status["pos"] + dice
for sp in self.stop_points:
if status["pos"] < sp <= next_pos:
next_pos = sp
print(f"🛑 {sp}マス目で強制停止!期末試験が始まる…")
break
status["pos"] = next_pos
print(f"🎲 {dice}が出て、現在地: {status['pos']} / {self.goal_pos}")
if status["pos"] >= self.goal_pos:
if self.snow_battle(name): return
else:
self.trigger_event(name)
if status["sanity"] <= 0:
self.log(f"{name}は無気力状態となった。")
status["alive"] = False
print(f"\n🏆 祝! {self.winner} は「技術に堪能なる士君子」となった! 🏆")
if name == "main": p_input = input("プレイヤー名をカンマ区切りで入力 (例: A,B,C): ") names = [n.strip() for n in p_input.split(",")] print("\n--- モード選択 ---") print("1: 1Q (25マス), 2: 2Q (50マス), 3: 3Q (75マス), 4: 4Q (100マス)") mode = int(input("選択 (1-4): "))
game = SnowSugoroku(names, mode)
game.play()
4
投稿日時:
更新日時: