Implement point counting and reshuffle

master
En Yi 2019-05-04 20:02:45 +01:00
parent 679b205d02
commit 09e44d0ca2
2 changed files with 120 additions and 54 deletions

View File

@ -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)

View File

@ -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):