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