Приложение Node в интерактивном режиме получает пользовательский ввод из интерфейса переднего плана, приостанавливая текущее выполнение. - PullRequest
0 голосов
/ 10 февраля 2019

Я преобразовал старую игру, написанную на python, в javascript (узел).Игра просто запускается в цикле while, пока не завершится определенное количество итераций.

runUntil(steps = 100000) {
var x = 0;
while (x < steps) {
  this.conversation();
  x++;
}

}

conversation() {
const roundPicture = this.getRandomPicture();
const conversationers = this.utils.getRandomTwo(this.network, this.Graph);

const chosen1 = conversationers[0];
const chosen2 = conversationers[1];


if (chosen1.name == "Player 0" && !chosen1.v.hasOwnProperty(roundPicture)) {
  //Wait for user input
  //..
  //..
  //..
  //Use the given input in order to continue game

}

if (chosen2.name == "Player 0" && !chosen2.v.hasOwnProperty(roundPicture)) {
    //Wait for user input
    //..
    //..
    //..
    //Use the given input in order to continue game

} else {
  //do sth else
}

}

В некоторых случаях игра останавливается вДля того, чтобы получить пользовательский ввод, который требуется и влияет на результат игры.В моей реализации javascript я использовал readline-sync, чтобы приостановить игру и получить пользовательский ввод через командную строку.Теперь я создал приложение переднего плана для обслуживания игры в браузере с пользовательским интерфейсом и создал сервер с использованием Express для обработки API и запускаю игру всякий раз, когда пользователь нажимает кнопку start.

const express = require("express");
const http = require("http");
const socketIO = require("socket.io");
const Game = require("./Game");
const port = 4000;
const app = express();
const server = http.createServer(app);
//Create socket usin server instance
const io = socketIO(server);

io.on("connection", socket => {

  console.log("user connected!");
  socket.on("startGame", data => {
    const nI = data.nI;
    const pI = data.pI;
    const noOfAgents = 20;
    const noOfPlayers = 1;

    const g = new Game(nI, pI, noOfAgents, noOfPlayers);
    g.runUntil(1000);
    });

  socket.on("disconnect", () => console.log("user has disconnected"));
});




server.listen(port, () => console.log("Listenint on port " + port));

ОднакоЯ в данный момент застрял в этой точке.Я не уверен, как я могу приостановить игру, чтобы получить данные из внешнего интерфейса и использовать их соответственно.Все попытки, которые я делал до сих пор, не увенчались успехом.Я пытался использовать обещания, но это не помогло, потому что это не останавливало процесс игры, чтобы ждать ввода пользователя.

1 Ответ

0 голосов
/ 10 февраля 2019

Существует удобный пакет, называемый promise-do-whilst для Node (я уверен, что есть другие аналогичные аналогии для традиционных конструкций циклов, организованных вокруг Promises. Допустим, у вас есть последовательный синхронный код, который выглядит следующим образом(где fn - простая синхронная функция):

  do {
    fn();
  } while( condition === true)

... переписать это как ...

  var promiseDoWhilst = require('promise-do-whilst')
  var condition = true;
  function fn() { // for example
    condition = Math.random() > 0.5; // flip a coin
    return new Promise(function(r, j){
      setTimeout(function(){ r(); }, 1000);
    }); 
  }
  promiseDoWhilst(function() {
    return fn(); with fn converted to a promise-returning function
  }, function() {
    return condition === true;
  })

Если у вас есть пара параллельных потоков, которые вы должны ждатьдля того, чтобы «добиться прогресса» в вашем цикле, вы можете заставить их все происходить в функциях, которые возвращают обещания, помещать все эти возвращенные обещания в массив arr, а затем иметь функцию fn return Promise.all(arr). A .then после Promise.all получает разрешенные значения исходных обещаний в массиве с сохранением позиционного порядка. Надеюсь, это поможет!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...