Implement point counting and reshuffle
parent
679b205d02
commit
09e44d0ca2
60
cards.py
60
cards.py
|
@ -6,6 +6,7 @@ Deck is used as a Card container
|
|||
import pygame
|
||||
import view
|
||||
import os
|
||||
import random
|
||||
from enum import Enum
|
||||
|
||||
|
||||
|
@ -50,6 +51,15 @@ class Card(pygame.sprite.Sprite):
|
|||
def get_pos(self):
|
||||
return self.x, self.y
|
||||
|
||||
def suit(self):
|
||||
return self.value // 100
|
||||
|
||||
def number(self):
|
||||
return self.value % 100
|
||||
|
||||
def value_info(self):
|
||||
return self.suit(), self.number()
|
||||
|
||||
|
||||
class Deck():
|
||||
|
||||
|
@ -84,6 +94,7 @@ class Deck():
|
|||
self._layer = 1
|
||||
|
||||
def add_card(self, card, position=0):
|
||||
# TODO: Add a function to add additional cards, to optimise number of recalculations
|
||||
card.parent = self
|
||||
number_of_cards = len(self.cards)
|
||||
|
||||
|
@ -120,6 +131,8 @@ class Deck():
|
|||
|
||||
def set_card_positions(self):
|
||||
number_of_cards = len(self.cards)
|
||||
|
||||
if number_of_cards > 0 :
|
||||
if self.is_horizontal():
|
||||
total_card_length = self.cards[0].width + self.default_spacing * (number_of_cards-1)
|
||||
if total_card_length <= self.length:
|
||||
|
@ -153,6 +166,7 @@ class Deck():
|
|||
|
||||
def update_deck_display(self):
|
||||
self.deck_surface.blit(self.background, (0, 0))
|
||||
if not self.is_empty():
|
||||
if self.draw_from_last:
|
||||
for card in reversed(self.cards):
|
||||
self.deck_surface.blit(card.image, (card.x, card.y))
|
||||
|
@ -160,12 +174,21 @@ class Deck():
|
|||
for card in self.cards:
|
||||
self.deck_surface.blit(card.image, (card.x, card.y))
|
||||
|
||||
def remove_card(self):
|
||||
pass
|
||||
def remove_card(self, pos=-1):
|
||||
if pos < 0:
|
||||
card = self.cards.pop()
|
||||
else:
|
||||
card = self.cards.pop(pos)
|
||||
self.set_card_positions()
|
||||
return card
|
||||
|
||||
|
||||
def is_horizontal(self):
|
||||
return not self.vert_orientation
|
||||
|
||||
def is_empty(self):
|
||||
return len(self.cards) == 0
|
||||
|
||||
def get_pos(self):
|
||||
return self.x, self.y
|
||||
|
||||
|
@ -208,22 +231,21 @@ class test_screen(view.PygView):
|
|||
super().__init__(*args, **kwargs)
|
||||
|
||||
try: # try to load images from the harddisk
|
||||
card_img = pygame.image.load(os.path.join(DATA_FOLDER, 'diamond.jpg'))
|
||||
self.card_img = pygame.image.load(os.path.join(DATA_FOLDER, 'diamond.jpg'))
|
||||
except:
|
||||
raise Exception("Cannot load image") # print error message and exit program
|
||||
|
||||
self.test_card = Card(50, 0, 50, 75, 111, image_data=card_img)
|
||||
self.test_card = Card(50, 0, 50, 75, 111, image_data=self.card_img)
|
||||
self.test_deck = Deck(100, 100, 200, 100, 25)
|
||||
self.test_deck.add_card()
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 315, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 210, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 103, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 405, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 112, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 301, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 206, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 206, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 206, image_data=card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 315, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 210, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 103, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 405, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 112, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 301, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 206, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 206, image_data=self.card_img))
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, 206, image_data=self.card_img))
|
||||
|
||||
def draw_function(self):
|
||||
self.screen.blit(self.test_card.image, self.test_card.get_pos())
|
||||
|
@ -238,8 +260,14 @@ class test_screen(view.PygView):
|
|||
elif event.type == pygame.KEYDOWN:
|
||||
if event.key == pygame.K_ESCAPE:
|
||||
running = False
|
||||
if event.key == pygame.K_p:
|
||||
print('add cards')
|
||||
if event.key == pygame.K_r:
|
||||
card = self.test_deck.remove_card()
|
||||
del card
|
||||
print('remove cards')
|
||||
|
||||
if event.key == pygame.K_a:
|
||||
self.test_deck.add_card(Card(50, 0, 50, 75, random.randint(1, 500), image_data=self.card_img))
|
||||
print('remove cards')
|
||||
pass
|
||||
|
||||
milliseconds = self.clock.tick(self.fps)
|
||||
|
|
50
players.py
50
players.py
|
@ -139,20 +139,39 @@ class Table:
|
|||
#while(True):
|
||||
if self.game_state == GameState.DEALING:
|
||||
if self.discard_deck:
|
||||
random.shuffle(self.discard_deck)
|
||||
for i in range(NUM_OF_PLAYERS):
|
||||
for j in range(STARTING_HAND):
|
||||
self.players[i].add_card(self.discard_deck.pop())
|
||||
dealt_cards = random.sample(self.discard_deck, 13)
|
||||
for player in self.players:
|
||||
for card in dealt_cards:
|
||||
player.add_card(card)
|
||||
self.update_table.emit()
|
||||
print("Shuffle Complete!")
|
||||
self.game_state = GameState.POINT_CHECK
|
||||
|
||||
elif self.game_state == GameState.POINT_CHECK:
|
||||
pass
|
||||
reshuffle = False
|
||||
for player in self.players:
|
||||
print(player.get_card_points())
|
||||
if player.get_card_points() < 4:
|
||||
if input("Reshuffle?").lower() == 'y':
|
||||
reshuffle = True
|
||||
self.game_state = GameState.ENDING
|
||||
print('Reshuffle Initiated!')
|
||||
break
|
||||
if not reshuffle:
|
||||
self.game_state = GameState.ENDING
|
||||
print('No Reshuffle needed!')
|
||||
|
||||
elif self.game_state == GameState.BIDDING:
|
||||
pass
|
||||
elif self.game_state == GameState.PLAYING:
|
||||
pass
|
||||
else:
|
||||
pass
|
||||
for player in self.players:
|
||||
while not player.is_empty():
|
||||
self.discard_deck.append(player.remove_card())
|
||||
print(len(self.discard_deck))
|
||||
self.game_state = GameState.DEALING
|
||||
self.update_table.emit()
|
||||
|
||||
|
||||
class Player(cards.Deck):
|
||||
|
@ -191,6 +210,25 @@ class Player(cards.Deck):
|
|||
def check_for_valid_moves(self):
|
||||
pass
|
||||
|
||||
def get_card_points(self):
|
||||
suit_points = 0
|
||||
card_points = []
|
||||
current_suit = 1
|
||||
card_position = 0
|
||||
for (i, card) in enumerate(self.cards):
|
||||
if card.suit() != current_suit:
|
||||
suit_points += (i-card_position) // 5
|
||||
card_position = i
|
||||
current_suit = card.suit()
|
||||
card_points.append(max(0, card.number() - 10))
|
||||
suit_points += (STARTING_HAND-card_position) // 5
|
||||
return suit_points + sum(card_points)
|
||||
|
||||
def request_reshuffle(self):
|
||||
# Players can choose NOT to reshuffle
|
||||
# But always reshuffle for simplicity
|
||||
return True
|
||||
|
||||
|
||||
class MainPlayer(cards.PlayerDeck):
|
||||
def __init__(self, *args, ai_component=None, **kwargs):
|
||||
|
|
Loading…
Reference in New Issue