Space Invaders เกมส์ผู้รุกรานพื้นที่

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

“Space Invaders” ซึ่งเป็นเกมคลาสสิคที่มีประวัติศาสตร์ยาวนาน เกมนี้ถูกสร้างขึ้นครั้งแรกในปี 1978 โดย Tomohiro Nishikado ซึ่งทำงานให้กับบริษัท Taito ในประเทศญี่ปุ่น เป็นเกมที่มีประวัติศาสตร์ยาวนานและมีผลกระทบต่อวงการเกมอย่างมาก เกมนี้เป็นสัญลักษณ์ของความสำเร็จในยุคแรกของเกมอาร์เคด และมีอิทธิพลต่อการพัฒนาเกมในอนาคตอย่างต่อเนื่อง

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

1.ทำลายศัตรู: ผู้เล่นต้องยิงและทำลายเอเลี่ยนหรือศัตรูที่เคลื่อนที่ลงมาจากด้านบน โดยทำให้จำนวนเอเลี่ยนในสนามลดลงจนหมด

2.ป้องกันไม่ให้ศัตรูเข้าถึงฐาน: ผู้เล่นต้องควบคุมยานอวกาศเพื่อป้องกันไม่ให้ศัตรูถึงพื้น ซึ่งถ้าศัตรูเข้าถึงระดับที่กำหนด ผู้เล่นจะต้องแพ้เกม

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

4.เพิ่มระดับความยาก: เมื่อผู้เล่นทำลายเอเลี่ยนทั้งหมดแล้ว เกมจะเข้าสู่ระดับใหม่ โดยเอเลี่ยนอาจมีจำนวนเพิ่มขึ้นหรือเคลื่อนที่เร็วขึ้น ทำให้เกมมีความท้าทายมากขึ้น

5.สร้างความบันเทิง: จุดมุ่งหมายหลักคือการให้ความสนุกสนานและความตื่นเต้นแก่ผู้เล่น ผ่านการเล่นที่รวดเร็วและต้องใช้การตอบสนองที่ดี

6พัฒนาทักษะ: เกมช่วยให้ผู้เล่นพัฒนาทักษะในการควบคุมและการประสานงานระหว่างมือและตา รวมถึงการวางแผนกลยุทธ์ในการเล่น

3.ขอบเขต

1. ด้านการเล่นเกม (Gameplay)

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

2. ด้านระดับความยาก

  • ระดับ: การเพิ่มความยากตามจำนวนเอเลี่ยนที่เหลืออยู่และความเร็วในการเคลื่อนไหวของพวกเขา
  • ระบบคะแนน: ผู้เล่นจะได้รับคะแนนตามจำนวนเอเลี่ยนที่ทำลายได้

3. ด้านการควบคุม

  • การควบคุม: ผู้เล่นใช้แป้นพิมพ์ในการเคลื่อนที่และยิง โดยควรมีการตอบสนองที่รวดเร็ว

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

  • ผู้เล่นจะมีความสนุกสนานและความบันเทิงจากการเล่น
  • พัฒนาทักษะการคิดวิเคราะห์และการตัดสินใจ

5. ความรู้ที่เกี่ยวข้อง

  • HTML: สำหรับสร้างโครงสร้างของเกม
  • CSS: สำหรับจัดรูปแบบและการออกแบบของหน้าเกม
  • JavaScript: สำหรับการสร้างตรรกะของเกมและการโต้ตอบกับผู้เล่น

6. การดำเนินงาน

1. การเริ่มเกม

  • โหลดภาพ: โหลดภาพสำหรับยานอวกาศและเอเลี่ยน
  • สร้างพื้นผิว: ตั้งค่า Canvas เพื่อให้แสดงผลกราฟิกของเกม
  • สร้างเริ่มต้น: กำหนดค่าต่างๆ เช่น ตำแหน่งเริ่มต้นของยาน, จำนวนเอเลี่ยน, และคะแนน

2. การควบคุม

  • การเคลื่อนที่ของยาน: รับการกดปุ่ม (เช่น ลูกศรซ้าย/ขวา) เพื่อตรวจสอบการเคลื่อนที่ของยาน
  • การยิงกระสุน: รับการกดปุ่ม (เช่น Space) เพื่อให้ยานยิงกระสุนไปยังเอเลี่ยน

7. วิธีการใช้งานโปรแกรม

1. การติดตั้งและเปิดโปรแกรม

  • ดาวน์โหลดไฟล์: ดาวน์โหลดไฟล์ทั้งหมดที่เกี่ยวข้องกับเกม (HTML, CSS, JavaScript, รูปภาพ) ไปยังเครื่องคอมพิวเตอร์ของคุณ
  • เปิดไฟล์ HTML: เปิดไฟล์ HTML ในเว็บเบราว์เซอร์ (เช่น Chrome, Firefox) โดยดับเบิลคลิกที่ไฟล์

2. เริ่มเล่นเกม

  • เริ่มเกม: เมื่อเกมเปิดขึ้น ให้ดูที่หน้าจอสำหรับปุ่มหรือคำแนะนำในการเริ่มเกม (เช่น “Press Space to Start”)

8. การทดลอง

1. การเตรียมการทดลอง

  • ตั้งค่าอุปกรณ์: ตรวจสอบว่าเกมทำงานได้ในเบราว์เซอร์ที่รองรับ (เช่น Chrome, Firefox)
  • เตรียมทีมทดลอง: เชิญผู้เล่นที่มีประสบการณ์และไม่มีประสบการณ์ในการเล่นเกมประเภทนี้

2. ขั้นตอนการทดลอง

  • เริ่มเล่นเกม: ให้ผู้เล่นเริ่มเกมโดยการกดปุ่มที่กำหนด

9. เทคนิคการประยุกต์เพื่อเพิ่มประสิทธิภาพ

1. การปรับปรุง AI ของเอเลี่ยน

  • การเคลื่อนที่ที่ซับซ้อน: ทำให้เอเลี่ยนมีพฤติกรรมที่หลากหลาย เช่น การโจมตีที่มีการวางแผนหรือการหลบหลีก
  • การทำงานร่วมกัน: ให้เอเลี่ยนสามารถทำงานร่วมกันเพื่อโจมตีผู้เล่นในรูปแบบที่ซับซ้อนมากขึ้น

10. สรุปผลและข้อเสนอแนะ

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

ข้อเสนอแนะ

  1. เพิ่มความหลากหลาย: ควรเพิ่มเอเลี่ยนชนิดใหม่และมินิเกมเพื่อให้มีความหลากหลายในการเล่น
  2. ปรับปรุง AI ของศัตรู: การทำให้ AI ของเอเลี่ยนมีพฤติกรรมที่หลากหลายและซับซ้อนมากขึ้นจะช่วยเพิ่มความท้าทาย

11. ข้อมูลอ้างอิง

โค้ดเกม Space Invaders

HTML

<!DOCTYPE html>
<html>
    <head>
        <meta charset="UTF-8">
        <meta name="viewport", content="width=device-width, initial-scale=1.0">
        <title>Space Invaders</title>
        <link rel="stylesheet" href="space.css">
        <script src="space.js"></script>
    </head>

    <body>
        <h1>Space Invaders</h1>
        <canvas id="board"></canvas>
        <div id="game-controls">
            <button id="start-btn" onclick="startGame()">Start</button>
            <button id="reset-btn" onclick="resetGame()">Reset</button>
            <button id="stop-btn" onclick="stopGame()">Stop</button>
    </body>
</html>

CSS

body {
    font-family:'Courier New', Courier, monospace;
    text-align: center;
}

#board {
    background-color: black;
   
}

JAVASCRIPT

//board
let tileSize = 32;
let rows = 16;
let columns = 16;

let board;
let boardWidth = tileSize * columns; // 32 * 16
let boardHeight = tileSize * rows; // 32 * 16
let context;

//ship
let shipWidth = tileSize * 2;
let shipHeight = tileSize;
let shipX = tileSize * columns / 2 - tileSize;
let shipY = tileSize * rows - tileSize * 2;

let ship = {
    x: shipX,
    y: shipY,
    width: shipWidth,
    height: shipHeight
};

let shipImg;
let shipVelocityX = tileSize; // ship moving speed

//aliens
let alienArray = [];
let alienWidth = tileSize * 2;
let alienHeight = tileSize;
let alienX = tileSize;
let alienY = tileSize;
let alienImg;

let alienRows = 2;
let alienColumns = 3;
let alienCount = 0; // number of aliens to defeat
let alienVelocityX = 1; // alien moving speed

//bullets
let bulletArray = [];
let bulletVelocityY = -10; // bullet moving speed

let score = 0;
let gameOver = false;
let isGameRunning = false;
let gameInterval;

window.onload = function() {
    board = document.getElementById("board");
    board.width = boardWidth;
    board.height = boardHeight;
    context = board.getContext("2d");

    // Load images
    shipImg = new Image();
    shipImg.src = "./ship.png";
    shipImg.onload = function() {
        context.drawImage(shipImg, ship.x, ship.y, ship.width, ship.height);
    };

    alienImg = new Image();
    alienImg.src = "./alien.png";
    createAliens();

    document.addEventListener("keydown", moveShip);
    document.addEventListener("keyup", shoot);
}

// Start the game
function startGame() {
    if (!isGameRunning) {
        isGameRunning = true;
        score = 0; // Reset score
        alienCount = 0; // Reset alien count
        gameOver = false; // Reset game over state
        alienArray = [];
        bulletArray = [];
        createAliens();
        gameInterval = requestAnimationFrame(update);
        console.log("Game Started");
    }
}

// Stop the game
function stopGame() {
    if (isGameRunning) {
        cancelAnimationFrame(gameInterval);
        isGameRunning = false;
        console.log("Game Stopped");
    }
}

// Reset the game
function resetGame() {
    stopGame(); // หยุดเกมก่อน
    score = 0;
    alienCount = 0;
    gameOver = false;
    alienArray = [];
    bulletArray = [];
    ship.x = shipX; // รีเซ็ตตำแหน่งเรือ
    createAliens(); // สร้างเอเลี่ยนใหม่

    // เคลียร์หน้าจอและวาดเรือใหม่
    context.clearRect(0, 0, board.width, board.height); 
    context.drawImage(shipImg, ship.x, ship.y, ship.width, ship.height);
    console.log("Game Reset");
}

// Update the game state
function update() {
    if (gameOver) {
        return;
    }

    context.clearRect(0, 0, board.width, board.height);

    // Ship
    context.drawImage(shipImg, ship.x, ship.y, ship.width, ship.height);

    // Aliens
    for (let i = 0; i < alienArray.length; i++) {
        let alien = alienArray[i];
        if (alien.alive) {
            alien.x += alienVelocityX;

            // If alien touches the borders
            if (alien.x + alien.width >= board.width || alien.x <= 0) {
                alienVelocityX *= -1;
                alien.x += alienVelocityX * 2;

                // Move all aliens up by one row
                for (let j = 0; j < alienArray.length; j++) {
                    alienArray[j].y += alienHeight;
                }
            }
            context.drawImage(alienImg, alien.x, alien.y, alien.width, alien.height);

            if (alien.y >= ship.y) {
                gameOver = true;
            }
        }
    }

    // Bullets
    for (let i = 0; i < bulletArray.length; i++) {
        let bullet = bulletArray[i];
        bullet.y += bulletVelocityY;
        context.fillStyle = "white";
        context.fillRect(bullet.x, bullet.y, bullet.width, bullet.height);

        // Bullet collision with aliens
        for (let j = 0; j < alienArray.length; j++) {
            let alien = alienArray[j];
            if (!bullet.used && alien.alive && detectCollision(bullet, alien)) {
                bullet.used = true;
                alien.alive = false;
                alienCount--;
                score += 100;
            }
        }
    }

    // Clear bullets
    while (bulletArray.length > 0 && (bulletArray[0].used || bulletArray[0].y < 0)) {
        bulletArray.shift(); // Removes the first element of the array
    }

    // Next level
    if (alienCount == 0) {
        score += alienColumns * alienRows * 100; // Bonus points
        alienColumns = Math.min(alienColumns + 1, columns / 2 - 2); // Cap at 6
        alienRows = Math.min(alienRows + 1, rows - 4); // Cap at 12
        alienVelocityX += 0.2; // Increase the alien movement speed
        alienArray = [];
        bulletArray = [];
        createAliens();
    }

    // Score
    context.fillStyle = "white";
    context.font = "16px courier";
    context.fillText("Score: " + score, 5, 20);

    // Request next frame
    gameInterval = requestAnimationFrame(update);
}

function moveShip(e) {
    if (gameOver) {
        return;
    }

    if (e.code == "ArrowLeft" && ship.x - shipVelocityX >= 0) {
        ship.x -= shipVelocityX; // Move left one tile
    } else if (e.code == "ArrowRight" && ship.x + shipVelocityX + ship.width <= board.width) {
        ship.x += shipVelocityX; // Move right one tile
    }
}

function createAliens() {
    for (let c = 0; c < alienColumns; c++) {
        for (let r = 0; r < alienRows; r++) {
            let alien = {
                img: alienImg,
                x: alienX + c * alienWidth,
                y: alienY + r * alienHeight,
                width: alienWidth,
                height: alienHeight,
                alive: true
            };
            alienArray.push(alien);
        }
    }
    alienCount = alienArray.length;
}

function shoot(e) {
    if (gameOver) {
        return;
    }

    if (e.code == "Space") {
        // Shoot
        let bullet = {
            x: ship.x + shipWidth * 15 / 32,
            y: ship.y,
            width: tileSize / 8,
            height: tileSize / 2,
            used: false
        };
        bulletArray.push(bullet);
    }
}

function detectCollision(a, b) {
    return a.x < b.x + b.width &&   // a's top left corner doesn't reach b's top right corner
           a.x + a.width > b.x &&   // a's top right corner passes b's top left corner
           a.y < b.y + b.height &&  // a's top left corner doesn't reach b's bottom left corner
           a.y + a.height > b.y;    // a's bottom left corner passes b's top left corner
}

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

You may also like...

ใส่ความเห็น

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