13

Javascript を使用して単純化されたポーカー ゲームを開発しようとしています。以下のように、特定のプレイヤーが手札に持つ可能性のあるすべてのカードの組み合わせを、その価値順に並べてリストしました。

switch(sortedHand)
{           
 //Pair
     case [1,1,4,3,2]: sortedHand.push(1,"Pair"); break;
     case [1,1,5,3,2]: sortedHand.push(2,"Pair"); break; 
     case [1,1,5,4,2]: sortedHand.push(3,"Pair"); break;
     case [1,1,5,4,3]: sortedHand.push(4,"Pair"); break;
     case [1,1,6,3,2]: sortedHand.push(5,"Pair"); break;
     case [1,1,6,4,2]: sortedHand.push(6,"Pair"); break;
     case [1,1,6,4,3]: sortedHand.push(7,"Pair"); break;
     case [1,1,6,5,2]: sortedHand.push(8,"Pair"); break;
     case [1,1,6,5,3]: sortedHand.push(9,"Pair"); break;
     case [1,1,6,5,4]: sortedHand.push(10,"Pair"); break;

「sortedHand」配列は正常に値を格納しますが (console.log で見たように)、switch() ステートメントは常にデフォルトのケースを返し、全員がストレート フラッシュを取得します。これは、可能な配列値を宣言して「sortedHand」全体と比較するために使用した文字通りのアプローチの問題であると思いますが、それ以上のことはわかりません。そのような方法で switch() を使用することさえ可能ですか?

4

6 に答える 6

25

switch配列のテキスト表現を試すことができます。

switch(sortedHand.join(' '))
{           
    //Pair
    case '1 1 4 3 2': sortedHand.push(1,"Pair"); break;
    case '1 1 5 3 2': sortedHand.push(2,"Pair"); break; 
    case '1 1 5 4 2': sortedHand.push(3,"Pair"); break;
    case '1 1 5 4 3': sortedHand.push(4,"Pair"); break;
    // etc.
}

すべてのケースを直接指定する代わりに、おそらくオブジェクトを使用して関数ディスパッチ テーブルを構築し、スイッチを完全に取り除きます。

var dispatch = {};

// Build the table however you'd like, for your application
for (var i = 0; i < 10; i++) {
    (function(i) {
        var hand = ...; // Add your hand logic here
        dispatch[hand] = function() { sortedHand.push(i, "Pair"); };
    })(i);
}

// Execute your routine
dispatch[sortedHand.join(' ')]();
于 2013-07-23T18:31:52.607 に答える
7

switch() ステートメントは常にデフォルトのケースを返します

これは、比較で配列の内容がチェックされるのではなく、配列オブジェクト自体がチェックされるためです。オブジェクトは ID によって等しいと見なされるため、リテラルによってインスタンス化されたオブジェクトと等しいものはありません。

そのような方法で switch() を使用することさえ可能ですか?

switchはい、ステートメントでオブジェクトを使用できますが、ケースでは参照を使用する必要があります。あなたの問題には当てはまりません。

あなたの場合、文字列化をお勧めします:

switch(sortedHand.join())
{           
 //Pair
     case "1,1,4,3,2": sortedHand.push(1,"Pair"); break;
     case "1,1,5,3,2": sortedHand.push(2,"Pair"); break; 
     case "1,1,5,4,2": sortedHand.push(3,"Pair"); break;
     case "1,1,5,4,3": sortedHand.push(4,"Pair"); break;
     case "1,1,6,3,2": sortedHand.push(5,"Pair"); break;
     case "1,1,6,4,2": sortedHand.push(6,"Pair"); break;
     case "1,1,6,4,3": sortedHand.push(7,"Pair"); break;
     case "1,1,6,5,2": sortedHand.push(8,"Pair"); break;
     case "1,1,6,5,3": sortedHand.push(9,"Pair"); break;
     case "1,1,6,5,4": sortedHand.push(10,"Pair"); break;

しかし、あなたが求めているパターンを検出するための、さらに優れた算術ソリューションがあると思います。それはより短く、より速くなりますが、このスニペットが何をすべきか正確にはわかりません.

于 2013-07-23T18:32:36.447 に答える
2

より高速で、再利用可能で、より柔軟な方法は、ケースの代わりにオブジェクトを使用することです。

var ok= {
    '1 1 4 3 2':1,
    '1 1 5 3 2':2,
    '1 1 5 4 2':3,
    '1 1 5 4 3':4
}[ sortedHand.join(' ') ] ;
if(ok){ sortedHand.push( ok ,"Pair"); }

オブジェクトは、1 つの出力が 1 つの入力に依存している場合にうまく機能します。それぞれのケースで 5 つのことを行う必要がある場合は、ケースを使用する必要がありますが、X を Y に変換する必要がある場合 (1:1)、オブジェクトの形のルックアップ テーブルが理想的です。

ここでRegExpが機能すると思います.connect4ゲームでそれらを使用して4つ連続して識別しましたが、上記の論理テーブルはあなたが説明したものと同じかそれ以上に機能するはずです.

于 2013-07-23T18:34:20.657 に答える
1

それはあなたが持っているようにはうまくいきませんが、それを使用sortedHand.join(',')して比較することができます[1,1,1,2,5].join(','). which は2つの配列を比較し、それらの内容がまったく同じである場合は true になるはずです ( とnumber入力された sには注意してくださいstrings!)なぜそのようなロジックを設計するのか想像できません。単純なカード ゲームでさえ、何十万もの可能なハンドがあります。underscore.jsのコレクション管理関数を使用すると、より簡単になり、より良い方法になる可能性があります。

于 2013-07-23T18:32:54.713 に答える
1

通常のデッキでは、5 枚のカードの組み合わせは 1274 通りあります。それらすべてを switch ステートメントにリストするのはまったくばかげています。関数で重複をカウントして、2、3、4 種類をチェックしてからストレートをチェックしないのはなぜですか? (あなたの配列はスーツを示していないので、あなたがそれを省略していると思います)。

しかし、本当にそのようにしたい場合は、文字列を使用できます。文字列はスイッチで機能し、配列のように使用することもできます。例: "123"[0] == '1'。parseInt などのユーザー関数を前後に変更できます。

于 2013-07-23T18:46:14.233 に答える
0

Since no one suggested this, use a for loop and count the number of cards with exactly the given value. Having such a function you can call 'cardCount = count(sortedHand, cardNumber)'. And of cause looping through all possible card-numbers will give you the hands.

Since a given player can only have 1x2, 2x2, 1x3, 1x3+1x2, 1x4 or straights/streets, you can return an array of all hits being arrays/objects stating the count and the cardNumber involved. So [{2, 5}, {3, 6}] for a full house.

于 2018-08-11T21:49:33.613 に答える