Skip to content
Snippets Groups Projects
snake.ts 3 KiB
Newer Older
  • Learn to ignore specific revisions
  • Jonas Leder's avatar
    Jonas Leder committed
    let fieldSize = 20;
    
    let snakeField:HTMLElement = document.getElementById("snakeField");
    
    let snake:number[][] = [[10, 10], [10, 11], [10, 12]];
    let snakedir:number = 2;
    
    Jonas Leder's avatar
    Jonas Leder committed
    let target:number[] = []
    let score = 0;
    
    function getRandomInt(max:number) {
        return Math.floor(Math.random() * Math.floor(max)) + 1;
    }
    
    function drawField(){
        let fieldHTML:string = "";
        for(let i:number = 1; i <= fieldSize; i++){
            for(let x:number = 1; x <= fieldSize; x++){
                let elementClass:string = "";
                for(let y:number = 0; y<snake.length; y++){
                    let currentSnake = snake[y];
                    if(currentSnake[0] == i && currentSnake[1] == x){
    
                        if(y == snake.length - 1)
                            elementClass += " snake-head";
                        else
                            elementClass += " snake-body";
    
    Jonas Leder's avatar
    Jonas Leder committed
                    }
                }
    
                if(target[0] == i && target[1] == x)
                    elementClass += " target";
    
                fieldHTML += `<span id="field-${i}-${x}" class="${elementClass}"></span>`;
            }
            if(i < fieldSize) {
                fieldHTML += "<br>"
            }
        }
        snakeField.innerHTML = fieldHTML;
    }
    
    function moveSnake(){
        let head:number[] = snake[snake.length - 1].slice(0);
        switch (snakedir){
            case 0:
                head[0]++;
                break;
            case 1:
                head[0]--;
                break;
            case 2:
                head[1]++;
                break;
            case 3:
                head[1]--;
                break;
        }
        if (!(snake.length - 3 < score))
            snake.shift();
        snake.push(head);
    }
    
    
    Jonas Leder's avatar
    Jonas Leder committed
    function detectEnd(){
        let gameFinished:boolean = false;
        for(let i:number = 0; i < snake.length; i++){
            let snake1:number[] = snake[i];
            for (let x:number = i + 1; x < snake.length; x++){
                let snake2:number[] = snake[x]
                if(snake1[0] == snake2[0] && snake1[1] == snake2[1])
                    gameFinished = true
            }
            if(snake1[0] < 0 || snake1[0] > fieldSize || snake1[1] < 0 || snake1[1] > fieldSize)
                gameFinished = true
        }
    
        if(gameFinished){
            clearInterval(mainLoop);
            alert("Game Over, your score: " + score);
        }
    }
    let mainLoop = window.setInterval(function(){
    
    Jonas Leder's avatar
    Jonas Leder committed
        for(let y:number = 0; y<snake.length; y++){
            let currentSnake = snake[y];
            if(currentSnake[0] == target[0] && currentSnake[1] == target[1]){
                score++;
                target = [getRandomInt(fieldSize), getRandomInt(fieldSize)];
            }
        }
    
        moveSnake();
        detectEnd()
    
    Jonas Leder's avatar
    Jonas Leder committed
        drawField();
    }, 1000);
    
    //keypress handler
    document.addEventListener('keydown', function(event) {
        const key:string = event.key;
        switch (key){
            case "ArrowRight":
                snakedir = 2
                break;
            case "ArrowLeft":
                snakedir = 3;
                break;
            case "ArrowUp":
                snakedir = 1;
                break;
            case "ArrowDown":
                snakedir = 0
        }
    });
    
    target = [getRandomInt(fieldSize), getRandomInt(fieldSize)];
    drawField();