このTopCoderの問題はこちらで見ることができる(要TopCoder登録 & 問題文は英語)。それでは、問題について説明する。
ブラックジャックでは、プレーヤーはディーラーよりも数字が大きいか、もしくはディーラーがバースト(21を超える)し、プレーヤーが21を超えない場合、掛け金と合わせて、同じ額を余分に受け取ることができる。もし、プレーヤーが21以下で、ディーラーと同じ数になったらプッシュという状態になり。掛け金はそのままになる(プラスマイナス0の状態)。もしプレーヤーがディーラーの数より小さいか、21を超えてしまった場合、掛け金を失う。
ブラックジャックというのは21ポイントの状態で、すべての手を負かす。この場合、プレーヤーは掛け金の1.5倍を得ることができる。もし、プレーヤーもディーラーもブラックジャックであれば、プッシュになる。もし、ディーラーがブラックジャックで、プレーヤーがブラックジャックでないものの21であった場合は、ディーラーの勝ちで、プレーヤーは掛け金を失う。
プレーヤーの掛け金betと、ディーラーのスコアdealer、プレーヤーのスコアplayerと、2人がブラックジャックかそうでないかを表す状態(dealerBlackjack、blackjack)が与えられている。ブラックジャックである状態は1、そうでない状態は0で表す。このとき、プレーヤがの収支を返せ。勝てばプラス、負ければマイナス、プッシュは0になる。
私の解答はこちら。
public class BlackjackWinner { public int winnings(int bet, int dealer, int dealerBlackjack, int player, int blackjack) { if( dealerBlackjack == 0 && blackjack == 1){ // プレーヤーのみブラックジャック return (int)(bet*1.5); // 掛け金は常に偶数 }else if( dealerBlackjack == 1 && blackjack == 1){ return 0; // 両者ブラックジャック(プッシュになる) }else if( dealerBlackjack == 1 && blackjack == 0 ){ return -bet; // ディーラーのみブラックジャック }else{ // どちらもブラックジャックではない if( player > 21 ){ // プレーヤーがバースト return -bet; }else if( player <= 21 && dealer > 21 ){ return bet; // ディーラーがバースト }else if( player <= 21 && dealer <= 21 ){ // どちらもバーストしてない if( player > dealer ) return bet; if( player == dealer ) return 0; if( player < dealer ) return -bet; } } return 0; } }
得点は183.25/250。場合分けが細かいですね。
0 件のコメント:
コメントを投稿