2016-12-05 14 views
0

かなり複雑な問題があります。すべてを試してみて、正しく動作していません。javascriptのいくつかの配列間でアイテムを転送する

プログラムはカードゲームであり、24枚のカード(4つの異なる色、常に強く、それはより強く、 ADU)は、4人のプレイヤー(4つの配列)の間でランダムに配布されます。あなたがカードを置くテーブルは "asztal"配列で表されます。彼らは同じ色と任意の値を持っている場合は、そのカード

  • を選ぶ - - 彼らは同じ色と高い値を持っている場合は

    1. をそのカードを選ぶ:最初の人間のプレイヤーがカードを置き、その後、コンピュータがこの順に達する必要があります
    2. 色が一致しない場合、特別な色のセットからの車(シンプルで、ループ内にループが見つかる最初のカード)
    3. 色が一致しないか、配列の最初の要素(player [0])よりも優先されます。

    私のコードを実行すると、各アレイから1/1/1カードを取得していないことがわかります。そしてそれらのカードは消えて、アズタールの配列に入っていません。私のコード:(https://jsfiddle.net/daxa3pL2/

    function CardA(name,value,adu){ 
        this.name = name; 
        this.value = value; 
    }; 
    function CardB(name,value,adu){ 
        this.name = name; 
        this.value = value; 
    }; 
    function CardC(name,value,adu){ 
        this.name = name; 
        this.value = value; 
    }; 
    function CardD(name,value,adu){ 
        this.name = name; 
        this.value = value; 
    }; 
    CardA.prototype.adu = false; 
    CardB.prototype.adu = false; 
    CardC.prototype.adu = false; 
    CardD.prototype.adu = false; 
    var a9 = new CardA("Tök kilenc",0); 
    var a10 = new CardA("Tök tíz",10); 
    var aal = new CardA("Tök alsó",2); 
    var afel = new CardA("Tök felső",3); 
    var akir = new CardA("Tök király",4); 
    var aasz = new CardA("Tök ász",11); 
    var b9 = new CardB("Levél kilenc",0); 
    var b10 = new CardB("Levél tíz",10); 
    var bal = new CardB("Levél alsó",2); 
    var bfel = new CardB("Levél felső",3); 
    var bkir = new CardB("Levél király",4); 
    var basz = new CardB("Levél ász",11); 
    var c9 = new CardC("Makk kilenc",0); 
    var c10 = new CardC("Makk tíz",10); 
    var cal = new CardC("Makk alsó",2); 
    var cfel = new CardC("Makk felső",3); 
    var ckir = new CardC("Makk király",4); 
    var casz = new CardC("Makk ász",11); 
    var d9 = new CardD("Szív kilenc",0); 
    var d10 = new CardD("Szív tíz",10); 
    var dal = new CardD("Szív alsó",2); 
    var dfel = new CardD("Szív felső",3); 
    var dkir = new CardD("Szív király",4); 
    var dasz = new CardD("Szív ász",11); 
    CardC.prototype.adu = true; 
    var player1 = [c9,b9,b10,d9,a9,d10]; 
    var player2 = [a10,aal,dal,c10,cal,bal]; 
    var player3 = [bfel,bkir,basz,dfel,dkir,dasz]; 
    var player4 = [afel,akir,aasz,cfel,ckir,casz]; 
    var asztal = []; 
    asztal.push(player1.splice(0,1)[0]); 
    var player2card1 = function() { 
    for (i = 0; i < player2.length; i++) { 
        if (Object.getPrototypeOf(player2[i]) == Object.getPrototypeOf(asztal[0]) && player2[i].value > asztal[0].value) { 
         asztal.push(player2.splice(i,i+1)[0]) 
         return 
        } 
    } 
    if (asztal.length == 1) { 
    for (i = 0; i < player2.length; i++) { 
        if (Object.getPrototypeOf(player2[i]) == Object.getPrototypeOf(asztal[0])) { 
         asztal.push(player2.splice(i,i+1)[0]) 
         return 
        } 
    } 
    } 
    if (asztal.length == 1){ 
        for (i = 0; i < player2.length; i++) { 
        if (player2[i].adu == true) { 
         asztal.push(player2.splice(i,i+1)[0]) 
         return 
        } 
    } 
    } 
    if (asztal.length == 1) { 
        asztal.push(player2.splice(0,1)[0]) 
        return 
    } 
         }; 
    var player3card1 = function() { 
    for (i = 0; i < player3.length; i++) { 
        if (Object.getPrototypeOf(player3[i]) == Object.getPrototypeOf(asztal[0]) && player3[i].value > asztal[0].value) { 
         asztal.push(player3.splice(i,i+1)[0]) 
         return 
        } 
    } 
    if (asztal.length == 2) { 
    for (i = 0; i < player3.length; i++) { 
        if (Object.getPrototypeOf(player3[i]) == Object.getPrototypeOf(asztal[0])) { 
         asztal.push(player3.splice(i,i+1)[0]) 
         return 
        } 
    } 
    } 
    if (asztal.length == 2){ 
        for (i = 0; i < player3.length; i++) { 
        if (player3[i].adu == true) { 
         asztal.push(player3.splice(i,i+1)[0]) 
         return 
        } 
    } 
    } 
    if (asztal.length == 2) { 
        asztal.push(player3.splice(0,1)[0]) 
        return 
    } 
         }; 
    var player4card1 = function() { 
    for (i = 0; i < player4.length; i++) { 
        if (Object.getPrototypeOf(player4[i]) == Object.getPrototypeOf(asztal[0]) && player4[i].value > asztal[0].value) { 
         asztal.push(player4.splice(i,i+1)[0]) 
         return 
        } 
    } 
    if (asztal.length == 3) { 
    for (i = 0; i < player4.length; i++) { 
        if (Object.getPrototypeOf(player4[i]) == Object.getPrototypeOf(asztal[0])) { 
         asztal.push(player4.splice(i,i+1)[0]) 
         return 
        } 
    } 
    } 
    if (asztal.length == 3){ 
        for (i = 0; i < player4.length; i++) { 
        if (player4[i].adu == true) { 
         asztal.push(player4.splice(i,i+1)[0]) 
         return 
        } 
    } 
    } 
    if (asztal.length == 3) { 
        asztal.push(player4.splice(0,1)[0]) 
        return 
    } 
         }; 
    player2card1(); 
    player3card1(); 
    player4card1(); 
    console.log(player1); 
    console.log(player2); 
    console.log(player3); 
    console.log(player4); 
    console.log(asztal); 
    
  • +0

    私は本当に私はあなたの問題を解決する手助け傾けるためにあなたが行っていたか理解カントが、あなたは間違いなく束をそのコードをクリーンアップすることができます。ここに私の最初の試みです:http://codepen.io/anon/pen/gLeXxw?editors=0010 – Marie

    +0

    申し訳ありませんが私は十分にはっきりしていない場合。あなたのコードは良いようですが、それは本当に達成すべきことをしません。各アレイのカードは1枚だけasztalに行きます。 – Koppany

    答えて

    1

    は、だから私はあなたのコードをデバッグし、私が見つけた二つの基本的なミスがあります。

    1:あなたがループ内でスプライスを使用する場合は、インデックスが変更されますが。あなたが例

    asztal.push(player2.splice(i,i+1)[0]) 
    

    のために行うと、ループ内に置くときに、あなたの条件に一致player2の指標は、とすぐにスプライスを行うように変更します。したがって、ループの次の反復では誤った結果が得られます/削除する必要があるオブジェクトのインデックスがありません。

    スプライスの代わりにforループ内に要素をasztalに挿入し、親をスプライスしないでください。次にループの外で、次のようにフィルター機能を使用してプレーヤーからからそれらをスプライス:

    var player2card1 = function() { 
    for (i = 0; i < player2.length; i++) { 
        if (Object.getPrototypeOf(player2[i]) == Object.getPrototypeOf(asztal[0]) && player2[i].value > asztal[0].value) { 
         asztal.push({name: player2[i].name, value: player2[i].value, prototype: player2[i].prototype}); 
         player2[i].name = "delete"; 
         return 
        } 
    } 
    player2.filter((each)=>{return each.name!== "delete"}); 
    

    2:第二の間違いは、(私はここでの問題はないと思いますが、それでもトラブルを引き起こす可能性があることを)あなたの使用であり、 「==」のJavaScriptでは、 '==='を可能な限り使うようにしてください。できるだけタイプをチェックしてください。

    +0

    こんにちは、 簡単に説明していただきありがとうございます。 1つのことに気づくべきである。問題は現在、player2 [i] .name = "delete"だけでなく、asztal [1] .name、asztal [2] .name、asztal [3] .nameにもなります。 asztal配列内のオブジェクトの名前の値は後で出力されます。 – Koppany

    +0

    ねえ、そうだね、私はそれを逃した。 :)答えを編集しました。新しいオブジェクトを作成してasztalに挿入するか、player2 [i]のローカルコピーを作成してasztalに挿入するだけで、何かが動作する必要があります。 –

    +0

    もう一つのアイデアが実際に現れました。 player2 [i]をスライスしてasztal配列にプッシュするとどうなりますか?関数の直後では、player2配列のループを実行し、すべての項目を別の配列に(SPLICEは「ゴミ箱」と呼ぶことができます)、未定義にします。 – Koppany

    0

    少しリファクタリングがこれを明確にするために長い道を行くことができます。

    // define a card type class 
     
    function CardType(type, adu) 
     
    { 
     
    \t // This simply says that if ADU is undefined (not passed) then 
     
        // ADU should be set to false by default 
     
        this.adu = (typeof adu === 'undefined' ? false : adu); 
     
        this.type = type; 
     
    } 
     
    
     
    function Card(name, value, type) 
     
    { 
     
        this.name = name; 
     
        this.value = value; 
     
        this.type = type; 
     
    } 
     
    
     
    // Define our card types 
     
    var CardA = new CardType("A"); 
     
    var CardB = new CardType("B"); 
     
    var CardC = new CardType("C", true);// set to be ADU 
     
    var CardD = new CardType("D"); 
     
    
     
    // Define our cards 
     
    var a9 = new Card("Tök kilenc",0, CardA); 
     
    var a10 = new Card("Tök tíz",10, CardA); 
     
    var aal = new Card("Tök alsó",2, CardA); 
     
    var afel = new Card("Tök felső",3, CardA); 
     
    var akir = new Card("Tök király",4, CardA); 
     
    var aasz = new Card("Tök ász",11, CardA); 
     
    var b9 = new Card("Levél kilenc",0, CardB); 
     
    var b10 = new Card("Levél tíz",10, CardB); 
     
    var bal = new Card("Levél alsó",2, CardB); 
     
    var bfel = new Card("Levél felső",3, CardB); 
     
    var bkir = new Card("Levél király",4, CardB); 
     
    var basz = new Card("Levél ász",11, CardB); 
     
    var c9 = new Card("Makk kilenc",0, CardC); 
     
    var c10 = new Card("Makk tíz",10, CardC); 
     
    var cal = new Card("Makk alsó",2, CardC); 
     
    var cfel = new Card("Makk felső",3, CardC); 
     
    var ckir = new Card("Makk király",4, CardC); 
     
    var casz = new Card("Makk ász",11, CardC); 
     
    var d9 = new Card("Szív kilenc",0, CardD); 
     
    var d10 = new Card("Szív tíz",10, CardD); 
     
    var dal = new Card("Szív alsó",2, CardD); 
     
    var dfel = new Card("Szív felső",3, CardD); 
     
    var dkir = new Card("Szív király",4, CardD); 
     
    var dasz = new Card("Szív ász",11, CardD); 
     
    
     
    var player1 = [c9,b9,b10,d9,a9,d10]; 
     
    var player2 = [a10,aal,dal,c10,cal,bal]; 
     
    var player3 = [bfel,bkir,basz,dfel,dkir,dasz]; 
     
    var player4 = [afel,akir,aasz,cfel,ckir,casz]; 
     
    var asztal = []; 
     
    
     
    // It doesn't really make sense to splice the array because 
     
    // you are changing the array. 
     
    // asztal.push(player1.splice(0,1)[0]); 
     
    // This line can be replaced with a simple: 
     
    asztal.push(player1[0]); 
     
    
     
    // This function has lots of redundant code and we can simplify it greatly 
     
    // as well as generalize it to work for each player 
     
    
     
    function getNextCard(player, card){ 
     
    \t // By default we take the first card unless we find a better one along the way. 
     
        var matchCase2 = null, // same type, any value 
     
         matchCase3 = null, // special set 
     
         matchCase4 = player[0]; // any card 
     
        for(i = 0; i < player.length; i++) 
     
        { 
     
        \t // Check our first case 
     
        \t if(player[i].type.type == card.type.type && 
     
         player[i].value > card.value){ 
     
        \t return player[i]; 
     
        } 
     
        
     
        if(matchCase2 === null && player[i].type.type == card.type.type){ 
     
        \t matchCase2 = player[i]; 
     
        } 
     
        
     
        if(matchCase3 === null && player[i].type.adu === true){ 
     
        \t matchCase3 = player[i]; 
     
        } 
     
        } 
     
        if(matchCase2 !== null) return matchCase2; 
     
        if(matchCase3 !== null) return matchCase3; 
     
        return matchCase4; 
     
    } 
     
    
     
    console.log(getNextCard(player2, asztal[0])); 
     
    console.log(getNextCard(player3, asztal[0])); 
     
    console.log(getNextCard(player4, asztal[0]));

    +0

    私の書式を突き詰めましたが、クールな機能です。ありがとう! –

    関連する問題