Project

berlin-ai

0.02
No commit activity in last 3 years
No release in over 3 years
There's a lot of open issues
Berlin Artificial Intelligence
2005
2006
2007
2008
2009
2010
2011
2012
2013
2014
2015
2016
2017
2018
2019
2020
2021
2022
2023
2024
2025
2026
 Dependencies

Development

>= 0

Runtime

~> 1.1.4
= 1.4.3
= 1.5.1
= 1.1.0
 Project Readme

Berlin-Ai

Berlin-Ai is a gem to quickly ramp up on the Berlin game.

Changelog

See changelog for recent changes

Usage

Create your AI in a simple .rb file:

require 'berlin-ai'         # Require the berlin-ai library.

class Berlin::AI::Player
  def self.on_turn(game)         # Implement the on_turn method of Berlin::AI::Player.
    # Do your magic here.

    # Here's an AI that randomly moves soldiers from node to node.
    game.map.controlled_nodes.each do |node|
      node.adjacent_nodes.shuffle.each do |other_node|
        soldiers = rand(0..(node.available_soldiers))
        game.add_move(node, other_node, soldiers)
      end
    end
  end
end

You're now ready to host your AI locally or with Heroku. We use Sinatra in this gem, so a simple ruby your_ai_file.rb will launch the web server.

To modify some defaults, you can execute ruby your_ai_file.rb -h for a list of available options.

API

game (Berlin::AI::Game)

Entry point in the API from Berlin::AI::Player#on_turn.

# General information on the game.
game.id                      # This game unique id.
game.number_of_players       # Number of players in this game.
game.maximum_number_of_turns # Maximum number of turns for this game.
game.player_id               # Your player id for this game.
game.time_limit_per_turn     # Maximum number of time (ms) to make your moves, per turn.

# Information on the current turn.
game.current_turn            # The current turn count.
game.turns_left              # Remaining turns before the end of the game.

# Add a move to perform this turn by your AI.
# IMPORTANT: 'from' and 'to' must be node objects.
game.add_move(from, to, number_of_soldiers)

# List of moves to perform this turn by your AI.
game.moves # => [{ from: node_id, to: node_id, number_of_soldiers: int }]

# The game's map with its own set of useful methods.
game.map

map (Berlin::AI::Map)

Helper methods to work with nodes.

map.directed?          # Determine if a path from A to B is A -> B (directed) or A <-> B (not directed)
map.nodes              # All the nodes.
map.owned_nodes        # Your nodes, including those with 0 soldiers.
map.enemy_nodes        # Enemy nodes.
map.free_nodes         # Nodes not controlled by anyone.
map.foreign_nodes      # Nodes not owned (i.e. enemy nodes and free nodes).
map.controlled_nodes   # Owned nodes, excluding those with 0 soldiers.

node (Berlin::AI::Node)

Node objects obtained when querying the map.

node.id                       # Id of the node.
node.map                      # The map to which the node belongs to
node.type                     # Type of node.
node.player_id                # Owner of the node.
node.number_of_soldiers       # Number of soldiers on the node.
node.incoming_soldiers        # Owned soldiers coming to this node (result from add_move calls).
node.available_soldiers       # Owned remaining soldiers on this node (result from add_move calls).
node.==(other)                # Check if two nodes are the same.
node.adjacent?(other_node)    # Check if two nodes are adjacents.
node.occupied?                # Check if some soldiers are on the node.
node.enemy?                   # Check if another player (not you) owns the node.
node.mine? (node.owned?)      # Check if you own the node.
node.free?                    # Check if no one own the node.
node.foreign?                 # Check if you don't own the node. Might belongs to an enemy or be free.
node.owned_by?(player_id)     # Check if the node is owned by a given player.
node.adjacent_nodes           # Get a list of adjacent nodes.
node.adjacent_nodes_and_self  # Get a list of adjacent nodes, including this node.
node.soldiers_per_turn        # Spawned soldiers per turn if you own this node.
node.points                   # Given points by this node at the end of the game.

Installation

Add this line to your application's Gemfile:

gem 'berlin-ai'

And then execute:

$ bundle

Or install it yourself as:

$ gem install berlin-ai

Contributing

  1. Fork it
  2. Create your feature branch (git checkout -b my-new-feature)
  3. Commit your changes (git commit -am 'Add some feature')
  4. Push to the branch (git push origin my-new-feature)
  5. Create new Pull Request