Pygameใ็จใใฆPONG้ขจใฎๅ็ใฒใผใ ใไฝใๆนๆณใจใฝใผในใณใผใใ่งฃ่ชฌใใพใใ
ๅ็ใฒใผใ (PONG)ใจใฏ
PONGใจใฏใ1972ๅนดใซATARI็คพใใ็บๅฃฒใใใใขใผใฑใผใใฒใผใ ใงใใ
ๅ
ๅฎนใฏใใผใใณใณใใญใผใฉใผใงไธไธใซๆไฝใใใผใซใๆใกๅใ2ไบบ็จใฎใใณใใณใฒใผใ ใงใใ
ไปๅใฏใไปฅไธใฎใใใชPygameใงPONG้ขจใฎๅ็ใฒใผใ ไฝๆใใๆนๆณใ่งฃ่ชฌใใพใใ
ๅ็ป่งฃ่ชฌ็
ใตใณใใซใณใผใ
PONEใฎใตใณใใซใณใผใใงใใใใผใไธไธใซๅใใใฆใใผใซใๆใก่ฟใใ็ธๆใฎใดใผใซใซใใผใซใๅ ฅใใใจในใณใขใๅ ็ฎใใใพใใ
ใณใผใ่งฃ่ชฌ
ไธ่จใณใผใใฎๅ้จๅใ้ ใซ่ฉณใใ่งฃ่ชฌใใพใใ
1. ใคใณใใผใ
import pygame
import sys
from pygame.locals import *
- pygame: Pygameใฉใคใใฉใชใ
- sys: ใทในใใ ้ข้ฃใ
- pygame.locals: Pygameใฎๅฎๆฐใ
2. ใใผใฎในใใฉใคใใฏใฉใน
# ใใผใฎในใใฉใคใใฏใฉใน
class Bar(pygame.sprite.Sprite):
def __init__(self, x, y, alpha=0):
super().__init__()
self.image = pygame.Surface((10, 50 + 50*alpha))
self.image.fill((255, 255, 255))
self.rect = self.image.get_rect()
self.rect.topleft = (x, y)
def update(self, dy):
self.rect.y += dy
if self.rect.y < 10:
self.rect.y = 10
elif self.rect.y > 420:
self.rect.y = 420
- Barใฏใฉใน: ใใฌใคใคใผใฎใใผใ่กจใในใใฉใคใใฏใฉในใ
- initใกใฝใใ: ใใผใฎๅๆไฝ็ฝฎใจใตใคใบใ่จญๅฎใalphaใฏใฒใผใ ใฌใใซใซๅฟใใฆ็ธๆใฎใใผใตใคใบใๅคงใใใใใใใฎๅ็ใ
- updateใกใฝใใ: ใใผใฎไฝ็ฝฎใๆดๆฐใใ็ป้ขๅคใซๅบใชใใใใซๅถ้ใ
3. ใใผใซใฎในใใฉใคใใฏใฉใน
class Ball(pygame.sprite.Sprite):
def __init__(self, x, y, vx, vy):
super().__init__()
self.image = pygame.Surface((20, 20), pygame.SRCALPHA)
pygame.draw.circle(self.image, (255, 255, 255), (10, 10), 10)
self.rect = self.image.get_rect()
self.rect.center = (x, y)
self.vx = vx
self.vy = vy
def update(self):
self.rect.x += self.vx
self.rect.y += self.vy
if self.rect.y <= 10 or self.rect.y >= 457.5:
self.vy = -self.vy
- Ballใฏใฉใน: ใใผใซใ่กจใในใใฉใคใใฏใฉในใ
- initใกใฝใใ: ใใผใซใฎๅๆไฝ็ฝฎใจ้ๅบฆใ่จญๅฎใ
- updateใกใฝใใ: ใใผใซใฎไฝ็ฝฎใๆดๆฐใใไธไธใฎๅฃใซๅฝใใฃใๅ ดๅใซๅๅฐใ
4. ๅๆ่จญๅฎ
def main():
pygame.init()
screen = pygame.display.set_mode((640, 480), 0, 32)
pygame.display.set_caption("PONG")
clock = pygame.time.Clock()
font = pygame.font.SysFont(None, 40)
# ในใณใข
score1, score2 = 0, 0
# ใฒใผใ ใฌใใซ๏ผๅคใๅคงใใใชใใปใฉใใใผใจใใผใซใๆฉใๅใใๆตใฎใใผใตใคใบใๅคงใใใชใ๏ผ
game_level = 2
# ใใผใซในใใผใ
ball_speed = 5
- pygame.init(): Pygameใๅๆๅใ
- screen: ใฒใผใ ็ป้ขใฎ่จญๅฎใ
- pygame.display.set_caption: ใฆใฃใณใใฆใฎใฟใคใใซใ่จญๅฎใ
- clock: ใใฌใผใ ใฌใผใใ็ฎก็ใ
- font: ในใณใข่กจ็คบ็จใฎใใฉใณใใ่จญๅฎใ
5. ในใใฉใคใใฎไฝๆใจ็ฎก็
# ในใใฉใคใไฝๆ
bar1 = Bar(10, 215)
bar2 = Bar(620, 215, game_level*0.2)
ball = Ball(320, 240, ball_speed + game_level, ball_speed + game_level)
# ในใใฉใคใใฐใซใผใใซ่ฟฝๅ
all_sprites = pygame.sprite.Group()
all_sprites.add(bar1, bar2, ball)
- bar1, bar2: ใใฌใคใคใผใจๆตใฎใใผใไฝๆใ
- ball: ใใผใซใไฝๆใ
- all_sprites: ๅ จใฆใฎในใใฉใคใใ็ฎก็ใใใฐใซใผใใ
6. ใฒใผใ ใฎๅๆ็ถๆ
bar1_dy = 0
score1, score2 = 0, 0
- bar1_dy: ใใฌใคใคใผใฎใใผใฎ็งปๅ้๏ผๅๆๅค0๏ผใ
- score1, score2: ใใฌใคใคใผใจๆตใฎในใณใขใ
7. ใกใคใณใซใผใใจใคใใณใๅฆ็
running = True # ใซใผใๅฆ็ใฎๅฎ่กใ็ถ็ถใใใใฉใฐ
while running:
# ใญใผใคใใณใๅฆ็
for event in pygame.event.get():
# ้ใใใใฟใณใๆผใใใใใซใผใ็ตไบ๏ผใฒใผใ ็ตไบ๏ผ
if event.type == QUIT:
running = False
# โใใใใฏโ็ขๅฐใญใผใๆผใใใใใใผใ10pxๅใใ
if event.type == KEYDOWN:
if event.key == K_UP:
bar1_dy = -10
elif event.key == K_DOWN:
bar1_dy = 10
if event.type == KEYUP:
if event.key in (K_UP, K_DOWN):
bar1_dy = 0
- QUITใคใใณใ: ใฒใผใ ใ็ตไบใ
- KEYDOWNใคใใณใ: ใญใผใๆผใใใใจใใฎๅฆ็ใ
- KEYUPใคใใณใ: ใญใผใ้ขใใใใจใใฎๅฆ็ใ
8. ในใใฉใคใใฎๆดๆฐ
# ใใผใจใใผใซใฎๆดๆฐ
bar1.update(bar1_dy)
bar2.update((ball.rect.y - bar2.rect.y) * 0.1 * game_level)
ball.update()
- bar1.update: ใใฌใคใคใผใฎใใผใๆดๆฐใ
- bar2.update: ๆตใฎใใผใใใผใซใซ่ฟฝๅพใใใใใฒใผใ ใฌใใซ๏ผgame_level๏ผใ้ซใใปใฉ้ใ่ฟฝๅพใใใ
- ball.update: ใใผใซใๆดๆฐใ
9. ่ก็ชๅคๅฎ
if pygame.sprite.collide_rect(ball, bar1) or pygame.sprite.collide_rect(ball, bar2):
ball.vx = -ball.vx
- collide_rect: ใใผใซใใใผใซๅฝใใฃใๅ ดๅใใใผใซใฎๆนๅใๅ่ปขใ
10. ในใณใขใฎๆดๆฐ
if ball.rect.x < 5:
score2 += 1
ball.rect.center = (320, 240)
ball.vx = 2
ball.vy = 2
elif ball.rect.x > 620:
score1 += 1
ball.rect.center = (320, 240)
ball.vx = -2
ball.vy = -2
- ใใผใซใๅทฆ็ซฏใพใใฏๅณ็ซฏใซๅฐ้: ในใณใขใๆดๆฐใใใใผใซใไธญๅคฎใซใชใปใใใ
11. ็ป้ขใฎๆ็ป
screen.fill((0, 50, 0))
pygame.draw.aaline(screen, (255, 255, 255), (330, 5), (330, 475))
all_sprites.draw(screen)
screen.blit(font.render(str(score1), True, (255, 255, 255)), (250, 10))
screen.blit(font.render(str(score2), True, (255, 255, 255)), (400, 10))
pygame.display.update()
clock.tick(30)
- ็ป้ขใฎใฏใชใข: ็ป้ขใ้ปใงๅกใใคใถใใ
- ไธญๅคฎ็ทใฎๆ็ป: ไธญๅคฎใซ็ทใๆ็ปใ
- ในใใฉใคใใฎๆ็ป: ๅ จใฆใฎในใใฉใคใใๆ็ปใ
- ในใณใขใฎๆ็ป: ในใณใขใ็ป้ขใซ่กจ็คบใ
- ็ป้ขใฎๆดๆฐ: ็ป้ขใๆดๆฐใ
- ใใฌใผใ ใฌใผใใฎ่จญๅฎ: ใฒใผใ ใฎใใฌใผใ ใฌใผใใ่จญๅฎใ
12. main้ขๆฐใฎๅผใณๅบใ
if __name__ == "__main__":
main()
- main้ขๆฐใฎๅผใณๅบใ: ใฒใผใ ใ้ๅงใ
้ข้ฃใใผใธ
Pygameใฎไฝฟใๆนใซใคใใฆใฏไปฅไธใใผใธใง่งฃ่ชฌใใฆใใพใใ

Pythonๅ จ่ฌใซใคใใฆใฏไปฅไธใใผใธใง่งฃ่ชฌใใฆใใพใใ

ใณใกใณใ
ใใญใฐใๆฅฝใใๆ่ฆใใใฆ้ ใใฆใใใพใใใใใใจใใใใใพใใ
ใใฆใPONGใตใณใใซใๅไฝใใใใใจๆใใพใใใใใผใ ใๅใใฆๅไฝใใพใใใ
ไฝใๅ้กใใใพใใงใใใใ๏ผ
ๅ ใฟใซ/โ//ใฎๅฏพๅฟใฏใใพใใใ
๏ผ้็บ็ฐๅข๏ผ
Windows
Python 3.6
โปrenkๆง
ใณใกใณใใใใใจใใใใใพใใ
็งใฎ็ฐๅข๏ผWindows10+Python3.6๏ผใงใใจใฉใผใๅบใพใใใฎใง
ใฝใผในใณใผใใไฟฎๆญฃ่ดใใพใใใ
ใ็ขบ่ชใใใ ใใพใใจๅนธใใงใใ
ใๅฏพๅฟ้ ใใใใใจใใใใใพใใ
็งใฎ็ฐๅขใงใๅไฝ็ขบ่ชใงใใพใใใ