Skip to content

Instantly share code, notes, and snippets.

@fddcddhdd fddcddhdd/poker.php
Last active Dec 20, 2015

Embed
What would you like to do?
第一回ギークハウスプログラムコンテスト【8/4開催】で作ったプログラムhttps://www.facebook.com/events/206583066132014/?hc_location=stream
<?php
// 問題:
// プログラム引数で与えられる5枚のカード情報から、その5枚を用いて出来る一番強いポーカーの役を判定して出力せよ(*1)(*2)。
// プログラム引数は以下のように与えられる。
// $ prog Ac Th Kd 3h As
// カード情報について(*3)(*4)(*5)
// 1文字目:数値 (A:エース 2〜9:数字 T:10 J:11 Q:12 K:13)
// 2文字目:スート(s:スペード h:ハート d:ダイヤ c:クローバー)
// ポーカー役の強さの順番と出力値、それに対応する入力例
// 1:straight flash (As Ks Qs Js Ts) (*6)
// 2:four of a kind (7s 7h 7d 7c As)
// 3:full house (Ts Th Td 7c 7d)
// 4:flush (Ad 4d 5d Jd Kd)
// 5:straight (2s 3h 4s 5d 6c)
// 6:three of a kind (9s 9h 9d Ts 3s)
// 7:two pair (Ts Th 2c 2h 5d)
// 8:one pair (2s 2d 5c 6d 9c)
// 9:high cards (Ah Jc 5d 4s 9c)
// *1 入力が「As Ks Qs Js Ts」のとき、「straight flash\n」と出力すること
// *2 標準入力からの入力内容は無し
// *3 カード情報は特に決まった順番はなく、ランダムに与えられる
// *4 大文字・小文字は例示の通り与えられる
// *5 ジョーカーは無い
// *6 T J Q K A はストレートになるが、J Q K A 2 はストレートにならない
// 全ての役の判定実装が間に合わない場合、部分的に実装して「○番と○番以外は判定できます」という申告もアリ。
// 追加問題:
// テキサスホールデムの役判定を行え。
// 7枚分のカード情報が与えられるので、そのうち任意の5枚を用いて作られる最高の役を判定して出力せよ。
// (プログラムは上記5枚バージョンとは別に作成してください)
// 参考:
// "straight flash"
// "four of a kind"
// "full house"
// "flush"
// "straight"
// "three of a kind"
// "two pair"
// "one pair"
// "high cards"
//引数から変数に格納
for($i=0; $i<5; $i++){
$data[$i] = $argv[$i+1];
}
//カードの数とスートを切り出して、2次元配列に入れる。
for($i=0; $i<5; $i++){
//文字->数字に変換
if(substr($data[$i],0,1)=="A"){ $card_num[$i]=1;}
elseif(substr($data[$i],0,1)=="T"){ $card_num[$i]=10;}
elseif(substr($data[$i],0,1)=="J"){ $card_num[$i]=11;}
elseif(substr($data[$i],0,1)=="Q"){ $card_num[$i]=12;}
elseif(substr($data[$i],0,1)=="K"){ $card_num[$i]=13;}
else{$card_num[$i]=substr($data[$i],0,1);}
//スート
$card_suit[$i] = substr($data[$i],1,1);
}
//数字でソート(最初の配列の中身でソートされる。二番目の配列も一緒にくっついてくる)
array_multisort($card_num, $card_suit);
//print_r($card_num);
//print_r($card_suit);
//ストレート判定
$straight_flag = 0;
for($i=0; $i<4; $i++){ //5枚目は比較しない!
//A,T, J,Q,Kの場合
if($card_num[0]==1 &&
$card_num[1]==10 &&
$card_num[2]==11 &&
$card_num[3]==12 &&
$card_num[4]==13){
$straight_flag = 1;
}elseif($card_num[$i] == ($card_num[$i+1]-1)){
$straight_flag = 1;
}else{
$straight_flag = 0;
break ;
}
}
//フラッシュ判定
$flush_flag = 0;
$base_suit = $card_suit[0];
for($i=1; $i<5; $i++){
if($base_suit == $card_suit[$i]){
$flush_flag = 1;
}else{
$flush_flag = 0;
break;
}
}
//ペア数カウント変数
$four_card_flag = 0;
$tree_card_flag = 0;
$pair_card_count = 0;
//配列内にある重複した値と数を、配列で返してくれる関数
$card_pair = array_count_values($card_num);
//1-13の数字で重なっている数を数える
for($i=1; $i<=13; $i++){
if($card_pair[$i] == 4){ //4カード
$four_card_flag = 1;
}
if($card_pair[$i] == 3){ //3カード
$tree_card_flag = 1;
}
if($card_pair[$i] == 2){ //ペア数をカウント
$pair_card_count = $pair_card_count+1;
}
}
//フラグを使って判定&表示する。
if($straight_flag ==1 && $flush_flag==1){
$disp = "straight flush" ;
}elseif($four_card_flag==1){
$disp = "four of a kind";
}elseif($tree_card_flag ==1 && $pair_card_count==1){
$disp = "full house";
}elseif($flush_flag==1){
$disp = "flush";
}elseif($straight_flag==1){
$disp = "straight";
}elseif($tree_card_flag==1){
$disp = "tree of a kind";
}elseif($pair_card_count==2){
$disp = "two pair";
}elseif($pair_card_count==1){
$disp = "one pair";
}else{
$disp = "high card";
}
//表示して終わり
echo $disp . PHP_EOL;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.