ゲームを作ろう! ターン制バトルその4 バトルをもっと複雑に


前回のその2 隠しパラメータでフラグ管理で、テキストアドベンチャーゲームのフラグを作ってみました。
今回は、その3までで作ったターン制バトルにも、フラグを入れてバトルを複雑にしてみようと思います。
現在のところ、その3のバトルはひたすら攻撃するか回復するかのどちらかです。
ここに、

・勇者は「防御」したら、魔王が与えるダメージをどんな攻撃でも半減する
・魔王に「究極魔法」を使わせる。1ターン詠唱に使うものの、次ターンで大ダメージ

という動作を加えてみます。
このためには「勇者が防御しているか、していないか」というフラグ、「魔王が究極魔法を唱えているか、いないか」というフラグが必要です。

勇者の「防御」……
開始時は
Ybougyo = 0
とする。防御したら、+1して
Ybougyo = 1
この時に、魔王が与えるダメージを全て半減。
防御行動後は、
Ybougyo = 0
に戻す。

魔王の「究極魔法」……
使っていない時は、
Mkyukyoku = 0
「究極魔法」は魔王ターン時に3%の確率で使用する。
選択したら、
Mkyukyoku = 1
としてそのターンは「魔王は究極魔法を詠唱している」と表示し、実質何もしない。
次ターンでは100%の確率で究極魔法を使用し、
Mkyukyoku = 0
に戻す。

という感じです。

まず、勇者の「防御」から。
「防御でダメージ半減」と設定しましたが、魔王の攻撃のダメージ量が奇数の場合は、半減させると小数点以下の数字が発生してしまいます。
これを防ぐためには、Math.Floor(number)を使います。
Math.Floor(56.5)ならば、小数点以下を切り捨てて、56としてくれます。

具体的にプログラムに加えた文章は以下の通り。

Ybougyo = 0 '勇者の「防御」用フラグ管理

フラグ管理用の変数。初期が0(防御していない)で、防御時は「1」にします。

ybou = Controls.AddButton("防御", 500, 280)

これは「防御」ボタン。

'勇者の行動その2 防御
If Controls.LastClickedButton = ybou Then
    If Ybougyo = 1 Then
      Ybougyo = Ybougyo - 1
    EndIf
  Sound.PlayClick()
  GraphicsWindow.BrushColor = haikeicolor
  GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
  GraphicsWindow.BrushColor = mojicolor
  GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者は防御している。")
  Ybougyo = Ybougyo + 1
  Controls.HideControl(ytatakau)
  Controls.HideControl(ybou)
  Controls.HideControl(ykaihuku)
  Controls.HideControl(ymahou)
  Controls.ShowControl(maouturn)
EndIf

「防御」ボタンを押した時の行動。
文章自体は「勇者は防御している。」と表示されるだけですが、隠しステータスとして「Ybougyo = Ybougyo + 1」と、勇者の「防御」用フラグの数値を+1しています。
また、行動前に

    If Ybougyo = 1 Then
      Ybougyo = Ybougyo - 1
    EndIf

で、Ybougyoが1の時にゼロに戻しています。これは、他の勇者の行動(攻撃や魔法)の前にも入れておきます。

'魔王の行動その1 通常攻撃
  If 1 <= maoukoudou And maoukoudou <= 70 Then
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.FillRectangle(yuusyaHPX, yuusyaHPY, 60, 20) '勇者HP消去用
    GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
    GraphicsWindow.BrushColor = mojicolor
    mdamage = maoutuujou + Math.GetRandomNumber(201) - 1
    If Ybougyo = 1 Then
      yuusyaHP = yuusyaHP - Math.Floor(mdamage / 2)
      GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, Math.Floor(mdamage / 2))
    Else
      yuusyaHP = yuusyaHP - mdamage
      GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, mdamage)
    EndIf
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王の攻撃!")
    GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
    Controls.HideControl(maouturn)
    If yuusyaHP <= 0 Then
      GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "魔王は勇者を倒した!")
      GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, 0) '勇者HP描画(倒したので強制で0)
      Controls.ShowControl(maousyouri)
    Else
      GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
      Controls.ShowControl(ytatakau)
      Controls.ShowControl(ybou)
      Controls.ShowControl(ykaihuku)
      Controls.ShowControl(ymahou)
    EndIf
  EndIf

魔王の行動の一例。

    If Ybougyo = 1 Then
      yuusyaHP = yuusyaHP - Math.Floor(mdamage / 2)
      GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, Math.Floor(mdamage / 2))
    Else
      yuusyaHP = yuusyaHP - mdamage
      GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, mdamage)
    EndIf

この部分で、勇者が防御しているかしていないかの分岐です。
防御時はダメージ量を通常の半分(小数点以下切り捨て)にしています。

それから、勇者・魔王全ての行動で、
Controls.ShowControl(ybou)
Controls.HideControl(ybou)
のどちらかを付け足し、新たに加わった防御ボタンを表示したり消したりしています。
こういう作業はミスが怖いので慎重に。

次に、魔王の「究極魔法」ですが、魔王の行動を以下のように変更します。

(4-1)魔王「通常攻撃」……確率50%。
(4-2)魔王「魔法攻撃」……確率20%。
(4-3)魔王「必殺技」……確率15%。
(4-4)魔王「究極魔法」……確率5%
(4-5)魔王「様子を見る」……確率10%。

これまでは「通常攻撃」が70%でしたが、これだと魔王の攻撃のほとんどが通常攻撃ばかりでつまらないということがテストプレイをしていてわかりましたので、こんな感じにしています。
これでも究極魔法がなかなか来ないので、また変更するかも。
ひとまずこれで続行。

Mkyukyoku = 0 '魔王の「究極魔法」用フラグ管理

maoukyumahou = 15000 '魔王の「究極魔法」ダメージ基本量

変数を追加しました。
魔王「究極魔法」行動時の追加は以下。

  'ここから魔王の行動
  If Controls.LastClickedButton = maouturn Then
    Sound.PlayClick()
    maoukoudou = Math.GetRandomNumber(100)

  '魔王「究極魔法」 フラグ立っている時(Mkyukyoku = 1)強制
    If Mkyukyoku = 1 Then
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.FillRectangle(yuusyaHPX, yuusyaHPY, 60, 20) '勇者HP消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王の究極魔法!!")
      GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
      mdamage4 = maoukyumahou + Math.GetRandomNumber(1001) - 1
      If Ybougyo = 1 Then
        yuusyaHP = yuusyaHP - Math.Floor(mdamage4 / 2)
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, Math.Floor(mdamage4 / 2))
      Else
        yuusyaHP = yuusyaHP - mdamage4
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, mdamage4)
      EndIf
      Controls.HideControl(maouturn)
      If yuusyaHP <= 0 Then
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "魔王は勇者を倒した!")
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, 0) '勇者HP描画(倒したので強制で0)
        Controls.ShowControl(maousyouri)
      Else '魔王「究極魔法」使用後に、勇者のHPがゼロになっていない時は、Mkyukyokuを0に戻す記述を入れる
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
        Controls.ShowControl(ytatakau)
        Controls.ShowControl(ybou)
        Controls.ShowControl(ykaihuku)
        Controls.ShowControl(ymahou)
        Mkyukyoku = Mkyukyoku - 1
      EndIf
    Else 'ここのElse以下は、魔王「究極魔法」 フラグ立っていない時(Mkyukyoku = 0)

  '魔王の行動その1 通常攻撃
(省略)

これは、魔王行動時の最初に入れました。
この前ターンで、Mkyukyoku = 1(究極魔法の詠唱)になっていたら、このターンでは究極魔法を使う設定です。
また、この魔法使用後に勇者のHPがゼロになっていない時は、Mkyukyokuから1を引いて、Mkyukyoku = 0に戻しています。

詠唱ターンの記述は以下の通り。

  '魔王の行動その4 究極魔法。このターンは詠唱のみ。更にMkyukyoku = Mkyukyoku + 1でフラグを立てる
    If 86 <= maoukoudou And maoukoudou <= 90 Then
    Mkyukyoku = Mkyukyoku + 1
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王は究極魔法の詠唱を始めた!")
      Controls.HideControl(maouturn)
      Controls.ShowControl(ytatakau)
      Controls.ShowControl(ybou)
      Controls.ShowControl(ykaihuku)
      Controls.ShowControl(ymahou)
    EndIf

詠唱ターンではダメージを与える攻撃はしないで、Mkyukyoku = Mkyukyoku + 1のフラグを立てます。
ということで、実際のプログラムは以下の通り。
例によって長いのでクリックで全体表示です。

GraphicsWindow.Title = "勇者VS魔王 魔王戦"
GraphicsWindow.Width = 600
GraphicsWindow.Height = 400
GraphicsWindow.BackgroundColor = haikeicolor

haikeicolor = "black"
mojicolor = "white"

GraphicsWindow.FontName = "メイリオ"

yuusyatuujou = 1400 '勇者の「戦う」(通常)ダメージ基本量
yuusyakaisin = 4000 '勇者の「戦う」(会心の一撃)ダメージ基本量
yuusyakaihuku = 10000 '勇者の「回復魔法」基本量
yuusyamahou = 4000 '勇者の「攻撃魔法」ダメージ基本量

maoutuujou = 2400 '魔王の「戦う」ダメージ基本量
maoumahou = 3000 '魔王の「魔法」ダメージ基本量
maouhissatu = 4200 '魔王の「必殺技」ダメージ基本量
maoukyumahou = 15000 '魔王の「究極魔法」ダメージ基本量

YuusyaMXHP = 20000 '勇者の最大HP
yuusyaHP = 20000 '勇者のHP
yuusyaMP = 30 '勇者のMP
maouHP = 30000 '魔王のHP

Ybougyo = 0 '勇者の「防御」用フラグ管理
Mkyukyoku = 0 '魔王の「究極魔法」用フラグ管理

'メッセージ表示位置
massagewindowX = 130 'メッセージウィンドウのX座標
massagewindowY = 280 'メッセージウィンドウのY座標
yuusyaHPX = 450 '勇者のHP表示位置のX座標
yuusyaHPY = 25 '勇者のHP表示位置のY座標
yuusyaMPX = 450 '勇者のMP表示位置のX座標
yuusyaMPY = 55 '勇者のMP表示位置のY座標
maouHPX = 530 '魔王のMP表示位置のX座標
maouHPY = 160 '魔王のMP表示位置のY座標

maouimage = "http://farm3.staticflickr.com/2843/34019152321_29649e9a68_b.jpg" '魔王のグラフィック
GraphicsWindow.DrawImage(maouimage, 230, 100)

'ボタン設定
GraphicsWindow.FontSize = 17
GraphicsWindow.BrushColor = "black"
ytatakau = Controls.AddButton("戦う", 500, 240)
ybou = Controls.AddButton("防御", 500, 280)
ykaihuku = Controls.AddButton("回復魔法", 500, 320)
ymahou = Controls.AddButton("攻撃魔法", 500, 360)
GraphicsWindow.FontName = "Wingdings 3"
maouturn = Controls.AddButton("u", 550, 360) '魔王の攻撃ボタン
For i = 1 to 5
  opkaiwa[i] = Controls.AddButton("u", 550, 360) 'オープニング会話用ボタン。メッセージが5個なので、opkaiwa[1]〜opkaiwa[5]と設定
Endfor
ysyouri = Controls.AddButton("u", 550, 360) '勇者勝利時のメッセージ送りボタン
maousyouri = Controls.AddButton("u", 550, 360) '魔王勝利時のメッセージ送りボタン

'ボタン初期表示設定。opkaiwa[1]だけ表示したままで他は隠す
Controls.HideControl(ytatakau)
Controls.HideControl(ybou)
Controls.HideControl(ykaihuku)
Controls.HideControl(ymahou)
Controls.HideControl(maouturn)
For i = 2 to 5
  Controls.HideControl(opkaiwa[i])
Endfor
Controls.HideControl(ysyouri)
Controls.HideControl(maousyouri)

'文字の初期表示
GraphicsWindow.FontName = "メイリオ"
GraphicsWindow.BrushColor = mojicolor
GraphicsWindow.DrawText(430, 160, "魔王のHP:")
GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
GraphicsWindow.DrawText(yuusyaMPX, yuusyaMPY, YuusyaMP) '勇者MP描画
GraphicsWindow.DrawText(maouHPX, maouHPY, MaouHP) '魔王HP描画

'勇者ステータス表示用
stwindowX = 370
stwindowY = 10
GraphicsWindow.PenColor = mojicolor
GraphicsWindow.DrawRectangle(stwindowX - 2, stwindowY - 2, 200, 80)
GraphicsWindow.DrawText(400, 25, "HP:")
GraphicsWindow.DrawText(400, 55, "MP:")
GraphicsWindow.BrushColor = "DarkSlateGray"
GraphicsWindow.FillRectangle(stwindowX - 5, stwindowY - 5, 68, 18)
GraphicsWindow.BrushColor = mojicolor
GraphicsWindow.DrawText(stwindowX + 11, stwindowY - 8, "勇者")

'メッセージウィンドウの枠
GraphicsWindow.PenColor = mojicolor
GraphicsWindow.DrawRectangle(massagewindowX - 2, massagewindowY - 2, 365, 100)

'魔王と勇者のメッセージウィンドウ横顔グラフィック。開始時に魔王の顔を表示
maoukaoimage = "http://farm3.staticflickr.com/2947/34149757465_f4442f9355_b.jpg"
yuusyakaoimage1 = "http://farm3.staticflickr.com/2861/34019110651_b5d2da3fb4_b.jpg"
yuusyakaoimage2 = "http://farm3.staticflickr.com/2812/33764735780_de066f4c57_b.jpg"
GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ

'開始時のメッセージウィンドウ内セリフ
GraphicsWindow.FontSize = 18
GraphicsWindow.BrushColor = mojicolor
GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王があらわれた!")

Controls.ButtonClicked = OnClick

Sub OnClick
  'オープニング会話
  If Controls.LastClickedButton = opkaiwa[1] Then
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 30, "「勇者よ よくぞ来た!」")
    Controls.HideControl(opkaiwa[1]) 'ひとつのメッセージを表示したら、そのメッセージ表示用のボタンを消して、
    Controls.ShowControl(opkaiwa[2]) '次のメッセージ用のボタンを表示していく
  EndIf
  If Controls.LastClickedButton = opkaiwa[2] Then
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.DrawImage(yuusyakaoimage1, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者1顔グラ
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 30, "「やる気のない格好だな……。」")
    Controls.HideControl(opkaiwa[2])
    Controls.ShowControl(opkaiwa[3])
  EndIf
  If Controls.LastClickedButton = opkaiwa[3] Then
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 30, "「これは仮の姿!")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 60, " 本当は長髪美形なのだ!」")
    Controls.HideControl(opkaiwa[3])
    Controls.ShowControl(opkaiwa[4])
  EndIf
  If Controls.LastClickedButton = opkaiwa[4] Then
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.DrawImage(yuusyakaoimage2, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者2顔グラ
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 30, "「そんな訳あるか! 覚悟しろ、魔王!」")
    Controls.HideControl(opkaiwa[4])
    Controls.ShowControl(opkaiwa[5])
  EndIf
  If Controls.LastClickedButton = opkaiwa[5] Then
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 30, "「なお、おまえの回復魔法の消費MPは5、")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 60, "攻撃魔法の消費MPは10だ! フハハ!」")
    Controls.HideControl(opkaiwa[5])
    Controls.ShowControl(ytatakau)
    Controls.ShowControl(ybou)
    Controls.ShowControl(ykaihuku)
    Controls.ShowControl(ymahou)
  EndIf
  
  'ここから勇者の行動
  'MPが足りない時に魔法が使えない、というメッセージを出す
  If Controls.LastClickedButton = ymahou And yuusyaMP < 10 Then '攻撃魔法用
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "MPが足りません。")
    GraphicsWindow.DrawImage(yuusyakaoimage1, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者1顔グラ
  ElseIf Controls.LastClickedButton = ykaihuku And yuusyaMP < 5 Then '回復魔法用
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "MPが足りません。")
    GraphicsWindow.DrawImage(yuusyakaoimage1, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者1顔グラ
  Else
    
  '勇者の行動その1 戦う(確率で通常・会心の一撃)
  If Controls.LastClickedButton = ytatakau Then
      If Ybougyo = 1 Then
        Ybougyo = Ybougyo - 1
      EndIf
    Sound.PlayClick()
    yuusyakougeki = Math.GetRandomNumber(10) '通常・会心の確率をランダム取得
    If 1 <= yuusyakougeki And yuusyakougeki <= 8 Then '通常攻撃80%
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.FillRectangle(maouHPX, maouHPY, 60, 20) '魔王HP消去用
      GraphicsWindow.DrawImage(yuusyakaoimage2, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者2顔グラ
      ydamage = yuusyatuujou + Math.GetRandomNumber(101) - 1 'ダメージ量計算式。基本ダメージ量にランダムな数字を足す
      MaouHP = MaouHP - ydamage '魔王のHPからダメージ量を引いた値を、新たな魔王のHPと設定
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者の攻撃!")
      GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
      GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, ydamage) 'ダメージ量の数値
      Controls.HideControl(ytatakau)
      Controls.HideControl(ybou)
      Controls.HideControl(ykaihuku)
      Controls.HideControl(ymahou)
      If MaouHP  <= 0 Then '魔王のHPが0になった時。エンディングへ
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "勇者は魔王を倒した!")
        GraphicsWindow.DrawText(maouHPX, maouHPY, 0) '魔王HP描画(倒したので強制で0)
        Controls.ShowControl(ysyouri)
      Else '魔王のHPが1以上ならば、魔王ターンへ
        GraphicsWindow.BrushColor = mojicolor
        GraphicsWindow.DrawText(maouHPX, maouHPY, MaouHP) '魔王HP描画
        Controls.ShowControl(maouturn)
      EndIf
    EndIf
    If 9 <= yuusyakougeki And yuusyakougeki <= 10 Then '会心の確率20%
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.FillRectangle(maouHPX, maouHPY, 60, 20) '魔王HP消去用
      GraphicsWindow.DrawImage(yuusyakaoimage2, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者2顔グラ
      ydamage = yuusyakaisin + Math.GetRandomNumber(201) - 1
      MaouHP = MaouHP - ydamage
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者の攻撃! 会心の一撃!!")
      GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
      GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, ydamage) 'ダメージ量の数値
      Controls.HideControl(ytatakau)
      Controls.HideControl(ybou)
      Controls.HideControl(ykaihuku)
      Controls.HideControl(ymahou)
      If MaouHP  <= 0 Then
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "勇者は魔王を倒した!")
        GraphicsWindow.DrawText(maouHPX, maouHPY, 0) '魔王HP描画(倒したので強制で0)
        Controls.ShowControl(ysyouri)
      Else
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, ydamage) 'ダメージ量の数値
        GraphicsWindow.DrawText(maouHPX, maouHPY, MaouHP) '魔王HP描画
        Controls.ShowControl(maouturn)
      EndIf
    EndIf
  EndIf
  
  '勇者の行動その2 防御
  If Controls.LastClickedButton = ybou Then
      If Ybougyo = 1 Then
        Ybougyo = Ybougyo - 1
      EndIf
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者は防御している。")
    Ybougyo = Ybougyo + 1
    Controls.HideControl(ytatakau)
    Controls.HideControl(ybou)
    Controls.HideControl(ykaihuku)
    Controls.HideControl(ymahou)
    Controls.ShowControl(maouturn)
  EndIf
  
  
  '勇者の行動その3 回復魔法
  If Controls.LastClickedButton = ykaihuku Then
      If Ybougyo = 1 Then
        Ybougyo = Ybougyo - 1
      EndIf
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.FillRectangle(yuusyaHPX, yuusyaHPY, 60, 20) '勇者HP消去用
    GraphicsWindow.FillRectangle(yuusyaMPX, yuusyaMPY, 40, 20) '勇者MP消去用
    GraphicsWindow.DrawImage(yuusyakaoimage1, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者1顔グラ
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者は回復魔法を唱えた!")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, "勇者のHPが回復した。")
    ykaihukuryou = yuusyakaihuku + Math.GetRandomNumber(1001) - 1
    YuusyaHP = YuusyaHP + ykaihukuryou
    YuusyaMP = YuusyaMP - 5
    GraphicsWindow.DrawText(yuusyaMPX, yuusyaMPY, YuusyaMP) '勇者MP描画
    Controls.HideControl(ytatakau)
    Controls.HideControl(ybou)
    Controls.HideControl(ykaihuku)
    Controls.HideControl(ymahou)
    Controls.ShowControl(maouturn)
    If YuusyaMXHP <= YuusyaHP Then '回復したHPが勇者の最大HP以上の時は、表示するHPを最大HPに強制変更
      GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, YuusyaMXHP) '勇者最大HP描画
    Else
      GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
    EndIf
  EndIf
    
  '勇者の行動その4 攻撃魔法
  If Controls.LastClickedButton = ymahou Then
      If Ybougyo = 1 Then
        Ybougyo = Ybougyo - 1
      EndIf
    Sound.PlayClick()
    GraphicsWindow.BrushColor = haikeicolor
    GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
    GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
    GraphicsWindow.FillRectangle(maouHPX, maouHPY, 60, 20) '魔王HP消去用
    GraphicsWindow.FillRectangle(yuusyaMPX, yuusyaMPY, 40, 20) '勇者MP消去用
    GraphicsWindow.DrawImage(yuusyakaoimage2, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ勇者2顔グラ
    ydamage = yuusyamahou + Math.GetRandomNumber(201) - 1
    MaouHP = MaouHP - ydamage
    YuusyaMP = YuusyaMP - 10
    GraphicsWindow.BrushColor = mojicolor
    GraphicsWindow.DrawText(massagewindowX, massagewindowY, "勇者は攻撃魔法を唱えた!")
    GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
    GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, ydamage) 'ダメージ量の数値
    GraphicsWindow.DrawText(yuusyaMPX, yuusyaMPY, YuusyaMP) '勇者MP描画
    Controls.HideControl(ytatakau)
    Controls.HideControl(ybou)
    Controls.HideControl(ykaihuku)
    Controls.HideControl(ymahou)
      If MaouHP <= 0 Then
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "勇者は魔王を倒した!")
        GraphicsWindow.DrawText(maouHPX, maouHPY, 0) '魔王HP描画(倒したので強制で0)
        Controls.ShowControl(ysyouri)
      Else
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, ydamage) 'ダメージ量の数値
        GraphicsWindow.DrawText(maouHPX, maouHPY, MaouHP) '魔王HP描画
        Controls.ShowControl(maouturn)
      EndIf
    EndIf
  EndIf
  
  '勇者勝利用
  If Controls.LastClickedButton = ysyouri Then
    Sound.PlayClick()
    GraphicsWindow.Clear()
    yuusyaending = "http://farm3.staticflickr.com/2850/34019110891_ec84167d8b_b.jpg"
    GraphicsWindow.DrawImage(yuusyaending, 0, 0)
  EndIf
  
  'ここから魔王の行動
  If Controls.LastClickedButton = maouturn Then
    Sound.PlayClick()
    maoukoudou = Math.GetRandomNumber(100)

  '魔王「究極魔法」 フラグ立っている時(Mkyukyoku = 1)強制
    If Mkyukyoku = 1 Then
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.FillRectangle(yuusyaHPX, yuusyaHPY, 60, 20) '勇者HP消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王の究極魔法!!")
      GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
      mdamage4 = maoukyumahou + Math.GetRandomNumber(1001) - 1
      If Ybougyo = 1 Then
        yuusyaHP = yuusyaHP - Math.Floor(mdamage4 / 2)
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, Math.Floor(mdamage4 / 2))
      Else
        yuusyaHP = yuusyaHP - mdamage4
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, mdamage4)
      EndIf
      Controls.HideControl(maouturn)
      If yuusyaHP <= 0 Then
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "魔王は勇者を倒した!")
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, 0) '勇者HP描画(倒したので強制で0)
        Controls.ShowControl(maousyouri)
      Else '魔王「究極魔法」使用後に、勇者のHPがゼロになっていない時は、Mkyukyokuを0に戻す記述を入れる
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
        Controls.ShowControl(ytatakau)
        Controls.ShowControl(ybou)
        Controls.ShowControl(ykaihuku)
        Controls.ShowControl(ymahou)
        Mkyukyoku = Mkyukyoku - 1
      EndIf
    Else 'ここのElse以下は、魔王「究極魔法」 フラグ立っていない時(Mkyukyoku = 0)

  '魔王の行動その1 通常攻撃
    If 1 <= maoukoudou And maoukoudou <= 50 Then
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.FillRectangle(yuusyaHPX, yuusyaHPY, 60, 20) '勇者HP消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      mdamage = maoutuujou + Math.GetRandomNumber(201) - 1
      If Ybougyo = 1 Then
        yuusyaHP = yuusyaHP - Math.Floor(mdamage / 2)
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, Math.Floor(mdamage / 2))
      Else
        yuusyaHP = yuusyaHP - mdamage
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, mdamage)
      EndIf
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王の攻撃!")
      GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
      Controls.HideControl(maouturn)
      If yuusyaHP <= 0 Then
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "魔王は勇者を倒した!")
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, 0) '勇者HP描画(倒したので強制で0)
        Controls.ShowControl(maousyouri)
      Else
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
        Controls.ShowControl(ytatakau)
        Controls.ShowControl(ybou)
        Controls.ShowControl(ykaihuku)
        Controls.ShowControl(ymahou)
      EndIf
    EndIf

  '魔王の行動その2 魔法攻撃
    If 51 <= maoukoudou And maoukoudou <= 70 Then
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.FillRectangle(yuusyaHPX, yuusyaHPY, 60, 20) '勇者HP消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      mdamage2 = maoumahou + Math.GetRandomNumber(301) - 1
       If Ybougyo = 1 Then
        yuusyaHP = yuusyaHP - Math.Floor(mdamage2 / 2)
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, Math.Floor(mdamage2 / 2))
      Else
        yuusyaHP = yuusyaHP - mdamage2
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, mdamage2)
      EndIf
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王はなんかすごい魔法を唱えた!")
      GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
      Controls.HideControl(maouturn)
      If yuusyaHP <= 0 Then
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "魔王は勇者を倒した!")
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, 0) '勇者HP描画(倒したので強制で0)
        Controls.ShowControl(maousyouri)
      Else
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
        Controls.ShowControl(ytatakau)
        Controls.ShowControl(ybou)
        Controls.ShowControl(ykaihuku)
        Controls.ShowControl(ymahou)
      EndIf
    EndIf
    
  '魔王の行動その3 必殺技
    If 71 <= maoukoudou And maoukoudou <= 85 Then
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.FillRectangle(yuusyaHPX, yuusyaHPY, 60, 20) '勇者HP消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王はなんかすごい必殺技を放った!")
      GraphicsWindow.DrawText(massagewindowX + 50, massagewindowY + 20, "のダメージを与えた。")
      mdamage3 = maouhissatu + Math.GetRandomNumber(401) - 1
      If Ybougyo = 1 Then
        yuusyaHP = yuusyaHP - Math.Floor(mdamage3 / 2)
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, Math.Floor(mdamage3 / 2))
      Else
        yuusyaHP = yuusyaHP - mdamage3
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 20, mdamage3)
      EndIf
      Controls.HideControl(maouturn)
      If yuusyaHP <= 0 Then
        GraphicsWindow.DrawText(massagewindowX, massagewindowY + 40, "魔王は勇者を倒した!")
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, 0) '勇者HP描画(倒したので強制で0)
        Controls.ShowControl(maousyouri)
      Else
        GraphicsWindow.DrawText(yuusyaHPX, yuusyaHPY, yuusyaHP) '勇者HP描画
        Controls.ShowControl(ytatakau)
        Controls.ShowControl(ybou)
        Controls.ShowControl(ykaihuku)
        Controls.ShowControl(ymahou)
      EndIf
    EndIf
    
  '魔王の行動その4 究極魔法。このターンは詠唱のみ。更にMkyukyoku = Mkyukyoku + 1でフラグを立てる
    If 86 <= maoukoudou And maoukoudou <= 90 Then
    Mkyukyoku = Mkyukyoku + 1
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王は究極魔法の詠唱を始めた!")
      Controls.HideControl(maouturn)
      Controls.ShowControl(ytatakau)
      Controls.ShowControl(ybou)
      Controls.ShowControl(ykaihuku)
      Controls.ShowControl(ymahou)
    EndIf
    
  '魔王の行動その4 様子見
    If 91 <= maoukoudou And maoukoudou <= 100 Then
      GraphicsWindow.BrushColor = haikeicolor
      GraphicsWindow.FillRectangle(massagewindowX, massagewindowY, 360, 90) 'メッセージウィンドウ台詞消去用
      GraphicsWindow.FillRectangle(massagewindowX - 110, massagewindowY, 100, 100) 'メッセージウィンドウ顔グラ消去用
      GraphicsWindow.DrawImage(maoukaoimage, massagewindowX - 110, massagewindowY) 'メッセージウィンドウ魔王顔グラ
      GraphicsWindow.BrushColor = mojicolor
      GraphicsWindow.DrawText(massagewindowX, massagewindowY, "魔王は様子を見ている。")
      Controls.ShowControl(ytatakau)
      Controls.ShowControl(ybou)
      Controls.ShowControl(ykaihuku)
      Controls.ShowControl(ymahou)
      Controls.HideControl(maouturn)
      EndIf
    EndIf
    
  '魔王勝利用
    If Controls.LastClickedButton = maousyouri Then
      Sound.PlayClick()
      GraphicsWindow.Clear()
      maouending = "http://farm3.staticflickr.com/2814/33764735820_f5e1a43c43_b.jpg"
      GraphicsWindow.DrawImage(maouending, 0, 0)
    EndIf

  EndIf
EndSub


rpg


rpg


魔王のHPが変な場所に表示されていますが、実際のゲームでは敵側のHPは表示されないと思いますので、最終的にはこのHP表示は削除すると思います。
それまではデバッグということで、表示しておいても良いかなと。
レイアウト自体、まだまだ改良の余地がありそうですし。

また、防御実行後は究極魔法のダメージが半減しているのも確認できました。
ただ、防御して待たないと究極魔法を使ってくれない気がします。w
ここに、ターン数をカウントする変数を加えて、「5ターン目以降は究極魔法の確率を上げる」などの処理をしても良いかもしれませんね。



▲TOPへ戻る