Headlines

เขียนเกมจับลูกบอลง่ายๆ ด้วย ChatGPT

อยากสร้างเกมง่ายๆ แต่ไม่รู้จะเริ่มยังไง?

สำหรับใครที่อยากลองเขียนเกมของตัวเอง แต่กังวลว่าจะต้องมีความรู้ด้านโปรแกรมมิ่งเยอะๆ หรือใช้เวลาเรียนรู้เป็นเดือนๆ วันนี้เรามีวิธีง่ายๆ ที่จะพาคุณเข้าสู่โลกของการเขียนเกมด้วยตัวเอง โดยใช้ ChatGPT ช่วย! คุณจะได้เรียนรู้การสร้างเกมจับลูกบอล (Ball Catch Game) ที่สนุกและเพลิดเพลินได้ในเวลาเพียงไม่กี่นาที!

เกมจับลูกบอลคืออะไร?

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

  • การสร้างวัตถุเคลื่อนไหว
  • การตรวจจับการชน
  • การใช้คีย์บอร์ดและเมาส์เพื่อควบคุม

วิธีสร้างเกมนี้ด้วย ChatGPT

ขั้นตอนที่ 1: เข้า ChatGPT

พิมพ์ Prompt “เขียนเกมจับลูกบอล ด้วย html5” ChatGPT จะสร้างโค้ดพื้นฐาน พร้อมคำอธิบายเกี่ยวกับการใช้งานแต่ละส่วน คุณสามารถคัดลอกโค้ดเหล่านั้นไปทดสอบได้ทันที!

ขั้นตอนที่ 2: เตรียมโครงสร้าง HTML

โค้ดพื้นฐานของ HTML ที่ ChatGPT สร้างให้จะเป็นดังนี้

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>เกมจับลูกบอล</title>
  <style>
    canvas {
      background: lightblue;
      display: block;
      margin: 0 auto;
      border: 2px solid #000;
    }
    body {
      text-align: center;
      font-family: Arial, sans-serif;
    }
    h1 {
      color: #333;
    }
  </style>
</head>
<body>
  <h1>เกมจับลูกบอล</h1>
  <canvas id="gameCanvas" width="480" height="320"></canvas>
  <p>ใช้เมาส์เพื่อเลื่อนแท่นจับบอล!</p>
  <script>
    const canvas = document.getElementById("gameCanvas");
    const ctx = canvas.getContext("2d");

    // ขนาดและตำแหน่งของลูกบอล
    let ballX = canvas.width / 2;
    let ballY = canvas.height - 30;
    let ballDX = 2; // ความเร็วแนวนอน
    let ballDY = -2; // ความเร็วแนวตั้ง
    const ballRadius = 10;

    // ขนาดและตำแหน่งของแท่นจับ
    const paddleHeight = 10;
    const paddleWidth = 75;
    let paddleX = (canvas.width - paddleWidth) / 2;

    // ตัวแปรสำหรับการควบคุมเมาส์
    let rightPressed = false;
    let leftPressed = false;

    // ตัวนับคะแนน
    let score = 0;

    // ฟังก์ชันสำหรับวาดลูกบอล
    function drawBall() {
      ctx.beginPath();
      ctx.arc(ballX, ballY, ballRadius, 0, Math.PI * 2);
      ctx.fillStyle = "red";
      ctx.fill();
      ctx.closePath();
    }

    // ฟังก์ชันสำหรับวาดแท่นจับบอล
    function drawPaddle() {
      ctx.beginPath();
      ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
      ctx.fillStyle = "green";
      ctx.fill();
      ctx.closePath();
    }

    // ฟังก์ชันสำหรับแสดงคะแนน
    function drawScore() {
      ctx.font = "16px Arial";
      ctx.fillStyle = "#000";
      ctx.fillText("Score: " + score, 8, 20);
    }

    // ฟังก์ชันสำหรับอัพเดตเกม
    function updateGame() {
      ctx.clearRect(0, 0, canvas.width, canvas.height);
      drawBall();
      drawPaddle();
      drawScore();

      // ตรวจสอบการชนขอบของลูกบอล
      if (ballX + ballDX > canvas.width - ballRadius || ballX + ballDX < ballRadius) {
        ballDX = -ballDX;
      }
      if (ballY + ballDY < ballRadius) {
        ballDY = -ballDY;
      } else if (ballY + ballDY > canvas.height - ballRadius) {
        if (ballX > paddleX && ballX < paddleX + paddleWidth) {
          ballDY = -ballDY;
          score++; // เพิ่มคะแนนเมื่อจับลูกบอลได้
        } else {
          alert("Game Over! คะแนนของคุณคือ " + score);
          document.location.reload();
        }
      }

      // อัปเดตตำแหน่งลูกบอล
      ballX += ballDX;
      ballY += ballDY;

      // ควบคุมการเลื่อนแท่นจับ
      if (rightPressed && paddleX < canvas.width - paddleWidth) {
        paddleX += 7;
      } else if (leftPressed && paddleX > 0) {
        paddleX -= 7;
      }

      requestAnimationFrame(updateGame);
    }

    // ฟังก์ชันสำหรับจับการกดปุ่ม
    function keyDownHandler(e) {
      if (e.key === "Right" || e.key === "ArrowRight") {
        rightPressed = true;
      } else if (e.key === "Left" || e.key === "ArrowLeft") {
        leftPressed = true;
      }
    }

    function keyUpHandler(e) {
      if (e.key === "Right" || e.key === "ArrowRight") {
        rightPressed = false;
      } else if (e.key === "Left" || e.key === "ArrowLeft") {
        leftPressed = false;
      }
    }

    // จับการเคลื่อนเมาส์
    function mouseMoveHandler(e) {
      const relativeX = e.clientX - canvas.offsetLeft;
      if (relativeX > 0 && relativeX < canvas.width) {
        paddleX = relativeX - paddleWidth / 2;
      }
    }

    // เพิ่ม Event Listeners
    document.addEventListener("keydown", keyDownHandler);
    document.addEventListener("keyup", keyUpHandler);
    document.addEventListener("mousemove", mouseMoveHandler);

    // เริ่มเกม
    updateGame();
  </script>
</body>
</html>

ขั้นตอนที่ 3: ทดสอบ

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

ขั้นตอนที่ 4: ปรับแก้ Code ที่มีข้อผิดพลาด

โดยพิมพ์ Prompt “มี bug คือเมื่อกดปุ่ม close ตอน Game Over แต่ไม่สามารถเริ่มเล่นใหม่ได้” หลังจากนั้น ChatGPT จะสร้างโค้ดใหม่ให้เป็นดังนี้

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>เกมจับลูกบอล</title>
  <style>
    canvas {
      background: lightblue;
      display: block;
      margin: 0 auto;
      border: 2px solid #000;
    }
    body {
      text-align: center;
      font-family: Arial, sans-serif;
    }
    h1 {
      color: #333;
    }
    #gameOverModal {
      display: none;
      position: fixed;
      top: 50%;
      left: 50%;
      transform: translate(-50%, -50%);
      background: white;
      border: 2px solid #000;
      padding: 20px;
      text-align: center;
      z-index: 1000;
    }
    #gameOverModal button {
      margin-top: 10px;
      padding: 10px 20px;
      font-size: 16px;
      cursor: pointer;
    }
  </style>
</head>
<body>
  <h1>เกมจับลูกบอล</h1>
  <canvas id="gameCanvas" width="480" height="320"></canvas>
  <div id="gameOverModal">
    <p id="gameOverMessage"></p>
    <button onclick="restartGame()">เริ่มใหม่</button>
  </div>
  <script>
    const canvas = document.getElementById("gameCanvas");
    const ctx = canvas.getContext("2d");

    // ขนาดและตำแหน่งของลูกบอล
    let ballX, ballY, ballDX, ballDY;
    const ballRadius = 10;

    // ขนาดและตำแหน่งของแท่นจับ
    const paddleHeight = 10;
    const paddleWidth = 75;
    let paddleX;

    // ตัวแปรสำหรับการควบคุมเมาส์
    let rightPressed = false;
    let leftPressed = false;

    // ตัวนับคะแนน
    let score = 0;

    // ตัวแปรสถานะเกม
    let isGameOver = false;

    // อ้างอิง modal สำหรับ Game Over
    const gameOverModal = document.getElementById("gameOverModal");
    const gameOverMessage = document.getElementById("gameOverMessage");

    // ฟังก์ชันเริ่มเกมใหม่
    function initializeGame() {
      ballX = canvas.width / 2;
      ballY = canvas.height - 30;
      ballDX = 2; // ความเร็วแนวนอน
      ballDY = -2; // ความเร็วแนวตั้ง
      paddleX = (canvas.width - paddleWidth) / 2;
      score = 0;
      isGameOver = false;
      gameOverModal.style.display = "none";
      updateGame();
    }

    // ฟังก์ชันสำหรับวาดลูกบอล
    function drawBall() {
      ctx.beginPath();
      ctx.arc(ballX, ballY, ballRadius, 0, Math.PI * 2);
      ctx.fillStyle = "red";
      ctx.fill();
      ctx.closePath();
    }

    // ฟังก์ชันสำหรับวาดแท่นจับบอล
    function drawPaddle() {
      ctx.beginPath();
      ctx.rect(paddleX, canvas.height - paddleHeight, paddleWidth, paddleHeight);
      ctx.fillStyle = "green";
      ctx.fill();
      ctx.closePath();
    }

    // ฟังก์ชันสำหรับแสดงคะแนน
    function drawScore() {
      ctx.font = "16px Arial";
      ctx.fillStyle = "#000";
      ctx.fillText("Score: " + score, 8, 20);
    }

    // ฟังก์ชันสำหรับอัพเดตเกม
    function updateGame() {
      if (isGameOver) return; // หยุดเกมเมื่อเกมจบ

      ctx.clearRect(0, 0, canvas.width, canvas.height);
      drawBall();
      drawPaddle();
      drawScore();

      // ตรวจสอบการชนขอบของลูกบอล
      if (ballX + ballDX > canvas.width - ballRadius || ballX + ballDX < ballRadius) {
        ballDX = -ballDX;
      }
      if (ballY + ballDY < ballRadius) {
        ballDY = -ballDY;
      } else if (ballY + ballDY > canvas.height - ballRadius) {
        if (ballX > paddleX && ballX < paddleX + paddleWidth) {
          ballDY = -ballDY;
          score++; // เพิ่มคะแนนเมื่อจับลูกบอลได้
        } else {
          gameOver();
          return;
        }
      }

      // อัปเดตตำแหน่งลูกบอล
      ballX += ballDX;
      ballY += ballDY;

      // ควบคุมการเลื่อนแท่นจับ
      if (rightPressed && paddleX < canvas.width - paddleWidth) {
        paddleX += 7;
      } else if (leftPressed && paddleX > 0) {
        paddleX -= 7;
      }

      requestAnimationFrame(updateGame);
    }

    // ฟังก์ชันสำหรับแสดง Game Over
    function gameOver() {
      isGameOver = true;
      gameOverMessage.textContent = "Game Over! คะแนนของคุณคือ " + score;
      gameOverModal.style.display = "block";
    }

    // ฟังก์ชันสำหรับเริ่มเกมใหม่
    function restartGame() {
      initializeGame();
    }

    // ฟังก์ชันสำหรับจับการกดปุ่ม
    function keyDownHandler(e) {
      if (e.key === "Right" || e.key === "ArrowRight") {
        rightPressed = true;
      } else if (e.key === "Left" || e.key === "ArrowLeft") {
        leftPressed = true;
      }
    }

    function keyUpHandler(e) {
      if (e.key === "Right" || e.key === "ArrowRight") {
        rightPressed = false;
      } else if (e.key === "Left" || e.key === "ArrowLeft") {
        leftPressed = false;
      }
    }

    // จับการเคลื่อนเมาส์
    function mouseMoveHandler(e) {
      const relativeX = e.clientX - canvas.offsetLeft;
      if (relativeX > 0 && relativeX < canvas.width) {
        paddleX = relativeX - paddleWidth / 2;
      }
    }

    // เพิ่ม Event Listeners
    document.addEventListener("keydown", keyDownHandler);
    document.addEventListener("keyup", keyUpHandler);
    document.addEventListener("mousemove", mouseMoveHandler);

    // เริ่มเกม
    initializeGame();
  </script>
</body>
</html>

ขั้นตอนที่ 5: ทดสอบใหม่อีกครั้ง

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

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

ลองเขียนเกมของคุณเอง แล้วสนุกไปกับโลกของการพัฒนาเกมกันนะคะ! 😊🎮

Leave a Reply