python21点小游戏

        游戏规则:

        玩家和庄家(电脑)各随机抽二张牌,玩家的二张牌都亮出,庄家的牌只亮出一张。

        若玩家的手牌点数和小于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']

        虽然完成了游戏功能,但代码写的稀烂,望各位看官不吝赐教!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值