【问题标题】:Get global variables out of blackjack game从二十一点游戏中获取全局变量
【发布时间】:2020-01-20 15:14:46
【问题描述】:

我正在尝试制作二十一点游戏,但我在玩家手牌、庄家手牌的全局变量以及在完成一手牌后重置或清除下注以便可以玩新手牌时遇到很大问题。如何在多个函数中引用这些变量时摆脱这些全局变量?

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()

【问题讨论】:

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

标签: python blackjack


【解决方案1】:

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

我尝试运行您的代码,但您似乎在结构方面做出了一些奇怪的设计。如果我是你,我会再次坐下来,让你的结构(什么函数调用哪个方法,什么时候发生......)`正确,因为据我所见,你做出了一些糟糕的决定。

只是一个简单的例子。当你被问到是要“留下”还是“击中”并且你选择“留下”时,它会导致循环并且玩家失去对他的牌的控制。 另一个例子是

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

结构。你的 elifelse 做同样的事情,那么为什么你同时拥有这两个,在这种情况下,只需摆脱 elif-statement。

还有一件事是,使用os._exit(1) 而不是sys.exit(0)sys.exit(0) 会抛出某种警告,你的程序也不会按照你想要的方式关闭。

【讨论】:

    猜你喜欢
    • 2023-03-21
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    • 2014-10-22
    • 2022-11-12
    • 2015-04-16
    • 2012-10-16
    • 2015-06-02
    相关资源
    最近更新 更多