Last active
January 19, 2020 22:16
-
-
Save clonalejandro/3dc18c836fa5ae07094f6aff5538aad4 to your computer and use it in GitHub Desktop.
3 En raya en javascript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var isEnded = false | |
const board = { | |
rows: 3, | |
columns: 3, | |
map: [], | |
isEmpty: () => !board.map.length, | |
isFull: () => !board.map.some(row => row.includes(0)) | |
} | |
const players = { | |
player1: { | |
name: 'player1', | |
id: 1, | |
asks: [] | |
}, | |
player2: { | |
name: 'player2', | |
id: 2, | |
asks: [] | |
} | |
} | |
function isNull(val){ | |
return val == null || val == undefined | |
} | |
function fillBoard(value = 0){ | |
const fillRows = callback => { | |
for (let i = 0; i < board.rows; i++){ | |
board.map.push([]) | |
callback(i) | |
} | |
} | |
const fillColumns = callback => { | |
for (let i = 0; i < board.columns; i++) | |
callback(i) | |
} | |
fillRows(row => | |
fillColumns(column => board.map[row][column] = value) | |
) | |
} | |
function checkBoard(player, position){ | |
const token = player.id | |
const check = (rows, columns) => { | |
if (!board.map[rows[0]] || !board.map[rows[1]]) | |
return false | |
return board.map[rows[0]][columns[0]] == token && | |
board.map[rows[1]][columns[1]] == token | |
} | |
const topRigth = () => check( | |
[position.row +1, position.row +2], | |
[position.column +1, position.column +2] | |
) | |
const topLeft = () => check( | |
[position.row +1, position.row +2], | |
[position.column -1, position.column -2] | |
) | |
const bottomRigth = () => check( | |
[position.row -1, position.row -2], | |
[position.column +1, position.column +2] | |
) | |
const bottomLeft = () => check( | |
[position.row -1, position.row -2], | |
[position.column -1, position.column -2] | |
) | |
const betweenHorizontal = () => check( | |
[position.row +1, position.row -1], | |
[position.column, position.column] | |
) | |
const betweenVertical = () => check( | |
[position.row, position.row], | |
[position.column +1, position.column -1] | |
) | |
const top = () => check( | |
[position.row +1, position.row +2], | |
[position.column, position.column] | |
) | |
const bottom = () => check( | |
[position.row -1, position.row -2], | |
[position.column, position.column] | |
) | |
const right = () => check( | |
[position.row, position.row], | |
[position.column +1, position.column +2] | |
) | |
const left = () => check( | |
[position.row, position.row], | |
[position.column -1, position.column -2] | |
) | |
const checks = [top(), bottom(), right(), left(), betweenHorizontal(), betweenVertical(), bottomRigth(), bottomLeft(), topRigth(), topLeft()] | |
const isWinner = checks.includes(true) | |
if (isWinner) return { | |
code: 1, | |
message: `The game has ended the winner is: ${player.name}` | |
} | |
if (board.isFull()) return { | |
code: 2, | |
message: 'The game has ended in a draw' | |
} | |
return { | |
code: 0 | |
} | |
} | |
function gameThread(){ | |
const askToPlayer = message => parseInt(prompt(message)) | |
if (board.isEmpty()) | |
fillBoard() | |
const player = players.player2.asks < players.player1.asks && !!players.player1.asks.length ? players.player2 : players.player1 | |
const token = player.id | |
const position = { | |
row: askToPlayer(`Player '${player.name}'\nWrite a row value from 0 to 2`), | |
column: askToPlayer(`Player '${player.name}'\nWrite a column value from 0 to 2`) | |
} | |
const logErr = () => alert('The position writted is in use or is undefined') | |
if (isNull(position.row) || isNull(position.column) || isNaN(position.row) || isNaN(position.column)){ | |
logErr() | |
return gameThread() | |
} | |
if (board.map[position.row][position.column] != 0){ | |
logErr() | |
return gameThread() | |
} | |
player.asks.push(position) | |
board.map[position.row][position.column] = token | |
const checkRes = checkBoard(player, position) | |
if (checkRes.code != 0){ | |
isEnded = true | |
alert(checkRes.message) | |
} | |
} | |
while (!isEnded) | |
gameThread() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment