オブジェクト指向で戦闘シミュレーション?
Pythonで遊んでいて、ふと、オブジェクト指向をあまりうまく使いこなせてないなぁと思いまして。
なので今回は、オブジェクト指向的なプログラミングを練習したいと思います。
ええ、あくまで練習ですよ?
だから気楽に行きましょう!
その1 ジャンケンプログラム
まずは、ジャンケンをシミュレーションするプログラムを作りたいと思います。
とりあえずシーケンシャルなプログラムの流れ方で実現するならば、
(1)プレーヤ1の手をランダムに決める
(2)プレーヤ2の手をランダムに決める
(3)手を比較して、勝敗を決める
こんな感じで作りたくなりますが、オブジェクト指向を使いたいので少し見方を変えてみます。
【オブジェクト】
・プレーヤ1
・プレーヤ2
・審判
プレーヤは、ジャンケンの手を出す機能があれば良さそうです。(★1)
それを二人分用意することにします。(★2)
審判は、ジャンケンの進行(★3)と勝敗の判定(★4)をさせます。
そのように考えて、次のようにプログラムを作りました。
プログラム説明は文末参照。
import random
class Player():
def __init__(self):
self.HP= 1
def GetHand(self):
return random.randint(0, 2) #(★1)
class Battle():
def __init__(self, Player1, Player2):
self.P1= Player1
self.P2= Player2
def Fight(self):
handsign= ("グー","チョキ","パー")
#(★3)
p1hand= self.P1.GetHand()
p2hand= self.P2.GetHand()
print(f"Player1:{handsign[p1hand]}")
print(f"Player2:{handsign[p2hand]}")
#(★4)
if p1hand==p2hand:
return 0
elif p1hand==0 and p2hand==1 \
or p1hand==1 and p2hand==2 \
or p1hand==2 and p2hand==0:
return 1
else:
return 2
#ここからメインルーチン開始
#(★2)
P1= Player()
P2= Player()
BattleObject= Battle(P1, P2)
result= BattleObject.Fight()
if result==0:
print("あいこです")
else:
print(f"Player{result}の勝ちです")
シーケンシャルに作るよりも、少し冗長な感じに思えますが、思っていた通りのプログラムが作れました。(★マークは先述の計画に対応)
Player1:チョキ
Player2:パー
Player1の勝ちです
うんうん、まずは満足です。
でも、もう少し発展させてみたくなりますよね、このままでは味気ない。
そんなこともあろうかと、実はプログラムの中にプレーヤのHPを保持する変数を仕込んでみました。
次回は、このプログラムを改造して、RPGの戦闘のような動作をさせてみたいと思います。
プログラム説明
・グー/チョキ/パーをランダムに出すため、乱数を使う必要があります。
なので、import randomをしています。
・実行するプログラムは、「#ここからメインルーチン開始」の下から始まります。
まずは、プレーヤを2人用意します。
具体的には、PlayerクラスをP1とP2の2つ分、オブジェクト化しました。
次に、審判のBattleクラスを1つオブジェクト化しました。
審判オブジェクトに、Fightメソッドでジャンケンを実行させ、帰ってくる勝敗結果を受け取ります。
最後に、メインルーチンはその結果を画面表示します。
・「class Player」の部分は、Playerクラスです。
ステータスとしてHPを持たせました。(このプログラムでは持ってるだけ)
GetHandメソッドは、ランダムにジャンケンの手を出します。
仮に0:グー、1:チョキ、2:パーとしています。
・「class Battle」の部分は、審判クラスです。
オブジェクト化するときにプレーヤを2人登録しておくようにしました。
Fightメソッドでは、プレーヤ2人の手を取得し、判定を行っています。