# -*- encoding: utf-8 -*- """ Saichugen console game """ from saichugenlib import * DISABLE_DISPLAY = False DISABLE_LOG = False def join(xs, sep=" ", func=str): return sep.join(map(func, xs)) def puts(*args): if DISABLE_DISPLAY: return print " ".join(map(str, args)) def get_logger(fo = None): if not fo and not DISABLE_LOG: from time import strftime filename = strftime("%Y%m%d_%H%M%S") fo = file(filename, "w") def log(*args): if DISABLE_LOG: return print >>fo, " ".join(map(str, args)) return log def run_game(PLAYERS): from random import shuffle log = get_logger() for i in range(3): log("Player%d:" % i, PLAYERS[i].name) # deal cards cards = range(52) shuffle(cards) players = [None] * 3 for i in range(3): players[i] = PLAYERS[i](cards[17 * i: 17 * (i + 1)]) unknowns = range(52) # cards which not played yet # record hands log("HANDS:") for i in range(3): log(join(players[i].hand)) plays = [] game_score = [0] * 3 info = dict( unknowns=unknowns, game_score=game_score, plays=plays, ) puts("****BEGIN GAME") for iround in range(5): round_score = [0] * 3 info["round_score"] = round_score puts("**BEGIN ROUND", iround + 1) for iturn in range(3): puts("**TURN", iturn + 1) info["iround"] = iround info["iturn"] = iturn # start a turn. players play a card. play = [players[i].play(info) for i in range(3)] plays.append(play) puts("PLAY:") playstr = map(to_str, play) puts(", ".join(playstr)) # record play log("UNKNOWN CARDS:") log(join(unknowns, func=to_str)) log("PLAY %d,%d:" % (iround, iturn)) log(join(play)) # card counting for p in play: unknowns.remove(p) # select median median = get_mid(*play) winner = play.index(median) puts("MEDIAN:", to_str(median), "Player", winner) round_score[winner] += to_num(median) puts("SCORES OF ROUND:") puts(join(round_score, ", ")) puts() puts("**END ROUND", iround + 1) # select median median = get_mid(*round_score) puts("MEDIAN OF ROUND SCORES:", median) for i in range(3): if round_score[i] == median: puts("Player", i, "got", median, "points") game_score[i] += median puts("SCORES OF GAME:") puts(join(game_score, ", ")) puts() puts("****END GAME") median = get_mid(*game_score) puts("MEDIAN OF GAME SCORES:", median) game_result = [0, 0, 0] for i in range(3): if game_score[i] == median: puts("Player", i, "won") log("WINNER:", i) game_result[i] = 3 offset = sum(game_result) / 3 game_result = [x - offset for x in game_result] for i in range(3): puts("rest card of Player%d:" % i, join(players[i].hand, ", ", to_str)) log("REST_CARD%d:" % i, join(players[i].hand)) puts("not used card:", to_str(cards[-1])) log("NOT_USED_CARD:", cards[-1]) return game_result class Player(object): def __init__(self, hand): self.hand = hand class RandomAI(Player): name = "Random(AI)" def play(self, info): return self.hand.pop() class GoodAI(Player): """GoodAI - Count cards - Assume other player is random player """ name = "Good(AI)" def __init__(self, hand): self.hand = hand def play(self, info): if info["iturn"] == 2: # when final turn unknowns = info["unknowns"] import logic r = logic.think_a_turn( unknowns, self.hand, logic.measure_win_game(info["round_score"], info["game_score"]))[1] self.hand.remove(r) return r return self.hand.pop() class ConsoleHuman(Player): name="Console(human)" def __init__(self, hand): hand.sort() self.hand = hand def play(self, info): print "YOUR HAND:" handstr = map(to_str, self.hand) print ", ".join(handstr) while True: c = raw_input("CHOOSE ONE>>> ") if c in handstr: i = handstr.index(c) return self.hand.pop(i) if __name__ == "__main__": run_game([ConsoleHuman, RandomAI, GoodAI])