新手Python,创建掷骰子游戏,给定n局游戏

0 投票
2 回答
2608 浏览
提问于 2025-04-17 17:37

我刚开始学习编程,特别是Python,现在在做作业时遇到了一些问题。

问题是这样的:

Craps是一种在很多赌场玩的骰子游戏。就像二十一点一样,玩家是和赌场对抗。游戏开始时,玩家会掷一对标准的六面骰子。如果玩家掷出的点数总和是7或11,玩家就赢了。如果总和是2、3或12,玩家就输了。对于其他的点数,玩家会继续掷骰子,直到再次掷出最开始的点数(那样就赢了)或者掷出7(那样就输了)。

请实现一个叫做testCraps()的函数,它接收一个正整数n作为输入,模拟n局Craps游戏,并返回玩家赢的局数占总局数的比例。

>>> testCraps(1000)
0.4844

>>> testCraps(1000)
0.492

这是我目前的进展:

import random

def roll():
   dice = (random.randrange(1,7) + random.randrange (1,7))
   return dice

def testCraps(n):
    dice = roll()
    total = 0
    count = 0

    for i in range (n):
        total = total + 1

        if dice == 2 or dice == 3 or dice == 12:
            count = count + 0
        elif dice == 7 or dice == 11:
            count += 1
        else:
            dice1 = roll()
             while dice1 != 7 or dice1 != dice:
                  if dice1 == 7:
                     count = count + 0
                  elif dice1 == dice:
                     count += 1
                  else: 
                     dice1 = roll()

     return(float(count/total))

我是不是漏掉了什么?任何提示都非常感谢!

2 个回答

1

你的代码缩进有问题。

从这一行开始:

for i in range (n):

这段代码已经不再属于函数“testcraps()”了。

这可能不是唯一的问题,但首先要确保缩进正确。

缩进问题已经解决,所以我会更新我的回答。

我不会为你的作业写代码,但我可以给你这个建议。你现在遇到的问题是“逻辑”上的问题。你需要把问题拆分成更简单的步骤,这样你才能更容易理解和测试。可以先写一个只模拟单局游戏的函数,根据这局游戏是赢还是输返回0/1(或者如果你喜欢,也可以返回True/False)。把这个搞定后,剩下的就简单多了。

1

我觉得你的程序出现了“卡住”的情况,或者说是陷入了一个永远循环的状态,这意味着它无法完成执行。你在循环的条件是 dice1 != 7 or dice1 != dice,这就意味着只要 dice1 不是同时等于 7 和 dice,这个循环就不会停止。如果 dice 不是 7,循环就会一直进行下去,永远不会结束。

while dice1 != 7 or dice1 != dice:

现在还有第二个问题,下面是修正后的代码,并附有注释:

dice1 = roll()
while True: # Loop until either lost or won
    if dice1 == 7:
        break # Player lost, don't do anything
    elif dice1 == dice:
        count += 1 # Player won, increase count
        break
    else:
        dice1 = roll()

撰写回答