2016-08-20 1 views
0

私はかなり趣味のようにPython(3)でコーディングするのはかなり新しいですが、GUIについて心配することなくいくつかのゲームの仕組みで遊んで楽しいです。私は現在、文学タイプのテキストベースのゲームに取り組んでいます。このゲームの基礎は、古いExcel文書にあります。数学と論理を中心にしていますが、これは非常に簡単ではあるが深い一連の仕組みのために作られたものです。Pythonのテキストベースの力学:クラス、辞書、またはリスト?

とにかく、ゲームは技術の研究、建物の生産、市民の成長、文化の収集などを可能にします。私が苦労しているのは軍事システムです。

私は、プレイヤーが生産するためのさまざまなユニットがあります。各ユニットに名前、強さ、弾力性があるとしましょう(例えば、「Archer」、「10」、「80」)。戦争は全プレイヤーの強さに基づいています(私はこれを計算できます)。戦闘が終わるたびに、ユニットの弾力は回復力によって減少します。このアーチャーは、戦後の元の強さの80%にまで低下します。

しかし、私はこのメカニックを可能にする方法でユニットを作成する方法を試していません。私はもともとユニットの量の名前/強度/弾力性と並んで 'quantity'引数を持つUnit()クラス(例えばアーチャー、スピアマンなどの異なるユニットを持つ)を使用しましたが、回復力私は、現在生産されているユニットだけでなく、今後のすべてのバージョンにも影響を与えていることに気付きました。

class Unit(): 
    def __init__(self, name, quantity, strength, resilience) 
    self.name = name 
    self.quantity = quantity 
    self.strength = strength 
    self.resilience = resilience 

archer = Unit('archer', 0, 10, 80) 

等...

ユーザーはユニット、「数量」を建てたびに増加するであろう:私は次のようなものを実行していました。しかし、おそらく私はそれがおそらく私を制限しているコーディングのこの方法だと理解するようになった。他のスレッドを読むと、オブジェクトデータをこのような方法で保存しないようにする必要があることがわかりました。

私は遊んでいて研究していて、私は解決策の周りに頭を浮かべているようには見えません(確かにそこにあります)。私は各ユニットの基本データ(名前、強度、弾力性)を格納する正しい方法を見つけるのが難しく、ユーザーは各ユニットの複数の固有のコピーを作成することができます。各ユニットはクラスでなければなりませんか?サブクラス?それは辞書に保存する必要がありますか?リスト?

この記事ではコードがないことをお詫びしますが、間違ったコードはありません。ロジックとPythonの知識が不足しているため、正しく動作するシステムを見つけることができません。辞書、リスト、ループ、継承されたクラスで遊んでいますが、私はそれを正しく理解できません。

将来の射手に影響を与えずに、それぞれがダメージを受ける複数の射手をどのように作成するのですか?

誰かが何か提案できる場合はありがとうございます。これ以外にも、私はPythonでたくさんの楽しいコーディングをしています!

+0

もっとコードを表示する必要があります。あなたがそこで行ったように強さを定義することは、それらがその特定のユニットにのみ適用されることを意味し、そのタイプのすべてのユニットには適用されません。人々が作る通常の間違いはクラスレベルでこれらの値を定義することですが、あなたはそれをしていません。 –

+0

フィードバックいただきありがとうございます。私は間違ったコードを持っているわけではないので、どのコードが本当に関係するかはわかりませんでした。ちょうど私がPythonのロジックを使い遊んでいて、正しい構造を理解できません。下のRawingの答えは近いですが、ユーザーがオブジェクトを作成する際にオブジェクトのIDを作成するだけの問題があります。 – Jammydude44

答えて

1

クラスのポイントは、そのクラスの多くのインスタンスを作成できることです。各ユニットのサブクラスUnitをサブクラス化する必要はありません(またはできません)。今、あなたは別の統計を持つ2つの別々の射手のユニットを持って

archer1= Unit('archer', 0, 10, 80) 
archer2= Unit('archer', 0, 10, 80) 

:あなたは、単にインスタンス化Unitクラスにする必要があります。これはあなたがquantity属性を必要としないことを意味し、もちろん

archer1.strength= 0 
print(archer2.strength) # prints 10 

、あなたは、いくつかの内のすべてのユニットを格納する必要があります。そのうちの一つは、戦争で戦うとその属性を変更した場合は、他には影響しませんリストのようなデータ構造の種類:

all_my_archers= [archer1, archer2] 
#create a 3rd archer 
all_my_archers.append(Unit('archer', 0, 10, 80)) 

これはそれほど重要ではないが、あなたはまた、Archerクラスを作成するUnitをサブクラス化することを検討すべきである:

をすべての射手ユニットが同じ統計(私は仮定)で始まるので、0
class Unit: 
    def fight_war(self): 
     self.strength= self.strength * self.resilience/100.0 

class Archer(Unit): 
    name= 'archer' 
    strength= 10 
    resilience= 80 

、これはあなたが新しい射手ユニットを作成strengthresilienceたびに(あなたが今archer4= Archer()行うことができます)を指定する必要がなくなります、とのことができます他のユニットに影響を与えずにユニットのステータスを変更します。

+0

ありがとうございます。これは私が探していたものに近いですが、少なくともそれは正しい軌道にあることを示しています。私が苦労している部分は、ユーザーがプロダクションメニューからそれらを選択すると、その場で一意のオブジェクトを生成することです。 'archer'や 'spearman'のユーザー入力が、私が 'archer3'や 'spearman4'オブジェクトを作成しているところまで来る方法をお勧めしますか?私は実行時にオブジェクトの一意のIDを作成する方法を理解できないようです。 – Jammydude44

+0

@ Jammydude44あなたが誤解していると思う。 'Archer()'や 'Unit()'を呼び出すだけで、ユニークで独立した新しいユニット/アーチャーを作ることができます。変数 'archer386 = Archer() 'を動的に作成する必要はありません。すべての他のユニットである 'all_my_archers.append(Archer())'を使って新しい 'Unit'インスタンスをリストに格納するだけです。ユニットごとに固有のIDが本当に必要な場合は、組み込みの 'id'関数' id(archer1) 'を使うことができます。 –

+0

はい、ありがとう、私は誤解していました。私はprint(all_my_archers.name)が「アーチャー、アーチャー、アーチャー」を返すと思っていました。彼らは同じインスタンスであり、私は私の質問にしたのと同じミスをしていました。しかし、それをさらにテストしたところ、それらが一意のインスタンスであることがわかりました。私は現在、オブジェクトに関するリストの魔法を理解しています。残りのコードを整理する時間!ありがとう、完璧に答えた。 – Jammydude44

0

私にとっては、特にゲームを作成するときに、サブクラス化は良いコードを書くための本当に良い方法です。主に、サブクラスに独立した機能を実装できるからです。たとえば、すべてUnitには同じ移動メカニズムがありますが、攻撃プロセスではArcher Unitが遅延する可能性があります。話すコード:

class Unit(object): 

    def __init__(self, movement_speed=10, health=100): 
     self.movement_speed = movement_speed 
     self.health = health 
     self.position = 0 

    def move(self): 
     self.position += movement_speed 

    def get_hit(self, damage=0): 
     self.health -= damage 

    #etc 

class Archer(Unit): 

    def __init__(self, arrows=10): 
     super(self.__class__, self).init() 
     self.arrows = 10 

    # Archer has all the Unit methods 

    def attack(self, other_unit_instance): 
     # Here you can check if he is in range, etc 
     other_unit_instance.get_hit(damage=1) 
     self.arrows -= 1 
+0

Kostas Pelelisさん、ありがとうございました。これは私が探していたものではありませんが(私の投稿の漠然としたことに責任を負うことはありますが)、これはシステムに深みを加えると間違いなく便利です。 – Jammydude44