2011-08-09 5 views
1

私はFreeBasicにいるように私がPythonに熟達しているかどうかを確認するための小さなプログラムを作成しました(そして私はFreeBasicでそれほど良くありません)。明らかに、答えは「いいえ」なので、私はこの質問をしています。BASICからPythonプログラム

このプログラムは、小さなDungeons and Dragons(2nd edition)戦闘ジェネレータです。何らかの理由で、多くの関数がまったく実行されません。それらは単にスキップされます。これは、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() 
+0

私はあなたを理解しているかわかりません。値が適切なときに値が変化しているように見えます。 – erlang

答えて

2

attaque1()attaque2()は、calcInitiative()から呼び出されますので、呼び出されなければどちらも表示されません。

あなたwhileループが((pv1 <= 0) or (pv2 <= 0))

ながら実行しますが、あなたはそうでもないが、これまで<= 0ことができるので、whileループが入力されることはありません、とcalcInitiative()が呼び出されることはありません彼らは

pv1 = random.randint(1,10) 
pv1 = (pv1) # this line does nothing 
pv2 = random.randint(1,10) 
pv2 = str(pv2) 

になるように定義しました。

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

あなた自身にとって良いテストは、globalを一切使わずにそのプログラムを書くことができるということです。

+0

コメントありがとうございました。あなたのコメントを考慮して、私は問題を解決することができました。ちなみに、私はPythonチュートリアルへのリンクをブックマークしています。 – erlang

+0

質問に答えた場合は、私の回答の横にあるチェックマークをクリックして受け入れてください。以前の質問に対してもそれを行うべきです。私はあなたが他の質問に対するあなたのコメントで言及したリソースはすべて良いと思って、それらを使用し続けます。 – agf

1

BASICとPythonは同じ原則に基づいて構築されていません。これは、パラシュートを使用することから飛行機を飛行することにしようとするようなものです。 Learn Python the Hard Wayのような良いPythonのチュートリアルであなたのやり方を試してみてください。あなたの混乱や疑問を一掃します。

+0

こんにちはJonathanb。私はBytes of Python(http://www.ibiblio.org/swaroopch/byteofpython/read/)を読んでいます。私はNew Bostonチュートリアル#28(http://www.youtube.com/watch?v=最近PythonでInventを読んでいるのですが(inventwithpython.com/)、私はPythonを使っています。だから、あなたが私の質問に関して私に助言を与えてくれれば、私はそれらを読むのが楽しくなるでしょう。 – erlang

+0

さて、具体的には、クラスを使用する場合は、この特定のプログラムを行う方が簡単だと思います。自分のイニシアチブをロールバックし、ターゲットを攻撃し、ダメージを与える方法を知っているプレイヤークラスを作成します。実際にあなたのコードを実行する関数呼び出しは、イニシアチブをロールバックし、2つの攻撃関数を繰り返し呼び出し、各ラウンドの間にイニシアチブを巻き起こすという2つの文字を使用します。 – Jonathanb

関連する問題