본문 바로가기
Coding/JavaScript

[JavaScript] 자바스크립트로 초간단 미사일 피하기 게임 만들기 2 !!

by 포스트it 2023. 10. 18.
반응형

 

[JavaScript] 자바스크립트로 초간단 미사일 피하기 게임 만들기 2 !!

전에는 마우스로 미사일을 피했는데 이번에는

키보드로 피하면서 미사일이 알파뱃으로 날라옵니다 ㅎㅎ

알파뱃 입력해서 미사일을 없애면서 피하는 게임입니다 :)

 

주석으로 게임관련 코드 설명해놨으니 취향에 맞게 커스텀하시면 됩니다 ㅎ

 

예제코드
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <canvas id="gameCanvas" width="500" height="500"></canvas>
</body>
</html>
<script>
    // 게임 상태
let missiles = [];
let score = 0;
let lives = 3;
let difficulty = 3; // 난이도 (1: 쉬움, 2: 보통, 3: 어려움)

// 플레이어 위치
let playerX = 250;
let playerY = 450;

// 캔버스 설정
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');

// 키보드 입력 처리
document.addEventListener('keydown', keyDownHandler);

function keyDownHandler(event) {
    if (event.key === 'ArrowLeft') {
        playerX -= 10;
    } else if (event.key === 'ArrowRight') {
        playerX += 10;
    } else if (event.key === 'ArrowUp') {
        playerY -= 10;
    } else if (event.key === 'ArrowDown') {
        playerY += 10;
    } else if (event.keyCode >= 65 && event.keyCode <= 90) {
        // 알파벳 키 입력 처리
        let letter = event.key.toUpperCase();
        for (let i = 0; i < missiles.length; i++) {
            if (missiles[i].letter === letter) {
                missiles.splice(i, 1);
                score++;
                break;
            }
        }
    }
}

// 미사일 생성
function createMissile() {
    let x = Math.random() * 500;
    let y = 0;
    let letter = String.fromCharCode(65 + Math.floor(Math.random() * 26));
    let size = Math.random() * 30 + 10; // 미사일 크기 (10 ~ 40)
    missiles.push({x: x, y: y, letter: letter, size: size});
}

// 게임 업데이트
function updateGame() {
    // 화면 지우기
    ctx.clearRect(0, 0, canvas.width, canvas.height);

    // 플레이어 그리기
    ctx.beginPath();
    ctx.fillStyle = 'blue';
    ctx.arc(playerX, playerY, 20, 0, Math.PI * 2);
    ctx.fill();
    ctx.closePath();

    // 미사일 그리기
    ctx.fillStyle = 'red';
    for (let i = 0; i < missiles.length; i++) {
        let missile = missiles[i];
        ctx.font = `${missile.size}px Arial`;
        ctx.fillText(missile.letter, missile.x, missile.y);
        missile.y += 5;

        // 미사일이 플레이어에게 닿았는지 확인
        if (missile.y > playerY - 20 && missile.y < playerY + 20 && missile.x > playerX - 20 && missile.x < playerX + 20) {
            lives--;
            missiles.splice(i, 1);
            i--;
        }
    }

    // 점수와 생명력 표시
    ctx.font = '20px Arial';
    ctx.fillText(`Score: ${score}`, 10, 20);
    ctx.fillText(`Lives: ${lives}`, 10, 40);

    // 미사일 생성
    if (Math.random() < score / (1000 / difficulty) + 0.01) {
        createMissile();
    }

    // 게임오버 체크
    if (lives === 0) {
        clearInterval(intervalId);
        alert('Game Over!');
    }
}

// 게임 시작
let intervalId = setInterval(updateGame, 20);
</script>

결과값

 

728x90
반응형

댓글