以下代码是一个非常简单的敌人遭遇概念。
# 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。
答案 0 :(得分:0)
enemyAttackDamage
和enemyAttackNumber
为0。这是否意味着它们不影响playerHP
?
我试图更改这些内容,但这确实改变了playerHP。
另外,在playerAttack
函数中,您尝试使用2个返回值,并且该程序永远不会到达第二个返回值,因为它从第一个返回了。
答案 1 :(得分:0)
您的playerAttack
和enemyAttack
函数分别返回playerAttackDamage
和enemyAttackDamage
的更新值,但是调用者没有任何变量来接收返回值。
此外,这两个函数在已经返回另一个值之后尝试返回playerDefending
和enemyDefending
。他们应该将两个更新后的值作为元组返回,因此在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)