Fix some bugs in bidding proces
parent
7361998aed
commit
ed90a50e49
24
cards.py
24
cards.py
|
@ -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):
|
||||||
|
|
92
players.py
92
players.py
|
@ -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
|
||||||
|
|
Loading…
Reference in New Issue