所以我试图用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();
}
}
答案 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()
方法}对象,因此所有这些对象都是突变的。调用范围中的名称仍然指向那些相同的对象,因此这些名称现在将看到那些更改。
deck
和hand
的故事是不同的。在stand
函数中,hit_stand
和hand
用stand
运算符分配了新值。如this excellent write-up from Fredrik Lundh所述,Python中的=
运算符不会“更改”变量,它只是获取一个对象并将其绑定到名称。 对象本身没有改变,而是被新的布尔对象替换。因此,外部作用域中的变量=
仍指向其原始布尔对象,而变量{{1 }}中的函数指向一个全新的布尔对象,该布尔对象与外部作用域中的对象不同。我们无法对在外部范围中看到的变量standing
和stand
进行任何操作,不能像其他变量那样进行“通过引用传递”或“输出参数”之类的操作语言。
这是一个概念,乍一看似乎很陌生,直到我们不学习在C / C ++ / Java教育中学到的东西。