Advertisement
Guest User

Schnapsen/Bensch

a guest
Apr 28th, 2017
67
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 6.35 KB | None | 0 0
  1. #Schnapsen mit Bensch
  2. from random import shuffle, choice, seed
  3.  
  4. class Card:    
  5.     def __init__(self, properties):
  6.         self.name = properties[0]
  7.         self.suit = properties[1]
  8.         self.value = int(properties[2])
  9.        
  10.  
  11. class CardPile:
  12.     def __init__(self, card_list):
  13.         self.cards = card_list
  14.  
  15.     def shuffle(self):
  16.         shuffle(self.cards)
  17.  
  18.     def deal_card(self, player1, player2):
  19.         if self.cards:
  20.             player1.hand.append(self.cards.pop())
  21.             player2.hand.append(self.cards.pop())
  22.  
  23.     def show(self):
  24.         for card in self.cards:
  25.             print(card.suit + card.name)
  26.        
  27.  
  28. class Player:
  29.     def __init__(self, name, cards):
  30.         self.name = name
  31.         self.hand = cards
  32.         self.win_pile = []
  33.         self.extrapoints = 0
  34.  
  35.  
  36.     def getPoints(self):
  37.        
  38.         if self.win_pile:
  39.             points = 0
  40.             for card in self.win_pile:
  41.                 points += card.value
  42.             points += self.extrapoints
  43.             return points
  44.        
  45.         return 0
  46.  
  47.  
  48. class Board:
  49.     def __init__(self, players, atout):
  50.         self.player1 = players[0]
  51.         self.player2 = players[1]
  52.         self.played_cards = []
  53.         self.farbzwang = False
  54.         self.atout = atout
  55.  
  56.        
  57.     def show(self):
  58.         p1_cards = [card.suit + card.name for card in self.player1.hand]
  59.         p2_cards = [card.suit + card.name for card in self.player2.hand]
  60.         table_cards = [card.suit + card.name for card in self.played_cards]
  61.        
  62.         print(' | '.join(p1_cards) + ' Punkte: ' + str(self.player1.getPoints()) + chr(10)
  63.               + ' | '.join(table_cards) + chr(10) +
  64.                ' | '.join(p2_cards)+ ' Punkte: ' + str(self.player2.getPoints()) )
  65.  
  66.     def action(self, player, draw_pile):
  67.         chosen_card = self.choose_card(player, draw_pile)
  68.         self.played_cards.append(player.hand.pop(chosen_card-1))
  69.  
  70.     def cleanUp(self, player, draw_pile):
  71.         winner = 0
  72.        
  73.         if self.takeable():
  74.             for card in self.played_cards:
  75.                 player.win_pile.append(card)
  76.             winner = player
  77.         else:
  78.             for card in self.played_cards:
  79.                 self.otherPlayer(player).win_pile.append(card)
  80.             winner = self.otherPlayer(player)
  81.  
  82.         self.played_cards = []
  83.         draw_pile.deal_card(winner, self.otherPlayer(winner))
  84.  
  85.         if not draw_pile.cards:
  86.             self.farbzwang = True
  87.  
  88.         return winner
  89.  
  90.     def takeable(self):
  91.  
  92.         if self.played_cards[1].suit == self.played_cards[0].suit:
  93.             if self.played_cards[1].value > self.played_cards[0].value:
  94.                 return True
  95.         else:
  96.             if self.played_cards[1].suit == self.atout:
  97.                 return True
  98.            
  99.         return False
  100.            
  101.     def otherPlayer(self, player):
  102.         for other_player in [self.player1, self.player2]:
  103.             if other_player is not player:
  104.                 return other_player
  105.  
  106.     def choose_card(self, player, draw_pile):
  107.         chosen_card = 0
  108.  
  109.         if self.farbzwang:
  110.             validcards = self.check_valid_cards(player.hand)
  111.         else:
  112.             validcards = list(range(1, 6))
  113.  
  114.         while chosen_card not in validcards:
  115.             chosen_card = input('Choose a card ' + player.name + ': ')
  116.             if chosen_card.isnumeric():
  117.                 chosen_card = int(chosen_card)
  118.             else:
  119.                 chosen_card = self.alternative_action(chosen_card, player, draw_pile)
  120.  
  121.         return chosen_card
  122.                
  123.  
  124.     def alternative_action(self, chosen_card, player, draw_pile):
  125.         if chosen_card == 'a':
  126.             for index, card in enumerate(player.hand):
  127.                 if card.name == 'J' and card.suit == self.atout:
  128.                     player.hand[index] = draw_pile.cards[0]
  129.                     draw_pile.cards[0] = card
  130.         if chosen_card[0] == 'm':
  131.             partner = player.hand[int(chosen_card[1])-1]
  132.             if partner.value in [3, 4]:
  133.                 for card in player.hand:
  134.                     if card.suit == partner.suit and (card.value + partner.value) == 7:
  135.                         if card.suit != self.atout:
  136.                             player.extrapoints += 20
  137.                         else:
  138.                             player.extrapoints += 40
  139.                         return int(chosen_card[1])
  140.  
  141.         return 0
  142.  
  143.  
  144.     def check_valid_cards(self, hand):
  145.         validoptions = []
  146.  
  147.         for index, card in enumerate(hand):
  148.             if card.suit == self.played_cards[0].suit:
  149.                 validoptions.append(index+1)
  150.  
  151.         if not validoptions:
  152.             validoptions = list(range(1,len(hand)+1))
  153.        
  154.         return validoptions
  155.        
  156.  
  157.     def change_player(self, player):
  158.         if player == self.player1:
  159.             return self.player2
  160.         return self.player1
  161.  
  162.     def finished(self, current_player):
  163.        
  164.         if len(current_player.hand) == 0 or current_player.getPoints() >= 66:
  165.             print(current_player.name + " hat gewonnen! WUHU!")
  166.             return True
  167.  
  168.         return False
  169.  
  170.  
  171. def initialise():
  172.     draw_pile = parse_from_txt()
  173.     draw_pile.shuffle()
  174.     player1 = Player('Max', [])
  175.     player2 = Player('Bensch', [])
  176.     for i in range(5):
  177.         draw_pile.deal_card(player1, player2)
  178.     board = Board([player1, player2], draw_pile.cards[0].suit)
  179.     print(draw_pile.cards[0].suit + draw_pile.cards[0].name)
  180.  
  181.     return draw_pile, board
  182.  
  183.  
  184. def parse_from_txt():
  185.     cards = []
  186.     file = open('Karten.txt', 'r', encoding = 'utf-8')
  187.    
  188.     for line in file:
  189.         cards.append(Card(line.split()))
  190.        
  191.     file.close()
  192.     return CardPile(cards)
  193.    
  194.  
  195.  
  196. def main():
  197.     seed(1)
  198.     [draw_pile, board] = initialise()
  199.     current_player = board.player1
  200.     board.show()
  201.     end = False
  202.     while not end:        
  203.         board.action(current_player, draw_pile)
  204.         board.show()
  205.         current_player = board.change_player(current_player)
  206.         board.action(current_player, draw_pile)
  207.         board.show()
  208.         current_player = board.cleanUp(current_player, draw_pile)
  209.         if draw_pile.cards:
  210.             print(draw_pile.cards[0].suit + draw_pile.cards[0].name)
  211.         board.show()
  212.         end = board.finished(current_player)
  213.  
  214. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement