■総合演習1 -対戦ゲームJapagon
問題文
見やすいように、問題文をGoogleドキュメントにて共有します。
▶Japagonの問題文はこちら
印刷して手元に置いておくと、作業がスムーズです。
ヒント:段階的に作っていきましょう
何をすれば良いのか分からない場合、作れそうな箇所だけを部分的に作ってみましょう。
(一部作る都度、動作確認するのがコツです)
例:
・ボスのHPが0より上の場合、ボスからの攻撃を受ける部分だけを実装してみる
・(↑ができたら)「どうする? 1:闘う 2:ためる 3:逃げる」の部分だけを実装してみる(無限ループに注意)
・(↑ができたら)選択肢3逃げるの場合の処理を追加する
・(↑ができたら)選択肢2貯めるの処理を追加する
・・・
ヒント:必要な変数
変数として管理すべき項目は、以下5つです。
- プレイヤーのHP(変数名の例:playerHP)
- ボスのHP(bossHP)
- 貯めるを実行した数(charge)
- サンダーが利用可能かどうか(isThunderAvailable)
4の「利用可能かどうか」は、True(可能)かFalse(不可)で管理するとよいでしょう。
TrueかFalseを扱うのはBoo..で始まる型です。
変数名は、例のとおりでなくてもかまいません。
何が入っているのかわかりやすい名前をつけましょう。
*「サンダーが利用可能かどうか」は、使わなくても作成自体は可能です。(サンダーを放つかどうかの条件を、「貯めるを実行した数が3以上」とすれば良い)
ただし、今回は問題文の指示とおり、使うやり方で実装してみてください。
ヒント:ベースとなる繰り返し
ベースとなる繰り返し文は「プレイヤーの体力が0より大きい かつ ボスの体力が0より大きい」です。
ヒント:ボスのHPを10減らす
ボスのHPを10減らすには、ボスHPから10引いた計算結果をボスHPに代入します。
具体的には、以下のように記述します。
(変数名bossHpの場合)bossHp = bossHp -10;
余談:
講義内で深く触れていませんが、以下のように省略して書くこともできます。
bossHp-=10;
ヒント:分岐の中で分岐する
以下のように、IF文の処理の中にIF文を書くと、分岐の中でさらに分岐させることができます。
if (choice == 1) {//1が入力された場合 if (条件の具体的な記述は割愛) { //サンダーが利用可能である場合 System.out.println("サンダーを放った!!"); bossHP = 0; } else { //サンダーが利用不可である場合 ...(以下略)
スペシャルヒント:コメント欄を埋めていけば完成するソース
ここまでのヒントで手を動かせない方のためのスペシャルヒントです。
(手を動かせるようなら、このヒントは見ずにトライしたほうが実力はつきます👍無理して挫折しては元も子もないので、心が折れそうなら遠慮無くスペシャルヒントを活用してください!)
コメントの箇所に、問題文の指示とおりに処理を記述してみてください。
package lesson99; import java.io.IOException; public class Japagon{ public static void main(String[] args) throws IOException { //readerの用意 int playerHP = 100; int bossHP = 200; //貯める数を管理する変数の初期化 //サンダー利用可否を管理する変数の初期化 System.out.println("じゃぱごんが現れた!"); while (playerHP > 0 && bossHP > 0) { //プレイヤーとボスそれぞれのhpの表示 System.out.println("1. 闘う 2. ためる 3. 逃げる"); //入力値によって処理を分岐 //もしボスのHPが0より上なら、30のダメージ } //プレイヤーのHPが0以下ならCLEAR、ボスのHPが0以下ならGameOver } }
//入力値によって処理を分岐
の部分だけ書かなければいけない処理が多いですがあえてです。
総合演習1じゃぱごん回答例
package lesson99; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Japagon { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); int playerHP = 100; int bossHP = 200; int charge = 0; boolean isThunderAvailable = false; System.out.println("じゃぱごんが現れた!"); while (playerHP > 0 && bossHP > 0) { System.out.println("あなたのHP: " + playerHP); System.out.println("じゃぱごんのHP: " + bossHP); System.out.println("1. 闘う 2. ためる 3. 逃げる"); int choice = Integer.parseInt(reader.readLine()); if (choice == 1) { if (isThunderAvailable) { System.out.println("サンダーを放った!!"); bossHP = 0; } else { System.out.println("じゃぱごんに攻撃!10のダメージ"); bossHP -= 10; // 通常攻撃のダメージ } } else if (choice == 2) { charge++; if (charge >= 3) { isThunderAvailable = true; System.out.println("サンダーが使えるようになった!"); } else { System.out.println("力をためている..."); } } else if (choice == 3) { System.out.println("ここで背中を向けることはできない・・!!"); } if (bossHP > 0) { System.out.println("じゃぱごんの攻撃!"); playerHP -= 30; // ボスからのダメージ } } if (playerHP <= 0) { System.out.println("HPが0になった!GameOver"); } else if (bossHP <= 0) { System.out.println("じゃぱごんを倒した!CLEAR!"); } } }
■総合演習2-恋愛シミュレーションゲームSchool_rpg
問題文
Googleドキュメントにて問題文を共有します。
ヒント1:ループ前提の繰り返し処理
- 正しい選択肢が入力された場合のみ、次のシーンに写ります。
- 間違った選択肢を選んだ場合は、初めのシーン(シーン1、チュンチュン・・朝が来た)に戻ります。
上記のたたき台となるソースは、以下です。
while (true) { // 最初のシーン System.out.println("チュンチュンチュン・・"); if (false) { // 誤った選択肢を選んだ場合 System.out.println("GameOver"); continue; // 以降の処理を中断し、シーン1に戻る } //正しい選択肢を選んだ場合は続きの処理を行う。記述は不要 //次のシーン if (false) { // 誤った選択肢を選んだ場合 System.out.println("GameOver"); continue; // 以降の処理を中断し、シーン1に戻る } //正しい選択肢を選んだ場合は続きの処理を行う。記述は不要 break; //ゲームクリア時、ループを抜ける } //ループから抜けた後の処理 System.out.println("Clear");
if文の()をtrueに変更して実行すると、誤った選択肢を選んだ場合の動きを再現できます。
(無限ループ状態になるので、動きを確認したら止めましょう。)
上記を見てもピンとこない方は、繰り返しのレクチャーを復習してみてください。
ヒント2:シーン1の模範解答ソース
シーン1の部分の実装方法です。
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); boolean hasHandkerchief = false; //ハンカチを持ったかを管理する変数 while (true) { //条件を常にtrueにして、breakしない限り、繰り返す System.out.println("チュンチュン・・朝が来た。"); System.out.println("シーン1: 学校に行く? (1: はい, 2: いいえ)"); int choice = Integer.parseInt(reader.readLine()); if (choice != 1) { //誤った選択肢を選んだ場合 System.out.println("YouTubeを見ていたら1日が終わった。"); System.out.println("Game Over"); continue;//ループの初めに戻る } //シーンXへ System.out.println("シーンX: ハンカチは持って行く? (1: 持つ, 2: 持たない)");
ヒント3:どちらの分岐にも共通している処理を書く場合
*少し応用的なので、読んで混乱する場合は気にしないでOKです。
シーン5(何回ねぇって言う?)では、2以外が入力された場合の分岐が複雑です。
・2以外が入力された場合、必ず実行する処理 「女の子は去って行った」 「Game over」 ・1以下の場合にのみ実行する処理 「聞こえなかったようだ」 ・3以上の場合のみ実行する処理 「凄く早足だった。気味悪がられたのかも・・」
このように共通して行う処理がある場合、記述は1箇所だけにまとめましょう。
(正しく動くものの、いまいちな例)
以下のようにそれぞれに記述しても動きはしますが、同じ処理が複数箇所に書かれているため、非効率でメンテナンス性が落ちます。
1以下の場合: 「女の子は去って行った」 「聞こえなかったようだ」 「Game over」 3以上の場合 「女の子は去って行った」 「凄く早足だった。気味悪がられたのかも・・」 「Game over」
問題文は、以下のように書かれています。この記述の仕方がそのまま、ヒントです。
2以外が入力された場合 「女の子は去って行った」 1以下の場合 「聞こえなかったようだ」 3以上の場合 「凄く早足だった。気味悪がられたのかも・・」 「Game Over」
■School_rpg回答例
package lesson99; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class School_rpg { public static void main(String[] args) throws IOException { BufferedReader reader = new BufferedReader(new InputStreamReader(System.in)); boolean hasHandkerchief = false; while (true) { System.out.println("チュンチュン・・朝が来た。"); System.out.println("シーン1: 学校に行く? (1: はい, 2: いいえ)"); int choice = Integer.parseInt(reader.readLine()); if (choice != 1) { System.out.println("YouTubeを見ていたら1日が終わった。"); System.out.println("Game Over"); continue; } System.out.println("シーンX: ハンカチは持って行く? (1: 持つ, 2: 持たない)"); choice = Integer.parseInt(reader.readLine()); if (choice == 1) { System.out.println("ハンカチをポケットに入れた"); hasHandkerchief = true; } System.out.println("シーン2: 何を着て行く? (1: 制服, 2: 私服)"); choice = Integer.parseInt(reader.readLine()); System.out.println("学校に着いた。"); if (choice != 1) { System.out.println("先生「制服はどうした?着替えてきなさい」"); System.out.println("Game Over"); continue; } System.out.println("シーン3: 休み時間だ。何をする? (1: 廊下に出る, 2: 本を読む)"); choice = Integer.parseInt(reader.readLine()); if (choice != 1) { System.out.println("全ての休み時間をスマホで漫画を読んで過ごした。"); System.out.println("最後の授業が終わった。さぁ、帰ろう"); System.out.println("Game Over"); continue; } System.out.println("シーン4: 女の子がハンカチを落としたようだ (1: 拾って声をかける, 2: 拾わない)"); choice = Integer.parseInt(reader.readLine()); if (choice != 1) { System.out.println("女の子は去って行った。その後何事もなく、1日が終わった"); System.out.println("Game Over"); continue; } System.out.println("シーン5: 声をかけよう。何回「ねぇ」って言う? (回数を入力)"); choice = Integer.parseInt(reader.readLine()); for (int i = 0; i < choice; i++) { System.out.println("ねぇ"); } if (choice != 2) { System.out.println("女の子は去って行った"); if (choice <=1) { System.out.println("聞こえなかったようだ"); } else { System.out.println("凄く早足だった。気味悪がられたのかも・・"); } System.out.println("Game Over"); continue; } System.out.println("ハンカチ落としたよ"); System.out.println("女の子「ありがとう。」"); if (hasHandkerchief == false) { System.out.println("・・・"); System.out.println("会話が終了した。"); System.out.println("Game Over"); continue; } System.out.println("女の子「あなたもハンカチ落としていない?」"); System.out.println("後ろを振り返ると、僕のハンカチが落ちていた"); System.out.println("その後、会話が盛り上がり、連絡先を交換した"); break; } System.out.println("~続く~ 第一章出会い編 CLEAR!"); } }