![見出し画像](https://assets.st-note.com/production/uploads/images/53139919/rectangle_large_type_2_1481b225292afbe57ebee684e223444c.png?width=1200)
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に置いてあります。
ここまで読んでいただきありがとうございました。
ここまで読んでいただきありがとうございます!