class Snake {
bodyParts = []
direction = 'north'
alive = true
constructor(startX, startY) {
this.bodyParts.push([startX, startY])
}
/*
* Udela jeden krok hada
* */
step() {
if (!this.alive) {
return false
}
const headPosition = this.bodyParts[0]
const newPosition = [headPosition[0], headPosition[1]]
if (direction == 'north') {
newPosition[1]--
} else if (direction == 'south') {
newPosition[1]++
} else if (direction == 'west') {
newPosition[0]--
} else if (direction == 'east') {
newPosition[0]++
} else {
throw "Unknown snake direction"
}
if (this.collides(newPosition)) {
// had narazil
this.alive = false
return
}
let snakeHasEaten = false
// todo: pokud je na newPosition jablicko, rekni ze se had nakrmil
// pridani noveho prvku zleva = vytvoreni "nove" hlavy hada
this.bodyParts.unshift(newPosition)
if (!snakeHasEaten) {
// odebrani posledniho prvku tela ("posun" ocasu)
this.bodyParts.pop()
}
}
setDirection(direction) {
if (['north', 'east', 'south', 'west'].includes(direction)) {
this.direction = direction
} else {
throw "Unknown direction in setDirection"
}
}
collides(position) {
for (let i = 0; i < this.bodyParts.length; i++) {
if (position[0] == this.bodyParts[i][0] && position[1] == this.bodyParts[i][1]) {
return true
}
}
// jinak
return false
}
draw(paintFunction){
for(let i = 0; i < this.bodyParts.length; i++){
paintFunction(this.bodyParts[i][0], this.bodyParts[i][1], 'green')
}
}
}
class Game {
width = 0
height = 0
htmlParent = null
gameObjects = []
constructor(width, height, htmlParent) {
this.width = width
this.height = height
this.htmlParent = htmlParent
for (let y = 0; y < this.height; y++) {
let row = document.createElement('tr')
for (let x = 0; x < this.height; x++) {
let cell = document.createElement('td')
cell.id = `cell-${x}-${y}`
cell.class = 'cell'
row.appendChild(cell)
}
this.htmlParent.appendChild(row)
}
// todo: setInterval na gameTick
}
/*
Funkce kterou podstrcime hadovi, aby se mohl vykreslit
*/
drawElement(x, y, color) {
const cell = document.getElementById(`cell-${x}-${y}`)
cell.style.background = color
}
gameTick() {
// Smaz vsechno
for (let y = 0; y < this.height; y++) {
for (let x = 0; x < this.height; x++) {
this.drawElement(x, y, 'white')
}
}
// Vykresli vsechny objekty znovu
for (const object of this.gameObjects) {
object.draw(this.drawElement)
}
}
}