• Stars
    star
    100
  • Rank 340,703 (Top 7 %)
  • Language
    JavaScript
  • License
    BSD 2-Clause "Sim...
  • Created almost 10 years ago
  • Updated over 9 years ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Движок для создания танков на js

Build Status

Движок для создания танков на js

Локальный сервер

Понадобится node версии 0.12+.

npm install
npm start

Затем в отдельной вкладке (в будущем этот шаг уберём)

node --harmony server

После этого игра доступна по адресу localhost:3009

API танков

Приложение зациклино через setInterval(tick, 200). Каждый тик выполняет: ai всех ботов; пересчёт положений снарядов и ботов, включая коллизии, попадания, подбор поверапов и смерти.

AI - это js-функция, вызванная в контексте инстанса бота.

Методы

// Направления
this.left();
this.up();
this.right();
this.down();

При вызове любого метода направления танк поворачивается в соответствующую сторону и проезжает в эту сторону 1 условный пиксель. Если за 1 тик вызвать несколько методов передвижения, реально вызовется только последний (например в коде выше это this.down). Если ни один из методов не был вызван, танк остановится в направлении предыдущего движения.

// Огонь
this.fire();

Попытка выстрелить. Огонь ведётся только в направлении движения (башня не крутится). На старте у бота есть 3 снаряда, которые можно расстрелять за три следующих тика. Снаряды восстанавливаются по 1 штуке за 10 тиков до максимального значения в 3 снаряда.

// Ускорение
this.nitro();

Резкое ускорение в направлении движения. На старте у бота есть 6 литров закиси азота, которые можно потратить за 6 следующих тиков. Затем закись восстанавливается по 1 литру за 10 тиков, однако вызов метода nitro ставит на паузу это восстановление на 10 тиков. Иными словами, если постоянно дёргать метод, ускорения не будет вообще.

// Противник
this.enemy;

Это поле, в котором хранится текущий преследуемый противник. Назначается автоматически. Можно задать вручную через метод

// Преследование противника
this.pursue(enemyId || undefined);

Записывает в this.enemy случайного бота, либо переданного в первом аргументе, и начинает его преследовать. По сути, this.pursue - это автоматический вызов одного из четырёх методов передвижения для максимально быстрого выхода на одну линию с противником.

// Убегание
this.escape(enemyId || undefined);

Автоматический вызов одного из четырёх методов передвижения для максимального удаления от текущего противника.

У танка есть набор флагов, характеризующих его состояние:

this.health; // Здоровье танка, 0-100.
this.armed; // Параметр готовности стрельбы, 0-30. Выстрел отнимает 10.
this.immortal; // Число тиков до потери бессмертия. При попытке выстрелить бессмертие теряется мгновенно.
this.stamina; // Запас стамины делённый на 10 - количество тиков, в течение которых можно использовать метод nitro. Вызов метода nitro отменяет восстановление стамины на 10 тиков. 0-60.

Особый набор флагов находится в объекте

this.powerups == {
    '2gisDamage': 25
};

В этом примере у танка есть '2gisDamage', который будет сохраняться следующие 25 тиков (либо до смерти). То есть следующие 25 тиков у снарядов танка будет двойной урон.

Данные о текущей игре

Все данные о других танках, границах карты, летящих снарядах и поверапах находятся в объекте frame, который имеет следующую структуру:

this.frame = {
    // Живые боты на карте
    players: [{
        id: 123, // Уникальный идентификатор бота
        name: 'overmind', // Никнейм бота
        x: 46, // Положение бота, карта обычно размером 100 на 120
        y: 84,
        width: 5, // Стандартный размер танка
        height: 5,
        health: 100, // Здоровье бота, максимум 100
        immortal: 6, // Количество тиков до потери бессмертия
        // Массив поверапов, в данном тике подцепленных игроком
        powerups: [{
            type: '2gisDamage',
            left: 12 // Количество тиков, после которого поверап кончится
        }],
    }],
    enemy: ... // Случайный бот, являющийся текущей целью
    // Массив летящих снарядов
    shells: [{
        id: '123', // Уникальный идентификатор снаряда
        vector: [0, 1], // Направление полёта снаряда, в данном случае вниз (Y направлен вниз)
        x: 123,
        y: 25,
        shooter: '123' // Идентификатор бота, который выпустил этот снаряд
    }],
    // Массив поверапов, в данном тике находящихся на карте
    powerups: [{
        type: '2gisDamage',
        left: 12
    }],
    map: {
        size: { // Размеры карты
            x: 100,
            y: 120
        }
    }
}

Определение своих методов

Для структурирования кода бота полезно выносить какие-то блоки кода в отдельные функции или методы самого бота. Поскольку код выполняется каждый тик, для экономии ресурсов рекомендуется использовать следующий паттерн:

this.fireForSure = this.fireForSure || function() {
    if (this.locked()) this.fire();
}

this.pursue();
this.fireForSure(); // Будет стрелять только когда противник на линии огня

В таком коде метод создастся только раз при первом выполнении.

В прототипе инстанса бота есть методы типа pursue и escape, но они не идеальны и их можно переопределять указанным способом.

Рандомный бот

Самый простой бот, который передвигается в случайном направлении и постоянно стреляет:

var moves = ['left', 'up', 'right', 'down'];
var method = moves[Math.foor(Math.random() * 4)];

this[method]();
this.fire();

Физика

Все размеры - условные пиксели. Это могут быть сантиметры, километры или парсеки, не важно. Но для простоты будем называть эти единицы пикселями. Главное понимать, что это не экранные, логические, физические или CSS пиксели. Это просто условные единицы длины.

У бота есть скорость. При простом передвижении она равняется 1 пиксель в тик, но при ускорении она повышается. При скорости больше 2 у танка появляется инерция: при повороте его будет заносить. Существует отдача, которая добавляет вектор скорости 1 в сторону, противоположную выстрелу.

Бот может стрелять когда его параметр armed больше 10. Он увеличивается каждый тик и может достигать максимум 30. Каждый выстрел уменьшает его на 10. То есть, на старте или после долгого перерыва можно быстро сделать три выстрела, но потом скорострельност резко снижается до 1 в 10 тиков.

Бот не может выехать за пределы карты. Его перемещение также ограничено другими ботами. Координаты любого бота - это координаты его левого верхнего угла.

После респавна у бота есть бессмертие - параметр immortal имеющий значение 10 и уменьшающийся на 1 каждый тик. Он обнуляется мгновенно при попытке выстрелить.

More Repositories

1

makeup

JavaScript tool for comfortable manual testing of markup
JavaScript
443
star
2

Winium.Desktop

Winium.Desktop is Selenium Remote WebDriver implementation for automated testing of Windows application based on WinFroms and WPF platforms.
C#
402
star
3

Winium

Automation framework for Windows platforms
C#
382
star
4

mapsapi

Карты 2ГИС — это точные данные обо всех объектах города, включая новостройки, с детализацией до заборов и внутриквартальных проездов.
JavaScript
205
star
5

partition_magic

Скрипт-сниппет для Postgresql на plpgsql, позволяющий лёгко, быстро и просто создавать партицированные таблицы в вашем проекте, а также изменять, добавлять и удалять данные.
PLpgSQL
200
star
6

k8s-handle

Easy CI/CD for Kubernetes clusters with python and jinja2
Python
170
star
7

Winium.Cruciatus

C# Framework for automated testing of Windows application based on WinFroms and WPF platforms.
C#
137
star
8

qtandroidextensions

Qt Android Helpers and Native Views
C++
101
star
9

slot

JavaScript фреймворк, позволяющий быстро и просто создавать модульные изоморфные приложения.
JavaScript
86
star
10

photor

jQuery photo gallery.
JavaScript
76
star
11

stf-utils

Utils for Open Smartphone Test Farm (OpenSTF)
Python
53
star
12

Winium.Mobile

Winium.Mobile is Selenium Remote WebDriver implementation for automated testing of Windows StoreApps and Silverlight apps, tested on emulators (currently only Windows Phone/Mobile apps are supported).
C#
51
star
13

RiftJS

JS-фреймворк для написания изоморфных приложений со сложной бизнес-логикой и высокосвязными интерфейсами
JavaScript
33
star
14

mock-geolocation

Mock for navigator.geolocation
JavaScript
28
star
15

2gis-maps-react

[DEPRECATED] React component for 2gis-maps
JavaScript
22
star
16

rader

Range slider
JavaScript
20
star
17

iOS-SDKs-for-tiles

JavaScript
20
star
18

2gl

WebGL library for 2gis projects
JavaScript
20
star
19

badger

Open-source tool for monitoring product quality.
JavaScript
16
star
20

geoloc

Оболочка для удобного получения данных о позиции пользователя от разных провайдеров.
JavaScript
16
star
21

webapi-democlient

This simple application, based on top of Yii PHP framework, shows the basic capabilities of DoubleGIS web API.
PHP
16
star
22

mobile-sdk-android-demo

Kotlin
16
star
23

winphonedriver

DEPRECATED Please see https://github.com/2gis/Winium.Mobile for latests releases. Selenium Driver for automated testing of Windows Phone 8.1 Silverlight applications.
C#
14
star
24

MapGL-iOS

2GIS Maps SDK for iOS
Swift
14
star
25

2gisqt5android

Qt5 with patches for Android by 2GIS
13
star
26

mobile-sdk-ios-demo

Swift
13
star
27

kafka-connect-hdfs-ext

Set of extensions for kafka connect hdfs
Java
12
star
28

uniassert

The uniassert library is a small collection of useful macros.
C++
12
star
29

Winium.Elements

Winium.Elements is a set of extensions for WebDriver Clients Bindings providing easy-to-use way of interacting with desktop-specific UI elements in Windows Desktop apps tested with Winium.Desktop.
C#
12
star
30

vmmaster

Automatic virtual machines manager for selenium-based testing
Python
10
star
31

Winium.StoreApps.CodedUi

Prototype of Winium.StoreApps driver using CodedUI. Implements JsonWireProtocol for automation of Windows Phone applications
C#
10
star
32

on-premise-helm-charts

Smarty
10
star
33

badger-api

Open source backend service (REST API) for Badger
Python
10
star
34

i18n-json-po

Json to POT converter
TypeScript
9
star
35

MapGL-Android

Kotlin
9
star
36

contesto

Framework for writing functional selenium-based tests
Python
9
star
37

loggo

Go
8
star
38

2fingers

simple PHP framework for REST API black-box functional testing
PHP
8
star
39

general

Fast marker generalization algorithm
TypeScript
8
star
40

reactive-zmq

The Akka Streams based ZMQ client.
Scala
8
star
41

2gis-materials

Демо-проект на базе API карт 2ГИС с использованием плагина для leaflet heatmap.js.
JavaScript
7
star
42

mapgl-react-app

TypeScript
7
star
43

markerdrawer

Library for fast drawing a huge amount of markers
TypeScript
6
star
44

webapi-client

PHP библиотека к API 2Гис
PHP
6
star
45

lode_runner

Patched nosetests test runner for better python testing. Made to run with unittest standard library.
Python
6
star
46

pytestrail

Binding for TestRail API
Python
5
star
47

tiny-map

A tiny script for displaying a static map with tiles
JavaScript
5
star
48

i18n-po-json

TypeScript
4
star
49

MarkerGeneralizationPlugin

Provides custom marker generalization for 2gis maps and Leaflet.
JavaScript
4
star
50

whalestack

Python
4
star
51

httpsrvvcr

HTTP VCR Server
Python
4
star
52

dali

Selenium-based tool for capturing and comparing screenshots.
Python
4
star
53

isomorphic-react-starter-kit

Base project to start develop isomorphic react-project
JavaScript
4
star
54

mobile-sdk-map-swift-package

Ruby
4
star
55

cartoshka

CartoCSS parser for Java (JVM)
Java
4
star
56

mapgl-gltf

Three.js plugin for @2gis/mapgl
TypeScript
3
star
57

mapgl-examples

Examples of using MapGL API
JavaScript
3
star
58

k8s-handle-example

Example with config and templates for k8s-handle
Dockerfile
3
star
59

dgKoModulizer

Knockout.js extension for module oragnization.
JavaScript
3
star
60

slot-bro

High-level browser extension framework
JavaScript
3
star
61

stex

i18n STrings EXtractor
TypeScript
3
star
62

2gis-schedule

Library for simple work with 2gis schedule.
JavaScript
3
star
63

ext-elliptics

Yii Framework extension that provides methods to work with the Elliptics Network.
PHP
3
star
64

floors-widget-constructor

Constructor for Floors Widget
JavaScript
3
star
65

WindowsPhone.Controls

C#
2
star
66

surt

Smart suggest
JavaScript
2
star
67

mapgl-utils

Utility funtions to use with MapGL API
TypeScript
2
star
68

cross-domain-analytics

JavaScript
2
star
69

mobile-sdk-full-swift-package

Ruby
2
star
70

maps-api-2.0-promo-site

maps-api-2.0-promo-site
JavaScript
2
star
71

vmmaster-frontend

Overview vmmaster session and tests specific info
JavaScript
2
star
72

android-SDKs-for-tiles

JavaScript
2
star
73

deck2gisLayer

Use DeckGL with 2gis api
TypeScript
2
star
74

CTF2024

Решения задач внутреннего CTF в 2024 году
Go
2
star
75

patronum

The framework for service-testing
C#
1
star
76

native-sdk-ios-swift-package

Swift
1
star
77

gulp.bless

Gulp plugin for CSS Post-Processor Bless
CSS
1
star
78

android-tile-provider-for-2gis

Java
1
star
79

prorab

Web worker abstraction library
TypeScript
1
star
80

vmmaster-client

Client for vmmaster extended API
Python
1
star
81

iOS-floors-widget-demo

Swift
1
star
82

vmmaster-agent

Agent to make things like taking a screenshot or running a command, etc. Should be installed to virtual machine to integrate with vmmaster
Python
1
star
83

migraptor

Утилита для управления миграциями данных, структур, схем, процедур, представлений и т.п. для баз данных проектов, реализованных на Yii 1
PHP
1
star
84

mapgl-ruler

Ruler plugin for @2gis/mapgl
TypeScript
1
star