1

我对 JavaScript 比较陌生,但我正在本地主机中创建一个简单的hangman web 应用程序。游戏完美运行,正如我所愿。但是,我意识到,在不同的选项卡中同时加载游戏后,所有实例中的单词都会变为同一个单词。例如,我可以在一个选项卡中运行游戏,然后在另一个选项卡中运行。然后,当我返回第一个选项卡时,我试图猜测的单词已更改为第二个选项卡中的单词。我不知道如何描述我的问题。这是我的 JS 和后端代码:

JS

function runHangmanInit(){
    $.get("/hangmanInit", {}, function(response){ //generates word
        term.write("RUNNING HANGMAN.cpp\r\n");
        guessedLetters = [];
        let json = JSON.parse(response);
        console.log(json);
        term.write(json["state"] + "\r\n");
        term.write("Category: " + json["category"] + "\t");
        for(let i = 0; i < json["dashes"]; i++){
            term.write(" _");
        }
        term.write("\r\nGuesses remiaining: "+ json["guesses"] + "\r\n");
        term.write(json["message"]);
    });
}

function checkLetterTerminal(letter){
    $.get("/hangman/" + letter, {}, function(response){
        let x = JSON.parse(response);
        //console.log(x);
        if(x["err"]){
            term.write(x["err"]);
        }
        else{
            term.write(x["state"] + "\r\n");
            term.write("Category: " + x["category"] + "\t");
            for(let i = 0; i < x.dashes.length; i++){
                term.write(x.dashes[i] + " ");
            }
            term.write("\r\nGuesses remiaining: "+ x["guesses"] + "\r\n");

            if(x["lettersGuessed"]){ //Incorrect guess
                guessedLetters.push(x["lettersGuessed"]);
            }
            term.write("Letters Guessed: ");
            for(let i = 0; i < guessedLetters.length; i++){
                term.write(guessedLetters[i] + " ");
            }
            term.write("\r\n");
        }
        if(x["message"]){
            term.write(x["message"] + "\r\n");
            check1 = 0;
            term.write("\r\n\x1B[1;3;31mdyaranon@DEKTOP-123:\x1B[0m/mnt/e$ ");
        }
        else{
            term.write("\r\nEnter your guess: ");
        }
    });
}

后端(Crow C++)

int main(int argc, char* argv[]){

crow::SimpleApp app;
Game game = Game(1);

CROW_ROUTE(app, "/hangmanInit")([](const request& req, response& res){
        nlohmann::json x;
        game.init();
        x["word"] = game.getWord();
        x["state"] = game.board.hangman;
        x["category"] = game.categoryName;
        x["dashes"] = game.board.dashes.size();
        x["guesses"] = 6;
        x["message"] = "Enter your guess: ";
        res.sendJSON(x);
    });

CROW_ROUTE(app, "/hangman/<string>")([](const request &req, response &res, string letter){
        nlohmann::json x;
        x = game.playGame(letter);
        res.sendJSON(x);
    });

我包括了代码的所有相关部分。任何帮助,将不胜感激。

4

1 回答 1

1

看起来您只是在创建一个游戏实例?所以是的,只有一次实例服务器端,您在所有客户端之间共享它。

HTTP 是无状态的,因此您首先需要一种方法来识别哪个客户端在发出请求时是哪个客户端。这通常由某种类型的会话 ID 完成,它应该是随机生成的。

通常将此会话 ID 存储在 cookie 中,但实际上您只想在页面加载时在 JavaScript 中使用局部变量,因为您希望以不同的方式处理每个选项卡。

从那里,当您发出 HTTP 请求(您正在使用的$.get())时,您需要包含此会话 ID。我建议将其放在 URL 中,例如:

/hangman/<some-game-id-here>/<some-route>

最后,在服务器端,您需要跟踪多个游戏实例……每个游戏实例一个,并将它们与会话 ID 相关联。

于 2021-01-02T02:19:19.107 回答