今回は水曜日のダウンタウン企画
電気椅子ゲームのシミュレーションです。
解説動画はこちら
電気椅子ゲームとは
水曜日のダウンタウンのネタ
結構色々やっていますが
今回は電気椅子ゲームの
シミュレーションです。
ゲームのルールはこうです。
このルールでシミュレーション用の
コードを作ってみました。
ゲームを実行する場合はこうです
これで1万回やる場合は
こんな感じのコードで
データフレームにできます。
シミュレーションの結果は
ぜひ動画を見てみてくださいませ
今回は電気椅子ゲームのシミュレーションコードについてでした
それでは!!
電気椅子ゲームのシミュレーションです。
解説動画はこちら
電気椅子ゲームとは
水曜日のダウンタウンのネタ
結構色々やっていますが
今回は電気椅子ゲームの
シミュレーションです。
ゲームのルールはこうです。
1~12などの番号が書かれたイス
プレイヤー二人は交互に以下を行う
相手が座るイスを予想し、電流を仕掛ける
電気イスでなければ得点獲得し、イスは撤去される
電流イスに座ると得点没収され、イスはそのまま
最終的にポイントが高い方が勝利
3回電流を喰らうか、40点先取されたら負け
このルールでシミュレーション用の
コードを作ってみました。
import random headers = ["ターン数", "選択プレイヤー", "選択数字", "電気プレイヤー", "仕掛数字", "結果", "P1得点", "P2得点", "P1電気回数", "P2電気回数", "残り椅子"] class ElectricChairGame: def __init__(self): self.chairs = {i: i for i in range(1, 13)} self.player_scores = [0, 0] self.electric_fails = [0, 0] self.current_player = 0 self.electrified_chair = None def choose_chair(self, chair_number): # 選択した数字と電気椅子の数字が一致する場合のみ電気椅子確定 if chair_number == self.electrified_chair: self.electric_fails[self.current_player] += 1 self.player_scores[self.current_player] = 0 return "電気椅子" else: points = self.chairs[chair_number] self.player_scores[self.current_player] += points del self.chairs[chair_number] return "得点獲得" def set_electric(self, chair_number): self.electrified_chair = chair_number return True def check_game_end(self): message = ["", ""] for player in range(2): if self.electric_fails[player] >= 3: winner = 2 if player == 0 else 1 message = [winner, "電気椅子3回"] return True, message if self.player_scores[player] >= 40: winner = player + 1 message = [winner, "スコア40"] return True, message if len(self.chairs) == 1: winner = 1 if self.player_scores[0] > self.player_scores[1] else 2 message = [winner, "スコア差"] return True, message return False, message def simulate_game(echo=False): game = ElectricChairGame() turn,selecting_player = 1,1 results = [] while True: # 電気椅子設置 electric_player = 2 if selecting_player == 1 else 1 electric_choice = random.choice(list(game.chairs.keys())) game.set_electric(electric_choice) # 椅子選択 chair_choice = random.choice(list(game.chairs.keys())) game.current_player = selecting_player - 1 result = game.choose_chair(chair_choice) # ログ出力 log_line = [ turn, selecting_player, chair_choice, electric_player, electric_choice, result, game.player_scores[0], game.player_scores[1], game.electric_fails[0], game.electric_fails[1], sorted(list(game.chairs.keys())) ] results.append(log_line) # ゲーム終了判定 game_end, message = game.check_game_end() if game_end: if message[0]==1: win_score = game.player_scores[0] else: win_score = game.player_scores[1] message+=[turn , win_score, game.player_scores[0], game.player_scores[1], game.electric_fails[0], game.electric_fails[1], len(list(game.chairs.keys()))] if echo: print(", ".join(headers)) for log_line in results: print(log_line) print(f"ゲーム終了: 勝利プレイヤー : {message[0]}, 勝因 : {message[1]}") return message, results # プレイヤー交代 selecting_player = 2 if selecting_player == 1 else 1 turn += 1
ゲームを実行する場合はこうです
message, log_line = simulate_game(True)
ターン数, 選択プレイヤー, 選択数字, 電気プレイヤー,
仕掛数字, 結果, P1得点, P2得点, P1電気回数, P2電気回数, 残り椅子
仕掛数字, 結果, P1得点, P2得点, P1電気回数, P2電気回数, 残り椅子
[1, 1, 2, 2, 3, '得点獲得', 2, 0, 0, 0, [1, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]]
[2, 2, 11, 1, 5, '得点獲得', 2, 11, 0, 0, [1, 3, 4, 5, 6, 7, 8, 9, 10, 12]]
[3, 1, 6, 2, 7, '得点獲得', 8, 11, 0, 0, [1, 3, 4, 5, 7, 8, 9, 10, 12]]
[4, 2, 1, 1, 8, '得点獲得', 8, 12, 0, 0, [3, 4, 5, 7, 8, 9, 10, 12]]
[5, 1, 3, 2, 10, '得点獲得', 11, 12, 0, 0, [4, 5, 7, 8, 9, 10, 12]]
[6, 2, 12, 1, 7, '得点獲得', 11, 24, 0, 0, [4, 5, 7, 8, 9, 10]]
[7, 1, 8, 2, 4, '得点獲得', 19, 24, 0, 0, [4, 5, 7, 9, 10]]
[8, 2, 9, 1, 7, '得点獲得', 19, 33, 0, 0, [4, 5, 7, 10]]
[9, 1, 10, 2, 7, '得点獲得', 29, 33, 0, 0, [4, 5, 7]]
[10, 2, 7, 1, 5, '得点獲得', 29, 40, 0, 0, [4, 5]]
ゲーム終了: 勝利プレイヤー : 2, 勝因 : スコア40
これで1万回やる場合は
こんな感じのコードで
データフレームにできます。
game_result, game_los = [], [] for i in range(10000): message, log_line = simulate_game() game_result.append([i+1] + message) for log in log_line: game_los.append([i+1] + log) import pandas as pd cols = ["ゲーム数", "勝利プレイヤー", "勝因","ターン数","獲得点数","P1得点", "P2得点", "P1電気回数", "P2電気回数", "残椅子個数"] game_result_df = pd.DataFrame(game_result, columns=cols) game_log_df = pd.DataFrame(game_los, columns=["ゲーム数"] + headers) game_result_df.head()
シミュレーションの結果は
ぜひ動画を見てみてくださいませ
今回は電気椅子ゲームのシミュレーションコードについてでした
それでは!!
コメントする