SMALL

 

html  형식이라서 바로  적용 해서사용 하시면 될것 같네여  



<!DOCTYPE html>

<html>

<head>

    <meta charset="UTF-8">

    <title>레트로 갤러그 - 20단계</title>

    <style>

        body {

            margin: 0;

            display: flex;

            justify-content: center;

            align-items: center;

            min-height: 100vh;

            background-color: #000;

            font-family: Arial, sans-serif;

        }

        #gameContainer {

            position: relative;

        }

        #gameCanvas {

            border: 2px solid #333;

            background-color: #000;

        }

        #gameInfo {

            color: white;

            position: absolute;

            top: -30px;

            left: 10px;

            font-size: 20px;

            width: 100%;

            display: flex;

            justify-content: space-between;

        }

        #controls {

            color: white;

            text-align: center;

            margin-top: 10px;

        }

    </style>

</head>

<body>

    <div id="gameContainer">

        <div id="gameInfo">

            <span>점수: <span id="scoreValue">0</span></span>

            <span>레벨: <span id="levelValue">1</span></span>

        </div>

        <canvas id="gameCanvas" width="400" height="600"></canvas>

        <div id="controls">

            조작: ← → 키로 이동, 스페이스바로 발사

        </div>

    </div>

 

    <script>

        const canvas = document.getElementById('gameCanvas');

        const ctx = canvas.getContext('2d');

        const scoreElement = document.getElementById('scoreValue');

        const levelElement = document.getElementById('levelValue');

 

        // 게임 상태

        let score = 0;

        let level = 1;

        let gameOver = false;

        let levelCompleted = false;

 

        // 플레이어 우주선

        const player = {

            x: canvas.width / 2,

            y: canvas.height - 50,

            width: 30,

            height: 30,

            speed: 5,

            bullets: []

        };

 

        // 적 우주선들

        let enemies = [];

        const enemyWidth = 30;

        const enemyHeight = 30;

        const enemyPadding = 20;

 

        // 키 입력 상태

        const keys = {

            left: false,

            right: false,

            space: false

        };

 

        // 레벨별 설정

        function getLevelConfig(level) {

            return {

                enemyRows: Math.min(3 + Math.floor(level / 4), 6),

                enemyCols: Math.min(6 + Math.floor(level / 3), 10),

                enemySpeed: Math.min(1 + level * 0.5, 8),

                enemyFireRate: Math.min(0.002 + level * 0.001, 0.01),

                movePattern: level % 3 // 0: 좌우, 1: 사인파, 2: 지그재그

            };

        }

 

        // 적 우주선 초기화

        function initEnemies() {

            enemies = [];

            const config = getLevelConfig(level);

            

            for (let row = 0; row < config.enemyRows; row++) {

                for (let col = 0; col < config.enemyCols; col++) {

                    enemies.push({

                        x: col * (enemyWidth + enemyPadding) + 50,

                        y: row * (enemyHeight + enemyPadding) + 50,

                        initialX: col * (enemyWidth + enemyPadding) + 50,

                        initialY: row * (enemyHeight + enemyPadding) + 50,

                        width: enemyWidth,

                        height: enemyHeight,

                        alive: true,

                        moveOffset: 0,

                        bullets: []

                    });

                }

            }

        }

 

        // 적 우주선 움직임 업데이트

        function updateEnemyPositions(time) {

            const config = getLevelConfig(level);

            enemies.forEach((enemy, index) => {

                if (!enemy.alive) return;

 

                switch(config.movePattern) {

                    case 0: // 좌우 이동

                        enemy.x = enemy.initialX + Math.sin(time * 0.002) * 50;

                        enemy.y = enemy.initialY + time * 0.02;

                        break;

                    case 1: // 사인파 이동

                        enemy.x = enemy.initialX + Math.sin(time * 0.003 + index * 0.2) * 70;

                        enemy.y = enemy.initialY + Math.cos(time * 0.002) * 30 + time * 0.02;

                        break;

                    case 2: // 지그재그 이동

                        enemy.x = enemy.initialX + ((time * 0.1 + index * 50) % 100) - 50;

                        enemy.y = enemy.initialY + time * 0.02;

                        break;

                }

 

                // 적 총알 발사

                if (Math.random() < config.enemyFireRate) {

                    enemy.bullets.push({

                        x: enemy.x + enemy.width / 2,

                        y: enemy.y + enemy.height,

                        speed: 5

                    });

                }

            });

        }

 

        // 적 총알 업데이트

        function updateEnemyBullets() {

            enemies.forEach(enemy => {

                enemy.bullets = enemy.bullets.filter(bullet => {

                    bullet.y += bullet.speed;

                    

                    // 플레이어 충돌 체크

                    if (bullet.y >= player.y && 

                        bullet.y <= player.y + player.height &&

                        bullet.x >= player.x - player.width/2 &&

                        bullet.x <= player.x + player.width/2) {

                        gameOver = true;

                        return false;

                    }

                    

                    return bullet.y < canvas.height;

                });

            });

        }

 

        // 플레이어 그리기

        function drawPlayer() {

            ctx.fillStyle = '#00ff00';

            ctx.fillRect(player.x - player.width/2, player.y, player.width, player.height);

        }

 

        // 총알 그리기

        function drawBullets() {

            // 플레이어 총알

            ctx.fillStyle = '#fff';

            player.bullets.forEach(bullet => {

                ctx.fillRect(bullet.x - 2, bullet.y, 4, 10);

            });

 

            // 적 총알

            ctx.fillStyle = '#ff0';

            enemies.forEach(enemy => {

                enemy.bullets.forEach(bullet => {

                    ctx.fillRect(bullet.x - 2, bullet.y, 4, 10);

                });

            });

        }

 

        // 적 우주선 그리기

        function drawEnemies() {

            enemies.forEach(enemy => {

                if (enemy.alive) {

                    ctx.fillStyle = `hsl(${360 * (level % 10) / 10}, 100%, 50%)`;

                    ctx.fillRect(enemy.x, enemy.y, enemy.width, enemy.height);

                }

            });

        }

 

        // 충돌 감지

        function checkCollisions() {

            player.bullets.forEach((bullet, bulletIndex) => {

                enemies.forEach(enemy => {

                    if (enemy.alive &&

                        bullet.x >= enemy.x &&

                        bullet.x <= enemy.x + enemy.width &&

                        bullet.y >= enemy.y &&

                        bullet.y <= enemy.y + enemy.height) {

                        enemy.alive = false;

                        player.bullets.splice(bulletIndex, 1);

                        score += 100 * level;

                        scoreElement.textContent = score;

                    }

                });

            });

        }

 

        // 레벨 완료 체크

        function checkLevelComplete() {

            if (enemies.every(enemy => !enemy.alive)) {

                if (level < 20) {

                    level++;

                    levelElement.textContent = level;

                    initEnemies();

                } else {

                    gameOver = true;

                    alert('축하합니다! 모든 레벨을 클리어했습니다!\n최종 점수: ' + score);

                }

            }

        }

 

        // 게임 업데이트

        function update(time) {

            if (gameOver) return;

 

            // 플레이어 이동

            if (keys.left && player.x > player.width/2) {

                player.x -= player.speed;

            }

            if (keys.right && player.x < canvas.width - player.width/2) {

                player.x += player.speed;

            }

 

            // 총알 업데이트

            player.bullets.forEach((bullet, index) => {

                bullet.y -= 7;

                if (bullet.y < 0) {

                    player.bullets.splice(index, 1);

                }

            });

 

            // 적 움직임 업데이트

            updateEnemyPositions(time);

            updateEnemyBullets();

 

            // 충돌 체크

            checkCollisions();

            checkLevelComplete();

        }

 

        // 화면 그리기

        function draw() {

            ctx.clearRect(0, 0, canvas.width, canvas.height);

            drawPlayer();

            drawBullets();

            drawEnemies();

        }

 

        // 게임 루프

        let lastTime = 0;

        function gameLoop(timestamp) {

            const deltaTime = timestamp - lastTime;

            lastTime = timestamp;

 

            update(timestamp);

            draw();

            requestAnimationFrame(gameLoop);

        }

 

        // 키보드 이벤트

        document.addEventListener('keydown', (e) => {

            if (e.key === 'ArrowLeft') keys.left = true;

            if (e.key === 'ArrowRight') keys.right = true;

            if (e.key === ' ' && !keys.space) {

                keys.space = true;

                player.bullets.push({

                    x: player.x,

                    y: player.y

                });

            }

        });

 

        document.addEventListener('keyup', (e) => {

            if (e.key === 'ArrowLeft') keys.left = false;

            if (e.key === 'ArrowRight') keys.right = false;

            if (e.key === ' ') keys.space = false;

        });

 

        // 게임 시작

        initEnemies();

        gameLoop(0);

    </script>

</body>

</html>

 

저장해서 바로 적용 하시면 된답니다 .


+ Recent posts