I'm trying to make a sort of cribbage game in Python, and it's actually going quite well. I've run into a problem though. Whenever I try to print the six 'cards' dealt to the player, it always prints them to 6 different lines. What would I need to use and how would I make it so they just print in one line right next to each other? My code is below:
#If a card has a 'T' on it, it is a 10
import math
import random
from cardArtGenerator import *
cardFaceSeparator = ''
def generateHeartFace(cardValues):
print(cardFaceSeparator.join(" ┌───┐" * len(cardValues)))
print(cardFaceSeparator.join(f" | {c} |" for c in cardValues))
print(cardFaceSeparator.join(" | ♥ |" * len(cardValues)))
print(cardFaceSeparator.join(" └───┘" * len(cardValues)))
def generateClubFace(cardValues):
print(cardFaceSeparator.join(" ┌───┐" * len(cardValues)))
print(cardFaceSeparator.join(f" | {c} |" for c in cardValues))
print(cardFaceSeparator.join(" | ♣ |" * len(cardValues)))
print(cardFaceSeparator.join(" └───┘" * len(cardValues)))
def generateDiamondFace(cardValues):
print(cardFaceSeparator.join(" ┌───┐" * len(cardValues)))
print(cardFaceSeparator.join(f" | {c} |" for c in cardValues))
print(cardFaceSeparator.join(" | ♦ |" * len(cardValues)))
print(cardFaceSeparator.join(" └───┘" * len(cardValues)))
def generateSpadeFace(cardValues):
print(cardFaceSeparator.join(" ┌───┐" * len(cardValues)))
print(cardFaceSeparator.join(f" | {c} |" for c in cardValues))
print(cardFaceSeparator.join(" | ♠ |" * len(cardValues)))
print(cardFaceSeparator.join(" └───┘" * len(cardValues)))
deck = ['dA','d2','d3','d4','d5','d6','d7','d8','d9','dT','dJ','dQ','dK',
'hA','h2','h3','h4','h5','h6','h7','h8','h9','hT','hJ','hQ','hK',
'sA','s2','s3','s4','s5','s6','s7','s8','s9','sT','sJ','sQ','sK',
'cA','c2','c3','c4','c5','c6','c7','c8','c9','cT','cJ','cQ','cK']
hand = []
separator = ''
def numberGenerator():
for x in range(6):
cardDealt = random.choice(deck)
hand.append(cardDealt)
deck.remove(cardDealt)
def cardArt(cardInput):
if cardInput[0] == 'd':
generateDiamondFace([cardInput[1]])
if cardInput[0] == 'h':
generateHeartFace([cardInput[1]])
if cardInput[0] == 's':
generateSpadeFace([cardInput[1]])
if cardInput[0] == 'c':
generateClubFace([cardInput[1]])
#actually prints the code cards, this is where I need help (line 61)
numberGenerator()
for x in range(len(hand)):
cardArt(hand[x-1])
print(hand)
CodePudding user response:
I refactored your code a bit, but I think this code snippet fits what you want:
import math
import random
deck = ['dA','d2','d3','d4','d5','d6','d7','d8','d9','dT','dJ','dQ','dK',
'hA','h2','h3','h4','h5','h6','h7','h8','h9','hT','hJ','hQ','hK',
'sA','s2','s3','s4','s5','s6','s7','s8','s9','sT','sJ','sQ','sK',
'cA','c2','c3','c4','c5','c6','c7','c8','c9','cT','cJ','cQ','cK']
CARD_SYMBOLS = {"d": "♦", "h": "♥", "s": "♠", "c": "♣"}
def show_hand(cards):
print("╭-----╮\t"*len(cards))
print( "\t".join([f"| {card[1]} |" for card in cards]))
print( "\t".join([f"| {CARD_SYMBOLS[card[0]]} |" for card in cards]))
print("╰-----╯\t"*len(cards))
hand = []
separator = ''
def numberGenerator():
for x in range(6):
card_dealt = random.choice(deck)
hand.append(card_dealt)
deck.remove(card_dealt)
numberGenerator()
show_hand(hand)
The output would look like this:
Let me know if this is helpful!
CodePudding user response:
The answer by @eric-lozano is a great one (I upvoted it :-).
I would tackle the problem in a slightly different manner though. I would definitely move the print() stuff out of method calls if I could.
This strategy is based on reshaping a your list of cards with face rows into a list of face rows with cards.
import random
## ---------------------------
## Generate the display for a single card.
## You have this now but in multiple methods
## Note that we will only print() from our main
## ---------------------------
def get_card_face(card_key):
card_suit, card_value = list(card_key)
suit_display = {"h": "♥", "c": "♣", "d": "♦", "s": "♠"}.get(card_suit, "*")
return [
f"┌───┐",
f"| {card_value} |",
f"| {suit_display} |",
f"└───┘"
]
## ---------------------------
## ---------------------------
## Generatet the display for a hand of cards.
## Note that we will only print() from our main.
## ---------------------------
def get_hand_faces(hand):
## ---------------
## Get a list of the displays of each card.
## This will be a list of lists as each card display is a list of display rows
## ---------------
hand_faces = [get_card_face(c) for c in hand]
## ---------------
## ---------------
## Reshape hand faces so that our list of lists changes from a list of
## cards into a list of rows. Note hand_faces now an enumerator.
## ---------------
hand_faces = zip(*hand_faces)
## ---------------
## ---------------
## return a string with proper spacing and line breaks
## ---------------
return "\n".join(" ".join(row) for row in hand_faces)
## ---------------
## ---------------------------
deck = [
f"{s}{v}"
for s in list("hdcs")
for v in list("A23456789TJQK")
]
random.shuffle(deck)
user_hand = []
computer_hand = []
for _ in range(6):
user_hand.append(deck.pop())
computer_hand.append(deck.pop())
print("User Hand:")
print(get_hand_faces(user_hand))
print("Computer Hand:")
print(get_hand_faces(computer_hand))
This should give you something like:
User Hand:
┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐
| K | | 9 | | 4 | | 6 | | A | | 8 |
| ♥ | | ♠ | | ♣ | | ♥ | | ♠ | | ♣ |
└───┘ └───┘ └───┘ └───┘ └───┘ └───┘
Computer Hand:
┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐ ┌───┐
| K | | 4 | | 9 | | 3 | | 4 | | A |
| ♠ | | ♦ | | ♣ | | ♣ | | ♠ | | ♦ |
└───┘ └───┘ └───┘ └───┘ └───┘ └───┘

