Skip to content

Instantly share code, notes, and snippets.

@clonalejandro
Last active January 19, 2020 22:16
Show Gist options
  • Save clonalejandro/3dc18c836fa5ae07094f6aff5538aad4 to your computer and use it in GitHub Desktop.
Save clonalejandro/3dc18c836fa5ae07094f6aff5538aad4 to your computer and use it in GitHub Desktop.
3 En raya en javascript
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