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
コメント