เกมป้องกันปราสาท(Castle defense)

ผู้เขียนบทความ : นายปรเมศวร์ จันทรโชติ 167404132015

คณะวิศวกรรมศาสตร์ : สาขาวิชาวิศวกรรมไฟฟ้า

วิชา : 04000104 การโปรแกรมคอมพิวเตอร์ 1/2567

1.ความเป็นมา

เกม “Castle Defense” เกิดขึ้นจากความต้องการที่จะสร้างเกมที่มีความสนุกสนานและท้าทาย โดยมีแนวคิดในการป้องกันสิ่งที่มีค่า ซึ่งในที่นี้คือปราสาท โดยผู้เล่นจะต้องตอบสนองต่อเหตุการณ์ที่เกิดขึ้นอย่างรวดเร็ว ด้วยการคลิกที่รูปร่างที่ตกลงมาเพื่อทำลายและรักษาพลังชีวิตของปราสาท

แนวคิดการสร้างเกมนี้ได้รับแรงบันดาลใจจากเกมแนวป้องกัน (Defense Games) ที่มีอยู่มากมายในตลาดปัจจุบัน โดยเฉพาะเกมที่ผู้เล่นมีบทบาทในการปกป้องฐานที่มั่นจากการโจมตีของศัตรู เกมประเภทนี้ได้รับความนิยมในกลุ่มผู้เล่นหลายวัย เนื่องจากให้ความสนุกสนานและความท้าทายในการเล่น

การพัฒนาเกม “Castle Defense” ใช้เทคโนโลยีเว็บที่เข้าถึงได้ง่าย เช่น HTML, CSS และ JavaScript ซึ่งทำให้ผู้เล่นสามารถเข้าถึงเกมได้โดยไม่ต้องติดตั้งโปรแกรมเพิ่มเติม นอกจากนี้ การใช้เทคโนโลยีเหล่านี้ยังช่วยให้นักพัฒนาสามารถสร้างและปรับปรุงเกมได้อย่างรวดเร็วและง่ายดาย

ในขั้นตอนการพัฒนา ทีมงานมุ่งเน้นไปที่การสร้างประสบการณ์ที่ดีให้กับผู้เล่น โดยพยายามทำให้เกมมีความน่าสนใจ มีกราฟิกที่สวยงาม และเสียงที่เข้ากับบรรยากาศของเกม การสร้างคะแนนและระบบพลังชีวิตของปราสาททำให้เกมมีความท้าทายและผู้เล่นต้องใช้กลยุทธ์ในการเล่นเพื่อให้สามารถเก็บคะแนนสูงสุด

สุดท้ายนี้ เกม “Castle Defense” ไม่เพียงแต่สร้างความสนุกสนานให้กับผู้เล่น แต่ยังช่วยให้ผู้เล่นได้ฝึกฝนทักษะการตอบสนองและการคิดเชิงกลยุทธ์ พร้อมทั้งสร้างความตื่นเต้นในการเล่นเกม

2.วัตถุประสงค์

เพื่อสร้างเกมป้องกันปราสาทที่ให้ผู้เล่นมีส่วนร่วมในการป้องกันปราสาทจากรูปร่างที่ตกลงมา โดยผู้เล่นจะต้องคลิกที่รูปร่างเพื่อทำลายและรักษาพลังชีวิต (HP) ของปราสาทให้อยู่ในระดับสูงสุดเพื่อให้ได้คะแนนสูงสุด

3.ขอบเขตการทำงาน

  • การออกแบบและพัฒนาเกมในรูปแบบ HTML, CSS, และ JavaScript
  • การสร้างกราฟิกและเสียงพื้นฐานสำหรับเกม
  • การสร้างระบบการสร้างและทำลายรูปร่างที่ตกลงมาจากด้านบน
  • การแสดงคะแนนและพลังชีวิตของปราสาท

4.อุปกรณ์และเครื่องมือที่ใช้

  • เครื่องมือพัฒนา: โปรแกรมแก้ไขโค้ด (เช่น Visual Studio Code, Sublime Text)
  • เว็บเบราว์เซอร์: Chrome, Firefox หรือ Safari สำหรับทดสอบเกม
  • กราฟิก: ใช้โปรแกรมสร้างกราฟิกพื้นฐาน (เช่น Photoshop, GIMP) สำหรับสร้างภาพหรือเสียงพื้นฐาน

5.ความรู้ที่คาดว่าจะได้รับ

  • ความเข้าใจในพื้นฐานการพัฒนาเว็บ
  • การใช้ HTML, CSS และ JavaScript ในการสร้างเกม
  • การจัดการกับเหตุการณ์ (Event Handling) ใน JavaScript
  • การทำงานกับ DOM (Document Object Model) ในการปรับปรุงส่วนต่างๆ ของหน้าเว็บแบบไดนามิก

6.ประโยชน์ที่คาดว่าจะได้รับ

  • ผู้เล่นจะพัฒนาทักษะการตอบสนองและการตัดสินใจอย่างรวดเร็ว
  • การเรียนรู้เกี่ยวกับการทำงานของโปรแกรมในแบบเรียลไทม์
  • การส่งเสริมความคิดสร้างสรรค์ในการพัฒนาเกม

7.สรุป

เกม “Castle Defense” เป็นเกมที่มอบประสบการณ์การเล่นที่สนุกสนานและท้าทาย โดยผู้เล่นจะต้องคลิกที่รูปร่างที่ตกลงมาเพื่อทำลายและป้องกันปราสาทของตนเองจากการลดพลังชีวิต

8.วิธีการเล่นเกม

  1. กดปุ่ม “เริ่มเกม” เพื่อเริ่มเกม
  2. รูปร่างจะเริ่มตกลงมาจากด้านบน ผู้เล่นต้องคลิกที่รูปร่างเพื่อทำลาย
  3. รักษาพลังชีวิตของปราสาทโดยไม่ให้ HP ลดเหลือ 0
  4. คะแนนจะเพิ่มขึ้นเมื่อผู้เล่นทำลายรูปร่าง

9.ผลการดำเนินการ

เกมนี้สร้างขึ้นสำเร็จตามวัตถุประสงค์ และผู้เล่นสามารถเข้าถึงเกมได้ง่ายผ่านเว็บเบราว์เซอร์ ผลการทดสอบแสดงให้เห็นว่าผู้เล่นสามารถสนุกสนานและมีส่วนร่วมในการเล่นเกม โดยมีการตอบสนองที่รวดเร็วต่อเหตุการณ์ที่เกิดขึ้น

อ้างอิง และ CODE GMAE

  1. chatgpt
  2. onlinegdb
<!DOCTYPE html>
<html lang="th">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Castle Design</title>
    <style>
        body {
            margin: 0;
            height: 100vh;
            overflow: hidden;
            background-color: #f0f0f0;
            display: flex;
            justify-content: center;
            align-items: center;
            position: relative;
        }
        .castle {
            position: absolute;
            left: 0;
            bottom: 0;
            width: 250px;
            height: 150px;
            background-color: #b5651d;
            border: 2px solid black;
            display: flex;
            justify-content: space-between;
            align-items: flex-end;
        }
        .wall {
            position: absolute;
            top: 0;
            width: 100%;
            height: 20px;
            background-color: black;
            display: flex;
            justify-content: space-between;
        }
        .wall-block {
            width: 20px;
            height: 20px;
            background-color: #b5651d;
        }
        .tower {
            position: absolute;
            top: -90px;
            width: 30px;
            height: 90px;
            background-color: #b5651d;
            border: 2px solid black;
        }
        .tower-left {
            left: 20px;
        }
        .tower-right {
            right: 20px;
        }
        .tower-top {
            width: 100%;
            height: 20px;
            background-color: black;
            position: absolute;
            top: 0;
            display: flex;
            justify-content: space-between;
        }
        .tower-top::before, .tower-top::after {
            content: "";
            width: 10px;
            height: 10px;
            background-color: #b5651d;
        }
        .gate {
            width: 50px;
            height: 80px;
            background-color: black;
            margin: 0 auto;
            position: relative;
            z-index: 1;
        }
        .hp-container {
            position: absolute;
            top: -130px;
            width: 100%;
            display: flex;
            flex-direction: column;
            align-items: center;
        }
        .hp-bar {
            width: 100%;
            height: 10px;
            background-color: red;
        }
        .hp-text {
            color: black;
            font-weight: bold;
            margin-bottom: 5px;
        }
        .shape {
            position: absolute;
            top: 0;
            right: 0;
            width: 30px;
            height: 30px;
            display: flex;
            justify-content: center;
            align-items: center;
            color: white;
            font-weight: bold;
            font-size: 12px;
        }
        .square {
            background-color: blue;
        }
        .circle {
            background-color: green;
            border-radius: 50%;
        }
        .game-over {
            position: absolute;
            top: 50%;
            left: 50%;
            transform: translate(-50%, -50%);
            font-size: 30px;
            color: red;
            display: none;
        }
        .start-button, .restart-button {
            position: absolute;
            top: 20px;
            padding: 10px 20px;
            font-size: 20px;
            background-color: #4CAF50;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
        }
        .start-button:hover, .restart-button:hover {
            background-color: #45a049;
        }
        .restart-button {
            display: none;
        }
        .score {
            position: absolute;
            top: 20px;
            left: 20px;
            font-size: 24px;
            font-weight: bold;
            color: black;
        }
    </style>
</head>
<body>
    <audio id="hit-sound" src="hit.mp3"></audio>
    <audio id="game-over-sound" src="game-over.mp3"></audio>

    <div class="score" id="score">คะแนน: 0</div>

    <button class="start-button" id="start-button">เริ่มเกม</button>
    <button class="restart-button" id="restart-button">เริ่มใหม่</button>
    
    <div class="castle" id="castle" style="display: none;">
        <div class="hp-container">
            <div class="hp-text" id="hp-text">HP: 100</div>
            <div class="hp-bar" id="hp-bar" style="width: 100%;"></div>
        </div>
        <div class="wall">
            <div class="wall-block"></div>
            <div class="wall-block"></div>
            <div class="wall-block"></div>
            <div class="wall-block"></div>
            <div class="wall-block"></div>
        </div>
        <div class="tower tower-left">
            <div class="tower-top"></div>
        </div>
        <div class="tower tower-right">
            <div class="tower-top"></div>
        </div>
        <div class="gate"></div>
    </div>

    <div class="game-over" id="game-over">Game Over</div>

    <script>
        let hp = 100;
        let score = 0;
        let shapeInterval;
        let shapeCreationRate = 3000;

        function updateHPDisplay() {
            const hpBar = document.getElementById('hp-bar');
            const hpText = document.getElementById('hp-text');
            hpBar.style.width = hp + '%';
            hpText.textContent = 'HP: ' + hp;

            if (hp > 50) {
                hpBar.style.backgroundColor = 'red';
            } else if (hp > 20) {
                hpBar.style.backgroundColor = 'orange';
            } else {
                hpBar.style.backgroundColor = 'yellow';
            }

            if (hp <= 0) {
                hp = 0;
                hpBar.style.width = '0%';
                displayGameOver();
            }
        }

        function updateScoreDisplay() {
            const scoreText = document.getElementById('score');
            scoreText.textContent = 'คะแนน: ' + score;
        }

        function displayGameOver() {
            const gameOverText = document.getElementById('game-over');
            gameOverText.style.display = 'block';
            clearInterval(shapeInterval);
            document.getElementById('restart-button').style.display = 'block';
            document.querySelectorAll('.shape').forEach(shape => shape.remove()); 
            const gameOverSound = document.getElementById('game-over-sound');
            gameOverSound.play(); 
        }

        function createShape() {
            const shape = document.createElement('div');
            shape.classList.add('shape');

            let shapeHP;
            if (Math.random() < 0.5) {
                shape.classList.add('square');
                shapeHP = 30; 
            } else {
                shape.classList.add('circle');
                shapeHP = 50; 
            }
            shape.dataset.hp = shapeHP; 
            shape.innerText = shapeHP; 

            shape.style.top = (window.innerHeight - 30) + 'px';
            shape.style.right = '0px';
            document.body.appendChild(shape);

            shape.addEventListener('click', () => {
                const hitSound = document.getElementById('hit-sound');
                hitSound.play(); 

                let points = 0; 
                if (shape.classList.contains('square')) {
                    points = 1; 
                } else if (shape.classList.contains('circle')) {
                    points = 3; 
                }

                let currentShapeHP = parseInt(shape.dataset.hp);
                currentShapeHP -= 10; 
                shape.dataset.hp = currentShapeHP; 
                shape.innerText = currentShapeHP; 

                if (currentShapeHP <= 0) {
                    shape.remove();
                    score += points; 
                    updateScoreDisplay(); 

                    if (score % 50 === 0) {
                        shapeCreationRate = Math.max(200, shapeCreationRate - 100);
                        clearInterval(shapeInterval);
                        shapeInterval = setInterval(createShape, shapeCreationRate); 
                    }
                }
            });

            const castleRect = document.getElementById('castle').getBoundingClientRect();
            const castleCenterX = castleRect.left + castleRect.width / 2;
            const castleCenterY = castleRect.top + castleRect.height / 2;

            const interval = setInterval(() => {
                const shapeRect = shape.getBoundingClientRect();
                const dx = castleCenterX - shapeRect.left;
                const dy = castleCenterY - shapeRect.top;
                const angle = Math.atan2(dy, dx);

                shape.style.left = shapeRect.left + Math.cos(angle) * 5 + 'px';
                shape.style.top = shapeRect.top + Math.sin(angle) * 5 + 'px';

                if (
                    shapeRect.left <= castleRect.right &&
                    shapeRect.bottom >= castleRect.top &&
                    shapeRect.top <= castleRect.bottom
                ) {
                    hp -= parseInt(shape.dataset.hp); 
                    shape.remove();
                    updateHPDisplay();
                    clearInterval(interval);
                }

                if (shapeRect.left < -30) {
                    shape.remove();
                    clearInterval(interval);
                }
            }, 20);
        }

        function startGame() {
            document.getElementById('start-button').style.display = 'none';
            document.getElementById('castle').style.display = 'block';
            document.getElementById('restart-button').style.display = 'none';
            hp = 100;
            score = 0;
            shapeCreationRate = 3000; 
            updateHPDisplay();
            updateScoreDisplay();
            shapeInterval = setInterval(createShape, shapeCreationRate); 
        }

        function restartGame() {
            hp = 100;
            score = 0;
            shapeCreationRate = 3000; 
            updateHPDisplay();
            updateScoreDisplay();
            document.getElementById('game-over').style.display = 'none';
            document.getElementById('restart-button').style.display = 'none';
            shapeInterval = setInterval(createShape, shapeCreationRate); 
            document.querySelectorAll('.shape').forEach(shape => shape.remove()); 
        }

        document.getElementById('start-button').addEventListener('click', startGame);
        document.getElementById('restart-button').addEventListener('click', restartGame);
    </script>
</body>
</html>

วิดิโออธิบาย CODE

วิดิโอตัวอย่างการเล่นเกม

ลิ้งค์เข้าเล่นเกม : https://onlinegdb.com/w4l3PgP-t

You may also like...

ใส่ความเห็น

อีเมลของคุณจะไม่แสดงให้คนอื่นเห็น ช่องข้อมูลจำเป็นถูกทำเครื่องหมาย *