-2

以下に多くのコードがありますが、実際にコードを読む必要はありません。関数が存在することと関数名を知る必要があるだけです。最初に私の問題を説明します。

以下に示すように、完全に関数といくつかのグローバル変数に基づいた手続き型プログラムを作成しました。プログラムをオブジェクト指向プログラムに変更したいのですが、このようなことをしたことがないので、うまくいきません。

従う必要がある手順は次のとおりです。 - 関数attack()は attack.py という名前のファイルに配置する必要があります - 関数defence()updateVars()、および関数はsmartDefender()defender.py ファイルに配置する必要があります -main()関数と残りのコード(ほとんどのコード) は manager.py という名前のファイルに配置されます。このファイルがメイン ファイルとなり、すべてがまとめられます。-クラスを使用する必要があります。

__init__関数の名前をに変更してから、それらをインポートして manager.py で使用しようとするなど、さまざまなことを試しました。また、関数名を同じにして、関数をクラス内に配置し、attacker.py と defender.py を manager.py にインポートしようとしましたが、何も機能していないようです...すべての助けをいただければ幸いです。

プログラムが何をするかについての説明は本当に必要ないと思いますが、本当に必要な場合は、簡単な説明を作成するか、ここで見ることができます。

ありとあらゆる助けをいただければ幸いです。

import random

HIGH= 3
MED= 2
LOW= 1

def attack(attackList):

    x= random.uniform(0,1)
    for attackLevel,probability in attackList:
        if x<probability:
            break
        x=x-probability
    return attackLevel





def defence(attackLevel,defendList):

    x= random.uniform(0,1)
    for defendLevel,probability in defendList:
        if x<probability:
            break
        x=x-probability
    return defendLevel





def updateVars(attackLevel,defendLevel,block,hit,run):

    if attackLevel==1:
        printAttackLevel='Low'
    if attackLevel==2:
        printAttackLevel='Medium'
    if attackLevel==3:
        printAttackLevel='High'
    if defendLevel==1:
        printDefendLevel='Low'
    if defendLevel==2:
        printDefendLevel='Medium'
    if defendLevel==3:
        printDefendLevel='High'



    if attackLevel==defendLevel:
        block=block+1
        hit=hit
        run=run+1
    else:
        block=block
        hit=hit+1
        run=run+1

    return block,hit,run,printAttackLevel,printDefendLevel





def smartDefender(defendLevel,attackLevel,smartList):

    for i in smartList:
        if (i==(i+1)==(i+2)):
            defendLevel= attackLevel
            return defendLevel
        else:
            return






def main():

    DEFAULT_PROBABILITY= 0.33
    run=0
    hit=0
    block=0
    smartList=[]


    rounds= int(input("\nPlease enter the number of rounds between 1 and 100:"))
    if rounds<=0 or rounds>100:
        print("\n")
        print("Invalid range. The number of rounds has been set to 10 by DEFAULT_PROBABILITY.")
        rounds=10


    lowAttackProb= float(input("\nPercentage of attacks aimed low(0-100):"))/100
    medAttackProb= float(input("Percentage of attacks aimed medium(0-100):"))/100
    highAttackProb= float(input("Percentage of attacks aimed high(0-100):"))/100
    if lowAttackProb+medAttackProb+highAttackProb !=1.00:
        print("\n")
        print("Invalid entry. The sum of the pecentages must equal 100%. The probability of each level has been set to 33.0% by DEFAULT_PROBABILITY.")
        lowAttackProb=DEFAULT_PROBABILITY
        medAttackProb=DEFAULT_PROBABILITY
        highAttackProb=DEFAULT_PROBABILITY


    print('\nLet The Fighting Begin')
    print('-'*22)


    while  run < rounds:

        lowDefProb= DEFAULT_PROBABILITY
        medDefProb= DEFAULT_PROBABILITY
        highDefProb= DEFAULT_PROBABILITY


        attackList= [(LOW,lowAttackProb),(MED,medAttackProb),(HIGH,highAttackProb)]
        attackLevel= attack(attackList)
        smartList.append(attackLevel)
        defendList=[(LOW,lowDefProb),(MED,medDefProb),(HIGH,highDefProb)]
        defendLevel=defence(attackLevel,defendList)
        block,hit,run,printAttackLevel,printDefendLevel= updateVars(attackLevel,defendLevel,block,hit,run)
        if run>(rounds/2):
            defendLevel=smartDefender(defendLevel,attackLevel,smartList)
            #implement smart mode

        print('%s%2s%s%3s%s%5s%s%3s'% ('\nRound',run,':\t','Attacker:',printAttackLevel,'\t','Defender:',printDefendLevel))


    print("%2s%2d%s%s%2d"% ('\nTotal Hits:',hit,'\t','Total Blocks:',block))
    print('Attacker Proportions:','','','Low:','','',lowAttackProb*100,'%','','','Medium:','','',medAttackProb*100,'%','','','High:','','',highAttackProb*100,'%')
    print('Defender Proportions:','','','Low:','','',lowDefProb*100,'%','','','Medium:','','',medDefProb*100,'%','','','High:','','',highDefProb*100,'%')
    print("\nThank you for using this program, Goodbye!")





main()

私の質問は、これらの手続き型プログラムを、クラスと複数のファイルを使用するオブジェクト指向プログラムに非常に簡単に (必ずしも効率的に) 変換するにはどうすればよいかということです。

問題の領域には、関数が呼び出されている場所が含まれると思いますmain()..

4

2 に答える 2

2

役立つ場合に備えて...このクラスベースのスクリプトを例として作成しました。

class Car():

    def __init__(self, mileage=0, mpg=10, tank_capacity=5):
        self.mileage = mileage
        self.mpg = mpg
        self.tank_capacity=tank_capacity
        self.tank_level = 0                

    def drive(self, miles):
        gallons_burned = float(miles) / self.mpg
        if self.tank_level < gallons_burned:
            miles_driven = float(self.tank_level) * self.mpg
            self.tank_level = 0
            self.mileage += miles_driven
            print "You ran out of gas after %s miles." % miles_driven
            return
        self.tank_level -= gallons_burned
        self.mileage += miles
        print "You made it to your destination after %s miles." % miles

    def pump_gas(self, gallons):
        self.tank_level += gallons
        if self.tank_level > self.tank_capacity:
            self.tank_level = self.tank_capacity
        print "You now have %s gallons in your tank" % self.tank_level

    def status(self):
        print "Mileage:", self.mileage
        print "Tank level: %s gallons" % self.tank_level

if __name__ == "__main__":
    my_car = Car(mileage=100, mpg=30, tank_capacity=3)
    my_car.pump_gas(4)
    my_car.status()
    my_car.drive(50)
    my_car.status()
    my_car.drive(60)
    my_car.status()

"""
You now have 3 gallons in your tank
Mileage: 100
Tank level: 3 gallons
You made it to your destination after 50 miles.
Mileage: 150
Tank level: 1.33333333333 gallons
You ran out of gas after 40.0 miles.
Mileage: 190.0
Tank level: 0 gallons
"""    
于 2012-12-07T16:18:48.803 に答える
0

今は十分な時間がありませんが、役立つコードの一部をここに置きます。後でさらに追加します

import random


class Attacker(object):
    def __init__(self, power):
    """In this method you can assign
        variables or perform actions which
        you want to perform on object create"""

        #for example on object create we want
        #to set strenght of attacker
        #so this variable will live and
        #availiable for object whole it's
        #life
        self.power = power

    def attack(self):
    """So attacker must can attack
        for example this method just
        return random int multiple on self.power 
        later we compare value of from defender's
        defend method and decide who is
        winner of round"""

        return random.randint(100) * self.power
于 2012-12-07T16:27:41.953 に答える