如何并排打印卡片
这是我下面的代码。 我尝试了很多不同的方法,也在Discord服务器上询问过,但没有人能回复或帮助我。
#import modules
import random
import os
import time
#global variables
random_suit = ['♠','♥','♦','♣']
random_card = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
lettered_card = ['A', 'J', 'Q', 'K']
dealer_sum = 0
user_sum = 0
dealer_cards = []
dealer_suit = []
turns = 0
user_cards = []
user_suit = []
user_balance = og_balance = 1000.00
user_bet = 0
# Print cards
def card_print(chosen_suit,chosen_card):
print(f'*------*')
print(f'| {chosen_card:<2} |')
print(f'| |')
print(f'| {chosen_suit} |')
print(f'*------*')
#run
def main():
os.system('cls')
print('----------------------')
print('Welcome to Blackjack!')
bets()
user_hand(2)
time.sleep(1)
dealer_hand()
time.sleep(1)
check_sum()
hit_stay()
#bets
def bets():
global user_bet
global user_balance
print(f'Your balance is currently: ${user_balance}')
bet = int(input('How much would you like to bet?: $'))
if bet < 0 or bet < 10:
print('Minimum bet is $10')
time.sleep(1)
main()
if bet > user_balance:
print('Not enough money in balance')
time.sleep(1)
main()
elif bet < user_balance:
user_bet += bet
else:
print('Invalid Session.')
time.sleep(1)
main()
# Print dealer hand
def dealer_hand():
global dealer_sum
print('-------------')
print('Dealer Hand: ')
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
dealer_cards.append(str(chosen_card))
dealer_suit.append(str(chosen_suit))
dealer_sum += check_letters(chosen_card)
card_print(chosen_suit,chosen_card)
time.sleep(1)
print(f'*------*')
print(f'| ???? |')
print(f'| ???? |')
print(f'| ???? |')
print(f'*------*')
print('Dealer Total: ', dealer_sum)
# Print user hand
def user_hand(amount):
global user_sum
print('-------------')
print('Your Hand: ')
for i in range(amount):
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
user_cards.append(str(chosen_card))
user_suit.append(str(chosen_suit))
user_sum += check_letters(chosen_card)
card_print(chosen_suit, chosen_card)
print('Your Total: ', user_sum)
# Convert letters to numbers
def check_letters(chosen_card):
if chosen_card.isdigit():
return int(chosen_card)
else:
for _ in lettered_card:
if chosen_card != 'A':
return 10
else:
return 11
# Check if the total of the dealer or user is over 21
def check_sum():
global user_bet
global user_balance
def win(bj):
global user_bet
global user_balance
if bj:
user_bet_won = user_bet * 1.75
user_balance += user_bet_won
else:
user_bet_won = user_bet * 1.25
user_balance += user_bet_won
def lose():
global user_bet
global user_balance
user_bet_lost = user_bet * 1.25
user_balance -= user_bet_lost
if user_sum > 21:
print('-------------')
print('Your over 21! You lose!')
lose()
play_again()
elif dealer_sum > 21:
print('-------------')
print('Dealer over 21! You win!')
win(False)
play_again()
elif user_sum == 21:
print('-------------')
print('You have Blackjack. You win!')
win(True)
play_again()
elif dealer_sum == 21:
print('-------------')
print('Dealer has blackjack. You lose!')
lose()
play_again()
elif dealer_sum > user_sum and turns > 0:
print('-------------')
print('Dealer has more. You lose!')
lose()
play_again()
else:
pass
# Hit or Knock
def hit_stay():
global turns
turns += 1
def hit():
global user_sum
global dealer_sum
os.system('cls')
print('-------------')
print('HIT')
#print('P Cards:', user_cards, user_suit)
#print('D Cards:', dealer_cards, dealer_suit)
#your hand
print('-------------')
print('Your Hand: ')
for i_index, card in enumerate(user_cards):
card_print(user_suit[i_index], card)
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
user_cards.append(str(chosen_card))
user_suit.append(str(chosen_suit))
user_sum += check_letters(chosen_card)
card_print(chosen_suit, chosen_card)
print('Your Total: ', user_sum)
# dealer hand
print('-------------')
print('Dealer Hand: ')
for i_index, card in enumerate(dealer_cards):
card_print(dealer_suit[i_index], card)
if dealer_sum >= 17:
check_sum()
hit_stay()
elif dealer_sum < 17:
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
dealer_cards.append(str(chosen_card))
dealer_suit.append(str(chosen_suit))
dealer_sum += check_letters(chosen_card)
card_print(chosen_suit, chosen_card)
print('Dealer Total: ', dealer_sum)
check_sum()
hit_stay()
def stay():
global dealer_sum
os.system('cls')
print('-------------')
print('STAY')
#print('P Cards:', user_cards, user_suit)
#print('D Cards:', dealer_cards, dealer_suit)
# your hand
print('-------------')
print('Your Hand:')
for i_index, card in enumerate(user_cards):
card_print(user_suit[i_index], card)
print('Your Total: ', user_sum)
#print('Knock Function Executed')
# dealer hand
print('-------------')
print('Dealer Hand: ')
for i_index, card in enumerate(dealer_cards):
card_print(dealer_suit[i_index], card)
if dealer_sum >= 17:
check_sum()
hit_stay()
elif dealer_sum < 17:
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
dealer_cards.append(str(chosen_card))
dealer_suit.append(str(chosen_suit))
dealer_sum += check_letters(chosen_card)
card_print(chosen_suit, chosen_card)
print('Dealer Total: ', dealer_sum)
check_sum()
hit_stay()
#outside of hit and knock function
print('-------------')
user_choice = str(input('Hit or Stay?(h/s): '))
if user_choice == 'h':
hit()
elif user_choice == 's':
stay()
def play_again():
global dealer_sum
global user_sum
global dealer_cards
global dealer_suit
global turns
global user_cards
global user_suit
global user_bet
print(f'Balance: ${user_balance}')
pG = str(input('Would you like to play again?(y/n): '))
if pG == 'y':
dealer_sum = 0
user_sum = 0
dealer_cards = []
dealer_suit = []
turns = 0
user_cards = []
user_suit = []
user_bet = 0
main()
else:
exit()
if __name__ == '__main__':
main()
在这里输入图片描述 这些卡片只是在一个个地打印出来。我是Python的初学者,大约一周半前才开始学习,所以请不要因为我的代码不够高效而批评我。谢谢!
2 个回答
0
这里有一个解决方案,可以让卡片在同一行打印:
#import modules
from calendar import c
import random
import os
import time
from collections import namedtuple
#global variables
random_suit = ['♠','♥','♦','♣']
random_card = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
lettered_card = ['A', 'J', 'Q', 'K']
dealer_sum = 0
user_sum = 0
dealer_cards = []
dealer_suit = []
turns = 0
user_cards = []
user_suit = []
user_balance = og_balance = 1000.00
user_bet = 0
Card = namedtuple("Card", ["chosen_suit", "chosen_card"])
DEALER_CARD = ( f'*------*',
f'| ???? |',
f'| ???? |',
f'| ???? |',
f'*------*',
)
INDENT_SPACE = " "
# Print cards
def card_print(*cards: Card):
for c in cards:
if c == DEALER_CARD:
print(c[0], end="")
continue
print(f'*------*'+INDENT_SPACE, end="")
print()
for c in cards:
if c == DEALER_CARD:
print(c[1], end="")
continue
print(f'| {c.chosen_card:<2} |'+INDENT_SPACE, end="")
print()
for c in cards:
if c == DEALER_CARD:
print(c[2], end="")
continue
print(f'| |'+INDENT_SPACE, end="")
print()
for c in cards:
if c == DEALER_CARD:
print(c[3], end="")
continue
print(f'| {c.chosen_suit} |'+INDENT_SPACE, end="")
print()
for c in cards:
if c == DEALER_CARD:
print(c[4])
continue
print(f'*------*'+INDENT_SPACE, end="")
print()
#run
def main():
os.system('cls')
print('----------------------')
print('Welcome to Blackjack!')
bets()
user_hand(2)
time.sleep(1)
dealer_hand()
time.sleep(1)
check_sum()
hit_stay()
#bets
def bets():
global user_bet
global user_balance
print(f'Your balance is currently: ${user_balance}')
bet = int(input('How much would you like to bet?: $'))
if bet < 0 or bet < 10:
print('Minimum bet is $10')
time.sleep(1)
main()
if bet > user_balance:
print('Not enough money in balance')
time.sleep(1)
main()
elif bet < user_balance:
user_bet += bet
else:
print('Invalid Session.')
time.sleep(1)
main()
# Print dealer hand
def dealer_hand():
global dealer_sum
print('-------------')
print('Dealer Hand: ')
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
dealer_cards.append(str(chosen_card))
dealer_suit.append(str(chosen_suit))
dealer_sum += check_letters(chosen_card)
card_print(Card(chosen_suit,chosen_card), DEALER_CARD)
time.sleep(1)
print('Dealer Total: ', dealer_sum)
# Print user hand
def user_hand(amount):
global user_sum
print('-------------')
print('Your Hand: ')
cards_to_print = []
for i in range(amount):
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
user_cards.append(str(chosen_card))
user_suit.append(str(chosen_suit))
user_sum += check_letters(chosen_card)
cards_to_print.append(Card(chosen_suit, chosen_card))
card_print(*cards_to_print)
print('Your Total: ', user_sum)
# Convert letters to numbers
def check_letters(chosen_card):
if chosen_card.isdigit():
return int(chosen_card)
else:
for _ in lettered_card:
if chosen_card != 'A':
return 10
else:
return 11
# Check if the total of the dealer or user is over 21
def check_sum():
global user_bet
global user_balance
def win(bj):
global user_bet
global user_balance
if bj:
user_bet_won = user_bet * 1.75
user_balance += user_bet_won
else:
user_bet_won = user_bet * 1.25
user_balance += user_bet_won
def lose():
global user_bet
global user_balance
user_bet_lost = user_bet * 1.25
user_balance -= user_bet_lost
if user_sum > 21:
print('-------------')
print('Your over 21! You lose!')
lose()
play_again()
elif dealer_sum > 21:
print('-------------')
print('Dealer over 21! You win!')
win(False)
play_again()
elif user_sum == 21:
print('-------------')
print('You have Blackjack. You win!')
win(True)
play_again()
elif dealer_sum == 21:
print('-------------')
print('Dealer has blackjack. You lose!')
lose()
play_again()
elif dealer_sum > user_sum and turns > 0:
print('-------------')
print('Dealer has more. You lose!')
lose()
play_again()
else:
pass
# Hit or Knock
def hit_stay():
global turns
turns += 1
def hit():
global user_sum
global dealer_sum
os.system('cls')
print('-------------')
print('HIT')
#print('P Cards:', user_cards, user_suit)
#print('D Cards:', dealer_cards, dealer_suit)
#your hand
print('-------------')
print('Your Hand: ')
cards_to_print = []
for i_index, card in enumerate(user_cards):
cards_to_print.append(Card(user_suit[i_index], card))
card_print(*cards_to_print)
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
user_cards.append(str(chosen_card))
user_suit.append(str(chosen_suit))
user_sum += check_letters(chosen_card)
card_print(Card(chosen_suit, chosen_card))
print('Your Total: ', user_sum)
# dealer hand
print('-------------')
print('Dealer Hand: ')
cards_to_print = []
for i_index, card in enumerate(dealer_cards):
cards_to_print.append(Card(dealer_suit[i_index], card))
card_print(*cards_to_print)
if dealer_sum >= 17:
check_sum()
hit_stay()
elif dealer_sum < 17:
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
dealer_cards.append(str(chosen_card))
dealer_suit.append(str(chosen_suit))
dealer_sum += check_letters(chosen_card)
card_print(Card(chosen_suit, chosen_card))
print('Dealer Total: ', dealer_sum)
check_sum()
hit_stay()
def stay():
global dealer_sum
os.system('cls')
print('-------------')
print('STAY')
#print('P Cards:', user_cards, user_suit)
#print('D Cards:', dealer_cards, dealer_suit)
# your hand
print('-------------')
print('Your Hand:')
cards_to_print = []
for i_index, card in enumerate(user_cards):
cards_to_print.append(Card(user_suit[i_index], card))
card_print(*cards_to_print)
print('Your Total: ', user_sum)
#print('Knock Function Executed')
# dealer hand
print('-------------')
print('Dealer Hand: ')
cards_to_print = []
for i_index, card in enumerate(dealer_cards):
cards_to_print.append(Card(dealer_suit[i_index], card))
card_print(*cards_to_print)
if dealer_sum >= 17:
check_sum()
hit_stay()
elif dealer_sum < 17:
time.sleep(1)
chosen_card = random.choice(random_card)
chosen_suit = random.choice(random_suit)
dealer_cards.append(str(chosen_card))
dealer_suit.append(str(chosen_suit))
dealer_sum += check_letters(chosen_card)
card_print(Card(chosen_suit, chosen_card))
print('Dealer Total: ', dealer_sum)
check_sum()
hit_stay()
#outside of hit and knock function
print('-------------')
user_choice = str(input('Hit or Stay?(h/s): '))
if user_choice == 'h':
hit()
elif user_choice == 's':
stay()
def play_again():
global dealer_sum
global user_sum
global dealer_cards
global dealer_suit
global turns
global user_cards
global user_suit
global user_bet
print(f'Balance: ${user_balance}')
pG = str(input('Would you like to play again?(y/n): '))
if pG == 'y':
dealer_sum = 0
user_sum = 0
dealer_cards = []
dealer_suit = []
turns = 0
user_cards = []
user_suit = []
user_bet = 0
main()
else:
exit()
if __name__ == '__main__':
main()
为了实现这个功能,我使用了 collections.namedtuple 来整理卡片的数据。这样做可以让我们在 card_print
函数中更方便地访问数据,同时也让代码更清晰。
在 card_print
函数中,添加了 DEALER_CARD
常量,以便打印卡片。
2
你可以把这些卡片放进一个列表里,然后一行一行地打印出来:
def print_hand(hand):
# Print first line of all cards in hand
for card in hand:
print("*------*", end=' ')
print()
# 2nd line
for card in hand:
print(f'| {card[0]:<2} |', end=' ')
print()
# 3rd line
for card in hand:
print("| |", end=' ')
print()
# 4th line
for card in hand:
print(f"| {card[1]} |", end=' ')
print()
# Last line
for card in hand:
print("*------*", end=' ')
hand = [('A', '♥'), ('K', '♦'), ('4', '♣')]
print_hand(hand)
输出结果:
*------* *------* *------*
| A | | K | | 4 |
| | | | | |
| ♥ | | ♦ | | ♣ |
*------* *------* *------*