对手在多人游戏中移动承诺

时间:2018-01-21 08:37:57

标签: javascript jquery promise multiplayer yield-keyword

我花了四天时间研究承诺,协同程序,纤维,延续等等。

我仍然无法看到如何解决我的多人回合制纸牌游戏动作,其中首发玩家实际上是最多五人的游戏“控制者”,无论是AI还是人类玩家。

以下代码有效,但有一个问题: -

它无法检测到人类oppo的卡片移动,因此在没有它们的情况下继续播放,这当然会弄得一团糟。

任何人都可以建议改变我的整体概念或使用诺言或任何其他“同步”构造之一吗?

以下是我的代码的四个关键区域:

function oppoPlays () {
    // can only go through here if game starter
    if (joiner!="") {return;}
    for (pp=1; pp<numberofplayers; pp++) {
        if (oppoType[pp] == "AI") {
            // an AI player moves
            .
            .
        } else {
            // non-AI player
            var yourTurnmsg="It's "+playerNames[pp]+"'s turn";
            // tell human player that it's their turn
            $("#text_message").val(yourTurnmsg).trigger(jQuery.Event('keypress', { keyCode: 13, which: 13 }));
            // how to detect human oppo's card moved?

        }
    }
}
// chat functionality
$("#text_message").on("keypress", function(e) {
    if (e.keyCode == 13){
        payload = new Object();
        payload.action = 'chat_text';
        payload.chat_text = tmsg; // It's michael29's turn
        payload.user_id = playerNames[pp];
        payload.game_no = game_no;
        socket.send(JSON.stringify(payload));
    }
});
// socket gets oppo's response
function checkJson(res, sttr_id, game_no) {
    if(res.action=="game_move"){
        // find player
        var pp=playerNames.indexOf(res.user_id);
        cpos=res.cardno;
        playCard_oppo(pp, cpos);
    }
}
// turn an oppo's card face up and update scores
function playCard_oppo(pp, cardno) {
    //  and move it to the stack
    topoc= parseInt($("#oppo_card" + cardno).css('top'));
    leftoc=parseInt($("#oppo_card" + cardno).css('left'));
    $("#oppo_card" + cardno).css({ top: topoc, left: leftoc, opacity: "50%" });
    .
    .
    if (joiner=="") {
        // tell oppoPlays fn that the card has moved 
    }
}

游戏在概念上类似于uno,但有一个得分组件

(旨在帮助孩子进行基本算术)。

3 个答案:

答案 0 :(得分:1)

考虑拥有一个全局的棋盘状态,并且玩家/ AI动作会对其进行修改。然后,当AI对手进行移动时,它会咨询当前的棋盘状态并决定移动。

如果您的电路板状态仅由页面上的元素表示,您将需要一种方法来扫描它并计算电路板状态的有用的内存表示。如果没有实施细节,很难更具体。

答案 1 :(得分:0)

也许开始考虑一个游戏周期,像这样:

  1. (主持人)播放游戏状态。
  2. (主持人)等待所有客户确认已收到广播。
  3. (客户)渲染游戏状态。
  4. (主持人)接收确认信息,然后通知下一位客户(及其播放员)他/她/她的回合。
  5. (主持人)等待玩家的移动
  6. (客户端)解锁允许玩家移动的UI。
  7. (玩家)移动。
  8. (客户端)发送移动命令并重新锁定UI。
  9. (主持人)接收移动命令并相应地修改游戏状态。
  10. 然后回到1。

    此外,将AI玩家视为人类玩家的特殊情况。如果你能为人类做到正确,那么(重新)引入AI应该相当简单。

答案 2 :(得分:0)

解决方案取决于两件事: -

  1. 将AI播放器代码与人类播放器代码分开;

  2. 添加和删除在检测到人的移动后触发的窗口事件。

  3. 精简代码现在看起来像这样: -

    elements_to_keep = []
    for i in phase_two_match:
        for j in phase_two_match:
            if i == j:
                continue
            else:
                if j not in i:
                    elements_to_keep.append(j)