ใ€Pygameใ€‘ๅ“็ƒใ‚ฒใƒผใƒ (PONG้ขจ)ใ‚’ไฝœๆˆใ™ใ‚‹ๆ–นๆณ•ใจใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰

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ใฎไฝฟใ„ๆ–นใซใคใ„ใฆใฏไปฅไธ‹ใƒšใƒผใ‚ธใง่งฃ่ชฌใ—ใฆใ„ใพใ™ใ€‚

ใ€Pygame่ถ…ๅ…ฅ้–€ใ€‘ไฝฟใ„ๆ–นใจใ‚ตใƒณใƒ—ใƒซใ‚ฒใƒผใƒ ใ‚’่งฃ่ชฌ
Pygameใง2Dใ‚ฒใƒผใƒ ใ‚’็ฐกๅ˜ใซๅˆถไฝœใ™ใ‚‹ๆ–นๆณ•ใ‚’ๅ…ฅ้–€่€…ๅ‘ใ‘ใซ่งฃ่ชฌใ—ใพใ™ใ€‚

Pythonๅ…จ่ˆฌใซใคใ„ใฆใฏไปฅไธ‹ใƒšใƒผใ‚ธใง่งฃ่ชฌใ—ใฆใ„ใพใ™ใ€‚

ใ€Python่ถ…ๅ…ฅ้–€ใ€‘ไฝฟใ„ๆ–นใจใ‚ตใƒณใƒ—ใƒซ้›†
Pythonใฎไฝฟใ„ๆ–นใซใคใ„ใฆใ€ๅŸบ็คŽๆ–‡ๆณ•ใ‹ใ‚‰ๅฟœ็”จไพ‹ใพใงๅ…ฅ้–€่€…ๅ‘ใ‘ใซ่งฃ่ชฌใ—ใพใ™ใ€‚
ใ“ใฎ่จ˜ไบ‹ใ‚’ๆ›ธใ„ใŸไบบ
่ฅฟไฝๆŠ€็ ”

Pythonไฝฟ็”จๆญด10ๅนดไปฅไธŠใ€‚็ ”็ฉถใ€ไป•ไบ‹ใ€่ถฃๅ‘ณใงใƒ‡ใƒผใ‚ฟๅˆ†ๆžใ‚„ไฝœๆฅญ่‡ชๅ‹•ๅŒ–ใชใฉใซๆดป็”จใ—ใฆใใŸใƒŽใ‚ฆใƒใ‚ฆใ‚’ๆƒ…ๅ ฑ็™บไฟกใ—ใฆใ„ใพใ™ใ€‚
่ฉณใ—ใ„ใƒ—ใƒญใƒ•ใ‚ฃใƒผใƒซใ‚„ใŠๅ•ๅˆใ›ใฏใ“ใกใ‚‰ใฎใƒšใƒผใ‚ธใพใงใ€‚
โ‡“Youtubeใ‚„X๏ผˆๆ—งTwitter๏ผ‰ใงใ‚‚ๆƒ…ๅ ฑ็™บไฟกไธญใงใ™๏ผ

่ฅฟไฝๆŠ€็ ”ใ‚’ใƒ•ใ‚ฉใƒญใƒผใ™ใ‚‹
PyGame

ใ‚ณใƒกใƒณใƒˆ

  1. renk ใ‚ˆใ‚Š:

    ใƒ–ใƒญใ‚ฐใ‚’ๆฅฝใ—ใๆ‹่ฆ‹ใ•ใ›ใฆ้ ‚ใ„ใฆใŠใ‚Šใพใ™ใ€‚ใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
    ใ•ใฆใ€PONGใ‚ตใƒณใƒ—ใƒซใ‚’ๅ‹•ไฝœใ•ใ›ใ‚ˆใ†ใจๆ€ใ„ใพใ™ใŒใ€ใƒใƒผใ ใ‘ๅ‹•ใ„ใฆๅ‹•ไฝœใ—ใพใ›ใ‚“ใ€‚
    ไฝ•ใ‹ๅ•้กŒใ‚ใ‚Šใพใ™ใงใ—ใ‚‡ใ†ใ‹๏ผŸ
    ๅ› ใฟใซ/โ†’//ใฎๅฏพๅฟœใฏใ—ใพใ—ใŸใ€‚

    ๏ผœ้–‹็™บ็’ฐๅขƒ๏ผž
    Windows
    Python 3.6

    • ็ฎก็†ไบบ ใ‚ˆใ‚Š:

      โ€ปrenkๆง˜
      ใ‚ณใƒกใƒณใƒˆใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
      ็งใฎ็’ฐๅขƒ๏ผˆWindows10+Python3.6๏ผ‰ใงใ‚‚ใ‚จใƒฉใƒผใŒๅ‡บใพใ—ใŸใฎใง
      ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ใ‚’ไฟฎๆญฃ่‡ดใ—ใพใ—ใŸใ€‚
      ใ”็ขบ่ชใ„ใŸใ ใ‘ใพใ™ใจๅนธใ„ใงใ™ใ€‚

  2. renk ใ‚ˆใ‚Š:

    ใ”ๅฏพๅฟœ้ ‚ใใ‚ใ‚ŠใŒใจใ†ใ”ใ–ใ„ใพใ™ใ€‚
    ็งใฎ็’ฐๅขƒใงใ‚‚ๅ‹•ไฝœ็ขบ่ชใงใใพใ—ใŸใ€‚