Catalog npm
Back to packageRELEASE DETAILS

6.2.3

npm

15-puzzle

A simple 15 puzzle library

15puzzlepuzzle
Published11 Dec 2021
Direct dependencies8
Transitive dependenciesNot calculated

README

Current package documentation

15-puzzle 🧩

15-puzzle is a simple 15 puzzle library with many useful features. 😎

Usage

Installation

Use npm to install (or yarn if you'd like).

npm install 15-puzzle

Then import the class RandomPuzzle from '15-puzzle' in your script.

import { RandomPuzzle } from '15-puzzle'      // ES Module
const { RandomPuzzle } = require('15-puzzle') // CommonJS

Generating

You can generate a random valid puzzle using a static method called generate() 🎰✨. To specify the size, give a number for both width and height, two numbers for width and height respectively, or nothing for 4x4.

import { RandomPuzzle } from '15-puzzle'

const foo = RandomPuzzle.generate()      // 4x4
const bar = RandomPuzzle.generate(5)     // 5x5
const baz = RandomPuzzle.generate(6, 7)  // 6x7

See the type definition to learn what you can do. 🧐

Now (actually since v2.0.2 😅), as we use random-seed to generate a puzzle, this feature is actually supported! 🎉 Just give a seed as the first argument. A seed must be a string, and here's why.

import { RandomPuzzle } from '15-puzzle'

const foo = RandomPuzzle.generate('kazukazu123123')        // 4x4
const bar = RandomPuzzle.generate('kazukazu123123', 5)     // 5x5
const baz = RandomPuzzle.generate('kazukazu123123', 6, 7)  // 6x7

If you have an array of pieces, instead, use Puzzle which allows you to create an instance without seed. Note that 0 means an empty square.

FYI, RandomPuzzle actually extends Puzzle.

import { Puzzle } from '15-puzzle'

const pieces = [ [  1 ,  2 ,  3 ,  4 ]
                 [  5 ,  6 ,  7 ,  8 ]
                 [  9 , 10 , 11 , 12 ]
                 [ 13 , 14 , 15 ,  0 ] ]

const puzzle = new Puzzle(pieces)

Checking

You can check if the puzzle is solvable, being solved, or completely solved. 🧐

import { Puzzle } from '15-puzzle'

const foo = new Puzzle([ [  1 ,  2 ,  3 ,  4 ]
                         [  5 ,  6 ,  7 ,  8 ]
                         [  9 , 10 , 11 , 12 ]
                         [ 13 , 14 , 15 ,  0 ] ])
foo.isSolvable() // true
foo.isSolving() // false
foo.isSolved() // true


const bar = new Puzzle([ [  1 ,  2 ,  3 ,  4 ]
                         [  5 ,  6 ,  7 ,  8 ]
                         [  9 , 10 , 11 , 12 ]
                         [ 13 ,  0 , 14 , 15 ] ])
bar.isSolvable() // true
bar.isSolving() // false
bar.isSolved() // false

bar.tap(2, 3)
bar.isSolving() // true
bar.isSolved() // false

bar.tap(3, 3)
bar.isSolving() // false
bar.isSolved() // true


const baz = new Puzzle([ [  1 ,  2 ,  3 ,  4 ]
                         [  5 ,  6 ,  7 ,  8 ]
                         [  9 , 10 , 11 , 12 ]
                         [ 13 , 15 , 14 ,  0 ] ])
baz.isSolvable() // false

Controlling

Use Puzzle.prototype.tap(x, y).

import { RandomPuzzle } from '15-puzzle'

const puzzle = RandomPuzzle.generate('kazukazu123123')
console.log(puzzle.toString())
// +--+--+--+--+
// | 5|  | 1|12|
// +--+--+--+--+
// |13|10| 8| 4|
// +--+--+--+--+
// | 3|14| 6| 7|
// +--+--+--+--+
// |11|15| 9| 2|
// +--+--+--+--+

puzzle.tap(0, 0)
console.log(puzzle.toString())
// +--+--+--+--+
// |  | 5| 1|12|
// +--+--+--+--+
// |13|10| 8| 4|
// +--+--+--+--+
// | 3|14| 6| 7|
// +--+--+--+--+
// |11|15| 9| 2|
// +--+--+--+--+

There's a method called swap which literally swaps two pieces, but using this method is not recommended, because calling this manually might make the puzzle become unsolvable.

Downloads & popularity

Awaiting observations

No metric observations yet

Download counts and popularity will appear here as the collector receives them.

Declared dependencies 8

Native requirements
8 direct targetsNot calculated transitive count
Package / targetRequirementRelationship
random-seed
Environment
{
  "local_name": "random-seed",
  "alias": false,
  "peer_metadata": null
}
^0.3.0runtime
@types/random-seed
Environment
{
  "local_name": "@types/random-seed",
  "alias": false,
  "peer_metadata": null
}
^0.3.3runtime
typescript
Environment
{
  "local_name": "typescript",
  "alias": false,
  "peer_metadata": null
}
^4.5.2development
ts-node
Environment
{
  "local_name": "ts-node",
  "alias": false,
  "peer_metadata": null
}
^10.4.0development
chai
Environment
{
  "local_name": "chai",
  "alias": false,
  "peer_metadata": null
}
^4.3.4development
mocha
Environment
{
  "local_name": "mocha",
  "alias": false,
  "peer_metadata": null
}
^9.1.3development
@types/chai
Environment
{
  "local_name": "@types/chai",
  "alias": false,
  "peer_metadata": null
}
^4.2.22development
@types/mocha
Environment
{
  "local_name": "@types/mocha",
  "alias": false,
  "peer_metadata": null
}
^9.0.0development

Distribution files

1 collected
Distribution 1

Source distribution

Source file
Checksums from source
{
  "integrity": "sha512-/yPJFBaOLqx2ZFUtU+dUhxb3npJKyczvvAAdG3zX2f3MASfxprUJUsYIMW9b7ruBPQpjqC4P/8+dtrLYQV5Z0g==",
  "shasum": "15dfd7979c141c2661a2ab682c069fbc5678c175",
  "tarball": "https://registry.npmjs.org/15-puzzle/-/15-puzzle-6.2.3.tgz",
  "fileCount": 90,
  "unpackedSize": 133151,
  "npm-signature": "-----BEGIN PGP SIGNATURE-----\r\nVersion: OpenPGP.js v3.0.13\r\nComment: https://openpgpjs.org\r\n\r\nwsFcBAEBCAAQBQJhtCnECRA9TVsSAnZWagAA0fcQAKOy5qBci/fVGF9flsYq\nEfYoy1+eUWUkTr51eAUGtQTq92ofuJF55+sWsSsfVwrK2G20LiDP2bkUlRLH\nGjUQDiCBNoSpWDWjl4/UnAqYvh4ySmj+FIZjnAjhcvYh1740laJr7UpUmDuc\nnXbbNdwIc89wcY61TD3vpCCF+Amn0cy2zJCL9Eh/FyCpGBTvZrRrbdJ3HEwK\nHnId2PWv6rKtj1uSInIxqQM8dvf1lAdCgwx7EaEqTCilBQ8y1d+ilq81s85r\nAfFn2xXFTb4FGLjDQQlvVSvktERD6kTWspRuYMhFjwwX5tnSmWUBY/kf7tQF\nZx8r7MHaY4IX7JIye1yd80sHvYZsk0IpJP9SINFV0OS9M2IIdbLA+JLY2o+1\nMWoFREqq8l9rNqoCBn2fXfHcG/P8kz43OYLE5xS6c6L5OVWJliySrUvwwyEF\nlFHMPcl4grmdYr73L/Q3Is8We3FomBrs1s/Grt6ebLUuCCz7hqAszI0IiDhD\nBB7OYvVv2ZY+hTvd8NHHpJXCmEAuEmX/dzJLNE+sxrTtrL5hvFyHQe1pcudL\n2H9VjEGtCXUDQsZzIhGjLc/ItzN6S8WsOD66Cu7BU8VnSeEDnSrzLgRcHkRO\nLxjmWpDwI9yeWewFOqQcvvbLV9sxoPz0GeLXNrVDPlf0vAHyI6kZeypRztB9\n4+xd\r\n=yVrb\r\n-----END PGP SIGNATURE-----\r\n",
  "signatures": [
    {
      "keyid": "SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA",
      "sig": "MEUCIQDZx72of6lWuYm6r7GNymYeAzvyMKs/bnCmHHhRuc9xNQIgZmiedXVSDpG9OY6jQn1hcedZ/bGKXfqYMPZZa5hg17A="
    }
  ]
}

Repository

PENDING
hiraginoyuki/15-puzzle

Shared repository data · GitHub

License detected in repository
Not collected

Metadata history

Meaningful changes
Current collected state Current

Observed since 20 Oct, 18:15 UTC

No superseded metadata states collected. Unchanged observations do not create new revisions.

Record identity

package_version:f85ebec3305a74714d2b21b6f8dd2bad1a1fb8a127566d2d2725caef48d034fb

Other collected versions

6.2.26 Dec6.2.16 Dec6.2.05 Dec6.1.55 Dec6.1.35 Dec6.1.25 DecView all collected versions →