⚔️ Slash Survivor

✍️ Coded line by line by Nutpoom Sookkasem, age 16 💛 · See full profile and all works →

← All projects

📖 What is this project?

Slash Survivor คือเกมแอ็กชันเรียลไทม์ที่เขียนด้วย pygame — ตัวเราเคลื่อนที่ตามเมาส์ ส่วนศัตรูสีแดงจะไล่ล่าเราตลอดเวลาแบบไม่ลดละ กด Space เพื่อฟันดาบ ถ้าฟันโดนศัตรูจะกระเด็นไปเกิดใหม่ที่ขอบจอแบบสุ่มและเราได้แต้ม แต่ถ้าปล่อยให้มันแตะตัวเราเมื่อไหร่ = จบเกมทันที

หัวใจของเกมนี้คือคณิตศาสตร์ — นักเรียนใช้การคำนวณเวกเตอร์และ math.sqrt หาระยะห่าง แล้ว normalize ให้ศัตรูวิ่งเข้าหาเราด้วยความเร็วคงที่ทุกทิศทาง ส่วนเอฟเฟกต์ฟันดาบใช้ math.cos / math.sin วาดสี่เหลี่ยมเล็ก ๆ เรียงเป็นวงโค้งแล้วค่อย ๆ จางหายไป — เป็นการเอาตรีโกณมิติมาใช้ทำเกมได้สวยงามมาก

🧠 What they used from the Python course:
pygame — เกมกราฟิกแบบเรียลไทม์ 120 FPS คณิตศาสตร์เวกเตอร์ — คำนวณทิศทางให้ศัตรูวิ่งไล่ math.sqrt หาระยะห่าง + normalize เวกเตอร์ ระบบ hitbox ตรวจการชน (colliderect) เอฟเฟกต์ฟันดาบด้วย math.cos / math.sin วาดเป็นวงโค้ง จับอินพุตเมาส์และคีย์บอร์ด (KEYDOWN / KEYUP) ระบบจางหายของเอฟเฟกต์ (alpha) ป้องกันการหารด้วยศูนย์

🕹️ Try the real thing!

This is the real pygame game, converted to run on the web with every position, colour and rule kept exactly the same — just click and play.

คอม: ขยับเมาส์เพื่อเดิน · กด Space เพื่อฟันดาบ  |  มือถือ: ลากนิ้วเพื่อเดิน · แตะปุ่มฟันด้านล่าง

👨‍💻 The original Python source code (with the comments they wrote themselves)

import time
import pygame
import math
import random

pygame.init()

width = 800
height = 600
screen = pygame.display.set_mode((width, height))#กำหนดขนาดหน้าจอ

pc = pygame.Rect((0, 0, 50, 50))#กำหนาดขนาดและที่อยู่ของสี่เหลี่ยมสีน้ำเงิน
ec = pygame.Rect((375, 0, 50, 50))#กำหนดขนาดและที่อยู่ของสี่เหลี่ยมสีแดง
ecop = [(375, 0), (0, 275), (375, 600), (800, 275)]#กำหนดค่า ecop เพื่อนำไปใช้ในการสุ่มภายหลัง

font = pygame.font.Font(None, 36)#กำหนดขนาดและ font

slash_hitbox = pygame.Rect(0, 0, 100, 50)#กำหนดขนาดและที่อยู่ของ slash_hitbox(hitbox)

clock = pygame.time.Clock()#กำหนดค่า clock เพื่อนนำไปใช้กำหนดค่า tick ในภายหลัง
slashes = []#กำหนดค่า slash เพื่อนำไปใช้ในการทำ effect ฟันดาบ
point = 0#กำหนดค่า point เพื่อเอาไว้ใช้นับแต้ม

run = True
while run:
    screen.fill((0, 0, 0))
    #เคลื่อนที่สี่เหลี่ยมสีแดงไปหาสี่เหลี่ยมสีน้ำเงิน
    player_center = pc.center
    enemy_center = ec.center

    #คำนวณหาค่าเวคเตอร์ไปหาผู้เล่น
    dx = player_center[0] - enemy_center[0]
    dy = player_center[1] - enemy_center[1]

    #คำนวณหาระยะห่างจากผู้เล่น
    distance = math.sqrt(dx ** 2 + dy ** 2)

    #กำหนดทิศทางที่สี่เหลี่ยมสี่แดงจะไปหาสี่เหลี่ยมสีน้ำเงิน
    if distance != 0:#กันไม่ให้มีการหาร 0
        dx /= distance
        dy /= distance
        ec.x += dx * 2
        ec.y += dy * 2

    if slash_hitbox.colliderect(ec):#ตรวจสอบว่า slash_hitbox ไปโดน ec หรือไม่
        ec.topleft = random.choice(ecop)#ถ้าโดนแล้วให้สุ่มที่อยู่ใหม่ของ ec
        point = point + 1#หลังจากนั้นเพิ่มค่า point ขึ้นมา 1
    if ec.colliderect(pc):#ถ้า ec ไปโดน pc
        print("You die")
        print(f"your points: {point}")#บอกคะแนนผู้เล่น
        run = False#ปิดเกม

    #กำหนดให้ตัวผู้เล่นขยับไปพร้อมกับ mouse
    mouse_x, mouse_y = pygame.mouse.get_pos()
    m = pygame.mouse.get_pos()
    pc.center = m

    #วางผู้เล่นและศัตรูลงบนจอ
    pygame.draw.rect(screen, (0, 0, 255), pc)
    pygame.draw.rect(screen, (255, 0, 0  ), ec)

    #วางตัวอักษรลงบนจอ
    po = font.render(f"points: {point}", True, (255, 255, 255))#กำหนดสีและตัวอักษร
    screen.blit(po, (10, 10))#กำหนดที่อยู่ตัวอักษร

    #event handler(มีหน้าที่รับข้อมูลว่าผู้เล่นหรือผู้ใช้ทำอะไรขยับ cursor ไปที่ไหนได้คลิกหรือไม่กดปุ่มอะไรและอื่นๆ)
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            run = False
        elif event.type == pygame.KEYDOWN:#ตรวจจับว่าปุ่มบน keyboard ถูกกดหรือไม่
            if event.key == pygame.K_SPACE:#ปุ่มที่ถูกกดใช่ spacebar หรือไม่
                slashes.append([mouse_x, mouse_y, 255])#ถ้าใช่ให้ใส่ข้อมูลเข้าไปใน slashes
            if event.key == pygame.K_SPACE:#ปุ่มที่ถูกกดใช่ spacebar หรือไม่
                slash_hitbox.midbottom = m#ตั้งค่าให้ตรงกลางข้างล่างของ slash_hitbox เท่ากับ m ซึ่งคือค่าตำแหล่ง cursor
        elif event.type == pygame.KEYUP:#ตรวจสอบว่าปุ่มบน keyboard ถูกปล่อย
            if event.key == pygame.K_SPACE:#ถ้าปุ่มที่ถูกปล่อยคือปุ่ม spacebar
                slash_hitbox.topleft = [0, 0]#ให้ขยับ slash_hitbox ไปหลบที่ 0, 0
    #ทำ effect ฟันดาบ
    for slash in slashes[:]:
        x, y, alpha = slash
        color = (255, 255, 255, alpha)

        for angle in range(-330, -200, 10):
            angle_rad = math.radians(angle)
            arc_x = x + int(math.cos(angle_rad) * 50)
            arc_y = y - int(math.sin(angle_rad) * 50)
            pygame.draw.rect(screen, color[:3], (arc_x, arc_y, 10, 10))

        slash[2] -= 15
        if slash[2] <= 0:
            slashes.remove(slash)

    pygame.display.update()
    clock.tick(120)#กำหนด tick

pygame.quit()
Share on LINE
Want your child to build games like this?

Our Python course is taught live, one-on-one, and every child builds a real project of their own just like these.