見出し画像

pyxelでシミュレーションゲームを作る(9)

今回は敵大名が攻めてくる仕組み、敵大名同士の合戦の発生などを作っていきます。ここまでできた段階でベータ版としてitch.coに登録してみます。

前回のnoteは以下になります。よろしければご参照ください。

まずは敵大名との合戦です。敵が攻めてくる部分は以下のような仕組みで実現しました。

                    a = int(self.daimyo1.yuko)
                    b = int(self.daimyo2.yuko)
                    if a < 30 or b < 30:
                        if a <= b:
                            a1 = randint(1, a)
                            a2 = randint(1, a)
                            if a1 == a2:
                                self.enemy_tgt = 1
                                self.window_ctr = 201
                            else:
                              self.window_ctr = 0
                        elif a > b:
                            b1 = randint(1, b)
                            b2 = randint(1, b)
                            if b1 == b2:
                                self.enemy_tgt = 2
                                self.window_ctr = 201
                            else:
                              self.window_ctr = 0
                            
                    else:
                        self.enemy_tgt = 9
                        self.window_ctr = 201
                elif self.daimyo_yuko < 20:

▲ターン経過時のロジックの一部分です。aには大名1の友好度が、bには大名2の友好度が入っています。aかbのどちらかが30以下の場合は合戦が発生する可能性があります。

                        if a <= b:
                            a1 = randint(1, a)
                            a2 = randint(1, a)
                            if a1 == a2:
                                self.enemy_tgt = 1
                                self.window_ctr = 201
                            else:
                              self.window_ctr = 0

if a <= b:trueの場合を抜粋します。a1とa2はそれぞれ1からaまでの整数でランダムな数値が入ります。これらが一致した場合、合戦のフラグが立ちます。この形式にすることで、友好度が低くなるほど合戦が起りやすくしています。例えば友好度が15の場合は1から15のランダム整数が一致した場合なので、そこまで確率は高くないですが、友好度1の場合は1から1のランダム整数なので1に確定され、必ず合戦が発生します。

無題

▲合戦フラグが立つとその旨を伝えるメッセージウィンドウが開きます。

無題1

▲普通にプレイしているとまず勝てない兵力で攻めてくるので、敵大名のご機嫌を取って攻めてこられないようにすることが求められます。

無題2

▲負けると資源を奪われるペナルティー。

さて、このような形で普通に攻めてこられた場合はプレイヤーに打つ手はありませんが、大名同士を争わせることで漁夫の利を狙うことができます。

                     elif self.update_tgt == 153:
                        t = str(self.update_tgt)
                        c = self.costs[t]
                        if self.roryoku >= c:
                            self.roryoku = self.roryoku - c
                            x = randint(5, 20)
                            self.daimyo_yuko = self.daimyo_yuko - x
                            if self.daimyo_yuko < 0:
                                self.daimyo_yuko = 0
                            self.inf_ctr = 157
                            self.window_ctr = 100
                        else:
                            self.window_ctr = 4

▲忍者に追加した「離間の計」コマンドです。大名同士の友好度を5から20のランダム整数分下げることができます。

無題

▲離間の計を実行します。効果が強力なのでコストは高めです。

無題2

無題1

▲実行するたびに大名同士の友好度が下がっていきます。

無題

▲友好度が下がると大名同士の合戦が発生する場合があります。お互いに兵力を減らしてくれるので、プレイヤーとしてはラッキーな展開です。

今回はここまで。exe化したものをβ版としてitch.coに載せてみましたので、よろしければご覧ください。

ソースやモジュールファイル等はGitHubにあります。

ここまでご覧いただきありがとうございました。

ここまで読んでいただきありがとうございます!