Add switching Lancelots and pep8
This commit is contained in:
parent
39febc9c52
commit
5887848f45
2 changed files with 62 additions and 16 deletions
74
tim.py
74
tim.py
|
|
@ -21,7 +21,7 @@ def ResistanceGame(n_players):
|
||||||
|
|
||||||
def AvalonGame(n_players):
|
def AvalonGame(n_players):
|
||||||
full_set = [("Merlin", True), ("G", True), ("G", True),
|
full_set = [("Merlin", True), ("G", True), ("G", True),
|
||||||
("E", False), ("E", False), ("G", True),
|
("E", False), ("ELance", False), ("GLance", True),
|
||||||
("Mordred", False), ("G", True), ("G", True), ("E", False)]
|
("Mordred", False), ("G", True), ("G", True), ("E", False)]
|
||||||
return full_set[:n_players]
|
return full_set[:n_players]
|
||||||
|
|
||||||
|
|
@ -62,10 +62,22 @@ class DeceptionGame(object):
|
||||||
self.ignorance_on_round[2] = Bernoulli(0.5)
|
self.ignorance_on_round[2] = Bernoulli(0.5)
|
||||||
self.ignorance_on_round[3] = Bernoulli(0.3)
|
self.ignorance_on_round[3] = Bernoulli(0.3)
|
||||||
self.ignorance_on_round[4] = Bernoulli(0.3)
|
self.ignorance_on_round[4] = Bernoulli(0.3)
|
||||||
self.merlin_ignorance = Bernoulli(0.2)
|
|
||||||
|
|
||||||
def player_is_good(self, deal, player):
|
self.merlin_ignorance = Bernoulli(0.2)
|
||||||
return deal[player][1]
|
self.lancelots_switch_at = []
|
||||||
|
|
||||||
|
def player_is_good(self, deal, player, round):
|
||||||
|
if len(self.lancelots_switch_at) != 1:
|
||||||
|
return deal[player][1]
|
||||||
|
else:
|
||||||
|
if self.player_role(deal, player) == "GLance" or \
|
||||||
|
self.player_role(deal, player) == "ELance":
|
||||||
|
if round >= self.lancelots_switch_at[0]:
|
||||||
|
return not deal[player][1]
|
||||||
|
else:
|
||||||
|
return deal[player][1]
|
||||||
|
else:
|
||||||
|
return deal[player][1]
|
||||||
|
|
||||||
def player_role(self, deal, player):
|
def player_role(self, deal, player):
|
||||||
return deal[player][0]
|
return deal[player][0]
|
||||||
|
|
@ -74,7 +86,7 @@ class DeceptionGame(object):
|
||||||
transaction = []
|
transaction = []
|
||||||
|
|
||||||
def obs(deal):
|
def obs(deal):
|
||||||
if self.player_is_good(deal, player_id) == is_good:
|
if self.player_is_good(deal, player_id, -1) == is_good:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
@ -87,6 +99,22 @@ class DeceptionGame(object):
|
||||||
"is good"]})
|
"is good"]})
|
||||||
self.tid += 1
|
self.tid += 1
|
||||||
|
|
||||||
|
def switch_lancelots(self, round):
|
||||||
|
transaction = []
|
||||||
|
rnd = round - 1
|
||||||
|
|
||||||
|
def obs(deal):
|
||||||
|
return True
|
||||||
|
|
||||||
|
self.lancelots_switch_at.append(rnd)
|
||||||
|
|
||||||
|
transaction.append(obs)
|
||||||
|
self.observations.append(transaction)
|
||||||
|
self.seen.append({"type": "switch",
|
||||||
|
"round": rnd,
|
||||||
|
"print_order": ["round"]})
|
||||||
|
self.tid += 1
|
||||||
|
|
||||||
def add_known_role(self, player_id, role_str):
|
def add_known_role(self, player_id, role_str):
|
||||||
transaction = []
|
transaction = []
|
||||||
|
|
||||||
|
|
@ -104,12 +132,14 @@ class DeceptionGame(object):
|
||||||
"role"]})
|
"role"]})
|
||||||
self.tid += 1
|
self.tid += 1
|
||||||
|
|
||||||
def player_sees_player_and_claims(self, p1, p2, claim):
|
def player_sees_player_and_claims(self, p1, p2, claim, round):
|
||||||
transaction = []
|
transaction = []
|
||||||
|
rnd = round - 1
|
||||||
|
|
||||||
def obs(deal):
|
def obs(deal):
|
||||||
if self.player_is_good(deal, p1) and self.player_role(deal, p1) == "Mordred":
|
if self.player_is_good(deal, p1, rnd) \
|
||||||
if self.player_is_good(deal, p2) == claim:
|
and self.player_role(deal, p1) == "Mordred":
|
||||||
|
if self.player_is_good(deal, p2, rnd) == claim:
|
||||||
return True
|
return True
|
||||||
else:
|
else:
|
||||||
return None
|
return None
|
||||||
|
|
@ -125,8 +155,10 @@ class DeceptionGame(object):
|
||||||
"p1": p1,
|
"p1": p1,
|
||||||
"p2": p2,
|
"p2": p2,
|
||||||
"is good": claim,
|
"is good": claim,
|
||||||
|
"round": round,
|
||||||
"print_order": ["p1",
|
"print_order": ["p1",
|
||||||
"p2",
|
"p2",
|
||||||
|
"round",
|
||||||
"is good"]})
|
"is good"]})
|
||||||
self.tid += 1
|
self.tid += 1
|
||||||
|
|
||||||
|
|
@ -136,7 +168,7 @@ class DeceptionGame(object):
|
||||||
|
|
||||||
def obs(deal):
|
def obs(deal):
|
||||||
n_actually_good_people = sum(
|
n_actually_good_people = sum(
|
||||||
[int(self.player_is_good(deal, x)) for x in team])
|
[int(self.player_is_good(deal, x, rnd)) for x in team])
|
||||||
n_spies = len(team) - n_actually_good_people
|
n_spies = len(team) - n_actually_good_people
|
||||||
if n_spies == 0:
|
if n_spies == 0:
|
||||||
if fails != 0:
|
if fails != 0:
|
||||||
|
|
@ -175,7 +207,7 @@ class DeceptionGame(object):
|
||||||
|
|
||||||
def obs(deal):
|
def obs(deal):
|
||||||
n_actually_good_people = sum(
|
n_actually_good_people = sum(
|
||||||
[int(self.player_is_good(deal, x)) for x in team])
|
[int(self.player_is_good(deal, x, rnd)) for x in team])
|
||||||
n_spies = len(team) - n_actually_good_people
|
n_spies = len(team) - n_actually_good_people
|
||||||
could_happen = True
|
could_happen = True
|
||||||
for player, vote in enumerate(votes):
|
for player, vote in enumerate(votes):
|
||||||
|
|
@ -188,7 +220,7 @@ class DeceptionGame(object):
|
||||||
return False
|
return False
|
||||||
elif player in team:
|
elif player in team:
|
||||||
continue
|
continue
|
||||||
elif self.player_is_good(deal, player):
|
elif self.player_is_good(deal, player, rnd):
|
||||||
if n_spies > fail_req - 1:
|
if n_spies > fail_req - 1:
|
||||||
if vote == 1:
|
if vote == 1:
|
||||||
if self.ignorance_on_round[rnd].rand():
|
if self.ignorance_on_round[rnd].rand():
|
||||||
|
|
@ -234,6 +266,8 @@ class DeceptionGame(object):
|
||||||
statement["votes"],
|
statement["votes"],
|
||||||
statement["fails required"],
|
statement["fails required"],
|
||||||
statement["round"])
|
statement["round"])
|
||||||
|
if type == "switch":
|
||||||
|
self.switch_lancelots(statement["round"])
|
||||||
elif type == "mission":
|
elif type == "mission":
|
||||||
self.do_mission(statement["team"],
|
self.do_mission(statement["team"],
|
||||||
statement["fails"],
|
statement["fails"],
|
||||||
|
|
@ -242,7 +276,8 @@ class DeceptionGame(object):
|
||||||
elif type == "lady":
|
elif type == "lady":
|
||||||
self.player_sees_player_and_claims(statement["p1"],
|
self.player_sees_player_and_claims(statement["p1"],
|
||||||
statement["p2"],
|
statement["p2"],
|
||||||
statement["is good"])
|
statement["is good"],
|
||||||
|
statement.get("round", -1))
|
||||||
elif type == "known_side":
|
elif type == "known_side":
|
||||||
self.add_known_alliance(statement["player"],
|
self.add_known_alliance(statement["player"],
|
||||||
statement["is good"])
|
statement["is good"])
|
||||||
|
|
@ -379,6 +414,7 @@ def display_statement(statement, namemap):
|
||||||
out += str(statement[key]).title() + " "
|
out += str(statement[key]).title() + " "
|
||||||
return out
|
return out
|
||||||
|
|
||||||
|
|
||||||
def help():
|
def help():
|
||||||
print(Fore.GREEN + "Initial Commands:")
|
print(Fore.GREEN + "Initial Commands:")
|
||||||
print("load <filename> -- Loads a savefile")
|
print("load <filename> -- Loads a savefile")
|
||||||
|
|
@ -391,14 +427,17 @@ def help():
|
||||||
print("name -- Name a player index for pretty printing")
|
print("name -- Name a player index for pretty printing")
|
||||||
print("side -- Assert that someone must be good or evil")
|
print("side -- Assert that someone must be good or evil")
|
||||||
print("lady -- Assert that one player saw another and made a claim")
|
print("lady -- Assert that one player saw another and made a claim")
|
||||||
print("vote -- Assert a voted-on team and the votes (whether it succeeded or not)")
|
print("vote -- Assert a voted-on team and the votes"
|
||||||
|
" (whether it succeeded or not)")
|
||||||
print("mission -- Assert the results of a team and a mission")
|
print("mission -- Assert the results of a team and a mission")
|
||||||
print("eval <repetitions> -- Quick eval, discounting special roles")
|
print("eval <repetitions> -- Quick eval, discounting special roles")
|
||||||
print("fulleval <repetitions> -- Eval, counting special roles")
|
print("fulleval <repetitions> -- Eval, counting special roles")
|
||||||
print("report -- Show last report again")
|
print("report -- Show last report again")
|
||||||
|
|
||||||
|
|
||||||
def main():
|
def main():
|
||||||
colorama.init(autoreset=True)
|
colorama.init(autoreset=True)
|
||||||
|
readline.get_history_length()
|
||||||
print(Fore.GREEN + Style.BRIGHT + "Tim the Enchanter v1.0")
|
print(Fore.GREEN + Style.BRIGHT + "Tim the Enchanter v1.0")
|
||||||
|
|
||||||
game = None
|
game = None
|
||||||
|
|
@ -463,7 +502,8 @@ def main():
|
||||||
p1 = int(raw_input("ID For Lady? ").strip())
|
p1 = int(raw_input("ID For Lady? ").strip())
|
||||||
p2 = int(raw_input("ID For Target? ").strip())
|
p2 = int(raw_input("ID For Target? ").strip())
|
||||||
claim = int(raw_input("Claim? ").strip()) == 1
|
claim = int(raw_input("Claim? ").strip()) == 1
|
||||||
game.player_sees_player_and_claims(p1, p2, claim)
|
round = int(raw_input("Round? ").strip()) == 1
|
||||||
|
game.player_sees_player_and_claims(p1, p2, claim, round)
|
||||||
game.trace = {}
|
game.trace = {}
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
|
@ -474,6 +514,12 @@ def main():
|
||||||
game.trace = {}
|
game.trace = {}
|
||||||
continue
|
continue
|
||||||
|
|
||||||
|
elif command == "switch":
|
||||||
|
r = int(raw_input("Round?").strip())
|
||||||
|
game.switch_lancelots(r)
|
||||||
|
game.trace = {}
|
||||||
|
continue
|
||||||
|
|
||||||
elif command == "eval":
|
elif command == "eval":
|
||||||
times = 200 / (game.n_players - 4) * 2
|
times = 200 / (game.n_players - 4) * 2
|
||||||
if len(command_list) > 1:
|
if len(command_list) > 1:
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
def merlin_vote(game, player_id, team, votes, fail_req, r, deal):
|
def merlin_vote(game, player_id, team, votes, fail_req, r, deal):
|
||||||
n_actually_good_people = sum(
|
n_actually_good_people = sum(
|
||||||
[int(game.player_is_good(deal, x)) for x in team])
|
[int(game.player_is_good(deal, x, r)) for x in team])
|
||||||
n_spies = len(team) - n_actually_good_people
|
n_spies = len(team) - n_actually_good_people
|
||||||
roles = [game.player_role(deal, x) for x in team]
|
roles = [game.player_role(deal, x) for x in team]
|
||||||
if "Mordred" in roles:
|
if "Mordred" in roles:
|
||||||
|
|
@ -33,7 +33,7 @@ def merlin_vote(game, player_id, team, votes, fail_req, r, deal):
|
||||||
|
|
||||||
def mordred_vote(game, player_id, team, votes, fail_req, r, deal):
|
def mordred_vote(game, player_id, team, votes, fail_req, r, deal):
|
||||||
n_actually_good_people = sum(
|
n_actually_good_people = sum(
|
||||||
[int(game.player_is_good(deal, x)) for x in team])
|
[int(game.player_is_good(deal, x, r)) for x in team])
|
||||||
n_spies = len(team) - n_actually_good_people
|
n_spies = len(team) - n_actually_good_people
|
||||||
roles = [game.player_role(deal, x) for x in team]
|
roles = [game.player_role(deal, x) for x in team]
|
||||||
if "Oberon" in roles:
|
if "Oberon" in roles:
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue