Python 从21点游戏中获取全局变量

Python 从21点游戏中获取全局变量,python,blackjack,Python,Blackjack,我正在尝试做一个21点游戏,我在玩家手牌、交易商手牌和赌注的全局变量方面遇到了很大的问题,在完成一手牌后重置或清除,以便可以玩新的手牌。在多个函数中引用这些变量时,如何去掉这些全局变量 import os import random import sys d = [] p = [] c = input("How many chips do you want: ") chips = int(c) b = input("Place your bet: ") bet = int(b) def c

我正在尝试做一个21点游戏,我在玩家手牌、交易商手牌和赌注的全局变量方面遇到了很大的问题,在完成一手牌后重置或清除,以便可以玩新的手牌。在多个函数中引用这些变量时,如何去掉这些全局变量

import os
import random
import sys

d = []
p = []
c = input("How many chips do you want: ")
chips = int(c)
b = input("Place your bet: ")
bet = int(b)


def card(x):
    x.append(random.randint(1, 11))


def clear():
    os.system("clear")


def main():
    global p
    global d
    card(p)
    card(p)
    card(d)
    card(d)
    show1()
    check()

    answer = input("Play again? y or n: ")
    if answer == "y":
        bb = list(b)
        bb.clear()
        bet.clear()
        p.clear()
        d.clear()
        main()
    else:
        sys.exit(0)


def show1():
    global d
    global p
    print(str(d[0]) + " []")


print(p)


def show2():

    global d
    global p
    print(d)
    print(p)


def win():
    print("You win")
    chip = chips
    bett = bet
    stash = chip + bett
    print(stash)


def lose():
    print("You lose")
    chip = chips
    bett = bet
    stash = chip - bett
    print(stash)


def check2():
    global p
    global d
    dealer = sum(d)
    player = sum(p)

    if player == 21:
        win()
    elif player > 21:
        lose()
    elif dealer > 21:
        win()
    elif dealer == 21:
        lose()
    elif dealer > player:
        lose()
    else:
        win()


def check():

    global d
    global p

    while sum(p) < 21:
        player = sum(p)
        dealer = sum(d)
        choice = input("Hit or stay? Type h or s: ")

        if choice == "h":
            clear()
            card(p)
            show1()
        elif player >= 21:
            break
        else:
            break

    while sum(d) < sum(p):
        dealer = sum(d)
        player = sum(p)
        card(d)
        clear()
        show2()

        if dealer > player:
            break
        elif dealer >= 21:
            break
        else:
            check2()


main()
导入操作系统
随机输入
导入系统
d=[]
p=[]
c=输入(“您想要多少芯片:”)
芯片=整数(c)
b=输入(“下注:”)
bet=int(b)
def卡(x):
x、 追加(random.randint(1,11))
def clear():
操作系统(“清除”)
def main():
全局p
全球d
卡片(p)
卡片(p)
卡片(d)
卡片(d)
show1()
检查()
回答=输入(“再次播放?y或n:”)
如果答案=“y”:
bb=列表(b)
bb.clear()
打赌
p、 清除()
d、 清除()
main()
其他:
系统出口(0)
def show1():
全球d
全局p
打印(str(d[0])+“[]”)
印刷品(p)
def show2():
全球d
全局p
印刷品(d)
印刷品(p)
def win():
打印(“你赢了”)
芯片=芯片
打赌
隐藏=芯片+电池
打印(隐藏)
def lose():
打印(“你输了”)
芯片=芯片
打赌
藏=芯片-贝特
打印(隐藏)
def check2():
全局p
全球d
经销商=金额(d)
玩家=总和(p)
如果player==21:
赢()
elif player>21:
失去
elif经销商>21:
赢()
elif经销商==21:
失去
elif经销商>玩家:
失去
其他:
赢()
def check():
全球d
全局p
当总和(p)<21时:
玩家=总和(p)
经销商=金额(d)
选择=输入(“命中或停留?类型h或s:”)
如果选项==“h”:
清除()
卡片(p)
show1()
elif播放器>=21:
打破
其他:
打破
而sum(d)玩家:
打破
elif经销商>=21:
打破
其他:
检查2()
main()

您应该再次查看python中的作用域。在给定的代码中,您根本不需要任何
全局
标识符(无论如何,您应该尽量避免使用它们,这对您很有好处)。只要去掉所有带有
global
的行就可以了

我试着运行你的代码,看起来你在做一些奇怪的设计。如果我是你,我会再次坐下来,让你的结构(什么函数调用哪个方法,什么时候发生…)正确,因为正如我所看到的,你在做一些糟糕的决定

只是一个简单的例子。当你被问到你想“留下”还是“打”,而你选择“留下”时,这会导致一个循环,玩家失去对他的牌的控制。 另一个例子是

    if choice == "h":
        clear()
        card(p)
        show1()
    elif player >= 21:
        break
    else:
        break
结构。您的
elif
else
做了相同的事情,那么为什么您同时拥有这两个呢?在这种情况下,只需去掉
elif
-语句即可


还有一件事是,使用
os.\u exit(1)
而不是
sys.exit(0)
sys.exit(0)
将抛出某种警告,并且您的程序也不会按您希望的方式关闭。

您可以利用它来包含和访问与游戏相关的功能,这将使您能够更合理地将事情放在一起。这里有太多的垂直空间。我还通过
black
格式化程序运行了您的代码,以使其可读。此外,在codereview.stackexchange.comA上可能更好。起点是将所有全局状态放入名为
Game
GameState
的类中。然后,所有其他方法要么接受
GameState
作为参数,要么是
Game
的成员函数。