Finish up RandomAI procedure

master
En Yi 2019-06-03 16:59:19 +01:00
parent 30261597f1
commit 01be453b5c
3 changed files with 45 additions and 11 deletions

View File

@ -6,10 +6,13 @@ never an invalid one.
AI also possess information on the table to facilitate decision making. AI also possess information on the table to facilitate decision making.
AI should output the card play as int, and the actual Card is played in the Player class AI should output the card play as int, and the actual Card is played in the Player class
AI possesses the table knowledge and the hand AI possesses the table knowledge and the hand
AI should not modify the player cards and table data. They are read only.
""" """
import random import random
import cards
class randomAI:
class RandomAI:
def __init__(self, table_status, player=None): def __init__(self, table_status, player=None):
self.player = player self.player = player
@ -18,9 +21,6 @@ class randomAI:
def connect_to_player(self, player): def connect_to_player(self, player):
self.player = player self.player = player
def get_valid_plays(self):
pass
def request_reshuffle(self): def request_reshuffle(self):
if random.randint(0, 1): if random.randint(0, 1):
return True return True
@ -31,6 +31,7 @@ class randomAI:
current_round_bid = self.table_status["bid"] // 10 current_round_bid = self.table_status["bid"] // 10
current_suit_bid = self.table_status["bid"] % 10 current_suit_bid = self.table_status["bid"] % 10
gen_bid = random.randint(1, 7)*10 + random.randint(1, 5) gen_bid = random.randint(1, 7)*10 + random.randint(1, 5)
print(gen_bid)
if gen_bid > self.table_status["bid"]: if gen_bid > self.table_status["bid"]:
if current_suit_bid == 5: if current_suit_bid == 5:
return (current_round_bid+1)*10 + 1 return (current_round_bid+1)*10 + 1
@ -38,7 +39,35 @@ class randomAI:
return self.table_status["bid"]+1 return self.table_status["bid"]+1
def call_partner(self): def call_partner(self):
pass player_cards = self.player.get_deck_values()
other_cards = []
for i in range(4):
for j in range(13):
current_card = (i + 1) * 100 + j + 2
if current_card not in player_cards:
other_cards.append(current_card)
return random.choice(other_cards)
def make_a_play(self, sub_state): def make_a_play(self, sub_state):
pass if sub_state == 0:
valid_plays = self.get_valid_plays(True)
else:
valid_plays = self.get_valid_plays(False)
return random.choice(valid_plays)
def get_valid_plays(self, leading):
all_plays = self.player.get_deck_values()
possible_plays = None
if leading:
if not self.table_status['trump broken']:
possible_plays = [card for card in all_plays
if not cards.get_card_suit(card) == self.table_status['trump suit']]
else:
leading_suit = self.table_status['played cards'][self.table_status["leading player"]].suit()
possible_plays = [card for card in all_plays
if cards.get_card_suit(card) == leading_suit]
if not possible_plays:
return all_plays
return possible_plays

View File

@ -132,6 +132,7 @@ class Deck():
self.set_card_positions() self.set_card_positions()
def set_card_positions(self): def set_card_positions(self):
# TODO: Fix vertical card positioning
number_of_cards = len(self.cards) number_of_cards = len(self.cards)
if number_of_cards > 0: if number_of_cards > 0:

View File

@ -114,7 +114,7 @@ class Table:
deck_reveal=cards.DeckReveal.HIDE_ALL)) deck_reveal=cards.DeckReveal.HIDE_ALL))
self.players[i].connect_to_table(self.table_status) self.players[i].connect_to_table(self.table_status)
self.players[3].add_ai(ai.randomAI(self.table_status)) self.players[3].add_ai(ai.RandomAI(self.table_status))
playfield_margins = 10 playfield_margins = 10
margins_with_w_deck = w_deck + playfield_margins margins_with_w_deck = w_deck + playfield_margins
@ -151,8 +151,10 @@ class Table:
:param text: String to be displayed on the center board :param text: String to be displayed on the center board
:return: None :return: None
""" """
# TODO: Write procedure to update the announcer text
rendered_text = self.table_font.render(text, True, (255,0,0)).convert_alpha() rendered_text = self.table_font.render(text, True, (255,0,0)).convert_alpha()
self.announcer.blit(rendered_text, (50, 50)) self.announcer.blit(rendered_text, (50, 50))
self.update_table.emit()
def get_pos(self): def get_pos(self):
return self.x, self.y return self.x, self.y
@ -405,12 +407,14 @@ class Player(cards.Deck):
return self.AI.make_a_bid() return self.AI.make_a_bid()
return self.make_a_bid() return self.make_a_bid()
else: else:
#if self.AI: if self.AI:
# pass return self.AI.call_partner()
return self.call_partner() return self.call_partner()
if game_state == GameState.PLAYING: if game_state == GameState.PLAYING:
#if self.AI: if self.AI:
# pass play = self.AI.make_a_play(sub_state)
[_, pos] = self.check_card_in(play)
return self.remove_card(pos)
return self.make_a_play(sub_state) return self.make_a_play(sub_state)
def make_a_bid(self): def make_a_bid(self):