Javaでドラクエっぽい対戦ゲームを作ってみる【お題3-4編】

Java

こんにちは、ゆきたです。

毎回お題を1つずつしかクリアできていないことにやや焦りつつあります。Javaでドラクエっぽい対戦ゲームを作っている途中です。前回はプレーヤーから入力を受け付けるお題をクリアしました。今回はお題3以降をコードにしていってみたいと思います。

参考:まゆさんの記事はコチラ【体験談】神里よしとさんのレッスンで、 Ruby完全初心者が対戦ゲームを作ってみた

 

前回の忘れ物

さて、お題3に入る前に前回の忘れ物を片付けておきたいと思います。前回はプレーヤーからのコマンドを受け取るところまでをやりましたが、肝心の受け取ったコマンドに合わせた内容を設定していませんでした。

入力したコマンドに合わせてストーリーを分岐させます。Javaでは分岐させる方法としてif文、switch文、条件演算子(三項演算子)があります。今回は「1:たたかう」「2:にげる」「それ以外」が入力される可能性があります。特に理由はありませんが今回はswitch文で書いてみます。

switch (choice) {
  case 1:
    System.out.println("\nゆきたはたたかうことをえらんだ!");
    break;
  case 2:
    System.out.println("\nゆきたはにげだした");
    break;
  default:
    System.out.println("\n1か2を入力してください");
}

これで実行して2を入力すると私はにげだします。

これで入力した内容に合わせてストーリー(処理)を分岐させることができました。

 

お題3 まずゆきたが攻撃。4回に1回会心の一撃を繰り出せる。

それでは気を取り直してお題3です。プレーヤーの攻撃は、攻撃したことを表示 + スライムのHPを減算処理 + スライムへのダメージの表示の順で書いていきます。「たたかうことをえらんだ」の下に以下のコードを書きます。

System.out.println("\nゆきたのこうげき!!");
slimeHp -= 10;
System.out.println("\nスライムに10のダメージを与えた!");

 

会心の一撃は減算量を増加させることで表現します。「4回に1回」を実現するやり方はいくつかありますが、今回はRandomクラスのnextInt()メソッドを利用してみます。nextInt()メソッドは引数にint(整数)をとり、0から(整数−1)までの整数をランダムに返すインスタンスメソッドです。nextInt()メソッドで0,1,2,3をランダムに生成し、生成した整数が1の時に会心の一撃を繰り出す条件分岐をif-else文で書いてみます。

 

Random random = new Random();
int critical = random.nextInt(4);
System.out.println("\nゆきたのこうげき!!");
if (critical == 1) {
  System.out.println("\nゆきたは会心の一撃をはなった!!");
  slimeHp -= 30;
  System.out.println("\nスライムに30のダメージを与えた!");
} else {
  slimeHp -= 10;
  System.out.println("\nスライムに10のダメージを与えた!");
}

ついでに会心の一撃をはなったことも表示させてみます。なおRandomクラスはjava.utilパッケージで提供されていますので、import文を忘れずに書いておきます。

import java.io.*;
import java.util.Random;

 

実行結果は、

無事4回に1回くらいの割合で会心の一撃を放つようになりました。

今回はもう一つお題いってみようと思います!

 

お題4 攻撃を受けたスライムの様子を出力する

これは攻撃を受けた後のスライムのHPを条件にした分岐で考えます。特に理由はありませんが条件演算子で書いてみます。条件演算子は条件式の後ろに?をつけて、そのあとに:を挟んで左側に条件式の評価がtrue、右側にfalseの時の式を書きます。

String status = "スライムは";
status += slimeHp >= 80 ? "不気味に笑っている"
        : slimeHp >= 60 ? "まだ余裕の表情だ"
        : slimeHp >= 40 ? "動きが鈍くなってきた"
        : slimeHp >= 20 ? "何とか踏みとどまっている"
        : slimeHp > 0 ? "今にも倒れそうだ"
        : "ちから尽きた";
System.out.println(status);

少しややこしいですがネストした条件演算子を書いてみました。最初に文字列statusを宣言して「スライムは」で初期化しています。続く2行目以降で「スライムは」のあとに続く文字列をslimeHpの数値で切り替えています。

試しにプレーヤの会心の一撃のダメージを130にして何度か実行してみます。

通常の攻撃の場合

 

会心の一撃の場合

スライムの残り体力によって表示される状態を変えることができました。最後にスライムを倒した後の表示も足しておきましょう。

if (slimeHp <= 0) {
  System.out.println("\nゆきたはスライムをやっつけた!");
  System.out.println("ゆきたは16の経験値を手に入れた!");
  System.out.println("ゆきたは26ゴールド手に入れた!");
}

だいぶそれらしくなってきましたね。

 

次回はお題5以降を書いていきたいと思います。(半分過ぎた…)

 

コメント

タイトルとURLをコピーしました