пятница, 22 марта 2013 г.

Написання клієнта для snake dojo на node.js

Одного разу спробувавши coding dojo не можливо відірватись. Хочеться внести якийсь свій вклад в розвиток проекту. Клієнт для JavaScript надасть змогу програмістам використовувати усі перевани динамічнох типізації.

JavaScript дуже потужний інструмент. Не дуже багато готових операцій для всіх типів даних він містить, але його гнучкість дозволяє реалізовувати велосипеди будь-якої складності та конфігурації, а базові елементи в правильних руках можуть показувати елегантні рішення. 

Отже, що ми маємо? Сервер гри розсилає зараєстрованим гравцям HTTP GET запити, в яких міститься властивість "board" з інформацією про ігровий світ, а у відповідь на цей запит отримує text/plain, в якому у рядковому вигляді міститься інформація про напрям при наступній операції.
Порядок дій:
1.  Створюєм веб - сервер, який буде слухати усі запити, на стандартному порту, перевіряєм запити на адекватість:
  • Чи містить запит властивість "board".
  • Чи  "board" є пропорційною визначеному розміру поля.
  • Якщо перевірки не проходять, арвертаєм відповідь, що все погано.
var http = require('http');
var BOARD_SIZE = 15;

http.createServer(function (req, res) {
  
    var request = require('url').parse(req.url, true);
    board = request.query.board;
 
    if(!board){
      res.writeHead(400, {'Content-Type': 'text/html'});
      res.end("
No board parameter!");
      return;
    };
    if(board.length % BOARD_SIZE) {
      res.writeHead(400, {'Content-Type': 'text/html'});
      res.end("
Bad board parameter!");
      return;
    };
  
  });

}).listen(8888, '127.0.0.1');
2.  Спочатку був застосований тривіальний синхронний підхід, але оскільки node.js дозволяє неблокуючі операції вводу - виводу - асинхронні самураї не можуть цим не скористатися.
  • В тілі нашого "сервлета" звертаємось до функції , яка форматує ігровий світ - "board",  асинхронно виводить цей ігровий світ у консоль, а коли буде отримана відповідь, її буде записано у відповідь нашого клієнта.
  split(board, function(board) {
    res.writeHead(200, {'Content-Type': 'text/plain'});
    res.end(answer.getAnswer(board));
  });
3.  А ось і сама функція яка буде займатись вище зазначеними діями:

  var split = function (board, callback) {
  var splitBoard = function(board, callback) {
    var result = '';
    var temp = board;
      for(var i = 0; i < BOARD_SIZE; i++) {
        result = result + temp.substring(0,BOARD_SIZE) + '\n';
        temp = temp.substring(BOARD_SIZE);
      } 
    callback(result);
    return result;
  }
  //Anonymous function for asynchronous printing formatted board to console;
  board = splitBoard(board, function(board) {
    console.log(board);
  });
  callback(board); 
}
4.  Відповідь для розвантаження підключаєм з іншого файлу, базово реалізуємо повороти в різних напрямах:
answer.js
  
var direction = require('./direction');
//implementation of simple random response
exports.getAnswer = function (board) {
 var random = Math.floor(Math.random()*4)+1;
 if (random === 1) {
  return direction.RIGHT;
 } 
 if (random === 2) {
  return direction.LEFT;
 } 
 if (random === 3) {
  return direction.UP;
 } 
 if (random === 4) {
  return direction.DOWN;
 } 
}

5.  Константи зберігаєм у файлі:
directions.js 
  
//Directional constants;
exports.UP = "UP";
exports.DOWN = "DOWN";
exports.LEFT = "LEFT";
exports.RIGHT = "RIGHT";


Результатом нашого дійства ствло отаке от представлення.*


От і все, дякую за увагу, програма працює, цілісні ресурси можна знайти на github:  snake-dojo-jsclient

*в залежності від налаштувань командного рядка можуть бути різні картини.

Комментариев нет:

Отправить комментарий