見出し画像

問題を作る課題でアドベンチャー風ゲームをつくる問題を考えた(Java)

Javaの授業の一環で、問題を作る課題が出たことがありました。

お題はゲーム性を持ったもの、というもので、

私はねこと出会うアドベンチャー風のゲームを作る問題を考えることにしました。

以下はその時の問題文です。

【問題】アドベンチャーゲームの作成!

ねこと散策中に出会い、その時の行動の選択によってエンディングが変化するゲームアプリの作成

ねこは7種類。
ねこの名前や種類は任意。
もし思いつかない場合などは下記の例をお使いください。
名前:クロ 種類:黒猫
名前:ミケ 種類:三毛猫
名前:ブチ 種類:ぶち猫
名前:サビ 種類:サビ猫
名前:バトラ 種類:サバとら
名前:ジトラ 種類:キジとら
名前:トロ 種類:白猫

それぞれのねこインスタンスには、名前と種類の他に特定の行動でなつき度が上がるフィールドlikeUpがあります。

ゲームの始まりの文の後にエンターを押し、
プレイヤー名を入力し、エンターを押すと
場所の表示、
プレイヤー名と場所名とねこの種類とねこの名前が表示され、
行動メニューが表示されます。
ゲームは5回繰り返します。

場所の名前も任意です。
(駅前の広場、並木道の通り、商店街、路地裏、大きな公園)

[実行例]
これからある街であなたはねこと出会います
どんな風に過ごすかはあなたの選択に委ねられます
[enter]
あなたの名前を教えてください>にゃんこ
[enter]
---------------------------------------------駅前の広場--
にゃんこさんが駅前の広場に来ると白猫のトロが寄ってきた
[enter]
1:撫でる 2:ごはんをあげる 3:威嚇する 4:素通り >1

にゃんこさんが撫でてあげるとトロはうれしそうに目を細めた
[enter]

例文

[実行例]1:撫でるを選択した場合
にゃんこさんが撫でてあげるとトロはうれしそうに目を細めた

[実行例]2:ごはんをあげるを選択した場合
にゃんこさんがあげたごはんをトロはおいしそうに食べている

[実行例]3:威嚇するを選択した場合
にゃんこさんが威嚇するとトロはびっくりして逃げていった

[実行例]4:素通りを選択した場合
にゃんこさんはトロを見向きもせずに横を通り過ぎて行った


5回の繰り返し終了後に以下のような結果を表示します。


[実行例]なつき度が3以上の場合
街中のねこに好かれ、にゃんこさんにねこが集まってきた。
しあわせポイント+10P
+++++TrueEnd+++++

[実行例]「ごはんをあげる」の選択回数が3以上の場合
街中のねこはごはんを求め、にゃんこさんはねこに囲まれた。
空腹ポイント+150P
*****GourmetEnd*****

[実行例]「威嚇する」の選択回数が3以上の場合
街中のねこが集まり、にゃんこさんにねこが復讐に来た。
ねこヘイトポイント+100P
*****RevengeEnd*****

[実行例]「素通り」の選択回数が3以上の場合
特ににゃんこさんは何事もなく帰宅した。
平穏ポイント+2P
*****ThroughEnd*****

[実行例]
街の中でにゃんこさんはいろんなねこを見かけた。
普通ポイント+1P
-----NormalEnd-----

ざっくりとした答え

ランダムで7種類のねこ
(猫の種類や名前はこちらで決めておく)
が、出てくる
街の中を歩いてる感じ(町名とか場所の表示だけ。〜〜まで来たら終了)
メニューが表示されて(5回ループ)
1:撫でる 2:ご飯をあげる 3:威嚇する 4:素通り
選択によってねこのなつき度が変化する
散歩終了時に
なつき度が高かったらねこが集まってきて、しあわせポイントが増える
なつき度が低くてかつ威嚇を3回以上していたら、ねこが復讐に来る
なつき度が低くてかつ素通りを3回以上していたら、何もないまま終了

7種類のねこのそれぞれにとって1〜3のどの選択肢がなつき度が上がるかが決まっている
7種類のねこも最初に決めておくけど名前や種類は自由
(一応、実行例で名前とかは掲示しておく)
このねこは撫でるで上がるとか威嚇するで上がるとかが決まってる
(これは各自好きに設定)

場所の表示は変数の値を渡してメソッド呼び出し

メインでねこの名前と種類を引数で
ねこクラス

ぬるが書いたコード

import java.util.*; 
public class NekoArukiApp{
	public static void main(String[] args){
		Scanner scan=new Scanner(System.in);

		//Neko型の配列を作り、7種類のねこのインスタンス生成
		Neko[] neko={
			new Neko("クロ","黒猫",2),
			new Neko("ミケ","三毛猫",1),
			new Neko("ブチ","ぶち猫",3),
			new Neko("サビ","サビ猫",4),
			new Neko("バトラ","サバとら",2),
			new Neko("ジトラ","キジとら",3),
			new Neko("トロ","白猫",1),
		};
		//Neko型配列をシャッフルするためのメソッドの呼び出し
		shuffleNeko(neko);

		//ゲーム開始
		System.out.print("これからある街であなたはねこと出会います\nどんな風に過ごすかはあなたの選択に委ねられます\n");
		scan.nextLine();
		System.out.print("あなたの名前を教えてください>");
		String userName=scan.nextLine();
		game(userName,neko);//ゲームを実行するためのメソッドの呼び出し
	}

	//ねこをランダムで表示するためのメソッド
	static void shuffleNeko(Neko[] neko){
		Random rand=new Random();
		for(int i=0;i<neko.length;i++){
			int index=rand.nextInt(neko.length-i);
			Neko temp=neko[index];
			neko[index]=neko[neko.length-1-i];
			neko[neko.length-1-i]=temp;
		}
	}
	
	//ゲームを実行するメソッド
	static void game(String userName,Neko[] neko){
		Scanner scan=new Scanner(System.in);
		int friendly=0;//なつき度
		int gourmet=0;//ごはん度
		int revenge=0;//復讐度
		int through=0;//素通り度
		String[] place={//場所表示の配列
			"駅前の広場",
			"並木道の通り",
			"商店街",
			"路地裏",
			"大きな公園",
		};
		for(int i=0;i<5;i++){//ゲーム回数の5回まわるループ
			scan.nextLine();
			System.out.printf("%s%s--%n",repeat("-",45),place[i]);
			System.out.printf("%sさんが%sに来ると%sの%sが寄ってきた",userName,place[i],neko[i].type,neko[i].name);
			scan.nextLine();
			System.out.print("1:撫でる 2:ごはんをあげる 3:威嚇する 4:素通り >");
			int action=scan.nextInt();
			System.out.println();
			if(action==neko[i].likeUp){//なつき度条件が一致したらなつき度が上がる
				friendly++;
			}
			if(action==1){
				System.out.printf("%sさんが撫でてあげると%sはうれしそうに目を細めた%n",userName,neko[i].name);
				scan.nextLine();
			}
			if(action==2){//ごはんをカウント
				System.out.printf("%sさんがあげたごはんを%sはおいしそうに食べている%n",userName,neko[i].name);
				scan.nextLine();
				gourmet++;
			}
			if(action==3){//威嚇をカウント
				System.out.printf("%sさんが威嚇すると%sはびっくりして逃げていった%n",userName,neko[i].name);
				scan.nextLine();
				revenge++;
			}
			if(action==4){//素通りをカウント
				System.out.printf("%sさんは%sを見向きもせずに横を通り過ぎて行った%n",userName,neko[i].name);
				scan.nextLine();
				through++;
			}
		}
		if(friendly>=3){//なつき度が3以上なら
			System.out.printf("%n街中のねこに好かれ、%sさんにねこが集まってきた。%nしあわせポイント+10P%n",userName);
			System.out.printf("%25sTrueEnd%-15s%n",repeat("+",5),repeat("+",5));
		}else if(gourmet>=3){//ごはん選択回数が3以上なら
			System.out.printf("%n街中のねこはごはんを求め、%sさんはねこに囲まれた。%n空腹ポイント+150P%n",userName);
			System.out.printf("%25sGourmetEnd%-15s%n",repeat("*",5),repeat("*",5));
		}else if(revenge>=3){//威嚇選択回数が3以上なら
			System.out.printf("%n街中のねこが集まり、%sさんにねこが復讐に来た!!%nねこヘイトポイント+100P%n",userName);
			System.out.printf("%25sRevengeEnd%-15s%n",repeat("*",5),repeat("*",5));
		}else if(through>=3){//素通り選択回数が3以上なら
			System.out.printf("%n特に%sさんは何事もなく帰宅した。%n平穏ポイント+2P%n",userName);
			System.out.printf("%25sThroughEnd%-15s%n",repeat("*",5),repeat("*",5));
		}else{//どの条件にも当てはまらなかったら
			System.out.printf("%n街の中で%sさんはいろんなねこを見かけた。%n普通ポイント+1P%n",userName);
			System.out.printf("%25sNomalEnd%-15s%n",repeat("-",5),repeat("-",5));
		}
	}

	//記号の繰り返しを表示するためのメソッド
	static String repeat(String str,int num){
	
		String ret="";
		for(int i=0;i<num;i++){
			ret+=str;
		}
		return ret;
	}
}

class Neko{
	String name;//名前
	String type;//種類
	int likeUp;//なつき度が上がる条件を決めるための変数

	//名前と種類となつき度UP条件が引数のコンストラクタ
	public Neko(String name,String type,int likeUp){
		this.name=name;
		this.type=type;
		this.likeUp=likeUp;
	}
}

良ければサポートよろしくお願いします!いただいたサポートは愛猫姉妹のごはんとおやつ代に使わせていただきます♡♡