我程序中一个特别重要的变量不会改变

时间:2018-06-28 03:19:29

标签: python

以下代码是一个非常简单的敌人遭遇概念。

# ENEMY ENCOUNTER CONCEPT

import random

PLAYERNAME = 'PLAYER'
ENEMYNAME = 'DEMON'
playerHP = 100
enemyHP = 100
print('You encounter %s!' % (ENEMYNAME))
playerMove = 0
playerAttackDamage = 0
playerDefending = 0
enemyAttackNumber = 0
enemyAttackDamage = 0
enemyDefending = 0
playerFrozen = 0

def drawEnemy():
    print('''[this isn't important now.]''')

def firstAttack(): #randomly decides which entity will attack first.
    if random.randint(1, 2) == 1:
        return 'PLAYER'
    else:
        return 'ENEMY'

def playerAttack(playerMove, playerAttackDamage, ENEMYNAME, playerDefending, playerHP): #asks the player what he/she wants to do. performs given action.
    playerMove = 0
    playerDefending = 0
    while playerMove not in range(1,3):
        print('''What will you do?
1. Attack
2. Defend''')
        playerMove = input()
        playerMove = int(playerMove)
        if int(playerMove) == 1:
                playerAttackDamage = random.randint(5, 10)
                print('You attack %s. %s receives %s damage.' % (ENEMYNAME, ENEMYNAME, playerAttackDamage))
        if int(playerMove) == 2:
                playerDefending = 1
                print('You are defending. As long as you are defending, %s\'s attacks will be halved in damage.' % (ENEMYNAME))
    return playerAttackDamage
    return playerDefending


def enemyAttack(enemyAttackNumber, enemyAttackDamage, playerFrozen, PLAYERNAME, ENEMYNAME, enemyDefending): #the enemy attacks.
    enemyDefending = 0
    enemyAttackNumber = random.randint(0, 18)
    if enemyAttackNumber in range(0, 8):
                enemyAttackDamage = random.randint(6, 12)
                print('%s attacks %s. %s receives %s damage.' % (ENEMYNAME, PLAYERNAME, PLAYERNAME, enemyAttackDamage))
    if enemyAttackNumber in range(8, 12):
                enemyAttackDamage = random.randint(10, 20)
                print('%s summons fire! %s receives %s damage.' % (ENEMYNAME, PLAYERNAME, enemyAttackDamage))
    if enemyAttackNumber in range(12, 18):
                enemyDefending = 1
                print('%s is defending. Your attacks will only deal half damage as long as it is defending.' % (ENEMYNAME))
    if enemyAttackNumber == 18:
                enemyAttackDamage = random.randint(10, 20)
                playerFrozen = 1
                print('%s summons ice! %s receives %s damage and is now frozen.' % (ENEMYNAME, PLAYERNAME, enemyAttackDamage))
    return enemyAttackDamage
    return enemyDefending

def playerDamage(playerHP, enemyAttackDamage, playerDefending):
    if playerDefending == 0:
        playerHP -= enemyAttackDamage
    else:
        playerHP -= (enemyAttackDamage/2)
    return playerHP

def enemyDamage(enemyHP, playerAttackDamage, enemyDefending):
    if enemyDefending == 0:
        enemyHP -= playerAttackDamage
    else:
        enemyHP -= (playerAttackDamage/2)
    return enemyHP

def playerIsDead(playerHP):
    return playerHP < 1

def enemyIsDead(enemyHP):
    return enemyHP < 1

def playAgain():
    print('Would you like to play again?')
    return input().lower().startswith('y')

while True:
    drawEnemy()
    turn = firstAttack()
    fighting = True

    while fighting:
        playerHP = playerDamage(playerHP, enemyAttackDamage, playerDefending)
        enemyHP = enemyDamage(enemyHP, playerAttackDamage, enemyDefending)
        if turn == 'PLAYER' and playerFrozen == 0:
            print('Player HP: %s' % (playerHP))
            print('Enemy HP: %s' % (enemyHP))
            playerAttack(playerMove, playerAttackDamage, ENEMYNAME, playerDefending, playerHP)
            if enemyIsDead(enemyHP):
                ('%s has been slain! You win!' % (ENEMYNAME))
                fighting = False

            else:
                turn = 'COMPUTER'
                playerFrozen = 0
        else:
            enemyAttack(enemyAttackNumber, enemyAttackDamage, playerFrozen, PLAYERNAME, ENEMYNAME, enemyDefending)
            if playerIsDead(playerHP):
                ('%s has defeated you! Game over!' % (ENEMYNAME))
                fighting = False
            else:
                turn = 'PLAYER'

    if not playAgain():
        break

我的问题吗? HP不会改变,因此游戏实际上无法完成。我试图重写HP代码并将其放置在程序的其他部分,但这些尝试均无济于事。到底是什么原因造成的?

如果需要信息,我的Python版本是3.6.4。

2 个答案:

答案 0 :(得分:0)

enemyAttackDamageenemyAttackNumber为0。这是否意味着它们不影响playerHP? 我试图更改这些内容,但这确实改变了playerHP。 另外,在playerAttack函数中,您尝试使用2个返回值,并且该程序永远不会到达第二个返回值,因为它从第一个返回了。

答案 1 :(得分:0)

您的playerAttackenemyAttack函数分别返回playerAttackDamageenemyAttackDamage的更新值,但是调用者没有任何变量来接收返回值。

此外,这两个函数在已经返回另一个值之后尝试返回playerDefendingenemyDefending。他们应该将两个更新后的值作为元组返回,因此在playerAttack中,它应该:

return playerAttackDamage, playerDefending

在“ enemyAttack”中,它应该:

return enemyAttackDamage, enemyDefending

然后将这些呼叫者行更改为:

playerAttackDamage, playerDefending = playerAttack(playerMove, playerAttackDamage, ENEMYNAME, playerDefending, playerHP)

enemyAttackDamage, enemyDefending = enemyAttack(enemyAttackNumber, enemyAttackDamage, playerFrozen, PLAYERNAME, ENEMYNAME, enemyDefending)