游戏规则:
玩家和庄家(电脑)各随机抽二张牌,玩家的二张牌都亮出,庄家的牌只亮出一张。
若玩家的手牌点数和小于21,则可以选择是否再抽一张牌,若抽牌后玩家手牌点数之和大于21,则不管庄家手牌如何,玩家直接判负。
若玩家不再抽牌,庄家亮出另一张手牌,玩家和庄家比较手牌点数之和:若玩家手牌点数和更接近21则玩家胜,反之庄家胜;若二者手牌点数和相等则平局。
玩家抽到的A可视为1或11,庄家抽到的A视为11
import random
#引入自定义的扑克牌list
from lists import list_poker_no_suit
#游戏结束标记
isGameEnd = False
#自定义的函数,用于将A/J/Q/K等牌转化为数字,形参card为抽到的牌,isUser为布尔值,用于判断是否是玩家抽的牌
def transedNum(card, isUser):
#函数的返回值,初始为0
numberUser = 0
match card:
#抽到的牌为A时,用户选择转换为1或11,电脑抽到A直接转换为11
case "A":
if isUser:
numberUser = int(input("u wanna 1 or 11?\n"))
while True:
if numberUser != 1 and numberUser != 11:
print("wrong input!")
numberUser = int(input("u wanna 1 or 11?\n"))
else:
break
else:
numberUser = 11
return numberUser
#抽到的牌是JQK时,直接转换为10
case "J"|"Q"|"K":
numberUser = 10
return numberUser
return int(card)
#判断胜负的函数
def checkWhoWin(sumUser, sumPc, cardPc2):
#如果用户的手牌和大于21,则用户输
if sumUser > 21:
print(f"ur total number is {sumUser} exceed 21, u lose!\n")
#如果用户和电脑的手牌和相等,则平局
if sumUser == sumPc:
print(f"Equal, pc's 2nd card is {cardPc2}, u both total numbers are {sumUser}")
#如果用户的牌和比电脑的手牌和更接近21,则用户赢
if 21 - sumUser < 21 - sumPc and sumUser <= 21:
print(f"ur total number is {sumUser}, pc's 2nd card is {cardPc2}, pc's total number is {sumPc}, u win!\n")
#如果电脑的牌和比用户的手牌和更接近21,则电脑赢
if 21 - sumUser > 21 - sumPc:
print(f"ur total number is {sumUser}, pc's 2nd card is {cardPc2}, pc's total number is {sumPc}, you lose\n")
def showEndMessage():
global isGameEnd
inputNext = input("exit to press e, restart to press r\n")
match inputNext:
case "e":
print("bye")
isGameEnd = True
case "r":
mainGame()
#定义主程序
def mainGame():
global isGameEnd
while not isGameEnd:
#将扑克list洗牌
random.shuffle(list_poker_no_suit)
cards = list_poker_no_suit
#初始化电脑的手牌和、玩家的手牌和
sumPc = 0
sumUser = 0
#是否再次抽牌标记
pickAgain = True
#若再次抽牌,则从13张牌的第5张开始抽
nextCardIndex = 4
#电脑和玩家各抽两张牌
cardPc1 = cards[0]
cardPc2 = cards[1]
cardUser1 = cards[2]
cardUser2 = cards[3]
print(f"pc's 1st card is {cardPc1}")
print(f"ur 1st card is {cardUser1}, ur 2nd card is {cardUser2}")
#将牌转换成数字(如果需要的话)
numPc1 = transedNum(cardPc1, False)
numPc2 = transedNum(cardPc2, False)
numUser1 = transedNum(cardUser1, True)
numUser2 = transedNum(cardUser2, True)
#算出电脑的手牌和、用户的手牌和
sumPc = numPc1 + numPc2
sumUser = numUser1 + numUser2
#用户是否再次抽牌的情况
while pickAgain:
cardAgain = input("u wanna another card?y or n")
match cardAgain:
case "y":
print(f"u pick {cards[nextCardIndex]}")
#用户的手牌和加上新抽的牌点数
sumUser += transedNum(cards[nextCardIndex], True)
#若再次抽牌,在13张牌中的索引加1
nextCardIndex += 1
#若用户手牌和小于21,可再次选择是否抽牌
if sumUser < 21:
continue
else:
#若再次抽牌后手牌和大于等于21,则判断胜负
checkWhoWin(sumUser, sumPc, cardPc2)
#用户选择结束程序或重新开始
showEndMessage()
case "n":
#若用户选择不抽牌,则跳出此循环
pickAgain = False
#判断胜负,用户选择是否结束程序
checkWhoWin(sumUser, sumPc, cardPc2)
showEndMessage()
#执行游戏主函数
mainGame()
开头引入的list包含52个点数,不包含花色和大小王,代码如下:
list_poker_no_suit = ['A', 'A', 'A', 'A', '2', '2', '2', '2', '3', '3', '3', '3', '4', '4', '4', '4', '5', '5', '5', '5', '6', '6', '6', '6', '7', '7', '7', '7',
'8', '8', '8', '8', '9', '9', '9', '9', '10', '10', '10', '10', 'J', 'J', 'J', 'J', 'Q', 'Q', 'Q', 'Q', 'K', 'K', 'K', 'K']
虽然完成了游戏功能,但代码写的稀烂,望各位看官不吝赐教!