【初学Python,人总要多学点东西】—— 二十一点小程序

老版不删对照

import random # 随机数包

bjl_xj = int(random.randint(1,13))  # 闲家产生第一个随机数

bjl_zj = int(random.randint(1,13)) # 庄家产生第一个随机数
s1 = 1 # 闲家初始化第一次叫牌
s2 = 1 # 庄家初始化第一次叫牌
print('闲家第',s1,'个数值',bjl_xj,'点,','是否叫牌')
print('叫牌请按:',1,'锁牌请按:',2)
xj_1 = int(input())
if xj_1 == 1:

    while bjl_xj < 21 and xj_1 == 1:
        del xj_1
        s1 = 1+s1
        bjl_qk = int(random.randint(0,13))


        bjl_xj = bjl_xj + bjl_qk
        print('闲家第', s1, '个数值', bjl_qk, '点')   # 循环值
        print('闲家共计', bjl_xj, '点')
        if  bjl_xj < 21 :
            print('闲家是否继续叫牌')
            print('叫牌请按:', 1, '锁牌请按:', 2)
            xj_1 = int(input())
            if xj_1 != 1:
                print('闲家弃牌,庄家叫牌')
                print('庄家第', s2, '个数值', bjl_zj, '点')  # 闲家循环 产生随机数
                while bjl_zj < bjl_xj :

                    s2 = 1 + s2
                    bzj_qk = int(random.randint(0, 13))

                    bjl_zj = bjl_zj + bzj_qk
                    print('庄家第', s2, '个数值', bzj_qk, '点') # 庄家循环 产生随机数
                    del s2
                    print('庄家共计', bjl_zj, '点')
                    if  bjl_zj > bjl_xj and bjl_zj >= 21:
                        print('庄家胜利')
                        break
                    elif bjl_zj < bjl_xj and bjl_xj >= 21:
                        print('庄家胜利')
                        break
        elif bjl_xj > 21:
            print('Game Over')
        elif bjl_xj == 21:
            print('庄家第', s2, '个数值', bjl_zj, '点')  # 循环值
            while bjl_zj < bjl_xj:

                s2 = 1 + s2
                bzj_qk = int(random.randint(0, 13))

                bjl_zj = bjl_zj + bzj_qk
                print('庄家第', s2, '个数值', bzj_qk, '点')  # 循环值
                del s2
                print('庄家共计', bjl_zj, '点')
                if bjl_zj > bjl_xj and bjl_zj >= 21:
                    print('庄家胜利')
                    break
                elif bjl_zj < bjl_xj and bjl_xj >= 21:
                    print('庄家胜利')
                    break
                elif bjl_zj > 21:
                    print('闲家胜利')
                    break

#   else:

#        print('庄家第', s1, '个数值', bjl_zj, '点')
#        print('庄家胜利')
elif xj_1 != 1:
    print(bjl_xj)
    print('庄家第', s1, '个数值', bjl_zj, '点')  # 循环值

    while bjl_zj < bjl_xj:

        s2 = 1 + s1
        bzj_qk = int(random.randint(0, 13))

        bjl_zj = bjl_zj + bzj_qk
        print('庄家第', s2, '个数值', bzj_qk, '点')  # 循环值
        del s2
        print('庄家共计', bjl_zj, '点')
        if bjl_zj > bjl_xj and bjl_zj >= 21:
            print('庄家胜利')
            break
        elif bjl_zj < bjl_xj and bjl_xj >= 21:
            print('庄家胜利')
            break
    else:
        print('庄家胜利')

新版未完待续…(有空再说)

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2021/11/26 23:18
# @Author  : Winston
# @File    : 31.py
# @Software: PyCharm
import random # 随机数包
import string
''' 21 点规则
庄家:游戏中第一个坐下的玩家默认为庄家。
闲家:本轮不坐庄的玩家。
点数计算:每张牌都有点数,2到10的牌的点数就是其牌面的数字;J、Q、K的点数是10分;A有两种算法,1或者11,如果A算为11时总和大于21,则A算为1。例如(A,8)是19点,(A,7,J)则为18点。
爆牌:玩家手中牌的总点数超过21点。
黑杰克(BlackJack):一张A带一张10点的牌,比其他21点的牌大,例如(A,Q)。闲家获得黑杰克,可以获得所下注的1.5倍。
停牌:玩家不再要牌,等待其他玩家操作。
要牌:
.闲家根据自己手上的点数决定是否要牌,如果要牌,则系统再发一张牌给玩家。如果要牌后总点数超过21,则算爆牌,玩家输掉本轮游戏;若要牌后点数为21点,则不能再要;如果要牌后总点数不到21点,则玩家可以继续“要牌”“停牌”“加倍”。
.庄家持牌总点数少于17,则必须要牌,直到超过16,如果庄家的总点数等于或多于17点,则必须停牌。如果庄家手中有A,且A作11点时大于16点,做1点时小于或等于16点,则由庄家自己选择是否要牌。
加倍:双倍下注(Double)如果您已经抽取了两张纸牌,在这两张牌不是“黑杰克”的前提下,如果认为第三张牌可以让您赢过庄家的手牌,您可以要求「双倍押注」。您的赌注将增加双倍,而您只可以再抽取一张额外纸牌。
保险:发过牌后如果庄家手中拿到明牌A,玩家就有机会买保险,保险金是玩家当初下注的一半。
.如果玩家选择保险:
庄家是黑杰克时,庄家只蠃得保险金。
庄家不是黑杰克,庄家首先收走保险金,然后进行要牌、比较的程序,与前述相同。
如果玩家拿到21点,仍能拿到全部的酬金。
.如果玩家不选择保险:
庄家是黑杰克时,收走玩家赌金。
庄家不是黑杰克,仍然进行要牌、比较等程序,与前述相同。
对子:闲家可以选择在自己或其他闲家上下注押对子,如果所压的闲家获得对子(即两张相同种类的牌),则下注闲家胜,庄家赔11倍的筹码。
分牌:若玩家获得对子,则可以选择分牌,将这两张牌分成两手牌,由这个玩家一人操作,每手牌的赌注与开始的赌注相同。分牌后不能“加倍”,拿到BlackJack牌型也只算普通的21点。
牌型比较
所有闲家都与庄家比较。
黑杰克为特殊牌型,比其他所有牌型都大。除黑杰克,其他牌型都以点数比较大小。
庄家和闲家点数相同,或都拿到黑杰克,则为平局。
庄家和闲家都爆牌,系统判断庄家赢。
'''
# 因为所有人都知道扑克的根数和花色,所以理论上以下这段代码可以忽视,直接使用字典进行固定值创建,这段代码只是为了巩固我自己的学习

color_dic = {"♤":{},"♢":{},"♡":{},"♧":{}}
guest_dic = {}
host_guset = {}
color_lis = []
user_set = []
count = 0 # 循环计数
inc = 0 # 花色计数
for i in range(1,57):# 循环57次是因为遇到第14次会进入第二阶段判定所以每种花色会间断一次
    count += 1
    if count < 14: # 一种花色13张牌
        if count == 1: # 每种花色有四根英文标识AJQK
            st_brk = 'A'
        elif count == 11:
            st_brk = 'J'
        elif count == 12:
            st_brk = 'Q'
        elif count == 13:
            st_brk = 'K'
        else:
            st_brk = str(count)
        combination = "".join(color_dic.keys())[inc] + st_brk
        color_dic[combination[0]].setdefault(combination,count)
        color_lis.append(combination)
    else:
        count = 0
        inc += 1
print(color_lis)

''' 正式开始21点逻辑 '''

numpeo = int(input("最多五人同桌,请输入入席人数:"))

for i in range(1,numpeo+1): # 生成玩家

    if i == numpeo:
        host_name = input("请输入庄家的名字:")
        host_guset.setdefault(host_name,[])
    else:
        name = input("请输入闲家的名字:")
        guest_dic.setdefault(name,[])
print(guest_dic,host_guset)
for k,v in guest_dic.items(): # 遍历玩家字典
    count =+ 1
    muv = int(random.randint(1, len(color_lis)))
    a1 = color_lis[muv] #查找列表对应的字符串
    guest_dic[k].append(color_dic[a1[0]][a1]) # 用列表对应的字符串在字典中取值
    user_set.append(color_lis[muv])
    print(f"闲家{k}{user_set},是否叫牌")
    button = input('叫牌请按:1\n锁牌请按任意键\n')


    while button == "1":
        if sum(guest_dic[k]) < 21:
            muv = int(random.randint(1, len(color_lis)))
            a1 = color_lis[muv]  # 查找列表对应的字符串
            guest_dic[k].append(color_dic[a1[0]][a1])  # 用列表对应的字符串在字典中取值
            user_set.append(color_lis[muv])
            print(f"闲家{k}{user_set},是否叫牌")
            button = input('叫牌请按:1\n锁牌请按:2\n')


        else:
            print("您爆了")

            break
    else:
        continue
    user_set.clear()

for k,v in host_guset.items():
    while sum(host_guset[k]) < 17: #庄家持牌总点数少于17,则必须要牌,直到超过16,如果庄家的总点数等于或多于17点,则必须停牌。如果庄家手中有A,且A作11点时大于16点,做1点时小于或等于16点,则由庄家自己选择是否要牌。
        muv = int(random.randint(1, len(color_lis)))
        a1 = color_lis[muv]  # 查找列表对应的字符串
        host_guset[k].append(color_dic[a1[0]][a1])  # 用列表对应的字符串在字典中取值
        user_set.append(color_lis[muv])
        if sum(host_guset[k]) > 21:
            print("您爆了")
            break
    else:
        if sum(host_guset[k]) > 21:
            print("您爆了")
            break
        else:
            print(f"庄家{k}{user_set},是否叫牌")
            button = input('叫牌请按:1\n锁牌请按:2\n')
            while button == "1":
                muv = int(random.randint(1, len(color_lis)))
                a1 = color_lis[muv]  # 查找列表对应的字符串
                host_guset[k].append(color_dic[a1[0]][a1])  # 用列表对应的字符串在字典中取值
                user_set.append(color_lis[muv])
                print(f"庄家{k}{user_set},是否叫牌")
                button = input('叫牌请按:1\n锁牌请按:2\n')
                if sum(host_guset[k]) > 21:
                    print("您爆了")
                    break
    user_set.clear()



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值