/ game.js
game.js
1 'use strict'; 2 import fs from "node:fs"; 3 import {adjacent} from "./public_html/script/src/adjacent.js"; 4 5 let shuffle = (array) => { 6 for(var i = array.length; i > 0; i--) { 7 var r = Math.floor(Math.random() * i); 8 [array[r], array[i - 1]] = [array[i - 1], array[r]]; 9 } 10 return array; 11 }; 12 13 class Game { 14 exists(name) { 15 try { 16 fs.statSync(`./games/${name}.game`); 17 return true; 18 } catch(e) { 19 return false; 20 } 21 } 22 new(name) { 23 let tilesList = [0, 0, 0, 0, 1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 4, 4, 4, 5]; 24 let numbersList = [2, 3, 3, 4, 4, 5, 5, 6, 6, 8, 8, 9, 9, 10, 10, 11, 11, 12]; 25 let robber = []; 26 27 let ok = false; 28 let tiles; 29 let n = 0; 30 while(!ok) { 31 ok = true; 32 tiles = shuffle(new Array(...tilesList)); 33 let numbers = shuffle(new Array(...numbersList)); 34 35 for(let i = 0; i < tiles.length; i++) { 36 if(tiles[i] != 5) { 37 tiles[i] = [tiles[i], numbers[0]]; 38 numbers.splice(0, 1); 39 } else { 40 tiles[i] = [5, 7]; 41 } 42 } 43 tiles = [ 44 [tiles[0], tiles[1], tiles[2]], 45 [tiles[3], tiles[4], tiles[5], tiles[6]], 46 [tiles[7], tiles[8], tiles[9], tiles[10], tiles[11]], 47 [tiles[12], tiles[13], tiles[14], tiles[15]], 48 [tiles[16], tiles[17], tiles[18]] 49 ]; 50 out: 51 for(let i = 0; i < tiles.length; i++) { 52 for(let j = 0; j < tiles[i].length; j++) { 53 if([6,8].indexOf(tiles[i][j][1]) != -1) { 54 let adj = adjacent(i, j, 'tile', 'tile'); 55 for(let tile of adj) { 56 if([6,8].indexOf(tiles[tile[0]][tile[1]][1]) != -1) { 57 ok = false; 58 break out; 59 } 60 } 61 } 62 } 63 } 64 } 65 out2: 66 for(let i = 0; i < tiles.length; i++) { 67 for(let j = 0; j < tiles[i].length; j++) { 68 if(tiles[i][j][0] == 5) { 69 robber = [i, j]; 70 break out2; 71 } 72 } 73 } 74 let ports = shuffle([0, 1, 2, 3, 4, 5, 5, 5, 5]); 75 let devCards = shuffle([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 2, 3, 3, 4, 4]); 76 77 let data = { 78 tiles: tiles, 79 ports: ports, 80 roads: [ 81 [-1, -1, -1, -1, -1, -1], 82 [-1, -1, -1, -1], 83 [-1, -1, -1, -1, -1, -1, -1, -1], 84 [-1, -1, -1, -1, -1], 85 [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], 86 [-1, -1, -1, -1, -1, -1], 87 [-1, -1, -1, -1, -1, -1, -1, -1, -1, -1], 88 [-1, -1, -1, -1, -1], 89 [-1, -1, -1, -1, -1, -1, -1, -1], 90 [-1, -1, -1, -1], 91 [-1, -1, -1, -1, -1, -1] 92 ], 93 houses: [ 94 [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]], 95 [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]], 96 [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]], 97 [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]], 98 [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]], 99 [[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0],[0, 0]] 100 ], 101 devCards: devCards, 102 trade: null, 103 players: { 104 /* 105 name: { 106 turn: 0, 107 hand: [ 108 [0,0,0,0,0], 109 [[0,0,0,0,0],[0,0,0,0,0]] 110 ], 111 color: 'red'|'orange'|'blue'|'white', 112 response: { 113 robber: null, 114 trade: null 115 }, 116 longestRoadCount: 1, 117 knights: 0, 118 largestArmy: false, 119 longestRoad: false 120 } 121 */ 122 }, 123 gameState: 0, 124 turn: -1, 125 turnCount: 0, 126 dice: [1, 1], 127 rolled: false, 128 robber: robber 129 }; 130 131 console.log(`New game created: ${name}`); 132 this.save(name, data); 133 134 return data; 135 } 136 load(name) { 137 return JSON.parse(fs.readFileSync(`./games/${name}.game`, 'utf8')); 138 } 139 save(file, data) { 140 fs.writeFile(`./games/${file}.game`, JSON.stringify(data), (err) => { 141 if(err) { 142 console.log(err); 143 return; 144 } 145 console.log(`Game was saved to './games/${file}.game'`); 146 }); 147 } 148 } 149 150 export default new Game();