diff --git a/05week/checkers.js b/05week/checkers.txt similarity index 90% rename from 05week/checkers.js rename to 05week/checkers.txt index 15d9953d1..fc3d39587 100644 --- a/05week/checkers.js +++ b/05week/checkers.txt @@ -51,8 +51,18 @@ class Board { } console.log(string); } + // Insert pieces here + checkers(){ + for(let row = 0; row < 8; row++){ + for(let column = 0; column < 8; column++){ + console.log("test") + if( row != 3 || row != 4){ + this.viewGrid[row][column] = 0 + } + } + } + } - // Your code here } class Game { @@ -61,6 +71,7 @@ class Game { } start() { this.board.createGrid(); + this.board.checkers(); } } diff --git a/05week/checkers/checkers.js b/05week/checkers/checkers.js new file mode 100644 index 000000000..5fe081c7d --- /dev/null +++ b/05week/checkers/checkers.js @@ -0,0 +1,142 @@ +'use strict'; + +const readline = require('readline'); +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}); + + +function Checker(color) { + //Set the symbol of each symbol + if(color === 'white'){ + this.symbol = String.fromCharCode(0x125CB); + }else{ + this.symbol = String.fromCharCode(0x125CF); + } + return this.symbol; +} + +class Board { + constructor() { + this.grid = []; + this.checkers = []; + } + // method that creates an 8x8 array, filled with null values + createGrid() { + // loop to create the 8 rows + for (let row = 0; row < 8; row++) { + this.grid[row] = []; + // push in 8 columns of nulls + for (let column = 0; column < 8; column++) { + this.grid[row].push(null); + } + } + } + viewGrid() { + // add our column numbers + let string = " 0 1 2 3 4 5 6 7\n"; + for (let row = 0; row < 8; row++) { + // we start with our row number in our array + const rowOfCheckers = [row]; + // a loop within a loop + for (let column = 0; column < 8; column++) { + // if the location is "truthy" (contains a checker piece, in this case) + if (this.grid[row][column]) { + // push the symbol of the check in that location into the array + rowOfCheckers.push(this.grid[row][column].symbol); + } else { + // just push in a blank space + rowOfCheckers.push(' '); + } + } + // join the rowOfCheckers array to a string, separated by a space + string += rowOfCheckers.join(' '); + // add a 'new line' + string += "\n"; + } + console.log(string); + } + createCheckers() { + //Checkers location at the start of a new game + let position = { + white:[ + [0, 1], [0, 3], [0, 5], [0, 7], + [1, 0], [1, 2], [1, 4], [1, 6], + [2, 1], [2, 3], [2, 5], [2, 7] + ], + black:[ + [5, 0], [5, 2], [5, 4], [5, 6], + [6, 1], [6, 3], [6, 5], [6, 7], + [7, 0], [7, 2], [7, 4], [7, 6] + ], + } + //Places the pieces onto the board + for (let color in position){ + for (let location of position[color]){ + //Initiate a new Checker and pass in the color + let checker = new Checker(color); + //Set the checker on the grid + this.grid[location[0]][location[1]] = checker; + //Add instance of the Checker onto the checkers array + this.checkers.push(checker) + } + } + } + selectChecker(start, end) { + //return checker at a particulare spot + let checker = this.grid[start[0]][start[1]]; + //let removeChecker = this.checkers.indexOf(this.grid[end[0]][end[1]]); + this.grid[end[0]][end[1]] = checker; + this.grid[start[0]][start[1]] = ' '; + //return removeChecker; + } + killChecker(position) { + //Set the killed piece to a blank space + this.grid[position[0]][position[1]] = '' + //Store index of checker in checkers array + let removeChecker = this.checkers.indexOf(this.grid[position[0]][position[1]]) + //Remove checker from array in order to count pieces on board + this.checkers.splice(removeChecker,1); + } +} + +class Game { + constructor() { + this.board = new Board; + } + start() { + this.board.createGrid(); + this.board.createCheckers(); + } + moveChecker(start, end){ + //Move checker + this.board.selectChecker(start, end); + //See if player moved up two rows indicating they jumped the other player + if ((Math.abs(start[0]-end[0])) === 2){ + //Get the posistion the jumped checker + let newRow = ((parseFloat(start[0])+parseFloat(end[0]))/2); + let newColumn = ((parseFloat(start[1])+parseFloat(end[1]))/2); + let newPosition = [newRow,newColumn] + //Remove it from board and checkers array + this.board.killChecker(newPosition); + } + } +} + +function getPrompt() { + game.board.viewGrid(); + rl.question('which piece?: ', (whichPiece) => { + rl.question('to where?: ', (toWhere) => { + game.moveChecker(whichPiece, toWhere); + getPrompt(); + }); + }); +} + +const game = new Game(); +game.start(); + +getPrompt(); + +module.exports = game; \ No newline at end of file diff --git a/05week/checkers/index.js b/05week/checkers/index.js new file mode 100644 index 000000000..e69de29bb diff --git a/05week/checkers/package.json b/05week/checkers/package.json new file mode 100644 index 000000000..0688c9804 --- /dev/null +++ b/05week/checkers/package.json @@ -0,0 +1,9 @@ +{ + "scripts": { + "start": "node checkers.js", + "test": "mocha" + }, + "devDependencies": { + "mocha": "^5.2.0" + } +} diff --git a/05week/checkers/test.js b/05week/checkers/test.js new file mode 100644 index 000000000..c420ee2c7 --- /dev/null +++ b/05week/checkers/test.js @@ -0,0 +1,36 @@ +"use strict"; + +const assert = require("assert"); +const game = require("./checkers") + +// Tests +if (typeof describe === "function") { + describe("Game", () => { + it("should have a board", () => { + assert.equal(game.board.constructor.name, "Board"); + }); + it("board should have 24 checkers", () => { + assert.equal(game.board.checkers.length, 24); + }); + }); + + describe("Game.moveChecker()", () => { + it("should move a checker", () => { + assert(!game.board.grid[4][1]); + game.moveChecker("50", "41"); + assert(game.board.grid[4][1]); + game.moveChecker("21", "30"); + assert(game.board.grid[3][0]); + game.moveChecker("52", "43"); + assert(game.board.grid[4][3]); + }); + it("should be able to jump over and kill another checker", () => { + game.moveChecker("30", "52"); + assert(game.board.grid[5][2]); + assert(!game.board.grid[4][1]); + assert.equal(game.board.checkers.length, 23); + }); + }); +} else { + getPrompt(); +} diff --git a/05week/package-lock.json b/05week/package-lock.json new file mode 100644 index 000000000..393c43985 --- /dev/null +++ b/05week/package-lock.json @@ -0,0 +1,194 @@ +{ + "requires": true, + "lockfileVersion": 1, + "dependencies": { + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "browser-stdout": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.1.tgz", + "integrity": "sha512-qhAVI1+Av2X7qelOfAIYwXONood6XlZE/fXaBSmW/T5SzLAmCgzi+eiWE7fUvbHaeNBQH13UftjpXxsfLkMpgw==", + "dev": true + }, + "commander": { + "version": "2.15.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.15.1.tgz", + "integrity": "sha512-VlfT9F3V0v+jr4yxPc5gg9s62/fIVWsd2Bk2iD435um1NlGMYdVCq+MjcXnhYq2icNOizHr1kK+5TI6H0Hy0ag==", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "diff": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz", + "integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==", + "dev": true + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=", + "dev": true + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "growl": { + "version": "1.10.5", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.5.tgz", + "integrity": "sha512-qBr4OuELkhPenW6goKVXiv47US3clb3/IbuWF9KNKEijAy9oeHxU9IgzjvJhHkUzhaj7rOUD7+YGWqUjLp5oSA==", + "dev": true + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "mocha": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-5.2.0.tgz", + "integrity": "sha512-2IUgKDhc3J7Uug+FxMXuqIyYzH7gJjXECKe/w43IGgQHTSj3InJi+yAA7T24L9bQMRKiUEHxEX37G5JpVUGLcQ==", + "dev": true, + "requires": { + "browser-stdout": "1.3.1", + "commander": "2.15.1", + "debug": "3.1.0", + "diff": "3.5.0", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.5", + "he": "1.1.1", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "supports-color": "5.4.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "supports-color": { + "version": "5.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz", + "integrity": "sha512-zjaXglF5nnWpsq470jSv6P9DwPvgLkuapYmfDm3JWOm0vkNTVF2tI4UrN2r6jH1qM/uc/WtxYY1hYoA2dOKj5w==", + "dev": true, + "requires": { + "has-flag": "^3.0.0" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } +} diff --git a/05week/package.json b/05week/package.json new file mode 100644 index 000000000..0cae57d15 --- /dev/null +++ b/05week/package.json @@ -0,0 +1,9 @@ +{ + "scripts": { + "start": "checkers.js", + "test": "mocha" + }, + "devDependencies": { + "mocha": "^5.2.0" + } +}