npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2024 – Pkg Stats / Ryan Hefner

morrisboard

v0.0.1

Published

A Node.js controller for a nine men's morris board

Downloads

479

Readme

Morris Board

The MorrisBoard controller is a module that is just used to control the board logic of a Nine Men's Morris board. This API provides all needed methods and tools to manage a morris game logically.

If you are using the game controller, a board instance will be created automatically and is accessible at yourGame.board. But that's how the board works:

// 1. Argument is the amount of rows
// 2. Argument is an array representing the logic of points on a side and wether they are connected vertically
var board = new MorrisBoard(3, [false, true, false]);

// Test it out
console.log(board);

Map

The board's points are stored within the yourBoard.map. The map contains each point as an object literal containing some details about the point and a lot of Getters that return things like mills, surroundings, line and more.

This is how a point's object looks like within the map array:

yourBoard.map = [
  ...
  {
    team: false || "black" || "white", // Name of the team that is staying on the point (False if there is no team)
    surroundings: [Object], // (Getter): Returns all connected points
    position: [Object], // (Getter): Returns the position as position object { row: Number, position: Number}
    mills: [Array], // (Getter): Returns all mills in which the point is involved
    sides: [Array], // (Getter): Returns all sides the point is part of
    line: [Object] || [Boolean], // Getter: Returns index of the vertical line the point is part of. If there is no vertical line, the value is false
  }
  ...
]

Coordinating

The coordinating system is, as I already explained, circular. That means, you will mostly address points on the board, by using a row index and a index within the row:

// Example position object for a point
{
  row: [Number], // E.g. 0 for the inner row or 2 for the outer (Common Nine Mens's Morris)
  position: [Number] // E.g. 0 for the first of your row or 7 for the last one (Common Nine Men's Morris)
}

Please keep in mind that you have to use your board instance within your game instance when working with a game controller. Normally this will be found at myGame.board.

Get Point Index (by using its position)

To get the index of a point directly from the position, use the getPointIndex() method of your board instance.

var index = board.getPointIndex(row, position);

(Of course could also get a point's index by using the indexOf method with the map array of your board instance but this needs a real point object and is much slower than this method. This method just calculates it directly. That also means that you could a index that does not exist because no point has such a position.)

Get Point (by using its position)

To get a point object literal by using the point's position, use the getPoint() method of your board instance.

var point = board.getPoint(row, position);

Get Point's Position (by using its index)

To get a point's position by using the point's index, use the get getPointPosition() method of your board instance.

var pos = board.getPointPosition(index);

Get Point (by using its index)

To get a points by its index, just call the index within the map array ;-)

// Just simple as it is
var point = board.map[index];

Surroundings

The connected points of a point are represented within the surroundings property of each point. A surroundings object contains one key for each direction. Such a key itself contains a point object.

{
  right: [Object], // Object literal representing the point right from this point
  left: [Object], // Object literal representing the point left from this point
  up: [Object], // Object literal representing the point top from this point
  down: [Object], // Object literal representing the point bottom from this point
}

Please always keep in mind that right, right, up and down are meant from the perspective of the middle point of the morris board. That's because we are using a circular coordinate system to address the points.

Position

The property position of a point object returns the exact position within the circular coordinate system of the point. It returns an object that looks like:

{
  row: [Number],
  position: [Number]
}

As you can see, such an object is also used very often to address a point ;-)

Mills

The property mills of a point object returns all mill's in which the point is involved.

Such a mill is represented by an array containing point objects for each point.

[
  [Array], // Array containing point object for each point that is a part of the mill
  [Array] // Array containing point object for each point that is a part of the mill
]

Of course it is theoretically impossible that a point is involved in more than 2 mills at the same time. And if you are playing morris normally a mill is always is using 3 points. But if you are using 100 rows, of course a vertical mill would need all 100 points.

Sides

The property sides of a point object returns all sides the point is a part of. A side is represented by its index.

Normally, when playing with 4 sides this index is from 0-3. Of course, a point can only be a part of 2 sides at the same time.

[
  Number, // Index [0-3]
  Number // Index [0-3]
]

Line

The property line of a point object returns wether the point is a part of a vertical line and if this is the case, the index of it. If not, false will be returned. Wether a point is part of a vertical line is defined by the vertical connections. If the points argument when creating the board is [false, true, false], the point in the middle of each side has a vertical line but the others do not.

The index of such a vertical line is the index position relative within the circular coordinate system of its points. For example, in Nine Men's Morris there are 4 vertical lines and their indexes would be 1, 3, 5 & 7.

getLine()

To return a line's points (point objects), call yourBoard.getLine(lineIndex). This will return an array containing all points of the line as point objects.

All Mills

To get all mills that are currently active on the board, just use the mills property of your board's instance.

yourBoard.mills = [
  ...
  [Array],
  [Array],
  [Array]
  ...
];