WBE_Miniprojekt/code/public/gamelogic.js

224 lines
5.7 KiB
JavaScript
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
* This solution sould be considered as a proof of concept the code
* definitely needs some cleanup and documentation
*/
import { render } from "./lib/suiweb.js"
let datakey = ''
let state = {
board: [
[ '', '', '', '', '', '', '' ],
[ '', '', '', '', '', '', '' ],
[ '', '', '', '', '', '', '' ],
[ '', '', '', '', '', '', '' ],
[ '', '', '', '', '', '', '' ],
[ '', '', '', '', '', '', '' ]
],
next: 'blue'
}
let stateSeq = []
const App = () => [Board, {board: state.board}]
const Board = ({board}) => {
let flatBoard = [].concat(...board)
let fields = flatBoard.map((type) => [Field, {type}])
return (
["div", {className: "board"}, ...fields]
)
}
const Field = ({type}) => {
return (
["div", {className: "field"},
["div", {className: ("piece " + type)}]]
)
}
const url = "http://localhost:3000/"
const SERVICE = "http://localhost:3000/api/data/c4state?api-key=c4game"
// Initialize game
//
function initGame () {
console.log("initializing game")
fetch(url + "api/data/" + datakey + "?api-key=c4game", {
method: 'POST',
headers: { 'Content-type': 'application/json' },
body: JSON.stringify(state)
}).then(response => response.json())
.then(data => {
datakey = data.id
})
let board = showBoard()
attachEventHandler(board)
document.getElementById("loadFromServer").addEventListener("click", event => {loadStateFromServer() })
document.getElementById("saveToServer").addEventListener("click", event => {saveStateToServer() })
document.getElementById("loadFromStorage").addEventListener("click", event => {loadStateFromLocalStorage() })
document.getElementById("saveToStorage").addEventListener("click", event => {saveStateToLocalStorage() })
document.getElementById("clearStorage").addEventListener("click", event => {clearLocalStorage() })
document.getElementById("undo").addEventListener("click", event => {undo() })
}
// Show board
function showBoard () {
console.log("showing board")
let actualPlayerText = document.getElementById("actualPlayer")
if(actualPlayerText){
actualPlayerText.innerText = state.next
}
const app = document.querySelector(".app")
render([App], app)
return app
}
// Attach event handler to board
//
function attachEventHandler (board) {
console.log("attaching Eventhandler")
// your implementation
board.addEventListener("click", event => {
let field = event.target
if(field.classList.contains("piece")){
field = field.parentNode
}
let column = Array.prototype.indexOf.call(field.parentNode.children, field) % state.board[1].length
console.log("calculated column", column)
setColumn(column)
showBoard()
})
}
function setColumn(column) {
console.log("setting Column")
let row = state.board.length - 1
const column_number = column
while(row >= 0){
if(state.board[row][column_number] !== ''){
row--
} else {
if(state.next === ''){
console.log("not setting Field becuase there is a winner.")
} else {
setField(row, column_number)
}
break
}
}
}
function setField(row, column) {
stateSeq.push(state)
state = setInObj(state, "board", setInList(state.board, row, setInList(state.board[row], column, state.next)))
//state.board[row][column] = state.next
showBoard()
if(connect4Winner(state.next, state.board)){
document.getElementById("state-text").innerText = "Player " + state.next + " won!"
state = setInObj(state, "next", "")
//state.next = ''
} else {
switchNextColor()
}
}
function switchNextColor() {
if(state.next === "red") {
state = setInObj(state, "next", "blue")
//state.next = "blue"
} else {
state = setInObj(state, "next", "red")
//state.next = "red"
}
}
// Get current state from server and re-draw board
//
function loadStateFromServer () {
// ...
// your implementation
// ...
console.log("loading State from Server")
fetch(url + "api/data/" + datakey + "?api-key=c4game", {
method: 'GET',
headers: { 'Content-type': 'application/json' }
}).then(response => response.json())
.then(data => {
state = data
stateSeq = []
showBoard()
})
}
// Put current state to server
//
function saveStateToServer () {
console.log("saving state To Server")
fetch(url + "api/data/" + datakey + "?api-key=c4game", {
method: 'PUT',
headers: { 'Content-type': 'application/json' },
body: JSON.stringify(state)
}).then(response => response.json())
.then(data => {
state = data
showBoard()
})
}
function loadStateFromLocalStorage() {
console.log("loading State from LocalStorage")
if(localStorage.getItem("state")){
state = JSON.parse(localStorage.getItem("state"))
stateSeq = []
} else {
console.log("no saved State in Localstorage")
}
showBoard()
}
function saveStateToLocalStorage() {
console.log("saving State to LocalStorage")
localStorage.setItem("state", JSON.stringify(state))
}
function clearLocalStorage() {
console.log("clearing localStorage")
localStorage.clear()
}
function undo() {
if(stateSeq.length > 0) {
console.log("undo")
state = stateSeq.pop()
showBoard()
}
}
function setInList(lst, idx, val) {
const newList = []
lst.forEach(element => {
newList.push(element)
});
newList[idx] = val
return newList
}
function setInObj(obj, attr, val) {
const newObject = {}
Object.keys(obj).forEach(key => {
newObject[key] = obj[key]
})
newObject[attr] = val
return newObject
}
export {initGame}