Q
High And Lowゲームを作成する。
[流れ]
1.52枚のカードの中から1枚カードが表示される。
2.2枚目のカードが1枚目のカードより大きいか小さいかを予想する。この際大きい小さいは基本カードの数字に依存するが1は例外で最大とする。
3.当たったら掛け金が倍になる。
4.外れるまで行い、最大どこまで到達したかを記録する。
なお、ターンごとにカード全体がシャッフルされそこから2枚を選ぶこととする。
2枚のカードの数字が同じ場合はDrawとし、Goldはそのままで継続する。
最初は1000goldから始める。
詳しくは実行例を参考のこと

[実行例]
****High And Low****
HighScore:1000
Gold:1000
****turn1****
H4
High…h Low…l>h
S13
Win
Gold:2000
****turn2****
H10
High…h Low…l>l
C5
Win
Gold:4000
****turn3****
S5
High…h Low…l>h
D4
Lose
Gold:0
GameOver
4000まで行きました。
もう一回やりますかYes…y NO…n>y
HighScore:4000
Gold:1000
****turn1****
H6
High…h Low…l>h
H2
Lose
Gold:0
GameOver
1000まで行きました。
もう一回やりますかYes…y NO…n>y
HighScore:4000
Gold:1000
****turn1****
H9
High…h Low…l>l
D9
Draw
Gold:1000
****turn2****
H13
High…h Low…l>l
H1
Lose
Gold:0
GameOver
1000まで行きました。
もう一回やりますかYes…y NO…n>n
今回の記録は4000でした。
アプリケーションを終了します。

[解答例]
Card.java

public class Card {
	String suit;
	int no;
	int point;
	Card(String suit,int no){
		this.suit=suit;
		this.no=no;
		this.point=no==1? 14:no;
	}
	String show() {
		return this.suit+this.no;
	}
}

HighLowApp.java

import java.util.Random;
import java.util.Scanner;
public class HighLowApp {
	static Card[] deck=new Card[52];
	static int turn=0;
	static int highScore=1000;
	static int gameScore;
	static int gold;
	static Scanner scan=new Scanner(System.in);
	static Random rand=new Random();
	/**
	 * メインメソッド
	 * @param args
	 */
	public static void main(String[] args) {
		//52枚のカード生成
		createCard();
		//オープニング
		System.out.println("****High And Low****");
		//ゲーム全体の繰り返し
		while(true) {
			gameStart();
			//ターンごとの繰り返し
			while(true) {
				if(!isTurnContinue()) {
					if(isGameEnd()) {
						System.out.println("今回の記録は"+highScore+"でした。");
						System.out.println("アプリケーションを終了します。");
						scan.close();
						return;
					}
					break;
				}
			}
		}
	}
	/**
	 * 52枚のカードを生成する
	 */
	private static void createCard() {
		String[] suits= {"S","D","H","C"};
		for(int i=0;i<suits.length;i++) {
			for(int j=0;j<13;j++) {
				deck[i*13+j]=new Card(suits[i],j+1);
			}
		}
	}
	/**
	 * ゲームの最初に表示する
	 */
	private static void gameStart() {
		turn=0;
		gold=1000;
		gameScore=gold;
		System.out.printf("HighScore:%d%n",highScore);
		System.out.printf("Gold:%d%n",gold);
	}
	/**
	 * ゲームのメインロジック。
	 * ゲームを行い。負けた場合にfalseを返す
	 * @return 勝ったか?
	 */
	private static boolean isTurnContinue() {
		boolean isContinue=true;
		turn++;
		System.out.printf("****turn%d****%n", turn);
		Card[] twoCards=new Card[2];
		for(int i=0;i<2;i++) {
			int index=rand.nextInt(deck.length-i);
			twoCards[i]=deck[index];
			Card temp=deck[index];
			deck[index]=deck[deck.length-1-i];
			deck[deck.length-1-i]=temp;
		}
		System.out.println(twoCards[0].show());
		System.out.print("High...h Low...l>");
		String select=scan.next();
		System.out.println(twoCards[1].show());
		if(twoCards[0].point==twoCards[1].point) {
			System.out.println("Draw");
		}else if(
				(select.equals("h") && twoCards[0].point < twoCards[1].point)
				||(select.equals("l") && twoCards[0].point > twoCards[1].point)
				){
			System.out.println("Win");
			gold *=2;
			gameScore=gold;
		}else {
			System.out.println("Lose");
			gold=0;
			isContinue=false;
		}
		System.out.println("Gold:"+gold);
		return isContinue;
	}
	/**
	 * 外したときに遷移する。
	 * 記録を表示し、継続するかを尋ねる
	 * @return ゲームをやめるか? trueでやめる
	 */
	private static boolean isGameEnd() {
		System.out.println("GameOver");
		System.out.printf("%dまで行きました。%n",gameScore);
		if(gameScore > highScore) {
			highScore=gameScore;
		}
		System.out.print("もう一回やりますかYes...y NO...n>");
		String select=scan.next();
		return select.equals("n");
	}
}

[記録]
さっきやったらこんな記録がでました!
2018/07/23 turn20 65536000
****turn20****
S7
High…h Low…l>h
D3
Lose
Gold:0
GameOver
65536000まで行きました。
もう一回やりますかYes…y NO…n>n