⚔️ Slash Survivor
✍️ Coded line by line by Nutpoom Sookkasem, age 16 💛 · See full profile and all works →
📖 What is this project?
Slash Survivor คือเกมแอ็กชันเรียลไทม์ที่เขียนด้วย pygame — ตัวเราเคลื่อนที่ตามเมาส์ ส่วนศัตรูสีแดงจะไล่ล่าเราตลอดเวลาแบบไม่ลดละ กด Space เพื่อฟันดาบ ถ้าฟันโดนศัตรูจะกระเด็นไปเกิดใหม่ที่ขอบจอแบบสุ่มและเราได้แต้ม แต่ถ้าปล่อยให้มันแตะตัวเราเมื่อไหร่ = จบเกมทันที
หัวใจของเกมนี้คือคณิตศาสตร์ — นักเรียนใช้การคำนวณเวกเตอร์และ math.sqrt หาระยะห่าง แล้ว normalize ให้ศัตรูวิ่งเข้าหาเราด้วยความเร็วคงที่ทุกทิศทาง ส่วนเอฟเฟกต์ฟันดาบใช้ math.cos / math.sin วาดสี่เหลี่ยมเล็ก ๆ เรียงเป็นวงโค้งแล้วค่อย ๆ จางหายไป — เป็นการเอาตรีโกณมิติมาใช้ทำเกมได้สวยงามมาก
🕹️ 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()
Our Python course is taught live, one-on-one, and every child builds a real project of their own just like these.