Fix some bugs in bidding proces

master
En Yi 2019-05-05 16:45:08 +01:00
parent 7361998aed
commit ed90a50e49
2 changed files with 125 additions and 69 deletions

View File

@ -54,10 +54,10 @@ class Card(pygame.sprite.Sprite):
return self.x, self.y return self.x, self.y
def suit(self): def suit(self):
return self.value // 100 return get_card_suit(self.value)
def number(self): def number(self):
return self.value % 100 return get_card_number(self.value)
def value_info(self): def value_info(self):
return self.suit(), self.number() return self.suit(), self.number()
@ -202,6 +202,11 @@ class Deck():
values.append(card.value) values.append(card.value)
return values return values
def check_card_in(self):
# TODO: Write a function to check if card is in the deck
# and return bool with position of card
pass
class PlayerDeck(Deck): class PlayerDeck(Deck):
# TODO: Maybe merge with Regular Deck # TODO: Maybe merge with Regular Deck
@ -232,10 +237,23 @@ def prepare_playing_cards(width, height):
for i in range(4): for i in range(4):
for j in range(13): for j in range(13):
all_cards.append(Card(0, 0, width, height, (i+1)*100 + j+1, image_data=card_img)) all_cards.append(Card(0, 0, width, height, (i+1)*100 + j+2, image_data=card_img))
return all_cards return all_cards
def card_check(value):
return 1 <= get_card_suit(value) <= 4 \
and 2 <= get_card_number(value) <= 14
def get_card_suit(value):
return value // 100
def get_card_number(value):
return value % 100
class test_screen(view.PygView): class test_screen(view.PygView):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):

View File

@ -8,6 +8,9 @@ from enum import Enum
NUM_OF_PLAYERS = 4 NUM_OF_PLAYERS = 4
STARTING_HAND = 13 STARTING_HAND = 13
HIGHEST_CARD = 414
LOWEST_CARD = 102
class GameState(Enum): class GameState(Enum):
DEALING = 0 DEALING = 0
@ -16,6 +19,10 @@ class GameState(Enum):
PLAYING = 3 PLAYING = 3
ENDING = 4 ENDING = 4
class PlayerRole(Enum):
UNKNOWN = 0
ATTACKER = 1
DEFENDER = 2
class Table: class Table:
""" """
@ -63,8 +70,12 @@ class Table:
self.game_state = GameState.DEALING self.game_state = GameState.DEALING
self.players = [] self.players = []
self.players_playzone = [] self.players_playzone = []
self.table_status = {'played cards': [0,0,0,0], 'leading player': 0, 'trump suit': 1, self.table_status = {'played cards': [0, 0, 0, 0], 'leading player': 0, 'trump suit': 1,
'trump broken': False, 'round history': [], 'bid': 0, 'partner': 0} 'trump broken': False, 'round history': [], 'bid': 0, 'partner': 0,
'partner_reveal': False}
self.team_status = {'defender': {'target': 0, 'wins': 0},
'attacker': {'target': 0, 'wins': 0}}
self.current_round = 0
self.background = pygame.Surface((self.width, self.height)) self.background = pygame.Surface((self.width, self.height))
self.background.fill(clear_colour) self.background.fill(clear_colour)
@ -138,6 +149,30 @@ class Table:
def start_game(self): def start_game(self):
#while(True): #while(True):
if self.game_state == GameState.DEALING: if self.game_state == GameState.DEALING:
self.shuffle_and_deal()
print("Shuffle Complete!")
self.game_state = GameState.POINT_CHECK
elif self.game_state == GameState.POINT_CHECK:
if self.check_reshuffle():
print('Reshuffle Initiated!')
self.game_state = GameState.ENDING
else:
print('No Reshuffle needed!')
self.game_state = GameState.BIDDING
elif self.game_state == GameState.BIDDING:
print("Start to Bid")
self.start_bidding()
self.game_state = GameState.ENDING
elif self.game_state == GameState.PLAYING:
pass
else:
self.reset_game()
self.game_state = GameState.DEALING
def shuffle_and_deal(self):
if self.discard_deck: if self.discard_deck:
for i in range(10): for i in range(10):
random.shuffle(self.discard_deck) random.shuffle(self.discard_deck)
@ -145,32 +180,22 @@ class Table:
for i in range(STARTING_HAND): for i in range(STARTING_HAND):
player.add_card(self.discard_deck.pop()) player.add_card(self.discard_deck.pop())
self.update_table.emit() self.update_table.emit()
print("Shuffle Complete!")
self.game_state = GameState.POINT_CHECK
elif self.game_state == GameState.POINT_CHECK: def check_reshuffle(self):
reshuffle = False
for player in self.players: for player in self.players:
print(player.get_card_points()) print(player.get_card_points())
if player.get_card_points() < 4: if player.get_card_points() < 4:
if input("Reshuffle?").lower() == 'y': if input("Reshuffle?").lower() == 'y':
reshuffle = True return True
self.game_state = GameState.ENDING
print('Reshuffle Initiated!')
break
if not reshuffle:
self.game_state = GameState.BIDDING
print('No Reshuffle needed!')
elif self.game_state == GameState.BIDDING: def start_bidding(self):
print("Start to Bid")
current_player = random.randint(1, NUM_OF_PLAYERS) - 1 current_player = random.randint(1, NUM_OF_PLAYERS) - 1
print("Starting Player: {0:d}".format(current_player)) print("Starting Player: {0:d}".format(current_player))
passes = 0 passes = 0
self.table_status["bid"] = 11 # Lowest Bid: 1 Club self.table_status["bid"] = 11 # Lowest Bid: 1 Club
current_player += 1 current_player += 1
current_player %= 4 current_player %= 4
while passes< NUM_OF_PLAYERS - 1: while passes < NUM_OF_PLAYERS - 1:
print("Player {0:d}".format(current_player)) print("Player {0:d}".format(current_player))
print("Current Bid: {0:d}".format(self.table_status["bid"])) print("Current Bid: {0:d}".format(self.table_status["bid"]))
print("Passes: {0:d}".format(passes)) print("Passes: {0:d}".format(passes))
@ -179,12 +204,12 @@ class Table:
passes += 1 passes += 1
else: else:
self.table_status["bid"] = player_bid self.table_status["bid"] = player_bid
if player_bid == 75: # Highest bid: 7 NoTrump
passes = 0 passes = 0
if player_bid == 75: # Highest bid: 7 NoTrump
break
current_player += 1 current_player += 1
current_player %= 4 current_player %= 4
print("Player {0:d}".format(current_player)) print("Player {0:d}".format(current_player))
# TODO: check for valid card call, maybe a function in player?
self.table_status["partner"] = self.players[current_player].make_decision(self.game_state, 1) self.table_status["partner"] = self.players[current_player].make_decision(self.game_state, 1)
self.table_status["trump suit"] = self.table_status["bid"] % 10 self.table_status["trump suit"] = self.table_status["bid"] % 10
self.table_status["trump broken"] = False self.table_status["trump broken"] = False
@ -195,20 +220,22 @@ class Table:
self.table_status["leading player"] = current_player + 1 self.table_status["leading player"] = current_player + 1
print('Bidding Complete') print('Bidding Complete')
print(self.table_status) print(self.table_status)
self.game_state = GameState.ENDING self.team_status['defender']['target'] = self.table_status["bid"] // 10 + 6
self.team_status['attacker']['target'] = 14 - self.team_status['defender']['target']
elif self.game_state == GameState.PLAYING: # TODO: Check who has the partner card and assign the role
def play_a_round(self):
pass pass
else:
def reset_game(self):
for player in self.players: for player in self.players:
print(len(player.cards)) print(len(player.cards))
while not player.is_empty(): while not player.is_empty():
self.discard_deck.append(player.remove_card()) self.discard_deck.append(player.remove_card())
print(len(self.discard_deck)) print(len(self.discard_deck))
self.game_state = GameState.DEALING
self.update_table.emit() self.update_table.emit()
class Player(cards.Deck): class Player(cards.Deck):
""" """
A player is essentially a Deck with decision making function or AI component if it is a bot A player is essentially a Deck with decision making function or AI component if it is a bot
@ -227,6 +254,7 @@ class Player(cards.Deck):
def __init__(self, *args, ai_component=None, **kwargs): def __init__(self, *args, ai_component=None, **kwargs):
super().__init__(*args, **kwargs) super().__init__(*args, **kwargs)
self.role = PlayerRole.UNKNOWN
self.AI = ai_component self.AI = ai_component
self.table_status = None # This is found in Table and updated through Table self.table_status = None # This is found in Table and updated through Table
@ -253,25 +281,35 @@ class Player(cards.Deck):
bid = int(bid) bid = int(bid)
except ValueError: except ValueError:
print("Please enter integer only") print("Please enter integer only")
if self.table_status["bid"] < bid <= 75: if self.table_status["bid"] < bid and self.bid_check(bid):
return bid return bid
else: else:
if bid > 75: if bid > 75:
print("You cannot bid beyond 7 No Trump") print("You cannot bid beyond 7 No Trump")
else: else:
print("The bid is lower than the current bid. Please bid higher or pass.") print("Invalid bid")
@staticmethod
def bid_check(value):
rounds = value // 10
suit = value % 10
return rounds <= 5 and 1 <= suit <= 5
def call_partner(self): def call_partner(self):
current_card_values = self.get_deck_values() current_card_values = self.get_deck_values()
while True: while True:
partner = input("Please call your partner card. Enter suit number + card number\n" partner = input("Please call your partner card. Enter suit number + card number\n"
"i.e 412 is Spade Queen, 108 is Clubs 8, 314 is Hearts Ace\n") "i.e 412 is Spade Queen, 108 is Clubs 8, 314 is Hearts Ace\n")
# TODO: Input scrubbing please try:
partner = int(partner)
if partner in current_card_values: if partner in current_card_values:
print("Please call a card outside of your hand") print("Please call a card outside of your hand")
else: elif cards.card_check(partner):
return partner return partner
else:
print("Invalid card call")
except ValueError:
print("Please enter integer only")
def make_a_play(self): def make_a_play(self):
pass pass