2009-05-12 13 views
1

私はYahtzeeのゲームを作っています。小さなストレート(順番に4つの数字のシーケンス)を計算する方法が必要です。それで有効なのは、1,2,3,4 | 2,3,4,5 | 3,4,5,6。配列内の数字のシーケンスを見つける

私は5つの数字の配列を持っています。これらの3つの組み合わせの1つがその配列に含まれているかどうかを判断する必要があります。

ヤッツェに慣れていない人には、1~6の5つのサイコロ(配列の5つの数字)があります。

+0

手前に状態の一部がありますか?そうであれば、より良い結果(スピード)を得ることができます。 – Milhous

+0

州によってはどういう意味ですか?私は5つの数字の配列をどんな関数にも渡すだけです。 – roflwaffle

答えて

5
function isStraight($hand) { 
    $straights = array(range(1, 4), range(2, 5), range(3, 6)); 
    foreach($straights as $solution) { 
     if(array_intersect($solution, $hand) == $solution) { 
      return $solution; 
     } 
    } 
    return false; 
} 

$hand = array(1,5,2,4,3); 

var_dump(isStraight($hand)); 

ゲームのルールについてはわかりませんが、それを行う必要があります。

この関数は、見つかった最初の解を返します。この場合は[1,2,3,4]です。それは手の中にストレートを見つけることができない場合はブール値falseを返します。お役に立てれば。

+0

私にそれを打つ+1 – da5id

+0

ねえ、あなたの答えは戻って...アレイ交差...あああ... – cgp

+0

それを修正するために戻ってくる前に逃げて夕食を食べた。 :) –

1

おそらく、このような何か:---警告---空気コーディング

function findSequenceLength(array $array) 
{ 
    // Filter duplicates out - and sort the array. 
    $sorted = array_unique($array, SORT_NUMERIC); 

    $lastValue = null; 
    $thisSeq = 0; 
    $longestSeq = 0; 
    foreach ($sorted as $value) 
    { 
    if (($lastValue !== null) && $value == $lastValue + 1) 
    { 
     // our value is exactly one above the last entry 
     // increase the counter 
     $thisSeq++; 
    } else { 
     // sequence ended - save the value 
     $longestSeq = max($longestSeq, $thisSeq); 
     $thisSeq = 1; 
    } 
    $lastValue = $value; 
    } 
    return max($longestSeq, $thisSeq); 
} 

$sequence = array(1,2,4,5,4,6); 
echo findSequenceLength($sequence); // should return 3 [4,5,6] 

その後、「系列長が」あなたの「小さなストレート」

0
のためのテストに> = 4であることをテストすることができ

より正確には:

function array_match($array, $target_array) { 
    $offset = 0; 
    $maxoffset = sizeof($target_array) - sizeof($array); 
    for($y=0;$y<$maxoffset;$y++) { 
    $result = true; 
    for($x=0;$x<sizeof($array);$x++) { 
     if ($array[$x] != $target_array[$x+$y]) { 
     $result = false; 
     continue; 
     } 
    } 
    if ($result) 
     return "true"; 
    } 
    return "false"; 
} 
echo array_match(array(1,2,3), array(1,2,3,4,5)); //true 
echo array_match(array(1,2,3), array(4,1,2,3,5)); //true 
echo array_match(array(1,2,3), array(4,2,2,1,2)); //false 
0

ここでもう一つのアイデアは、汎用isStraight()メソッドを使用して2つの配列のスライスをテストするためにそれを使用するのです。

$tests = array(
      array(1,2,3,4,5), 
      array(1,1,2,3,4), 
      array(4,3,2,1,4), 
      array(3,4,5,6,1) 
     ); 
foreach($tests as $test) { 
    print_r($test); 
    echo "Straight: "; 
    var_dump(isStraight($test)); 
    echo "Short Straight: "; 
    var_dump(isShortStraight($test)); 
    echo "\n"; 
} 

function isShortStraight($hand) { 
    return isStraight(array_slice($hand, 0, 4)) || 
      isStraight(array_slice($hand, 1, 4)); 
} 

function isStraight($hand) { 
    $unique = array_unique($hand); 
    if (count($hand) != count($unique)) { 
     /* Has Duplicates, not a straight */ 
     return false; 
    } 

    sort($unique); 
    if ($unique != $hand) { 
     /* Sort order changed, not a straight */ 
     return false; 
    } 
    return true; 
} 
関連する問題