1

私は、FreeBasicと同じくらいPythonに習熟しているかどうかを確認するために、小さなプログラムを作成しました(そして、FreeBasicはそれほど得意ではありません)。明らかに、答えはノーなので、私はこの質問をしています。

したがって、このプログラムは小さなダンジョンズアンドドラゴンズ(第2版)の戦闘ジェネレーターです。何らかの理由で、多くの関数がまったく実行されません。それらは単にスキップされます。これは、で発生することでattaque1()あり、attaque2()おそらくcalcInitiative()(cnt変数はまったくインクリメントされないため)で発生します。これが問題になる可能性があると考えて、多くの変数をグローバル化してみました(すべての変数は、デフォルトでFreeBasicでグローバル化されていると思います)。まあ、これは答えではないようです。バグはまだ残っており、何が原因であるのかまったくわかりません。

(コードにはフランス語が含まれています。)

#-*- 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()
4

2 に答える 2

2

attaque1()からattaque2()呼び出される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()がなく、呼び出されることもありません。

あなたはそれがBASICであったようにあなたのPythonコードを書いています。クラスのようなものについて学ぶために、Pythonチュートリアル、そしておそらくオブジェクト指向プログラミングに関する一般的なチュートリアルを通過する必要があります。

global自分自身にとって良いテストは、 sをまったく使用せずにそのプログラムを作成できるはずです。

于 2011-08-09T13:59:33.140 に答える
1

BASICとPythonは同じ原則に基づいて構築されていません。これは、パラシュートの使用から飛行機の飛行に移行しようとするのと少し似ています。Learn Python the Hard Wayのような優れたPythonチュートリアルを実行すると、混乱や質問の束が解消されます。

于 2011-08-09T13:56:23.217 に答える