Python - есть ли способ поместить функцию в функцию и не получить "TypeError: 'int' объект не вызывается"? - PullRequest
0 голосов
/ 15 мая 2019

Я делаю многопользовательскую игру в кости, в которой вы получаете очки в зависимости от того, что вы бросили.Я пытаюсь поместить функцию внутрь функции, однако это не работает из-за ошибки типа.

Я искал в Интернете, как уменьшить взаимодействие между функциями, чтобы попытаться удалить одну функцию из другой, однако ответов не было.Также спросили моих коллег и учителей об этом, но они тоже не знали.

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

Пожалуйста, вставьте код в Python IDLE или что-то еще, чтобы попробовать код.

Так что в основном этоначинается с вопроса, сколько игроков.Я ввожу 2, так как это минимум.

Затем просит нажать Enter, чтобы бросить кубик, и это прекрасно работает.

Наконец, он спрашивает, хочу ли я продолжить или остановиться, и когда я нажимаю c, чтобы продолжить, он говорит TypeError.

Если я нажимаю s, чтобы остановить, он говорит IndexError.

Мне нужно, чтобы этот код продолжался, чтобы остальная часть кода работала, или чтобы я мог исправить любые ошибки в моем коде.

Ответы [ 2 ]

2 голосов
/ 15 мая 2019

Первая ошибка при нажатии c вызвана из-за того же имени переменной и функции 'points'.И вторая ошибка вызвана тем, что в списке заканчивается индекс, который можно исправить, вычтя индекс на единицу.

Вот фиксированный код,

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

Для дальнейшего использования этохорошая практика программирования, чтобы дать соответствующие имена переменных и функций, чтобы избежать путаницы и, что еще хуже, ошибок.

0 голосов
/ 15 мая 2019

playerPoints = [0, 0]
игрок = 2

Делая playerPoints [player], вы пытаетесь получить доступ к третьему элементу, который не существует. Индексирование списка начинается с 0.

Вы можете набрать playerPoints [player - 1]

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...