![npm (scoped)](https://img.shields.io/npm/v/@adrielus/loopover?style=for-the-badge) ![npm bundle size (scoped)](https://img.shields.io/bundlephobia/minzip/@adrielus/loopover?style=for-the-badge) [![forthebadge](https://forthebadge.com/images/badges/powered-by-water.svg)](https://forthebadge.com) # Loopover ## Installation ```sh npm install @adrielus/loopover ``` (There is also an amd build at `/dist/bundle.amd.js` which uses the `Loopover` namespace) ## Usage ### Creating a game To create a game use the `createGame` helper and pass it the `width` and the `height` of the board: ```ts import { createGame } from '@adrielus/loopover' // this creates a 3x3 board const game = createGame(3, 3) ``` The `createGame` method returns a `GameState` instance. ### Getting the metadata from a state Each `GameState` instance has a `width` and a `height` prop: ```ts game.width // 3 game.height // 3 ``` ### Iterating over a state The `GameState` has a `[Symbol.iterator]` prop, so you can iterate over it with a for of loop: ```ts for (const piece of game) { // piece is just an int } ``` You can also transform it into an array and then use a normal for loop: ```ts const array = [...game] for (let index = 0; index < array.length; index++) { const piece = array[index] } ``` Or you can use the cells getter which will return an array: ```ts for (let index = 0; index < game.cells.length; i++) { const piece = array[index] } ``` ### Applying moves: The GameState instance has 2 methods for applying moves: `moveX` and `moveY`. Both method accept a direction (1 or -1) and a layer. Example: If the board is in the following position: | | | | | --- | --- | --- | | 1 | 2 | 3 | | 4 | 5 | 6 | | 7 | 8 | 9 | and you apply: ```ts game.moveX(-1, 1) ``` The board will look like: | | | | | --- | --- | --- | | 1 | 2 | 3 | | 5 | 6 | 4 | | 7 | 8 | 9 | > Note: both `moveX` and `moveY` **_WON'T_** mutate the original game state, but will return the new state. # Contributing First, clone this repo: ```sh git clone https://github.com/Mateiadrielrafael/loopover cd loopover ``` Then use **_pnpm_** to install the dependencies: ```sh pnpm install ``` You can use the `build` command to build the package (this is dont automatically by github actions): ```sh pnpm run build ```