見出し画像

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

今回はゲームクリアの仕組みを作って、何はともあれ通しで遊べるようにしたいと思います。バランスとかは後で考えます。

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

ゲームの目的として織田か今川のどちらかを倒すことなので、これが達成された時点でクリアとします。とりあえずは相手から攻めてきた場合ではなく、自分から攻めて勝ったときにしておきます。

     elif self.k_hei <= 0:
        self.k_end = True
        self.k_end_msg = 121
        self.k_kome = randint(100, self.k_hei2) 
        self.k_sikin = randint(100, self.k_hei2) 
        if self.enemy_tgt == 1:
            self.end_flug = True
            self.end_num = 1
        elif self.enemy_tgt == 2:
            self.end_flug = True
            self.end_num = 2

▲合戦ロジックにこのような分岐を追加しました。敵の兵士数であるk_heiが0以下になった際にenemy_tgtが1か2の際にend_flugをTrueにしてゲームクリアとします。end_numは相手が織田か今川かによって変わりますが、今のところ何の意味もありません。もしもエンディングを分岐させるなら使おうかなって感じです。

    #End 1
    elif self.window_ctr == 1000:
        if pyxel.btnp(pyxel.MOUSE_LEFT_BUTTON):
            x = pyxel.mouse_x
            y = pyxel.mouse_y
            if ((64 < x < 128)  and (114 < y < 128)):
                #Reset Game##################################################
                pyxel.load('assets/assets.pyxres') #Map reset
                #System status
                self.window_ctr = 999
                self.txt_ctr = 0
                self.inf_ctr = 999
                self.update_list = []
                self.update_tgt = 0
                self.turn = 1
    
                #Player status
                self.kome = 0
                self.sikin = 0
                self.heisi = 0
                self.roryoku = 500
                self.rend = 1
                self.gankyo = 1
                self.samurai = 0
                self.gaiko = 0
                self.ninjya = 0
                self.syonin = 0
    
                #Daimyo status
                del self.daimyo1
                self.daimyo1 = Daimyo(self.dst1["kome"],self.dst1["sikin"],
                               self.dst1["heisi"],self.dst1["sei"],
                               self.dst1["mei"],self.dst1["msg"],0)
                del self.daimyo2
                self.daimyo2 = Daimyo(self.dst2["kome"],self.dst2["sikin"],
                               self.dst2["heisi"],self.dst2["sei"],
                               self.dst2["mei"],self.dst2["msg"],30)
                self.daimyo_flug = 0
    
                #Gaiko status
                self.answer_list = []
                self.answer_tgt = 0
                self.msg_num = 0
    
                #Kassen status
                self.k_cnt = 0
                self.k_end = False
                self.k_end_msg = 0
                self.k_kome = 0
                self.k_sikin = 0
                self.k_hei = 0
                self.k_hei2 = 0
                self.enemy_tgt = 0
    
                #Ending status
                self.end_num = 0
                self.end_flug = False
                #############################################################

▲end_flugがTrueの場合に入るエンディングロジックです。if ((64 < x < 128) and (114 < y < 128)):の分岐はタイトル画面に戻った際に通る部分で、各種変数をリセットしています。これでタイトルから再度ゲームを始めてもちゃんと動くはずです。

    #End 1
    elif self.window_ctr == 1000:
        pyxel.cls(0)
        pyxel.rect(0, 114, 64, 14, 0)
        pyxel.rectb(0, 114, 64, 14, 7)
        pyxel.rect(64, 114, 64, 14, 0)
        pyxel.rectb(64, 114, 64, 14, 7)
        self.Draw_fonts(self.text_list["180"], 5, 5)
        self.Draw_fonts(self.text_list["182"], 5, 15)
        self.Draw_fonts(self.text_list["97"], 29, 15)
        pyxel.text(75, 15, str(self.kome), 7)
        self.Draw_fonts(self.text_list["182"], 5, 25)
        self.Draw_fonts(self.text_list["96"], 29, 25)
        pyxel.text(75, 25, str(self.sikin), 7)
        self.Draw_fonts(self.text_list["182"], 5, 35)
        self.Draw_fonts(self.text_list["95"], 29, 35)
        pyxel.text(75, 35, str(self.heisi), 7)
        self.Draw_fonts(self.text_list["182"], 5, 45)
        self.Draw_fonts(self.text_list["98"], 29, 45)
        pyxel.text(75, 45, str(self.roryoku), 7)
        self.Draw_fonts(self.text_list["183"], 5, 55)
        kei = self.kome+self.sikin+self.heisi+self.roryoku
        pyxel.text(75, 55, str(kei), 7)
        self.Draw_fonts(self.text_list["184"], 5, 65)
        pyxel.text(60, 65, str(self.turn), 7)
        kei_mai = self.turn * 500
        self.Draw_fonts(self.text_list["185"], 5, 75)
        pyxel.text(60, 75, str(self.turn)+"x500="+str(kei_mai), 7)
        #rank check
        self.Draw_fonts(self.text_list["186"], 5, 95)
        kei_g = kei - kei_mai
        if kei_g > 99999:
            rank = "S"
            pyxel.text(75, 95, rank, 8)
        elif kei_g > 79999:
            rank = "A"
            pyxel.text(75, 95, rank, 9)
        elif kei_g > 49999:
            rank = "B"
            pyxel.text(75, 95, rank, 10)
        elif kei_g > 19999:
            rank = "C"
            pyxel.text(75, 95, rank, 3)
        elif kei_g > 9999:
            rank = "D"
            pyxel.text(75, 95, rank, 6)
        else:
            rank = "Z"
            pyxel.text(75, 95, rank, 7)
        self.Draw_fonts(self.text_list["181"], 69, 117)
        

▲描画部分のコードです。自分の資源(米・兵士・資金・労力)の残り、経過ターン数を計算してランクを出します。資源を多く残して、短いターン数でクリアするほど評価が高くなります。

無題

▲画面はこんな感じ。

これで初めから終わりまで一応プレイできるようになりました。今後は外交イベントや建築できる建物など、ゲーム内の要素を増やす予定です。

コードの全体はGitHubにも載せています。また、タイルマップ等が入っているpyxresファイルやモジュールファイルもGitHubに置いてあります。

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

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