站着不做任何事情的选择

时间:2019-03-02 08:38:05

标签: python python-3.x blackjack

所以我试图用python 3做一个简单的二十一点游戏,并且一切正常,除了我不能忍受。如果我输入2,它将不会执行任何操作。提前致谢。 编辑1:击球效果很好。 编辑2:发布整个脚本,以便您可以重现我所面临的问题,如@roganjosh所建议。

package com.jimmytrivedi.alertdialog;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.os.Bundle;
import android.widget.EditText;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

public class AlertDialogActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alert_dialog);
        showAlertDialog(AlertDialogActivity.this);
    }

    private void showAlertDialog(final Context context) {
        // 1. Instantiate an <code><a href="/reference/android/app/AlertDialog.Builder.html">AlertDialog.Builder</a></code> with its constructor
        AlertDialog.Builder builder = new AlertDialog.Builder(AlertDialogActivity.this);

// 2. Chain together various setter methods to set the dialog characteristics
        builder.setMessage("How are you?")
                .setTitle("Hello");

// 3. Get the <code><a href="/reference/android/app/AlertDialog.html">AlertDialog</a></code> from <code><a href="/reference/android/app/AlertDialog.Builder.html#create()">create()</a></code>
        AlertDialog dialog = builder.create();
        dialog.show();


    }

}

2 个答案:

答案 0 :(得分:2)

玩家选择站立后,您无需检查结果。由于您在deal()循环之前仅while True一次,因此,如果您选择反复站立,只会得到无限的条件。在发牌人抽出所有卡后计算分数。

def hit_stand(deck, player, dealer, hand, stand):
    print("What would you like to do")
    print("[1] - Hit\n[2] - Stand")
    choice = input("> ")
    hand = False
    if choice == '1':
        player.append(deck.pop())
    elif choice == '2':
        stand = True
        while score(dealer) <= 16:
            print(score(dealer))
            dealer.append(deck.pop())
        display_info(player, dealer, stand)
        results(player, dealer, first_hand, stand) # HERE

在某种程度上不相关的方面,在确定最终比分之后崩溃退出游戏并不是很优雅。您可能想寻找一种比while True:sys.exit()更好的结构来控制流,但这是您的练习。

最后,您不应该在sum中将score()用作变量名,因为这是您要重新定义的内置函数。使用类似total的东西,这样就不会冒掩盖内置函数本身的风险。

答案 1 :(得分:0)

@roganjosh的答案是正确的,但我想补充一点说明,因为我认为这是关于Python如何工作的重要意义。那些使用C / C ++ / Java的人(即我们中的大多数人)在使用Python时需要取消学习。

正如我在上面的评论中所述,在Maria Laura的原始代码中,对hit_stand的调用似乎打算使用某些变量(例如stand)作为输出变量,并且在Python中,函数调用中不能包含“输出变量”。但是玛丽亚·劳拉(Maria Laura)提到“击球效果很好”,这意味着参数player正在被修改。因此,如果我们不能拥有“输出变量”,那为什么player的值会被函数hit_stand修改?

当代码调用hit_stand时,会将五个对象传递给该函数:

  • 一个列表对象,其名称为deck
  • 一个列表对象,其名称为player
  • 一个列表对象,其名称为dealer
  • 一个布尔对象,其名称为hand
  • 一个布尔对象,其名称为stand

此函数之外的代码还具有名称(deck, player, dealer, first_hand, standing),它们指向这五个对象。在hit_stand的代码内,在.append()player列表对象上调用dealer方法,在{{1}上调用.pop()方法}对象,因此所有这些对象都是突变的。调用范围中的名称仍然指向那些相同的对象,因此这些名称现在将看到那些更改。

deckhand的故事是不同的。在stand函数中,hit_standhandstand运算符分配了新值。如this excellent write-up from Fredrik Lundh所述,Python中的=运算符不会“更改”变量,它只是获取一个对象并将其绑定到名称。 对象本身没有改变,而是被新的布尔对象替换。因此,外部作用域中的变量=仍指向其原始布尔对象,而变量{{1 }}中的函数指向一个全新的布尔对象,该布尔对象与外部作用域中的对象不同。我们无法对在外部范围中看到的变量standingstand进行任何操作,不能像其他变量那样进行“通过引用传递”或“输出参数”之类的操作语言。

这是一个概念,乍一看似乎很陌生,直到我们不学习在C / C ++ / Java教育中学到的东西。