Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python-有没有一种方法可以将函数放入函数中而不获取;类型错误:';int';对象不可调用";?_Python_Python 3.x_Function_Module - Fatal编程技术网

Python-有没有一种方法可以将函数放入函数中而不获取;类型错误:';int';对象不可调用";?

Python-有没有一种方法可以将函数放入函数中而不获取;类型错误:';int';对象不可调用";?,python,python-3.x,function,module,Python,Python 3.x,Function,Module,我正在做一个多人掷骰子游戏,你可以根据你掷的骰子得到分数。我试图把一个函数放在一个函数中,但是由于typeerror,这不起作用 我在网上搜索了如何减少函数之间的交互,试图从另一个函数中删除一个函数,但没有找到答案。我也问过我的同学和老师,但他们也不知道 import random playerPoints = [] minPlayers = 2 players = 0 maxscore = 100 amountOfDice = 2 gameRound = 0 toRoll = "" die1

我正在做一个多人掷骰子游戏,你可以根据你掷的骰子得到分数。我试图把一个函数放在一个函数中,但是由于typeerror,这不起作用

我在网上搜索了如何减少函数之间的交互,试图从另一个函数中删除一个函数,但没有找到答案。我也问过我的同学和老师,但他们也不知道

import random

playerPoints = []
minPlayers = 2
players = 0
maxscore = 100
amountOfDice = 2
gameRound = 0
toRoll = ""
die1 = random.randint(1, 6)
die2 = random.randint(1, 6)

def setPlayers():
    while True:
        players = input("How many players are playing?\n")
        if players.isdigit():
            players = int(players)
            if minPlayers <= players:
                for i in range(players):
                    playerPoints.append(0)
                return players

def diceroll(player, amountOfDice, die1, die2):
    throw = 0
    print("Player {0}s turn:".format(player + 1))
    for i in range(amountOfDice):
        roll = 0
        while roll != toRoll:
            roll = input("Press enter to roll both dice")
            if roll == toRoll:
                print("Player {0} has thrown {1} and {2}".format(player + 1, i + 1, die1, die2))
                break
        points()

def cont():
    cont = input("Would you like to continue or stop? Press [C] to continue or press [S] to stop.")
    if cont == "c":
        points()
    elif cont == "s":
        print("You have successfully cashed in " + str(points) + " points. Well done!")
        playerPoints[players] += points

    playerPoints[player] += throw
    print("Player {0}s score is now: {1}".format(player + 1, playerPoints[player]))
    return throw

def checkWin(maxscore):
    for player in range(players):
        if (playerPoints[player] >= maxscore):
            print("Player {0} wins!".format(player + 1))
            return True

    return False

def points():
    while die1 != 1 or die2 != 1 and cont == "c":
        for i in playerPoints:
            global points
            points = 0
        if die1 == 1 and die2 == 1:
            print("That means you store " + str(double1) + " points.")
            points += double1
            cont()
        elif die1 == die2:
            print("That means you store " + str((die1 + die2)*2) + " points.")
            points += (die1 + die2)*2
            cont()
        elif die1 != die2:
            print("That means you store " + str(die1 + die2) + " points.")
            points += die1 + die2
            cont()
        elif die1 == 1 or die2 == 2:
            print("Unlucky! You have rolled " + str(die1) + " and " + str(die2) + ". Since you rolled a 1, your turn has ended. You have lost all stored points so far, and you lose " + str(die1 + die2) + " points.")
            points -= (die1 + die2)


if __name__ == "__main__":
    players = setPlayers()
    while True:
        gameRound += 1
        print("Round: {0}".format(gameRound))
        for i in range(players):
            diceroll(i, amountOfDice, die1, die2)
        if (checkWin(maxscore)):
            break

def players(numberOfPlayers):
    numberOfPlayers = 0
    while numberOfPlayers not in (str(i) for i in range (minPlayers,maxPlayers)):
        numberOfPlayers = int(numberOfPlayers)
        for i in range(numberOfPlayers):
            playerPoints["score{}".format(i+1)] = 0
        return numberOfPlayers
随机导入
playerPoints=[]
minPlayers=2
玩家=0
maxscore=100
amountOfDice=2
gameRound=0
toRoll=“”
die1=random.randint(1,6)
die2=random.randint(1,6)
def setPlayers():
尽管如此:
玩家=输入(“有多少玩家在玩?\n”)
if players.isdigit():
玩家=int(玩家)
如果minPlayers=maxscore):
打印(“玩家{0}获胜!”。格式(玩家+1))
返回真值
返回错误
def points():
而死亡1!=1或2!=1和cont==“c”:
对于我在playerPoints:
全局点
分数=0
如果die1==1和die2==1:
打印(“这意味着您存储“+str(double1)+”点。”)
点数+=双1
续(
elif die1==die2:
打印(“这意味着您存储”+str((die1+die2)*2)+“点数”。)
点数+=(第1个+第2个)*2
续(
伊里夫·迪厄第二条:
打印(“这意味着您存储“+str(die1+die2)+”点数。”)
点数+=die1+die2
续(
elif die1==1或die2==2:
打印(“不幸!你掷了“+str(die1)+”和“+str(die2)+”。自从你掷了1之后,你的回合结束。到目前为止,你已经失去了所有存储的点数,并且失去了“+str(die1+die2)+”点数。”)
点-=(第1个点+第2个点)
如果名称=“\uuuuu main\uuuuuuuu”:
players=setPlayers()
尽管如此:
gameRound+=1
打印(“回合:{0}”。格式(游戏回合))
对于范围内的i(玩家):
骰子卷(i,数量,骰子1,骰子2)
如果(checkWin(maxscore)):
打破
def播放器(播放器数量):
玩家数量=0
而numberOfPlayers不在(str(i)代表范围内的i(minPlayers,maxPlayers)):
numberOfPlayers=int(numberOfPlayers)
对于范围内的i(玩家数量):
playerPoints[“score{}”.format(i+1)]=0
返回人数
请将代码粘贴到pythonidle或其他东西中,以试用代码

所以基本上它是从问有多少玩家开始的。我输入2,因为这是最小值

然后,它要求按enter键滚动模具,这样做效果非常好

最后它问我是继续还是停止,当我按c继续时,它说是TypeError

如果我按s停止,它会显示IndexError

我需要此代码才能继续执行其余代码,或者修复代码中的任何错误。

playerPoints=[0,0]
玩家=2

通过执行playerPoints[player],您试图访问不存在的第三个元素。列表索引从0开始


您可以执行playerPoints[player-1]

当您按c键时的第一个错误是由于相同的变量和函数名“points”引起的。第二个错误是由于列表的索引不足而导致的,可以通过将索引减去1来修复

这是一个固定的代码

import random

playerPoints = []
minPlayers = 2
players = 0
maxscore = 100
amountOfDice = 2
gameRound = 0
toRoll = ""
die1 = random.randint(1, 6)
die2 = random.randint(1, 6)

def setPlayers():
    while True:
        players = input("How many players are playing?\n")
        if players.isdigit():
            players = int(players)
            if minPlayers <= players:
                for i in range(players):
                    playerPoints.append(0)
                return players

def diceroll(player, amountOfDice, die1, die2):
    throw = 0
    print("Player {0}s turn:".format(player + 1))
    for i in range(amountOfDice):
        roll = 0
        while roll != toRoll:
            roll = input("Press enter to roll both dice")
            if roll == toRoll:
                print("Player {0} has thrown {1} and {2}".format(player + 1, i + 1, die1, die2))
                break
        func_points()

def cont():
    cont = input("Would you like to continue or stop? Press [C] to continue or press [S] to stop.")
    if cont == "c":
        func_points()
    elif cont == "s":
        print("You have successfully cashed in " + str(points) + " points. Well done!")
        print (playerPoints, players)
        playerPoints[players - 1] += points

    playerPoints[players - 1] += throw
    print("Player {0}s score is now: {1}".format(player + 1, playerPoints[player]))
    return throw

def checkWin(maxscore):
    for player in range(players):
        if (playerPoints[player] >= maxscore):
            print("Player {0} wins!".format(player + 1))
            return True

    return False

def func_points():
    while die1 != 1 or die2 != 1 and cont == "c":
        for i in playerPoints:
            global points
            points = 0
        if die1 == 1 and die2 == 1:
            print("That means you store " + str(double1) + " points.")
            points += double1
            cont()
        elif die1 == die2:
            print("That means you store " + str((die1 + die2)*2) + " points.")
            points += (die1 + die2)*2
            cont()
        elif die1 != die2:
            print("That means you store " + str(die1 + die2) + " points.")
            points += die1 + die2
            cont()
        elif die1 == 1 or die2 == 2:
            print("Unlucky! You have rolled " + str(die1) + " and " + str(die2) + ". Since you rolled a 1, your turn has ended. You have lost all stored points so far, and you lose " + str(die1 + die2) + " points.")
            points -= (die1 + die2)


if __name__ == "__main__":
    players = setPlayers()
    while True:
        gameRound += 1
        print("Round: {0}".format(gameRound))
        for i in range(players):
            diceroll(i, amountOfDice, die1, die2)
        if (checkWin(maxscore)):
            break

def players(numberOfPlayers):
    numberOfPlayers = 0
    while numberOfPlayers not in (str(i) for i in range (minPlayers,maxPlayers)):
        numberOfPlayers = int(numberOfPlayers)
        for i in range(numberOfPlayers):
            playerPoints["score{}".format(i+1)] = 0
        return numberOfPlayers
随机导入
playerPoints=[]
minPlayers=2
玩家=0
maxscore=100
amountOfDice=2
gameRound=0
toRoll=“”
die1=random.randint(1,6)
die2=random.randint(1,6)
def setPlayers():
尽管如此:
玩家=输入(“有多少玩家在玩?\n”)
if players.isdigit():
玩家=int(玩家)
如果minPlayers=maxscore):
打印(“玩家{0}获胜!”。格式(玩家+1))
返回真值
返回错误
def func_points():
而死亡1!=1或2!=1和cont==“c”:
对于我在playerPoints:
全局点
分数=0
如果die1==1和die2==1:
打印(“这意味着您存储“+str(double1)+”点。”)
点数+=双1
续(
elif die1==die2:
打印(“这意味着您存储”+str((die1+die2)*2)+“点数”。)
点数+=(第1个+第2个)*2
续(
伊里夫·迪厄第二条:
打印(“这意味着您存储“+str(die1+die2)+”点数。”)
点数+=die1+die2
续(
elif die1==1或die2==2:
打印(“不幸!你掷了“+str(die1)+”和“+str(die2)+”。自从你掷了1之后,你的回合结束。到目前为止,你已经失去了所有存储的点数,并且失去了“+str(die1+die2)+”点数。”)
点-=(第1个点+第2个点)
如果名称=“\uuuuu main\uuuuuuuu”:
players=setPlayers()
尽管如此:
gameRound+=1
打印(“回合:{0}”。格式(游戏回合))
对于范围内的i(玩家):
骰子卷(i,数量,骰子1,骰子2)
如果(checkWin(maxscore)):
打破
def播放器(播放器数量):
玩家数量=0
而numberOfPlayers不在(str(i)代表范围内的i(minPlayers,maxPlayers)):
numberOfPlayers=int(numberOfPlayers)
对于范围内的i(玩家数量):
playerPoints[“score{}”.format(i+1)]=0
返回人数

为了便于将来参考,最好的编程实践是给出适当的变量和函数名,以避免混淆和更糟糕的bug。

考虑为函数和变量使用单独的名称。使用相同的名称会产生阴影并损害可读性。是的,很抱歉代码太混乱。我只是没有独创性啊哈,但这不是问题所在,即使是一个简单的后缀,如
\u var
\u func
,也可以。这怎么不是问题呢