2017-08-01 8 views
0

私はstackoverflowで新しく、私はこのコードの問題について私の最初の質問をしたいと思います。私はPythonでオブジェクトを学習するために書きました。 辞書を使ってオブジェクトの作成を呼び出そうとしています。 私の目的は、数のおかげで、例えば、私は辞書newch = {1 : Character.new_dragon(), 2 : Character.new_goblin()}を持っていると私はそれが新しいドラゴン(@classmethod new_dragon)を作成し、Player1dictonaryを使ってオブジェクトを作成するには?

に割り当てる必要がありますPlayer1 = newch[1]呼び出すときに問題がときということであるオブジェクトを作成することです私はプログラムを実行すると、Character.new_dragon()Character.new_goblin()が自動的に呼び出されます(私はコントロールプリントを置く)が、 "DRAGO"という要求の後に "どのプレイヤー"と書くか?機能は、制御プリント

import random 

class Character: 
    def __init__(self,idd,height,weight,att,defe): 
     self.idd=idd 
     self.height=height 
     self.weight=weight 
     self.att=att 
     self.defe=defe 


    @classmethod 
    def new_goblin(cls): 
     print('newgoblin') 
     return cls(1,getr(1,1.5,0.1),getr(40,60,0.5),getr(5,15,1),getr(6,10,1)) 

    @classmethod 
    def new_dragon(cls): 
     print('newdrago') 
     return cls(2,getr(20,30,1),getr(500,2000,5),getr(50,150,3),getr(20,100,3)) 


def getr(start,stop,step):   #returns float 
    x=random.randint(1, 1000) 
    random.seed(x) 
    return random.randint(0, int((stop - start)/step)) * step + start 


play={1:'p1', 2:'p2', 3:'p3', 4:'p4'} #dict for players 
newch={1:Character.new_dragon(),2:Character.new_goblin()} ############This doesn't work 


i=1  
while True: 
    char=input("which player? Drago or Goblin?").upper() 
    if(char=="DRAGO"): 
     play[i]=newch[1] #here i try to call Character.new_dragon() 
     i+=1 
     break 
    elif(char=="GOBLIN"): 
     play[i]=newch[2] 
     i+=1 
     break 
    print("write \'Drago\' or \'Goblin\'") 

print(play[1].height, play[1].weight, play[1].att, play[1].defe) 

がないので、あなたが辞書をこのように初期化されている場合はここで、あなたは私を助けることができれば、私は非常に喜んでいるだろう、私のコードです感謝

+0

ありがとうございました! :) – Matte

+0

あなたのブレークは、他のプレイヤーが自分のキャラクターを選ぶのを防ぎます。 Turnの答えは下記の私のコメントを見てください。また、 "どのキャラクター?"ではなく、 "どのプレイヤー"に聞くべきですか?提案されているもののもう1つの代替案は、入力の結果をif elseツリーの引数として関数を呼び出す関数に送ることです。だからあなたはこの問題を抱えません。 –

+0

はい、私はしばらくの間、機能を実装します。ありがとう – Matte

答えて

3

Character.new_dragon()を呼び出すとすぐに新しいオブジェクトが作成され、そのオブジェクトがdictに保存されます。

代わりにオブジェクトをdictに格納することはできませんでしたが、オブジェクトを作成する関数に格納することはできませんでした。その機能はCharacter.new_dragon()なし)になります。 play[i]=newch[1]()

完全なコード::この作品

import random 

class Character: 
    def __init__(self,idd,height,weight,att,defe): 
     self.idd=idd 
     self.height=height 
     self.weight=weight 
     self.att=att 
     self.defe=defe 


    @classmethod 
    def new_goblin(cls): 
     print('newgoblin') 
     return cls(1,getr(1,1.5,0.1),getr(40,60,0.5),getr(5,15,1),getr(6,10,1)) 

    @classmethod 
    def new_dragon(cls): 
     print('newdrago') 
     return cls(2,getr(20,30,1),getr(500,2000,5),getr(50,150,3),getr(20,100,3)) 


def getr(start,stop,step):   #returns float 
    x=random.randint(1, 1000) 
    random.seed(x) 
    return random.randint(0, int((stop - start)/step)) * step + start 


play={1:'p1', 2:'p2', 3:'p3', 4:'p4'} #dict for players 
newch={1:Character.new_dragon,2:Character.new_goblin} ############This doesn't work 


i=1  
while True: 
    char=input("which player? Drago or Goblin?").upper() 
    if(char=="DRAGO"): 
     play[i]=newch[1]() #here i try to call Character.new_dragon() 
     i+=1 
     break 
    elif(char=="GOBLIN"): 
     play[i]=newch[2]() 
     i+=1 
     break 
    print("write \'Drago\' or \'Goblin\'") 

print(play[1].height, play[1].weight, play[1].att, play[1].defe) 

、しかし私はそれが最高のコーディングスタイルで言わないだろうプレイヤーがキャラクターを選択したとき、あなたはその関数を呼び出すことができます。このコードだけで判断するのは難しいですが、CharacterクラスのDragoとGoblinサブクラスを作成し、それらのクラスのtypeをその辞書に格納する方がよいでしょう。このよう

2

と呼ばれていません:

newch={1:Character.new_dragon(),2:Character.new_goblin()}

あなたはキー(1及び2)戻り値にnew_dragonのとnew_goblin functi結合さons。次のように(呼び出さずに)関数をバインドする必要があります。

newch={1:Character.new_dragon,2:Character.new_goblin} 大括弧はありません。

そして、あなたが選手を作成するとき、あなたはそうのようなこれらの機能を実行します。ここ

play[i]=newch[1]()お知らせ私たちは、ブラケットを持っています!私はここでのコードの改善を提案することができる場合

さらに、:

if(char=="DRAGO"): 
    play[i]=newch[1]() 
    i+=1 

は、if文を避けるために、あなたは文字列でマッピングを作成することができます

newch={"DRAGO":Character.new_dragon,"GOBLIN":Character.new_goblin}

をそして作成します電話をかけるだけでのインスタンス

play[i]=newch[char]()

エラーを処理するには、char文字列がdictキー付きのリストにあるかどうかをチェックする単一のif文を追加できます。

2

newch={1:Character.new_dragon(),2:Character.new_goblin()}

は辞書が作成されたときにnew_dragonnew_goblin関数が呼び出され、書かれています。このため、プログラムを実行するたびに、両方が「自動的に」実行されていることがわかります。

newch={1:Character.new_dragon ,2:Character.new_goblin}

以降のようなものがあります:

if(char=="DRAGO"): 
    play[i]=newch[1]() 

newch[1]後の括弧に注意してください)あなたが欲しいものを手に入れる必要がありますがあなたの代わりのような辞書を宣言した場合

なお、breakの文は必要ありません。 If/elif/elseチェーンは、他の言語のswitch文のようには機能しません。

+0

whileブロックから抜け出すのを助けるので、役に立たないとは言いません。しかし一方で、あなたはこのブロックの中に他のプレイヤーのためのキャラクターを選択することはできません。私は代わりに、すべての人が自分のキャラクターを選ぶ機会があったかどうかを見るために、選手の数に相当する変数を比較したいと思います。 –

+1

はい、あなたは正しい@AndoJuraiです。 – Turn

関連する問題