LoginSignup
2
1

More than 3 years have passed since last update.

Mementoパターンで戦国シミュレーション

Last updated at Posted at 2019-07-30

Mementoパターンで戦国シミュレーション

某社内の勉強会で発表する資料づくりの一環でコードを書きました。
数学ガールの著者でもある結城浩さんの増補改訂版 Java言語で学ぶデザインパターン入門に基づき、
Pythonでプログラムを作成しました。

nobunaga.py
import random
import time

class Nobunaga:
    Busho = ['みつひで', 'らんまる', 'ひでよし', 'かついえ']

    def __init__(self, strength, resource):
        self.strength = strength
        self.resource = resource
        self.busho = []    

    def get_strength(self):
        return self.strength

    def get_resource(self):
        return self.resource

    def get_busho(self):
        prefix = ''
        if bool(random.randint(0,1)):
            prefix = '強い'
        return prefix + random.choice(Nobunaga.Busho)

    def __str__(self):
        return '[兵力 = {}, 資源 = {}, 武将 = {}]'.format(self.strength, self.resource, self.busho)

    def battle(self):
        dice = random.randint(1, 6)
        if dice == 1:
            self.strength += 100
            print('兵士を鍛錬し兵力が100上がった!')
        elif dice == 2 and self.resource > 99:
            self.resource *= 1.5
            print('戦を行って勝ち、資源が1.5倍になった!')
        elif dice == 3 and self.resource > 99:
            self.strength -= 100
            self.resource //= 2
            print('戦を行って負け、資源が半分になった!')
            print('兵力が100下がった!')
        elif dice == 4:
            b = self.get_busho()
            print('武将の{}が仲間になった!'.format(b))
            self.busho.append(b)
        elif dice == 5:
            if len(self.busho) > 0:
                b = random.choice(self.busho)
                print('武将{}が裏切った!'.format(b))
                self.busho.remove(b)
            else:
                print('何も起こらなかった')
        elif dice == 6:
            self.resource += 100
            print('農地を手に入れ、資源を100手に入れた!')
        else:
            print('資源が不足して何もできなかった...')

    def create_memento(self):
        m = Memento(self.strength,self.resource)
        for b in self.busho:
            if b.startswith('強い'):
                m.add_busho(b)
        return m

    def restore_memento(self, memento):
        self.strength = memento.get_strength()
        self.busho = memento.get_busho()

class Memento:
    def __init__(self,strength,resource):
        self.strength = strength
        self.resource = 0
        self.busho = []

    def get_strength(self):
        return self.strength

    def add_busho(self, busho):
        self.busho.append(busho)

    def get_busho(self):
        return self.busho

def main():
#クラスNobunagaのインスタンスnobuを生成
    nobu = Nobunaga(100,100)
    memento = nobu.create_memento()
    for i in range(10):
        print(str(i+1)+'年目')
        print('ステータス:{}'.format(nobu))
#メソッド名はもう少し考えればよかった...。battle以外もするのになぁ。
        nobu.battle()
        print('兵力は{}に、資源は{}になった!'.format(nobu.get_strength(), nobu.get_resource()))

        if nobu.get_strength() > memento.get_strength():
            print('      (だいぶ強くなったから、現在の状態を巻物に記しておこう)')
            memento = nobu.create_memento()
        elif nobu.get_strength() < memento.get_strength() / 2:
            print('      (だいぶ弱くなったから、以前の状態まで時間を遡ろう)')
            nobu.restore_memento(memento)
        time.sleep(1)
        print()

if __name__ == '__main__':
    main()

実行結果
1年目
ステータス:[兵力 = 100, 資源 = 100, 武将 = []]
兵士を鍛錬し兵力が100上がった!
兵力は200に、資源は100になった!
      (だいぶ強くなったから、現在の状態を巻物に記しておこう)

2年目
ステータス:[兵力 = 200, 資源 = 100, 武将 = []]
何も起こらなかった
兵力は200に、資源は100になった!

3年目
ステータス:[兵力 = 200, 資源 = 100, 武将 = []]
何も起こらなかった
兵力は200に、資源は100になった!

4年目
ステータス:[兵力 = 200, 資源 = 100, 武将 = []]
戦を行って勝ち、資源が1.5倍になった!
兵力は200に、資源は150.0になった!

5年目
ステータス:[兵力 = 200, 資源 = 150.0, 武将 = []]
農地を手に入れ、資源を100手に入れた!
兵力は200に、資源は250.0になった!

6年目
ステータス:[兵力 = 200, 資源 = 250.0, 武将 = []]
武将の強いみつひでが仲間になった!
兵力は200に、資源は250.0になった!

7年目
ステータス:[兵力 = 200, 資源 = 250.0, 武将 = ['強いみつひで']]
戦を行って勝ち、資源が1.5倍になった!
兵力は200に、資源は375.0になった!

8年目
ステータス:[兵力 = 200, 資源 = 375.0, 武将 = ['強いみつひで']]
戦を行って勝ち、資源が1.5倍になった!
兵力は200に、資源は562.5になった!

9年目
ステータス:[兵力 = 200, 資源 = 562.5, 武将 = ['強いみつひで']]
戦を行って負け、資源が半分になった!
兵力が100下がった!
兵力は100に、資源は281.0になった!

10年目
ステータス:[兵力 = 100, 資源 = 281.0, 武将 = ['強いみつひで']]
戦を行って負け、資源が半分になった!
兵力が100下がった!
兵力は0に、資源は140.0になった!
      (だいぶ弱くなったから、以前の状態まで時間を遡ろう)

ところで、強いってどうやって決めるのでしょうか?資源が多くても強いですし、武将が多くいても強い気がします
Strategyパターンと組み合わせてnobuの戦略を考えるのも面白いかもしれません!

それではまた!

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1