Ajout de fonctions

This commit is contained in:
SamuWrob 2020-12-17 17:38:11 +01:00
parent 3a0d29816f
commit 1ec96163ab
29 changed files with 2048 additions and 470 deletions

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"id":"../node_modules/@dzeio/dom-manager/dist/index.js","dependencies":[{"name":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/package.json","includedInParent":true,"mtime":1608198051272},{"name":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/package.json","includedInParent":true,"mtime":1608197056582},{"name":"./DOMElement","loc":{"line":7,"column":45},"parent":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/index.js","resolved":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/DOMElement.js"},{"name":"./DOMFleetManager","loc":{"line":9,"column":50},"parent":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/index.js","resolved":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/DOMFleetManager.js"}],"generated":{"js":"\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DOMFleetManager = exports.DOMElement = void 0;\nconst DOMElement_1 = __importDefault(require(\"./DOMElement\"));\nexports.DOMElement = DOMElement_1.default;\nconst DOMFleetManager_1 = __importDefault(require(\"./DOMFleetManager\"));\nexports.DOMFleetManager = DOMFleetManager_1.default;\n"},"sourceMaps":{"js":{"mappings":[{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":1,"column":0},"generated":{"line":1,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":2,"column":0},"generated":{"line":2,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":3,"column":0},"generated":{"line":3,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":4,"column":0},"generated":{"line":4,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":5,"column":0},"generated":{"line":5,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":6,"column":0},"generated":{"line":6,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":7,"column":0},"generated":{"line":7,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":8,"column":0},"generated":{"line":8,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":9,"column":0},"generated":{"line":9,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":10,"column":0},"generated":{"line":10,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":11,"column":0},"generated":{"line":11,"column":0}}],"sources":{"../node_modules/@dzeio/dom-manager/dist/index.js":"\"use strict\";\nvar __importDefault = (this && this.__importDefault) || function (mod) {\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\n};\nObject.defineProperty(exports, \"__esModule\", { value: true });\nexports.DOMFleetManager = exports.DOMElement = void 0;\nconst DOMElement_1 = __importDefault(require(\"./DOMElement\"));\nexports.DOMElement = DOMElement_1.default;\nconst DOMFleetManager_1 = __importDefault(require(\"./DOMFleetManager\"));\nexports.DOMFleetManager = DOMFleetManager_1.default;\n"},"lineCount":11}},"error":null,"hash":"2382ab187504905a26d3a1fa0e392eaa","cacheData":{"env":{}}}
{"id":"../node_modules/@dzeio/dom-manager/dist/index.js","dependencies":[{"name":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/package.json","includedInParent":true,"mtime":1608219815779},{"name":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/package.json","includedInParent":true,"mtime":1608219815443},{"name":"./DOMElement","loc":{"line":7,"column":45},"parent":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/index.js","resolved":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/DOMElement.js"},{"name":"./DOMFleetManager","loc":{"line":9,"column":50},"parent":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/index.js","resolved":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/node_modules/@dzeio/dom-manager/dist/DOMFleetManager.js"}],"generated":{"js":"\"use strict\";\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DOMFleetManager = exports.DOMElement = void 0;\r\nconst DOMElement_1 = __importDefault(require(\"./DOMElement\"));\r\nexports.DOMElement = DOMElement_1.default;\r\nconst DOMFleetManager_1 = __importDefault(require(\"./DOMFleetManager\"));\r\nexports.DOMFleetManager = DOMFleetManager_1.default;\r\n"},"sourceMaps":{"js":{"mappings":[{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":1,"column":0},"generated":{"line":1,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":2,"column":0},"generated":{"line":2,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":3,"column":0},"generated":{"line":3,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":4,"column":0},"generated":{"line":4,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":5,"column":0},"generated":{"line":5,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":6,"column":0},"generated":{"line":6,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":7,"column":0},"generated":{"line":7,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":8,"column":0},"generated":{"line":8,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":9,"column":0},"generated":{"line":9,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":10,"column":0},"generated":{"line":10,"column":0}},{"source":"../node_modules/@dzeio/dom-manager/dist/index.js","original":{"line":11,"column":0},"generated":{"line":11,"column":0}}],"sources":{"../node_modules/@dzeio/dom-manager/dist/index.js":"\"use strict\";\r\nvar __importDefault = (this && this.__importDefault) || function (mod) {\r\n return (mod && mod.__esModule) ? mod : { \"default\": mod };\r\n};\r\nObject.defineProperty(exports, \"__esModule\", { value: true });\r\nexports.DOMFleetManager = exports.DOMElement = void 0;\r\nconst DOMElement_1 = __importDefault(require(\"./DOMElement\"));\r\nexports.DOMElement = DOMElement_1.default;\r\nconst DOMFleetManager_1 = __importDefault(require(\"./DOMFleetManager\"));\r\nexports.DOMFleetManager = DOMFleetManager_1.default;\r\n"},"lineCount":11}},"error":null,"hash":"d24788d11e56655232f1dc2b69591de9","cacheData":{"env":{}}}

File diff suppressed because one or more lines are too long

View File

@ -1 +1 @@
{"id":"index.html","dependencies":[{"name":"./main.ts","dynamic":true,"resolved":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/public/main.ts","parent":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/public/index.html"}],"generated":{"html":"<!DOCTYPE html>\n<html lang=\"fr\">\n\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t\t<title>Puissance 4</title>\n\t</head>\n\n\t<body>\n\t\t<div class=\"tableContainer\">\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</div>\n\t</body>\n\t<script src=\"/6427dc610ec40c788cba04a9c39d6dcf.js\"></script>\n\n</html>\n"},"sourceMaps":null,"error":null,"hash":"51cadd649cefd22980e5240f1be43281","cacheData":{}}
{"id":"index.html","dependencies":[{"name":"./main.ts","dynamic":true,"resolved":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/public/main.ts","parent":"/home/ubuntu/Bureau/cours/2eme année/contest/Puissance4/public/index.html"}],"generated":{"html":"<!DOCTYPE html>\n<html lang=\"fr\">\n\n\t<head>\n\t\t<meta charset=\"UTF-8\">\n\t\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t\t<title>Puissance 4</title>\n\t</head>\n\n\t<body>\n\t\t<div>Tour du joueur <span class=\"playerColor\"></span></div>\n\t\t<button class=\"restartBtn\">Recommencer</button>\n\t\t<div class=\"tableContainer\">\n\t\t\t<table>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t\t<td>1</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t\t<td>2</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t\t<td>3</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t\t<td>4</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t\t<td>5</td>\n\t\t\t\t</tr>\n\t\t\t\t<tr>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t\t<td>6</td>\n\t\t\t\t</tr>\n\t\t\t</table>\n\t\t</div>\n\t</body>\n\t<script src=\"/6427dc610ec40c788cba04a9c39d6dcf.js\"></script>\n\n</html>\n"},"sourceMaps":null,"error":null,"hash":"f631e9ae9dd3d9ac10a2e3915d49f8ea","cacheData":{}}

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

26
Connection.ts Normal file
View File

@ -0,0 +1,26 @@
import WebSocket from "ws";
import Listener from "./Listener";
export default class Connection extends Listener<{
message: (message: string | Record<string, any>) => void
}> {
public constructor(
private ws: WebSocket
) {
super()
ws.on('message', (message) => {
try {
this.emit('message', JSON.parse(message.toString()))
} catch {
this.emit('message', message.toString())
}
})
}
public send(message: string | Record<string, any>) {
if (typeof message === 'string') {
return this.ws.send(message)
}
this.ws.send(JSON.stringify(message))
}
}

117
Listener.ts Normal file
View File

@ -0,0 +1,117 @@
type ItemToArray<T> = {
[P in keyof T]?: Array<T[P]>
}
export default abstract class Listener<T extends Record<string, (...args: Array<any>) => void> = { newListener: (eventName: string, listener: Function) => void, removeListener: (eventName: string, listener: Function) => void }> {
private maxListeners = 10
private handlers: ItemToArray<T> = {}
private internalAdd(push: boolean, event: keyof T, listener: T[typeof event]) {
// @ts-expect-error
this.emit('newListener', event, listener)
let item = this.handlers[event]
if (!item) {
this.handlers[event] = [listener]
item = this.handlers[event]
} else {
if (push) {
item.push(listener)
} else {
item.unshift(listener)
}
}
if ((item?.length || 1) > this.maxListeners) {
console.warn(`Warning: more than ${this.maxListeners} are in the event ${event}! (${item?.length || 1})`)
}
return this
}
on(event: keyof T, listener: T[typeof event]) {
return this.internalAdd(true, event, listener)
}
prependListener(event: keyof T, listener: T[typeof event]) {
return this.internalAdd(false, event, listener)
}
prependOnceListener(event: keyof T, listener: T[typeof event]) {
const fn = (...args: Array<any>) => {
listener(...args)
this.off(event, fn as any)
}
this.prependListener(event, fn as any)
return this
}
once(event: keyof T, listener: T[typeof event]) {
const fn = (...args: Array<any>) => {
listener(...args)
this.off(event, fn as any)
}
this.on(event, fn as any)
return this
}
emit(event: keyof T, ...ev: Parameters<T[typeof event]>) {
for (const fn of this.listeners(event)) {
fn(...ev)
}
return this
}
off(event: keyof T, listener: T[typeof event]) {
const listeners = this.listeners(event)
const index = listeners.indexOf(listener)
if (index !== -1) {
(this.handlers[event] as Array<T[typeof event]>).splice(index, 1)
}
// @ts-expect-error
this.emit('removeListener', event, listener)
return this
}
public removeListener(event: keyof T, listener: T[typeof event]) {
return this.off(event, listener)
}
public removeAllListeners(event: keyof T) {
this.handlers[event] = []
return this
}
public listenerCount(event: keyof T) {
return this.listeners(event).length
}
public listeners(event: keyof T) {
const item = this.handlers[event] as Array<T[typeof event]>
if (!item) {
return []
}
return item
}
public rawListeners(event: keyof T) {
return this.listenerCount(event)
}
public eventNames() {
return Object.keys(this.handlers)
}
public setMaxListeners(n: number) {
this.maxListeners = n
}
// Browser Listeners
addEventListener(event: keyof T, listener: T[typeof event]) {
return this.on(event, listener)
}
removeEventListener(event: keyof T, listener: T[typeof event]) {
return this.off(event, listener)
}
}

28
Websocket.ts Normal file
View File

@ -0,0 +1,28 @@
import WebSocket from "ws";
import Connection from "./Connection";
import Listener from "./Listener";
export default class Server extends Listener<{
connection: (connection: Connection) => void
open: () => void
}> {
private clients: Array<Connection> = []
public constructor(options: WebSocket.ServerOptions) {
super()
const server = new WebSocket.Server(options, () => this.emit('open'))
server.on('connection', (ws) => {
const connection = new Connection(ws)
connection.on('close', () => {
const index = this.clients.indexOf(connection)
this.clients.splice(index, 1)
})
this.emit('connection', connection)
})
}
public broadcast(message: string) {
this.clients.forEach((ws) => ws.send(message))
}
}

View File

@ -38,7 +38,7 @@ export default class Game {
this.onPlayerMove(cell, cellIndex)
}
})
cell.data('event-added', 'true')
cell.data('event-added', 'true')
}
// Put each cells in the corresponding column
@ -75,10 +75,17 @@ export default class Game {
playerShower.text(player ? this.playerColor : this.playerColor === 'red' ? 'yellow' : 'red')
if (player) {
this.isWaitingForPlayerMove = true
} else {
if (this.gameType === 'single' && this.gameStarted) {
setTimeout(() => {
this.makeIATakeTurn()
this.setPlayerTurn(true)
}, getRandomInt(200, 500))
}
}
}
public setupMultiplayer() {}
public setupMultiplayer() { }
public onPlayerMove(cell: DOMElement, xPos: number) {
if (this.isWaitingForPlayerMove) {
@ -87,10 +94,7 @@ export default class Game {
return
}
if (this.gameType === 'single' && this.gameStarted) {
setTimeout(() => {
this.makeIATakeTurn()
this.setPlayerTurn(true)
}, getRandomInt(200, 2000))
this.setPlayerTurn(false)
}
}
}

74
front-src/index.html Normal file
View File

@ -0,0 +1,74 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Puissance 4</title>
</head>
<body>
<div>Tour du joueur <span class="playerColor"></span></div>
<button class="restartBtn">Recommencer</button>
<div class="tableContainer">
<table>
<tr>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
</tr>
</table>
</div>
</body>
<script src="./main.ts"></script>
</html>

View File

@ -18,4 +18,8 @@ if (restartBtn) {
game.playerColor = 'yellow'
game.startSinglePlayer()
window.dm = DOMElement
const ws = new WebSocket('ws://localhost:8080')
ws.onmessage = (event) => {
console.log(event.data)
}

50
main.ts
View File

@ -1,4 +1,12 @@
import express from 'express'
import WebSocket from './Websocket'
import Connection from './Connection'
interface Comm {
type?: 'request' | 'join' | 'proxy'
id?: number
xPos?: number
}
const app = express();
@ -6,5 +14,47 @@ app.use(express.static('public'))
var server = app.listen(3000, function () {
const wsServer = new WebSocket({ port: 8080 })
wsServer.on('connection', (conn) => {
conn.send({ ok: true })
conn.on('message', (message: Comm | string) => {
if (typeof message === 'string') {
return
}
if (message?.type === 'request') {
handleRequest(conn)
}
if (message?.type === 'join' && message?.id) {
joinSession(conn, message.id)
}
if (message?.type === 'proxy' && message?.xPos) {
proxyRequest(conn, message.xPos)
}
})
})
console.log(`Example app listening at http://localhost:3000`);
});
function handleRequest(conn: Connection) {
// Générer un nombre aléatoire entre 100 et 999 et on vérifie qu'il n'y a pas déja de parti avec cette ID
// Rajouter la connection a cette partie
// renvoie au client l'ID
}
function joinSession(conn: Connection, session: number) {
// Rajouter la connection a cette partie
// renvoie au client l'ID
}
function proxyRequest(conn: Connection, xPos: number) {
// renvoyer a tout les clients du meme ID le xPos
}

2048
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@ -4,17 +4,21 @@
"main": "index.js",
"license": "MIT",
"dependencies": {
"@dzeio/dom-manager": "^1.2.2",
"@dzeio/dom-manager": "^1.2.3",
"@dzeio/listener": "^1.0.0",
"@types/express": "^4.17.9",
"@types/ws": "^7.4.0",
"express": "^4.17.1",
"nodemon": "^2.0.6",
"ts-node": "^9.1.1",
"ts-node-dev": "^1.1.1",
"typescript": "^4.1.3"
"typescript": "^4.1.3",
"ws": "^7.4.1"
},
"scripts": {
"start": "ts-node main.ts",
"dev-front": "parcel public/index.html",
"dev-front": "parcel front-src/index.html",
"build-front": "parcel build front-src/index.html --out-dir public",
"dev": "ts-node-dev main.ts"
},
"devDependencies": {

View File

@ -1,74 +1 @@
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Puissance 4</title>
</head>
<body>
<div>Tour du joueur <span class="playerColor"></span></div>
<button class="restartBtn">Recommencer</button>
<div class="tableContainer">
<table>
<tr>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
<td>1</td>
</tr>
<tr>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
<td>2</td>
</tr>
<tr>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
<td>3</td>
</tr>
<tr>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
<td>4</td>
</tr>
<tr>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
<td>5</td>
</tr>
<tr>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
<td>6</td>
</tr>
</table>
</div>
</body>
<script src="./main.ts"></script>
</html>
<!DOCTYPE html><html lang="fr"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Puissance 4</title><link rel="stylesheet" href="/main.491056a1.css"></head><body> <div>Tour du joueur <span class="playerColor"></span></div> <button class="restartBtn">Recommencer</button> <div class="tableContainer"> <table> <tr> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> <td>1</td> </tr> <tr> <td>2</td> <td>2</td> <td>2</td> <td>2</td> <td>2</td> <td>2</td> <td>2</td> </tr> <tr> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> <td>3</td> </tr> <tr> <td>4</td> <td>4</td> <td>4</td> <td>4</td> <td>4</td> <td>4</td> <td>4</td> </tr> <tr> <td>5</td> <td>5</td> <td>5</td> <td>5</td> <td>5</td> <td>5</td> <td>5</td> </tr> <tr> <td>6</td> <td>6</td> <td>6</td> <td>6</td> <td>6</td> <td>6</td> <td>6</td> </tr> </table> </div> </body><script src="/main.6ae8f54c.js"></script></html>

2
public/main.491056a1.css Normal file
View File

@ -0,0 +1,2 @@
body{margin:0;padding:0}.tableContainer{display:flex;align-items:center;justify-content:center;height:40rem}table{border:2px solid}td,tr{border:1px solid}td{height:10px;width:20px}td[data-color=red]{background:red}td[data-color=yellow]{background:#ff0}td[data-winner=true]{background:gold}
/*# sourceMappingURL=/main.491056a1.css.map */

View File

@ -0,0 +1 @@
{"version":3,"sources":["style.css"],"names":[],"mappings":"AAAA,KACI,QAAS,CACT,SAEJ,CAEA,gBACI,YAAa,CACb,kBAAmB,CACnB,sBAAuB,CACvB,YACJ,CAEA,MACI,gBAEJ,CAOA,MAHI,gBAOJ,CAJA,GAEI,WAAY,CACZ,UACJ,CAEA,mBACI,cACJ,CAEA,sBACI,eACJ,CAEA,qBACI,eACJ","file":"main.491056a1.css","sourceRoot":"../front-src","sourcesContent":["body {\n margin: 0;\n padding: 0;\n\n}\n\n.tableContainer {\n display: flex;\n align-items: center;\n justify-content: center;\n height: 40rem;\n}\n\ntable {\n border: 2px solid;\n\n}\n\ntr {\n\n border: 1px solid;\n}\n\ntd {\n border: 1px solid;\n height: 10px;\n width: 20px;\n}\n\ntd[data-color=\"red\"] {\n background: red\n}\n\ntd[data-color=\"yellow\"] {\n background: yellow\n}\n\ntd[data-winner=\"true\"] {\n background: gold\n}\n"]}

14
public/main.69e3d5fd.js Normal file
View File

@ -0,0 +1,14 @@
parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"iMte":[function(require,module,exports) {
},{}],"djAK":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(t,e){t instanceof HTMLElement?this.item=t:this.item=document.createElement(t,e)}static create(e,i){return new t(e,i)}static get(e,i){if(!(e instanceof HTMLElement)){const s=(i instanceof t?i.item:i||document).querySelector(e);if(!s)return;return new t(s)}return new t(e)}on(t,e,i){return this.item.addEventListener(t,e,i),this}off(t,e){return this.item.removeEventListener(t,e),this}text(t){return void 0!==t?(this.item.innerText=t,this):this.item.innerText}html(t){return void 0!==t?(this.item.innerHTML=t,this):this.item.innerHTML}addClass(...t){return this.item.classList.add(...t),this}setClass(...t){return this.item.classList.forEach(e=>{t.includes(e)||this.item.classList.remove(e)}),this.addClass(...t),this}classList(...t){if(!t){const t=[];return this.item.classList.forEach(e=>t.push(e)),t}return this.setClass(...t)}toggleClass(...t){for(const e of t)this.item.classList.toggle(e);return this}removeClass(...t){return this.item.classList.remove(...t),this}emit(t){return t in this.item?(this.item[t](),this):(this.item.dispatchEvent(new Event(t)),this)}attr(t,e){return void 0===e?this.item.getAttribute(t):null===e?(this.item.removeAttribute(t),this):"boolean"==typeof e?(this.item[t]=e,this):(this.item.setAttribute(t,e),this)}data(t,e){return this.attr(`data-${t}`,e)}style(t,e){return void 0===e?this.item.style[t]:(this.item.style[t]=e,this)}exist(){return!!this.item}placeBefore(e){e instanceof t&&(e=e.item);const i=e.parentElement;if(!i)throw new Error("can't place DOMElement before item because it has no parent");return i.insertBefore(this.item,e),this}placeAsChildOf(e){return e instanceof t&&(e=e.item),e.appendChild(this.item),this}place(t,e){return"before"===t?this.placeBefore(e):this.placeAsChildOf(e)}}exports.default=t;
},{}],"u1Ry":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=require(".");class t{constructor(e,t){this.query=e,this.source=t,this.items=[],this.refresh()}last(){return this.items[this.items.length-1]}each(e){this.items.forEach((t,s)=>e(t,s))}on(e,t,s){this.each(i=>i.on(e,t,s))}off(e,t){this.each(s=>s.off(e,t))}refresh(){this.items=[],(this.source instanceof e.DOMElement?this.source.item:this.source||document).querySelectorAll(this.query).forEach(t=>{const s=e.DOMElement.get(t);s&&this.items.push(s)})}[Symbol.iterator](){return this.items}}exports.default=t;
},{".":"jPsm"}],"jPsm":[function(require,module,exports) {
"use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DOMFleetManager=exports.DOMElement=void 0;const t=e(require("./DOMElement"));exports.DOMElement=t.default;const r=e(require("./DOMFleetManager"));exports.DOMFleetManager=r.default;
},{"./DOMElement":"djAK","./DOMFleetManager":"u1Ry"}],"jKSw":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@dzeio/dom-manager"),e=function(){function e(e){this.columns=[],this.gameStarted=!1,this.isWaitingForPlayerMove=!1,this.playerColor="red",this.gameType="single",this.table=new t.DOMElement(e),this.setupGeneral()}return e.prototype.setupGeneral=function(){var e=this;this.columns=[],new t.DOMFleetManager("tr",this.table).each(function(o,r){new t.DOMFleetManager("td",o).each(function(t,o){e.columns.length<=o&&e.columns.push([]),e.columns[o].push(t),t.text(" ").data("color",null).data("winner",null),null===t.data("event-added")&&(t.on("click",function(){e.gameStarted&&e.onPlayerMove(t,o)}),t.data("event-added","true"))}),console.log(e.columns)})},e.prototype.setRestartButton=function(t){var e=this;t.on("click",function(){e.setupGeneral(),e.startSinglePlayer()})},e.prototype.startSinglePlayer=function(){this.gameStarted=!0,this.isWaitingForPlayerMove=!0},e.prototype.setPlayerTurn=function(e){var r=this,i=t.DOMElement.get(".playerColor");i&&(i.text(e?this.playerColor:"red"===this.playerColor?"yellow":"red"),e?this.isWaitingForPlayerMove=!0:"single"===this.gameType&&this.gameStarted&&setTimeout(function(){r.makeIATakeTurn(),r.setPlayerTurn(!0)},o(200,500)))},e.prototype.setupMultiplayer=function(){},e.prototype.onPlayerMove=function(t,e){if(this.isWaitingForPlayerMove){if(this.isWaitingForPlayerMove=!this.makeMove(e,this.playerColor),this.isWaitingForPlayerMove)return;"single"===this.gameType&&this.gameStarted&&this.setPlayerTurn(!1)}},e.prototype.makeMove=function(t,e){for(var o,r=0,i=0;i<this.columns[t].length;i++){var n=this.columns[t][i],a=n.data("color");if(a||(o=n,r=i),a)break}return console.log("cellToFill",o),!!o&&(o.data("color",e),this.checkWinner(t,r),!0)},e.prototype.checkWinner=function(t,e){var o=this.checkDirection(t,e,"horizontal")||this.checkDirection(t,e,"vertical")||this.checkDirection(t,e,"diagonal-left")||this.checkDirection(t,e,"diagonal-right");if(!1===o)return console.log("FALSE"),!1;console.log(o),o.forEach(function(t){console.log(t.data("winner","true"))}),this.gameStarted=!1},e.prototype.checkDirection=function(t,e,o){console.log("Starting Check",o);var r=this.columns[t][e].data("color");if(!r)return!1;for(var i,n=[],a=0;a<4;a++){var l=t;("horizontal"===o||o.startsWith("diagonal"))&&(l=void 0!==i?t+a-i:t-a,"diagonal-left"===o&&(l=void 0!==i?t-a+i:t+a));var s=e;if(("vertical"===o||o.startsWith("diagonal"))&&(s=void 0!==i?e+a-i:e-a),console.log("index",a,"y",s,"Y exist",this.isYCorrect(s)),console.log("index",a,"x",l,"X exist",this.isXCorrect(l)),!this.isYCorrect(s)||!this.isXCorrect(l)){if(void 0===i){i=--a;continue}return!1}var c=this.columns[l][s];if(console.log("element color",c.data("color"),"color wanted",r),c.data("color")!==r){if(void 0===i){i=--a;continue}return!1}n.push(c)}return n},e.prototype.isXCorrect=function(t){return t>=0&&t<this.columns.length},e.prototype.isYCorrect=function(t){return t>=0&&t<this.columns[0].length},e.prototype.makeIATakeTurn=function(){for(var t=!1;!t;){var e=o(0,this.columns.length-1);t=this.makeMove(e,"red")}},e}();function o(t,e){return Math.floor(Math.random()*(e+1-t))+t}exports.default=e;
},{"@dzeio/dom-manager":"jPsm"}],"ZCfc":[function(require,module,exports) {
"use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),require("./style.css");var t=e(require("./Game")),r=require("@dzeio/dom-manager"),o=document.querySelector("table");if(!o)throw new Error("Table not found");var a=new t.default(o),l=r.DOMElement.get(".restartBtn");l&&a.setRestartButton(l),a.playerColor="yellow",a.startSinglePlayer();
},{"./style.css":"iMte","./Game":"jKSw","@dzeio/dom-manager":"jPsm"}]},{},["ZCfc"], null)
//# sourceMappingURL=/main.69e3d5fd.js.map

File diff suppressed because one or more lines are too long

14
public/main.6ae8f54c.js Normal file
View File

@ -0,0 +1,14 @@
parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"iMte":[function(require,module,exports) {
},{}],"djAK":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(t,e){t instanceof HTMLElement?this.item=t:this.item=document.createElement(t,e)}static create(e,i){return new t(e,i)}static get(e,i){if(!(e instanceof HTMLElement)){const s=(i instanceof t?i.item:i||document).querySelector(e);if(!s)return;return new t(s)}return new t(e)}on(t,e,i){return this.item.addEventListener(t,e,i),this}off(t,e){return this.item.removeEventListener(t,e),this}text(t){return void 0!==t?(this.item.innerText=t,this):this.item.innerText}html(t){return void 0!==t?(this.item.innerHTML=t,this):this.item.innerHTML}addClass(...t){return this.item.classList.add(...t),this}setClass(...t){return this.item.classList.forEach(e=>{t.includes(e)||this.item.classList.remove(e)}),this.addClass(...t),this}classList(...t){if(!t){const t=[];return this.item.classList.forEach(e=>t.push(e)),t}return this.setClass(...t)}toggleClass(...t){for(const e of t)this.item.classList.toggle(e);return this}removeClass(...t){return this.item.classList.remove(...t),this}emit(t){return t in this.item?(this.item[t](),this):(this.item.dispatchEvent(new Event(t)),this)}attr(t,e){return void 0===e?this.item.getAttribute(t):null===e?(this.item.removeAttribute(t),this):"boolean"==typeof e?(this.item[t]=e,this):(this.item.setAttribute(t,e),this)}data(t,e){return this.attr(`data-${t}`,e)}style(t,e){return void 0===e?this.item.style[t]:(this.item.style[t]=e,this)}exist(){return!!this.item}placeBefore(e){e instanceof t&&(e=e.item);const i=e.parentElement;if(!i)throw new Error("can't place DOMElement before item because it has no parent");return i.insertBefore(this.item,e),this}placeAsChildOf(e){return e instanceof t&&(e=e.item),e.appendChild(this.item),this}place(t,e){return"before"===t?this.placeBefore(e):this.placeAsChildOf(e)}}exports.default=t;
},{}],"u1Ry":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=require(".");class t{constructor(e,t){this.query=e,this.source=t,this.items=[],this.refresh()}last(){return this.items[this.items.length-1]}each(e){this.items.forEach((t,s)=>e(t,s))}on(e,t,s){this.each(i=>i.on(e,t,s))}off(e,t){this.each(s=>s.off(e,t))}refresh(){this.items=[],(this.source instanceof e.DOMElement?this.source.item:this.source||document).querySelectorAll(this.query).forEach(t=>{const s=e.DOMElement.get(t);s&&this.items.push(s)})}[Symbol.iterator](){return this.items}}exports.default=t;
},{".":"jPsm"}],"jPsm":[function(require,module,exports) {
"use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DOMFleetManager=exports.DOMElement=void 0;const t=e(require("./DOMElement"));exports.DOMElement=t.default;const r=e(require("./DOMFleetManager"));exports.DOMFleetManager=r.default;
},{"./DOMElement":"djAK","./DOMFleetManager":"u1Ry"}],"jKSw":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@dzeio/dom-manager"),e=function(){function e(e){this.columns=[],this.gameStarted=!1,this.isWaitingForPlayerMove=!1,this.playerColor="red",this.gameType="single",this.table=new t.DOMElement(e),this.setupGeneral()}return e.prototype.setupGeneral=function(){var e=this;this.columns=[],new t.DOMFleetManager("tr",this.table).each(function(o,r){new t.DOMFleetManager("td",o).each(function(t,o){e.columns.length<=o&&e.columns.push([]),e.columns[o].push(t),t.text(" ").data("color",null).data("winner",null),null===t.data("event-added")&&(t.on("click",function(){e.gameStarted&&e.onPlayerMove(t,o)}),t.data("event-added","true"))}),console.log(e.columns)})},e.prototype.setRestartButton=function(t){var e=this;t.on("click",function(){e.setupGeneral(),e.startSinglePlayer()})},e.prototype.startSinglePlayer=function(){this.gameStarted=!0,this.isWaitingForPlayerMove=!0},e.prototype.setPlayerTurn=function(e){var r=this,i=t.DOMElement.get(".playerColor");i&&(i.text(e?this.playerColor:"red"===this.playerColor?"yellow":"red"),e?this.isWaitingForPlayerMove=!0:"single"===this.gameType&&this.gameStarted&&setTimeout(function(){r.makeIATakeTurn(),r.setPlayerTurn(!0)},o(200,500)))},e.prototype.setupMultiplayer=function(){},e.prototype.onPlayerMove=function(t,e){if(this.isWaitingForPlayerMove){if(this.isWaitingForPlayerMove=!this.makeMove(e,this.playerColor),this.isWaitingForPlayerMove)return;"single"===this.gameType&&this.gameStarted&&this.setPlayerTurn(!1)}},e.prototype.makeMove=function(t,e){for(var o,r=0,i=0;i<this.columns[t].length;i++){var n=this.columns[t][i],a=n.data("color");if(a||(o=n,r=i),a)break}return console.log("cellToFill",o),!!o&&(o.data("color",e),this.checkWinner(t,r),!0)},e.prototype.checkWinner=function(t,e){var o=this.checkDirection(t,e,"horizontal")||this.checkDirection(t,e,"vertical")||this.checkDirection(t,e,"diagonal-left")||this.checkDirection(t,e,"diagonal-right");if(!1===o)return console.log("FALSE"),!1;console.log(o),o.forEach(function(t){console.log(t.data("winner","true"))}),this.gameStarted=!1},e.prototype.checkDirection=function(t,e,o){console.log("Starting Check",o);var r=this.columns[t][e].data("color");if(!r)return!1;for(var i,n=[],a=0;a<4;a++){var l=t;("horizontal"===o||o.startsWith("diagonal"))&&(l=void 0!==i?t+a-i:t-a,"diagonal-left"===o&&(l=void 0!==i?t-a+i:t+a));var s=e;if(("vertical"===o||o.startsWith("diagonal"))&&(s=void 0!==i?e+a-i:e-a),console.log("index",a,"y",s,"Y exist",this.isYCorrect(s)),console.log("index",a,"x",l,"X exist",this.isXCorrect(l)),!this.isYCorrect(s)||!this.isXCorrect(l)){if(void 0===i){i=--a;continue}return!1}var c=this.columns[l][s];if(console.log("element color",c.data("color"),"color wanted",r),c.data("color")!==r){if(void 0===i){i=--a;continue}return!1}n.push(c)}return n},e.prototype.isXCorrect=function(t){return t>=0&&t<this.columns.length},e.prototype.isYCorrect=function(t){return t>=0&&t<this.columns[0].length},e.prototype.makeIATakeTurn=function(){for(var t=!1;!t;){var e=o(0,this.columns.length-1);t=this.makeMove(e,"red")}},e}();function o(t,e){return Math.floor(Math.random()*(e+1-t))+t}exports.default=e;
},{"@dzeio/dom-manager":"jPsm"}],"ZCfc":[function(require,module,exports) {
"use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),require("./style.css");var t=e(require("./Game")),r=require("@dzeio/dom-manager"),o=document.querySelector("table");if(!o)throw new Error("Table not found");var a=new t.default(o),l=r.DOMElement.get(".restartBtn");l&&a.setRestartButton(l),a.playerColor="yellow",a.startSinglePlayer();var n=new WebSocket("ws://localhost:8080");n.onmessage=function(e){console.log(e.data)};
},{"./style.css":"iMte","./Game":"jKSw","@dzeio/dom-manager":"jPsm"}]},{},["ZCfc"], null)
//# sourceMappingURL=/main.6ae8f54c.js.map

File diff suppressed because one or more lines are too long

14
public/main.e275d3e4.js Normal file
View File

@ -0,0 +1,14 @@
parcelRequire=function(e,r,t,n){var i,o="function"==typeof parcelRequire&&parcelRequire,u="function"==typeof require&&require;function f(t,n){if(!r[t]){if(!e[t]){var i="function"==typeof parcelRequire&&parcelRequire;if(!n&&i)return i(t,!0);if(o)return o(t,!0);if(u&&"string"==typeof t)return u(t);var c=new Error("Cannot find module '"+t+"'");throw c.code="MODULE_NOT_FOUND",c}p.resolve=function(r){return e[t][1][r]||r},p.cache={};var l=r[t]=new f.Module(t);e[t][0].call(l.exports,p,l,l.exports,this)}return r[t].exports;function p(e){return f(p.resolve(e))}}f.isParcelRequire=!0,f.Module=function(e){this.id=e,this.bundle=f,this.exports={}},f.modules=e,f.cache=r,f.parent=o,f.register=function(r,t){e[r]=[function(e,r){r.exports=t},{}]};for(var c=0;c<t.length;c++)try{f(t[c])}catch(e){i||(i=e)}if(t.length){var l=f(t[t.length-1]);"object"==typeof exports&&"undefined"!=typeof module?module.exports=l:"function"==typeof define&&define.amd?define(function(){return l}):n&&(this[n]=l)}if(parcelRequire=f,i)throw i;return f}({"iMte":[function(require,module,exports) {
},{}],"djAK":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});class t{constructor(t,e){t instanceof HTMLElement?this.item=t:this.item=document.createElement(t,e)}static create(e,i){return new t(e,i)}static get(e,i){if(!(e instanceof HTMLElement)){const s=(i instanceof t?i.item:i||document).querySelector(e);if(!s)return;return new t(s)}return new t(e)}on(t,e,i){return this.item.addEventListener(t,e,i),this}off(t,e){return this.item.removeEventListener(t,e),this}text(t){return void 0!==t?(this.item.innerText=t,this):this.item.innerText}html(t){return void 0!==t?(this.item.innerHTML=t,this):this.item.innerHTML}addClass(...t){return this.item.classList.add(...t),this}setClass(...t){return this.item.classList.forEach(e=>{t.includes(e)||this.item.classList.remove(e)}),this.addClass(...t),this}classList(...t){if(!t){const t=[];return this.item.classList.forEach(e=>t.push(e)),t}return this.setClass(...t)}toggleClass(...t){for(const e of t)this.item.classList.toggle(e);return this}removeClass(...t){return this.item.classList.remove(...t),this}emit(t){return t in this.item?(this.item[t](),this):(this.item.dispatchEvent(new Event(t)),this)}attr(t,e){return void 0===e?this.item.getAttribute(t):null===e?(this.item.removeAttribute(t),this):"boolean"==typeof e?(this.item[t]=e,this):(this.item.setAttribute(t,e),this)}data(t,e){return this.attr(`data-${t}`,e)}style(t,e){return void 0===e?this.item.style[t]:(this.item.style[t]=e,this)}exist(){return!!this.item}placeBefore(e){e instanceof t&&(e=e.item);const i=e.parentElement;if(!i)throw new Error("can't place DOMElement before item because it has no parent");return i.insertBefore(this.item,e),this}placeAsChildOf(e){return e instanceof t&&(e=e.item),e.appendChild(this.item),this}place(t,e){return"before"===t?this.placeBefore(e):this.placeAsChildOf(e)}}exports.default=t;
},{}],"u1Ry":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});const e=require(".");class t{constructor(e,t){this.query=e,this.source=t,this.items=[],this.refresh()}last(){return this.items[this.items.length-1]}each(e){this.items.forEach((t,s)=>e(t,s))}on(e,t,s){this.each(i=>i.on(e,t,s))}off(e,t){this.each(s=>s.off(e,t))}refresh(){this.items=[],(this.source instanceof e.DOMElement?this.source.item:this.source||document).querySelectorAll(this.query).forEach(t=>{const s=e.DOMElement.get(t);s&&this.items.push(s)})}[Symbol.iterator](){return this.items}}exports.default=t;
},{".":"jPsm"}],"jPsm":[function(require,module,exports) {
"use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),exports.DOMFleetManager=exports.DOMElement=void 0;const t=e(require("./DOMElement"));exports.DOMElement=t.default;const r=e(require("./DOMFleetManager"));exports.DOMFleetManager=r.default;
},{"./DOMElement":"djAK","./DOMFleetManager":"u1Ry"}],"jKSw":[function(require,module,exports) {
"use strict";Object.defineProperty(exports,"__esModule",{value:!0});var t=require("@dzeio/dom-manager"),e=function(){function e(e){this.columns=[],this.gameStarted=!1,this.isWaitingForPlayerMove=!1,this.playerColor="red",this.gameType="single",this.table=new t.DOMElement(e),this.setupGeneral()}return e.prototype.setupGeneral=function(){var e=this;this.columns=[],new t.DOMFleetManager("tr",this.table).each(function(o,r){new t.DOMFleetManager("td",o).each(function(t,o){e.columns.length<=o&&e.columns.push([]),e.columns[o].push(t),t.text(" ").data("color",null).data("winner",null),null===t.data("event-added")&&(t.on("click",function(){e.gameStarted&&e.onPlayerMove(t,o)}),t.data("event-added","true"))}),console.log(e.columns)})},e.prototype.setRestartButton=function(t){var e=this;t.on("click",function(){e.setupGeneral(),e.startSinglePlayer()})},e.prototype.startSinglePlayer=function(){this.gameStarted=!0,this.isWaitingForPlayerMove=!0},e.prototype.setPlayerTurn=function(e){var r=this,i=t.DOMElement.get(".playerColor");i&&(i.text(e?this.playerColor:"red"===this.playerColor?"yellow":"red"),e?this.isWaitingForPlayerMove=!0:"single"===this.gameType&&this.gameStarted&&setTimeout(function(){r.makeIATakeTurn(),r.setPlayerTurn(!0)},o(200,500)))},e.prototype.setupMultiplayer=function(){},e.prototype.onPlayerMove=function(t,e){if(this.isWaitingForPlayerMove){if(this.isWaitingForPlayerMove=!this.makeMove(e,this.playerColor),this.isWaitingForPlayerMove)return;"single"===this.gameType&&this.gameStarted&&this.setPlayerTurn(!1)}},e.prototype.makeMove=function(t,e){for(var o,r=0,i=0;i<this.columns[t].length;i++){var n=this.columns[t][i],a=n.data("color");if(a||(o=n,r=i),a)break}return console.log("cellToFill",o),!!o&&(o.data("color",e),this.checkWinner(t,r),!0)},e.prototype.checkWinner=function(t,e){var o=this.checkDirection(t,e,"horizontal")||this.checkDirection(t,e,"vertical")||this.checkDirection(t,e,"diagonal-left")||this.checkDirection(t,e,"diagonal-right");if(!1===o)return console.log("FALSE"),!1;console.log(o),o.forEach(function(t){console.log(t.data("winner","true"))}),this.gameStarted=!1},e.prototype.checkDirection=function(t,e,o){console.log("Starting Check",o);var r=this.columns[t][e].data("color");if(!r)return!1;for(var i,n=[],a=0;a<4;a++){var l=t;("horizontal"===o||o.startsWith("diagonal"))&&(l=void 0!==i?t+a-i:t-a,"diagonal-left"===o&&(l=void 0!==i?t-a+i:t+a));var s=e;if(("vertical"===o||o.startsWith("diagonal"))&&(s=void 0!==i?e+a-i:e-a),console.log("index",a,"y",s,"Y exist",this.isYCorrect(s)),console.log("index",a,"x",l,"X exist",this.isXCorrect(l)),!this.isYCorrect(s)||!this.isXCorrect(l)){if(void 0===i){i=--a;continue}return!1}var c=this.columns[l][s];if(console.log("element color",c.data("color"),"color wanted",r),c.data("color")!==r){if(void 0===i){i=--a;continue}return!1}n.push(c)}return n},e.prototype.isXCorrect=function(t){return t>=0&&t<this.columns.length},e.prototype.isYCorrect=function(t){return t>=0&&t<this.columns[0].length},e.prototype.makeIATakeTurn=function(){for(var t=!1;!t;){var e=o(0,this.columns.length-1);t=this.makeMove(e,"red")}},e}();function o(t,e){return Math.floor(Math.random()*(e+1-t))+t}exports.default=e;
},{"@dzeio/dom-manager":"jPsm"}],"ZCfc":[function(require,module,exports) {
"use strict";var e=this&&this.__importDefault||function(e){return e&&e.__esModule?e:{default:e}};Object.defineProperty(exports,"__esModule",{value:!0}),require("./style.css");var t=e(require("./Game")),r=require("@dzeio/dom-manager"),o=document.querySelector("table");if(!o)throw new Error("Table not found");var a=new t.default(o),l=r.DOMElement.get(".restartBtn");l&&a.setRestartButton(l),a.playerColor="yellow",a.startSinglePlayer();var n=new WebSocket("http://localhost:8080");n.onmessage=function(e){console.log(e.data)};
},{"./style.css":"iMte","./Game":"jKSw","@dzeio/dom-manager":"jPsm"}]},{},["ZCfc"], null)
//# sourceMappingURL=/main.e275d3e4.js.map

File diff suppressed because one or more lines are too long