『ポーカーの役判定』投稿

| コメント(0) | トラックバック(0)
 どう書く?orgに初めて投稿しました。
 
お題はポーカーの役判定です。

引数に手札を与えると、ポーカーの役を表示するプログラムを作ってください。

条件:
  • スートはS,D,H,C、ランクはA,2~9,T,J,Q,Kのそれぞれ一文字で表します。
  • 手札は S2D5H3CQS9 のように10文字で指定されます。特にソートはされていません。
  • 手札にジョーカーは含まれません。
  • ストレートで取りうるランクの種類はA2345, 23456 ... 9TJQK, TJQKAの10種類で、JQKA2のようにK-A-2をまたぐものはストレートではありません。

 以下、投稿したコード。選択した言語はPHP。自分でも気持ちの悪い箇所が幾つかあるが、勇気を出して投稿してみた。

<?php
function Poker($c)
{
    CSort($c);
    if (IsFlush($c)) {
        if (IsStraight($c)) {
            if ($c[1] == 'A') {
                return 'Royal flush';
            }
            return 'Straight flush';
        }
        return 'Flush';
    } else {
        if (IsStraight($c)) {
            return 'Straight';
        }
        $wk = array();
        $wk[$c[1]]++;
        $wk[$c[3]]++;
        $wk[$c[5]]++;
        $wk[$c[7]]++;
        $wk[$c[9]]++;
        arsort($wk);
        switch (array_shift($wk).array_shift($wk)) {
        case '41':    return 'Four of a kind';
        case '32':    return 'Full house';
        case '31':    return 'Three of a kind';
        case '22';    return 'Two pair';
        case '21';    return 'One pair';
        }
    }
    return 'No pair';
}

function IsFlush($c)
{
    if ($c[0] == $c[2] && $c[0] == $c[4] && $c[0] == $c[6] && $c[0] == $c[8]) {
        return TRUE;
    }
    return FALSE;
}

function IsStraight($c)
{
    $rank = 'A23456789TJQK';
    $num = $c[1].$c[3].$c[5].$c[7].$c[9];
    if (strpos($rank, $num) !== FALSE || $num == 'ATJQK') {
        return TRUE;
    }
    return FALSE;
}

function CSort(&$c)
{
    $rep = array('1'=>'A', '10'=>'T', '11'=>'J', '12'=>'Q', '13'=>'K');
    $wk = array($c[0].$c[1] => $c[1], $c[2].$c[3] => $c[3],
                $c[4].$c[5] => $c[5], $c[6].$c[7] => $c[7],
                $c[8].$c[9] => $c[9]);
    $wk = str_ireplace($rep, array_flip($rep), $wk);
    asort($wk);
    $c = '';
    foreach ($wk as $key => $value) {
        $c .= $key;
    }
}
?>

関連記事

トラックバック(0)

このブログ記事を参照しているブログ一覧: 『ポーカーの役判定』投稿

このブログ記事に対するトラックバックURL: http://www.ivoryworks.com/cgi-bin/weblog/mt-tb.cgi/44

コメントする

アーカイブ

あわせて読みたいブログパーツ