Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #Schnapsen mit Bensch
- from random import shuffle, choice, seed
- class Card:
- def __init__(self, properties):
- self.name = properties[0]
- self.suit = properties[1]
- self.value = int(properties[2])
- class CardPile:
- def __init__(self, card_list):
- self.cards = card_list
- def shuffle(self):
- shuffle(self.cards)
- def deal_card(self, player1, player2):
- if self.cards:
- player1.hand.append(self.cards.pop())
- player2.hand.append(self.cards.pop())
- def show(self):
- for card in self.cards:
- print(card.suit + card.name)
- class Player:
- def __init__(self, name, cards):
- self.name = name
- self.hand = cards
- self.win_pile = []
- self.extrapoints = 0
- def getPoints(self):
- if self.win_pile:
- points = 0
- for card in self.win_pile:
- points += card.value
- points += self.extrapoints
- return points
- return 0
- class Board:
- def __init__(self, players, atout):
- self.player1 = players[0]
- self.player2 = players[1]
- self.played_cards = []
- self.farbzwang = False
- self.atout = atout
- def show(self):
- p1_cards = [card.suit + card.name for card in self.player1.hand]
- p2_cards = [card.suit + card.name for card in self.player2.hand]
- table_cards = [card.suit + card.name for card in self.played_cards]
- print(' | '.join(p1_cards) + ' Punkte: ' + str(self.player1.getPoints()) + chr(10)
- + ' | '.join(table_cards) + chr(10) +
- ' | '.join(p2_cards)+ ' Punkte: ' + str(self.player2.getPoints()) )
- def action(self, player, draw_pile):
- chosen_card = self.choose_card(player, draw_pile)
- self.played_cards.append(player.hand.pop(chosen_card-1))
- def cleanUp(self, player, draw_pile):
- winner = 0
- if self.takeable():
- for card in self.played_cards:
- player.win_pile.append(card)
- winner = player
- else:
- for card in self.played_cards:
- self.otherPlayer(player).win_pile.append(card)
- winner = self.otherPlayer(player)
- self.played_cards = []
- draw_pile.deal_card(winner, self.otherPlayer(winner))
- if not draw_pile.cards:
- self.farbzwang = True
- return winner
- def takeable(self):
- if self.played_cards[1].suit == self.played_cards[0].suit:
- if self.played_cards[1].value > self.played_cards[0].value:
- return True
- else:
- if self.played_cards[1].suit == self.atout:
- return True
- return False
- def otherPlayer(self, player):
- for other_player in [self.player1, self.player2]:
- if other_player is not player:
- return other_player
- def choose_card(self, player, draw_pile):
- chosen_card = 0
- if self.farbzwang:
- validcards = self.check_valid_cards(player.hand)
- else:
- validcards = list(range(1, 6))
- while chosen_card not in validcards:
- chosen_card = input('Choose a card ' + player.name + ': ')
- if chosen_card.isnumeric():
- chosen_card = int(chosen_card)
- else:
- chosen_card = self.alternative_action(chosen_card, player, draw_pile)
- return chosen_card
- def alternative_action(self, chosen_card, player, draw_pile):
- if chosen_card == 'a':
- for index, card in enumerate(player.hand):
- if card.name == 'J' and card.suit == self.atout:
- player.hand[index] = draw_pile.cards[0]
- draw_pile.cards[0] = card
- if chosen_card[0] == 'm':
- partner = player.hand[int(chosen_card[1])-1]
- if partner.value in [3, 4]:
- for card in player.hand:
- if card.suit == partner.suit and (card.value + partner.value) == 7:
- if card.suit != self.atout:
- player.extrapoints += 20
- else:
- player.extrapoints += 40
- return int(chosen_card[1])
- return 0
- def check_valid_cards(self, hand):
- validoptions = []
- for index, card in enumerate(hand):
- if card.suit == self.played_cards[0].suit:
- validoptions.append(index+1)
- if not validoptions:
- validoptions = list(range(1,len(hand)+1))
- return validoptions
- def change_player(self, player):
- if player == self.player1:
- return self.player2
- return self.player1
- def finished(self, current_player):
- if len(current_player.hand) == 0 or current_player.getPoints() >= 66:
- print(current_player.name + " hat gewonnen! WUHU!")
- return True
- return False
- def initialise():
- draw_pile = parse_from_txt()
- draw_pile.shuffle()
- player1 = Player('Max', [])
- player2 = Player('Bensch', [])
- for i in range(5):
- draw_pile.deal_card(player1, player2)
- board = Board([player1, player2], draw_pile.cards[0].suit)
- print(draw_pile.cards[0].suit + draw_pile.cards[0].name)
- return draw_pile, board
- def parse_from_txt():
- cards = []
- file = open('Karten.txt', 'r', encoding = 'utf-8')
- for line in file:
- cards.append(Card(line.split()))
- file.close()
- return CardPile(cards)
- def main():
- seed(1)
- [draw_pile, board] = initialise()
- current_player = board.player1
- board.show()
- end = False
- while not end:
- board.action(current_player, draw_pile)
- board.show()
- current_player = board.change_player(current_player)
- board.action(current_player, draw_pile)
- board.show()
- current_player = board.cleanUp(current_player, draw_pile)
- if draw_pile.cards:
- print(draw_pile.cards[0].suit + draw_pile.cards[0].name)
- board.show()
- end = board.finished(current_player)
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement