66 lines
1.8 KiB
Python
66 lines
1.8 KiB
Python
from hanabi import *
|
|
|
|
def is_playable(knowledge, board):
|
|
possible = get_possible(knowledge)
|
|
return all(map(playable(board), possible))
|
|
|
|
def maybe_playable(knowledge, board):
|
|
possible = get_possible(knowledge)
|
|
return any(map(playable(board), possible))
|
|
|
|
def is_useless(knowledge, board):
|
|
possible = get_possible(knowledge)
|
|
return all(map(useless(board), possible))
|
|
|
|
def maybe_useless(knowledge, board):
|
|
possible = get_possible(knowledge)
|
|
return any(map(useless(board), possible))
|
|
|
|
def has_property(predicate, knowledge):
|
|
possible = get_possible(knowledge)
|
|
return all(map(predicate, possible))
|
|
|
|
def may_have_property(predicate, knowledge):
|
|
possible = get_possible(knowledge)
|
|
return any(map(predicate, possible))
|
|
|
|
def probability(predicate, knowledge):
|
|
num = 0.0
|
|
denom = 0.0
|
|
for col in ALL_COLORS:
|
|
for i,cnt in enumerate(knowledge[col]):
|
|
if predicate(Card(col,i+1)):
|
|
num += cnt
|
|
denom += cnt
|
|
return num/denom
|
|
|
|
def playable(board):
|
|
def playable_inner(card):
|
|
return card.is_playable(board)
|
|
return playable_inner
|
|
|
|
def useless(board):
|
|
def useless_inner(card):
|
|
return card.is_useless(board)
|
|
return useless_inner
|
|
|
|
def has_rank(rank):
|
|
def has_rank_inner(card):
|
|
return card.rank == rank
|
|
return has_rank_inner
|
|
|
|
def has_color(color):
|
|
def has_color_inner(card):
|
|
return card.color == color
|
|
return has_color_inner
|
|
|
|
def get_possible(knowledge):
|
|
result = []
|
|
for col in ALL_COLORS:
|
|
for i,cnt in enumerate(knowledge[col]):
|
|
if cnt > 0:
|
|
result.append(Card(col,i+1))
|
|
return result
|
|
|
|
def filter_actions(type, actions):
|
|
return [act for act in actions if act.type == type] |