今回は受講生が作ったJava問題の中から良問をピックアップします。

*******武器商人ゲーム(S氏作)*******
オブジェクト指向の練習にピッタリの問題。良問です。
(一部表示やバランスの調整をさせていただきました。)

Java問題: 武器屋トルネコ
トルネコは将来自分のお店を持つために武器屋のバイトに励んでいる。
その日のバイトで3500G以上売り上げるか、HPが0以下になった時点でゲーム終了。
トルネコのHP(体力)は20
武器を1つ売るごとにHPを2消費する。
売らない場合はHPを1消費する。
お客は以下の武器をランダムで買ってく。

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)

[実行例1Success]
親方「今日も頼んだぜ。」
トルネコ「任せときな!!」

売上:0G HP:20

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?はじゃのつるぎを買おう。」
トルネコ「800円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:800G HP:18

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?はじゃのつるぎを買おう。」
トルネコ「800円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:1600G HP:16

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?ブーメランを買おう。」
トルネコ「350円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:1950G HP:14

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?くさりがまを買おう。」
トルネコ「550円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:2500G HP:12

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?ブーメランを買おう。」
トルネコ「350円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:2850G HP:10

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?はじゃのつるぎを買おう。」
トルネコ「800円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」
親方「ご苦労だったな。今日の仕事は以上だ。」
— 内訳 —
【こんぼう】(50G):0個
【どうのつるぎ】(100G):0個
【いばらのむち】(200G):0個
【ブーメラン】(350G):2個
【くさりがま】(550G):1個
【はじゃのつるぎ】(800G):3個

売上:3650G HP:8

SUCCESS!

[実行例2 Failed]
親方「今日も頼んだぜ。」
トルネコ「任せときな!!」

売上:0G HP:20

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?ブーメランを買おう。」
トルネコ「350円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:350G HP:18

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?はじゃのつるぎを買おう。」
トルネコ「800円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:1150G HP:16

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?こんぼうを買おう。」
トルネコ「50円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
n
トルネコ「テメェに売るこんぼうはねぇ!!帰んな!!」
客は逃げ出した

売上:1150G HP:15

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?はじゃのつるぎを買おう。」
トルネコ「800円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:1950G HP:13

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?ブーメランを買おう。」
トルネコ「350円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:2300G HP:11

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?どうのつるぎを買おう。」
トルネコ「100円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
n
トルネコ「テメェに売るどうのつるぎはねぇ!!帰んな!!」
客は逃げ出した

売上:2300G HP:10

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?ブーメランを買おう。」
トルネコ「350円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:2650G HP:8

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?どうのつるぎを買おう。」
トルネコ「100円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:2750G HP:6

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?どうのつるぎを買おう。」
トルネコ「100円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
y
トルネコ「毎度あり」

売上:2850G HP:4

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?どうのつるぎを買おう。」
トルネコ「100円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
n
トルネコ「テメェに売るどうのつるぎはねぇ!!帰んな!!」
客は逃げ出した

売上:2850G HP:3

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?どうのつるぎを買おう。」
トルネコ「100円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
n
トルネコ「テメェに売るどうのつるぎはねぇ!!帰んな!!」
客は逃げ出した

売上:2850G HP:2

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?ブーメランを買おう。」
トルネコ「350円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
n
トルネコ「テメェに売るブーメランはねぇ!!帰んな!!」
客は逃げ出した

売上:2850G HP:1

— 武器 —
【こんぼう】(50G)
【どうのつるぎ】(100G)
【いばらのむち】(200G)
【ブーメラン】(350G)
【くさりがま】(550G)
【はじゃのつるぎ】(800G)
———–
客「ここは武器の店かね?どうのつるぎを買おう。」
トルネコ「100円になります。」
客「売ってくれるかね?(はい:y いいえ:n)」
n
トルネコ「テメェに売るどうのつるぎはねぇ!!帰んな!!」
客は逃げ出した
親方「ご苦労だったな。今日の仕事は以上だ。」
— 内訳 —
【こんぼう】(50G):0個
【どうのつるぎ】(100G):2個
【いばらのむち】(200G):0個
【ブーメラン】(350G):3個
【くさりがま】(550G):0個
【はじゃのつるぎ】(800G):2個

売上:2850G HP:0

FAILED

[解答例]




import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 武器商人ゲーム
 */
public class Toruneko {

	/**
	 * メインメソッド
	 * @param args
	 */
	public static void main(String[] args) {

		final int HP=20;//主人公のHPの初期値
		final int QUOTA=3500;//ノルマ
		//スキャナーインスタンスを作成
		Scanner scan =new Scanner(System.in);
		//アイテムを作成しリストに格納
		List<Item> items=new ArrayList<>();
		items.add(new Item("こんぼう", 50));
		items.add(new Item("どうのつるぎ", 100));
		items.add(new Item("いばらのむち", 200));
		items.add(new Item("ブーメラン", 350));
		items.add(new Item("くさりがま", 550));
		items.add(new Item("はじゃのつるぎ", 800));

		//主人公のインスタンスを生成
		Merchant  toruneko = new Merchant("トルネコ",HP,items);
		//親方インスタンス
		Character oyakata=new Character("親方");
		//客インスタンス
		Customer kyaku=new Customer("客");

		/******opening*******/
		oyakata.talk("今日も頼んだぜ。");
		toruneko.talk("任せときな!!");
		/******mainルーチン******/
		while(true){
			toruneko.showInfo();//トルネコのステータスを表示
			toruneko.showItem();//トルネコがアイテム一覧を見せる
			Item item=kyaku.selectItem(toruneko.items);//トルネコのアイテム一覧を見て客がアイテムを決める
			toruneko.talk(item);//トルネコが値段を言う

			kyaku.talk("売ってくれるかね?(はい:y いいえ:n)");//売るかどうかの選択をする
			String select=scan.next();
			boolean isSales=select.equals("y");
			toruneko.sell(item, isSales);
			if(isSales==true){//売った
				item.amount++;//売ったアイテムの合計をインクリメント
			}else{//売らない
				kyaku.run();//客が帰る
			}
			//結果判定
			if(toruneko.money>=QUOTA || toruneko.hp<=0){
				oyakata.talk("ご苦労だったな。今日の仕事は以上だ。");
				toruneko.showResult(toruneko.money>=QUOTA);//結果表示
				break;
			}
		}
		/******終了処理******/
		scan.close();
	}
}

/**
 * アイテムクラス
 */
class Item{
	/****フィールド****/
	String name;//アイテム名
	int price;//アイテムの値段
	int amount;//このアイテムをいくつ売ったか

	/****コンストラクタ****/
	Item(String name,int price){
		this.name=name;
		this.price=price;
	}

	/**
	 * 商品の名前と価格を文字列にして返す
	 * @return
	 */
	String showInfo(){
		return String.format("【%s】(%dG)", this.name,this.price);
	}
	/**
	 * 商品の名前と価格、販売数を文字列にして返す
	 * @return
	 */
	String showResult(){
		return String.format("%s:%d個",this.showInfo(),amount);
	}

}
/**
 * キャラクタークラス
 *名前を持ち、喋ることができる
 */
class Character{
	/****フィールド****/
	String name;
	/****コンストラクタ****/
	Character(String name){
		this.name=name;
	}
	/**
	 * 引数で受け取った文言を
	 * 名前 「○○○○」という形で表示する
	 * @param msg
	 */
	void talk(String msg){
		System.out.printf("%s「%s」%n", this.name,msg);
	}
}
/**
 * 商人クラス
 *
 */
class Merchant extends Character{
	/****フィールド****/
	int money;//売上金
	int hp;
	List<Item> items;//商品リスト
	/****コンストラクタ****/
	Merchant(String name,int hp,List<Item> items){
		super(name);
		this.hp=hp;
		this.items=items;
	}
	/**
	 *売上金額とHPを表示する
	 */
	void showInfo(){
		System.out.printf("%n売上:%dG HP:%d%n%n",this.money,this.hp);
	}
	/**
	 * もっているアイテムを一覧表示する
	 */
	void showItem(){
		System.out.println("--- 武器 ---");
		for(Item item:this.items){
			System.out.println(item.showInfo());
		}
		System.out.println("-----------");
	}

	/**
	 * talkメソッドのオーバーロード
	 * 引数にアイテムを渡すとその値段を表示する
	 * @param item
	 */
	void talk(Item item){
		String msg=item.price+"Gになります。";
		this.talk(msg);
	}

	/**
	 * 売るか売らないかで処理を分岐する
	 * @param item
	 * @param isOk 
	 * @return 売ったか
	 */
	void sell(Item item,boolean isSales){
		if(isSales==true){
			this.talk("毎度あり");
			this.hp-=2;
			this.money+=item.price;
		}else {
			this.talk("テメェに売る"+item.name+"はねぇ!!帰んな!!");
			this.hp-=1;
		}

	}
	/**
	 * 結果を一覧表示
	 */
	void showResult(boolean isSuccess){
		System.out.println("--- 内訳 ---");
		for(Item item:this.items){
			System.out.println(item.showResult());
		}
		this.showInfo();
		System.out.println(isSuccess? "SUCCESS!":"FAILED");
	}
}

/**
 * 客クラス
 */
class Customer extends Character{
	/****コンストラクタ****/
	Customer(String name){
		super(name);
	}
	/**
	 * 商品リストを受け取ってその中からランダムに
	 * 商品を選ぶ
	 * @return 選んだアイテム
	 */
	Item selectItem(List<Item> items){
		/*
		 * Math.random()
		 * 0.00000 ~0.999999
		 * items.size() ->6
		 * 0.00000~5.999999
		 * 0~5
		 * Random rand=new Random();
		 * int no=rand.nextInt(items.size());
		 */
		int no=(int)(Math.random()*items.size());
		Item item=items.get(no);
		System.out.printf("%s「ここは武器の店かね?%sを買おう。」%n", this.name,item.name);
		return item;
	}

	/**
	 * 逃げる
	 */
	void run(){
		System.out.println(this.name+"は逃げ出した");
	}
}