Python 如何从该函数中获取最终值?

Python 如何从该函数中获取最终值?,python,function,loops,Python,Function,Loops,所以我编了一个蛇和梯子的游戏。然而,我并没有让它在玩家之间轮流进行,而是让它让一个玩家在整个游戏中全程运行,并记录他们完成游戏所用的圈数。然后它一直运行player2,并记录它们转了多少圈。最后,它会比较每个玩家的最终得分和得分最低的赢家(因为他们到达终点的次数较少)。我知道这不是这个游戏的最佳设置,但这就是我要做的 但是,我只需要帮助从这个函数中获取最终的_分数值。当玩家通过100时,它会成功地执行else位,并显示玩家完成该位所需的总圈数。函数最后一位中的total\u rolls值就是我需

所以我编了一个蛇和梯子的游戏。然而,我并没有让它在玩家之间轮流进行,而是让它让一个玩家在整个游戏中全程运行,并记录他们完成游戏所用的圈数。然后它一直运行player2,并记录它们转了多少圈。最后,它会比较每个玩家的最终得分和得分最低的赢家(因为他们到达终点的次数较少)。我知道这不是这个游戏的最佳设置,但这就是我要做的

但是,我只需要帮助从这个函数中获取最终的_分数值。当玩家通过
100
时,它会成功地执行else位,并显示玩家完成该位所需的总圈数。函数最后一位中的
total\u rolls
值就是我需要提取的值。所以我试着把它分配到
final_score
,然后让它返回
final_score

然而,当我这样做的时候,它说输出是无的

随机导入
def掷骰子():
dice_值=random.randint(1,6)
打印(“其a…”+str(骰子值)
返回骰子值
def移动玩家(玩家、当前玩家、总玩家):
蛇形方块={26:17,40:9,43:24,67:25,75:57,82:71,98:80}有蛇的方块
梯形图=10:40,16:38,37:46,41:52,50:68,53:73,87:97}35;带梯形图的正方形
打印(“你的回合,”+str(玩家))
输入(str(player)+”,键入“roll”掷骰子“+”\n”)
获得骰子=掷骰子()
新位置=当前位置+获得的骰子
打印(str(玩家)+”,移动到空格“+str(新位置))
总卷数=总卷数
总掷骰数+=1#计算玩家已经转了多少圈
打印(“卷数:+str(总卷数))
当新位置<100时:
如果蛇形方块中有新的位置:#如果它们落在蛇上
打印(“哦,不!你落在一条蛇上了!”+“\n”+“你从蛇身上摔下来,然后落回正方形{0}”。格式(snake_squares[new_pos]))
新位置=蛇形方格[新位置]
移动玩家(玩家一、新玩家位置、总掷骰数)
elif new_pos in ladder_Square:#如果他们降落在梯子上
打印(“万岁,你已经降落在梯子上了!”+“\n”+”爬上梯子并移动到方号{0}”。格式(梯形图[new_pos]))
新位置=梯形图方格[新位置]
移动玩家(玩家一、新玩家位置、总掷骰数)
否则:#如果他们降落在正常的正方形上
移动玩家(玩家一、新玩家位置、总掷骰数)
#如果他们通过100并完成
打印(“需要”+str(玩家一个)+“+str(总掷骰子)+”掷骰子才能到达棋盘顶部”)
打印(总卷数)
返回总卷数
p1_最终_分数=移动_玩家(玩家_1,1,1)
打印(p1\U最终分数)
所以我把这个循环改成了一个while循环,我想它仍然没有返回我需要的东西

当它达到100并结束while循环时的输出如下所示:

塔拉,去太空100号

卷数:23

塔拉花了23卷骰子才到达棋盘的顶端

二十三

二,


为什么它成功地保留了我打印的语句的滚动计数,但在我尝试返回值时却没有这样做?

我认为您需要一个while循环,而不是使用递归。

正如YHF指出的那样,在这里使用while循环可能更容易。但是,使用递归函数是可能的(这就是您在这里所做的)

让我们看看您的代码如何查找错误: 您调用函数
move\u player
一次,并尝试获取它的输出。在第一次迭代中,
if
语句为true,因此它没有返回值,因此它不返回任何值。在该
if
语句中,函数被反复调用,直到
if
为false为止,因此函数返回但是,在该迭代中返回的值丢失了,因为它没有存储在
if
语句中的任何位置

我们可以通过while循环来解决这个问题。在
while new_pos<100
中,我们可以不断更改位置,然后while循环中的迭代次数表示圈数

def move_player(player):
    position = 1 # start position
    total_rolls = 1 # first turn
    while position < 100:
         # a new turn
         total_rolls = total_rolls  + 1
         position = position + 25 
    # when we reach this, the while statement is no longer true
    return total_rolls
def move_播放器(播放器):
位置=1#开始位置
总转鼓数=1#第一圈
当位置<100时:
#新的转折
总卷数=总卷数+1
位置=位置+25
#当我们达到这一点时,while语句不再正确
返回总卷数
使用递归,这就行了。请注意,我删除了很多功能,只是为了突出显示转折点。您必须再次添加功能,但这应该很简单

def move_player(player, current_pos, total_rolls):
    new_pos = current_pos + dice_roll()
    total_rolls += 1 #counts how many turns the player has taken 
    if new_pos < 100:
        total_rolls = move_player(player_one, new_pos, total_rolls)
    return total_rolls
def移动玩家(玩家、当前位置、总掷骰):
新建位置=当前位置+掷骰子()
总掷骰数+=1#计算玩家已经转了多少圈
如果新位置<100:
总掷骰数=移动玩家(玩家掷骰数、新掷骰数、总掷骰数)
返回总卷数

此函数由您调用一次,我们将其称为“函数调用零”。然后将
total_rolls
设置为1。然后,当if解析为false时,我们再次调用该函数。然后total_rolls设置为2,我们再次调用它,直到最后一次调用为止。直到所有迭代已完成。也就是说,每个内部函数调用都需要在外部/函数调用0完成之前完成

看起来您只会返回Elsear您确定是否达到了
else
吗?是否
new\u pos<100
每一次都是真的假的?可能函数在失败之前进行了多次迭代?没有但是知道玩家做什么,或者你如何调用这个函数,我应该返回total_rolls吗