BASIC转Python程序
我写了一个小程序,想看看我在Python上的水平是否和在FreeBasic上一样好(其实我在FreeBasic上也不是特别厉害)。显然,我问这个问题是因为答案是否定的。
这个程序是一个小型的《龙与地下城》(第二版)战斗生成器。奇怪的是,很多功能根本没有执行,它们就像被跳过了一样。比如attaque1()
、attaque2()
,还有很可能是calcInitiative()
(因为cnt这个变量根本没有增加)。我试着把很多变量设为全局变量,以为这样可能会解决问题(我觉得在FreeBasic中,所有变量默认都是全局的)。但是,这似乎并没有解决问题。这个bug依然存在,我完全不知道是什么原因导致的。
(代码中有一些法语。)
#-*- coding: iso8859_1 -*-
import random
ca1 = 10
ca2 = 10
taco = 20
pv1 = random.randint(1,10)
pv1 = (pv1)
pv2 = random.randint(1,10)
pv2 = str(pv2)
cnt = 0
pv1Depart = pv1
pv2Depart = pv2
ast = "*" * 7
d20_1 = random.randint(1,20)
d8_1 = random.randint(1,8)
d20_2 = random.randint(1,20)
d8_2 = random.randint(1,8)
def intro():
global ca1
global ca2
global pv1
global pv2
print "Imaginez deux guerriers de D&D 2e édition qui se battent."
print
print "Guerrier 1: " + str(pv1) + " PV, épée longue (1-8 points de dégât), TACO de 20, CA de " + str(ca1) + "."
print "Guerrier 2: " + str(pv2) + " PV, épée longue (1-8 points de dégât), TACO de 20, CA de " + str(ca2) + "."
print ""
def nouveauCombat():
global cnt
print ast + "NOUVEAU COMBAT" + ast
print
while ((pv1 <= 0) or (pv2 <= 0)):
cnt = cnt + 1
print ast + "ROUND " + str(cnt) + ast
print
calcInitiative()
print
print ast + "RESULTAT" + ast
print
resultat()
def calcInitiative():
global pv1
global pv2
global initiative1
global initiative2
initiative1 = random.randint(1,10)
initiative2 = random.randint(1,10)
print "Le guerre 1 fait son jet d'initiative."
print str(initiative1) + "!"
print
print "Le guerre 2 fait son jet d'initiative."
print str(initiative2) + "!"
print
if initiative1 == initiative2:
print "Les deux guerriers attaquent au même moment."
print
print ast + "ATTAQUE" + ast
print
attaque1()
print
attaque2()
elif initiative1 < initiative2:
print "Le guerrier 1 attaque en premier."
print
print ast + "ATTAQUE" + ast
print
attaque1()
print
if pv2 <= 0:
print
attaque2()
else:
print "Le guerrier 2 attaque en premier."
print
print ast + "ATTAQUE" + ast
print
attaque2()
print
if pv1 <= 0:
print
attaque2()
def attaque1():
global d20_1
global d8_1
global pv2
global ca2
global pv2dep
print "Le guerrier 1 fait son jet de toucher."
print str(d20_1) + "!"
if d20_1 >= ca2:
print "Touché!"
pv2 = pv2 - d8_1
print str(d8_1) + "points de dégât!"
print "Le guerrier 2 est à " + str(pv2) + "/" + str(pv2dep) + " PV!"
else:
print "Raté!"
def attaque2():
global d20_2
global d8_2
global pv1
global ca1
global pv1dep
print "Le guerrier 2 fait son jet de toucher."
print str(d20_2) + "!"
if d20_2 >= ca1:
print "Touché!"
pv1 = pv1 - d8_2
print str(d8_2) + "points de dégât!"
print "Le guerrier 1 est à " + str(pv1) + "/" + str(pv1dep) + " PV!"
else:
print "Raté!"
def resultat():
global cnt
print "Le combat prend fin au round " + str(cnt) + "."
print
intro()
nouveauCombat()
2 个回答
1
BASIC和Python的基础理念是不一样的。这就像是你从用降落伞跳伞,突然想要去开飞机一样。你可以通过一个好的Python教程,比如《艰难学Python》,一步步学习,这样能帮助你解决很多困惑和问题。
2
attaque1()
和 attaque2()
是从 calcInitiative()
这个函数里调用的,所以如果 calcInitiative()
没有被调用,它们也不会被执行。
你的 while
循环会在 ((pv1 <= 0) or (pv2 <= 0))
为真时执行。
但是你已经把它们定义为
pv1 = random.randint(1,10)
pv1 = (pv1) # this line does nothing
pv2 = random.randint(1,10)
pv2 = str(pv2)
所以它们永远不会小于或等于0,因此 while
循环永远不会被进入,而 calcInitiative()
也不会被调用。
你写的 Python 代码像是在写 BASIC 语言。你应该去看看 Python 的教程,可能还需要了解一下面向对象编程的基础知识,学习一些关于类的内容。
给自己一个好测试:你应该能够在不使用 global
的情况下写出这个程序。