ใ€Pygameใ€‘ใ‚นใƒšใƒผใ‚นใ‚คใƒณใƒ™ใƒผใƒ€ใƒผใ‚ฒใƒผใƒ ใ‚’ไฝœๆˆใ™ใ‚‹ๆ–นๆณ•

Pygameใงใ‚นใƒšใƒผใ‚นใ‚คใƒณใƒ™ใƒผใƒ€ใƒผใ‚ฒใƒผใƒ ใ‚’ไฝœๆˆใ™ใ‚‹ๆ–นๆณ•ใ‚’ใ‚ฝใƒผใ‚นใ‚ณใƒผใƒ‰ไป˜ใใง่ฉณใ—ใ่งฃ่ชฌใ—ใพใ™ใ€‚

ใ€1ใ€‘ใ‚นใƒšใƒผใ‚นใ‚คใƒณใƒ™ใƒผใƒ€ใƒผใ‚ฒใƒผใƒ (็ฐกๆ˜“็‰ˆ)

Pygameใงใ‚นใƒšใƒผใ‚นใ‚คใƒณใƒ™ใƒผใƒ€ใƒผใ‚ฒใƒผใƒ ใ‚’ไฝœๆˆใ™ใ‚‹ๆ–นๆณ•ใ‚’่งฃ่ชฌใ—ใพใ™ใ€‚
ใพใšใ€ใ‚นใƒšใƒผใ‚นใ‚คใƒณใƒ™ใƒผใƒ€ใƒผใ‚ฒใƒผใƒ ใฎ้ชจ็ต„ใฟใ‚’็†่งฃใ™ใ‚‹ใŸใ‚ใซใ€ไปฅไธ‹ๅ‹•็”ปใฎใ‚ˆใ†ใชใ‚ทใƒณใƒ—ใƒซใช็‰ฉใ‹ใ‚‰ไฝœๆˆใ—ใพใ™ใ€‚

ๅ‹•็”ป่งฃ่ชฌ็‰ˆ

ๆœฌใƒšใƒผใ‚ธใฎๅ†…ๅฎนใฏไปฅไธ‹ๅ‹•็”ปใงใ‚‚่งฃ่ชฌใ—ใฆใ„ใพใ™ใ€‚

ใ€1-1ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ 

Sใ‚ญใƒผใ‚’ๆŠผใ™ใจใ‚ฒใƒผใƒ ใŒ้–‹ๅง‹ใ•ใ‚Œใพใ™ใ€‚
ใ‚นใƒšใƒผใ‚นใ‚ญใƒผใงใƒ—ใƒฌใ‚คใƒคใƒผ๏ผˆ็ท‘๏ผ‰ใ‹ใ‚‰ๅผพใŒ็™บๅฐ„ใ•ใ‚Œใ€่ฟซใฃใฆใใ‚‹ใ‚จใ‚คใƒชใ‚ขใƒณใซๅฝ“ใŸใ‚‹ใจๆ’ƒใก่ฝใจใ™ใ“ใจใŒใงใใพใ™ใ€‚


ใ€1-2ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ ใฎ่งฃ่ชฌ

ไธŠ่จ˜ใ‚ณใƒผใƒ‰ใฎๅ„้ƒจๅˆ†ใซใคใ„ใฆ่งฃ่ชฌใ—ใพใ™ใ€‚

1. ่‰ฒใฎๅฎš็พฉ

WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
RED = (255, 0, 0)
GREEN = (0, 255, 0)
DARK_GREEN = (0, 40, 0)
  • ใ‚ฒใƒผใƒ ๅ†…ใงไฝฟ็”จใ™ใ‚‹่‰ฒใ‚’RGBๅฝขๅผใงๅฎš็พฉใ—ใฆใ„ใพใ™ใ€‚

2. ใƒ—ใƒฌใ‚คใƒคใƒผใ‚ฏใƒฉใ‚น

ใƒ—ใƒฌใ‚คใƒคใƒผใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๅฎš็พฉใ—ใ€ๅทฆๅณใฎ็งปๅ‹•ใ‚’ๅˆถๅพกใ—ใพใ™ใ€‚

class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(GREEN)
        self.rect = self.image.get_rect()
        self.rect.center = (400, 550)
        self.speed = 5

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < 800:
            self.rect.x += self.speed
  • __init__ ใƒกใ‚ฝใƒƒใƒ‰: ใ‚ฏใƒฉใ‚นใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟใงใ€ใƒ—ใƒฌใ‚คใƒคใƒผใฎๅˆๆœŸ่จญๅฎšใ‚’่กŒใ„ใพใ™ใ€‚
    • super().__init__(): ่ฆชใ‚ฏใƒฉใ‚น๏ผˆpygame.sprite.Sprite๏ผ‰ใฎๅˆๆœŸๅŒ–ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ—ใพใ™ใ€‚
    • self.image = pygame.Surface((30, 30)): 30×30ใƒ”ใ‚ฏใ‚ปใƒซใฎใ‚ตใƒผใƒ•ใ‚งใ‚น๏ผˆ็”ปๅƒ๏ผ‰ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚
    • self.image.fill(GREEN): ใ‚ตใƒผใƒ•ใ‚งใ‚นใ‚’็ท‘่‰ฒใงๅก—ใ‚Šใคใถใ—ใพใ™ใ€‚
    • self.rect = self.image.get_rect(): ใ‚ตใƒผใƒ•ใ‚งใ‚นใฎ็Ÿฉๅฝข๏ผˆrect๏ผ‰ใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใจใ‚ตใ‚คใ‚บใ‚’็ฎก็†ใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚
    • self.rect.center = (400, 550): ็Ÿฉๅฝขใฎไธญๅฟƒใ‚’็”ป้ขใฎๆŒ‡ๅฎšไฝ็ฝฎ๏ผˆ400, 550๏ผ‰ใซ่จญๅฎšใ—ใพใ™ใ€‚ใƒ—ใƒฌใ‚คใƒคใƒผใฎๅˆๆœŸไฝ็ฝฎใ‚’่จญๅฎšใ—ใพใ™ใ€‚
    • self.speed = 5: ใƒ—ใƒฌใ‚คใƒคใƒผใฎ็งปๅ‹•้€Ÿๅบฆใ‚’5ใซ่จญๅฎšใ—ใพใ™ใ€‚
  • update ใƒกใ‚ฝใƒƒใƒ‰: ใƒ—ใƒฌใ‚คใƒคใƒผใฎไฝ็ฝฎใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏๆฏŽใƒ•ใƒฌใƒผใƒ ๅ‘ผใณๅ‡บใ•ใ‚Œใพใ™ใ€‚
    • keys = pygame.key.get_pressed(): ็พๅœจๆŠผใ•ใ‚Œใฆใ„ใ‚‹ใ‚ญใƒผใฎ็Šถๆ…‹ใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚
    • if keys[pygame.K_LEFT] and self.rect.left > 0: ๅทฆ็Ÿขๅฐใ‚ญใƒผใŒๆŠผใ•ใ‚Œใฆใ„ใฆใ€ใƒ—ใƒฌใ‚คใƒคใƒผใŒ็”ป้ขใฎๅทฆ็ซฏใซ้”ใ—ใฆใ„ใชใ„ๅ ดๅˆใซๆกไปถใŒๆˆ็ซ‹ใ—ใพใ™ใ€‚
      • self.rect.x -= self.speed: ใƒ—ใƒฌใ‚คใƒคใƒผใ‚’ๅทฆใซ็งปๅ‹•ใ•ใ›ใพใ™ใ€‚
    • if keys[pygame.K_RIGHT] and self.rect.right < 800: ๅณ็Ÿขๅฐใ‚ญใƒผใŒๆŠผใ•ใ‚Œใฆใ„ใฆใ€ใƒ—ใƒฌใ‚คใƒคใƒผใŒ็”ป้ขใฎๅณ็ซฏใซ้”ใ—ใฆใ„ใชใ„ๅ ดๅˆใซๆกไปถใŒๆˆ็ซ‹ใ—ใพใ™ใ€‚
      • self.rect.x += self.speed: ใƒ—ใƒฌใ‚คใƒคใƒผใ‚’ๅณใซ็งปๅ‹•ใ•ใ›ใพใ™ใ€‚

3. ใ‚จใ‚คใƒชใ‚ขใƒณใ‚ฏใƒฉใ‚น

ใ‚จใ‚คใƒชใ‚ขใƒณใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๅฎš็พฉใ—ใ€ๅทฆๅณใซ็งปๅ‹•ใ—ใชใŒใ‚‰็”ป้ข็ซฏใซ้”ใ™ใ‚‹ใจไธ‹ใซ็งปๅ‹•ใ—ใพใ™ใ€‚

class Alien(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.speed = 2

    def update(self):
        self.rect.x += self.speed
        if self.rect.right >= 800 or self.rect.left <= 0:
            self.speed = -self.speed
        self.rect.y += 40
  • __init__ ใƒกใ‚ฝใƒƒใƒ‰: ใ‚ฏใƒฉใ‚นใฎใ‚ณใƒณใ‚นใƒˆใƒฉใ‚ฏใ‚ฟใงใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅˆๆœŸ่จญๅฎšใ‚’่กŒใ„ใพใ™ใ€‚
    • super().__init__(): ่ฆชใ‚ฏใƒฉใ‚น๏ผˆpygame.sprite.Sprite๏ผ‰ใฎๅˆๆœŸๅŒ–ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ—ใพใ™ใ€‚
    • self.image = pygame.Surface((30, 30)): 30×30ใƒ”ใ‚ฏใ‚ปใƒซใฎใ‚ตใƒผใƒ•ใ‚งใ‚น๏ผˆ็”ปๅƒ๏ผ‰ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚
    • self.image.fill(RED): ใ‚ตใƒผใƒ•ใ‚งใ‚นใ‚’่ตค่‰ฒใงๅก—ใ‚Šใคใถใ—ใพใ™ใ€‚
    • self.rect = self.image.get_rect(): ใ‚ตใƒผใƒ•ใ‚งใ‚นใฎ็Ÿฉๅฝข๏ผˆrect๏ผ‰ใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎไฝ็ฝฎใจใ‚ตใ‚คใ‚บใ‚’็ฎก็†ใ™ใ‚‹ใŸใ‚ใซไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚
    • self.rect.topleft = (x, y): ็ŸฉๅฝขใฎๅทฆไธŠใฎไฝ็ฝฎใ‚’ๅผ•ๆ•ฐใจใ—ใฆๆธกใ•ใ‚ŒใŸxใจyใซ่จญๅฎšใ—ใพใ™ใ€‚
    • self.speed = 2: ใ‚จใ‚คใƒชใ‚ขใƒณใฎ็งปๅ‹•้€Ÿๅบฆใ‚’2ใซ่จญๅฎšใ—ใพใ™ใ€‚
  • update ใƒกใ‚ฝใƒƒใƒ‰: ใ‚จใ‚คใƒชใ‚ขใƒณใฎไฝ็ฝฎใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚ใ“ใฎใƒกใ‚ฝใƒƒใƒ‰ใฏๆฏŽใƒ•ใƒฌใƒผใƒ ๅ‘ผใณๅ‡บใ•ใ‚Œใพใ™ใ€‚
    • self.rect.x += self.speed: ใ‚จใ‚คใƒชใ‚ขใƒณใ‚’็พๅœจใฎ้€Ÿๅบฆใงๆจชๆ–นๅ‘ใซ็งปๅ‹•ใ•ใ›ใพใ™ใ€‚
    • if self.rect.right >= 800 or self.rect.left <= 0: ใ‚จใ‚คใƒชใ‚ขใƒณใŒ็”ป้ขใฎๅณ็ซฏ๏ผˆ800px๏ผ‰ใซ้”ใ™ใ‚‹ใ‹ใ€ๅทฆ็ซฏ๏ผˆ0px๏ผ‰ใซ้”ใ—ใŸๅ ดๅˆ(ๆŠ˜ใ‚Š่ฟ”ใ—็”จ)
      • self.speed = -self.speed: ใ‚จใ‚คใƒชใ‚ขใƒณใฎ็งปๅ‹•ๆ–นๅ‘ใ‚’ๅ่ปขใ•ใ›ใพใ™๏ผˆๅณใซ็งปๅ‹•ใ—ใฆใ„ใŸๅ ดๅˆใฏๅทฆใซใ€ๅทฆใซ็งปๅ‹•ใ—ใฆใ„ใŸๅ ดๅˆใฏๅณใซ๏ผ‰ใ€‚
      • self.rect.y += 40: ใ‚จใ‚คใƒชใ‚ขใƒณใ‚’็ธฆๆ–นๅ‘ใซ40ใƒ”ใ‚ฏใ‚ปใƒซไธ‹ใซ็งปๅ‹•ใ•ใ›ใพใ™ใ€‚ใ‚จใ‚คใƒชใ‚ขใƒณใŒ็”ป้ข็ซฏใซ้”ใ—ใŸใจใใซไธ€ๆฎตไธ‹ใซ้™ใ‚Šใ‚‹ๅ‹•ไฝœใ‚’ใ‚ทใƒŸใƒฅใƒฌใƒผใƒˆใ—ใพใ™ใ€‚

4. ๅผพใ‚ฏใƒฉใ‚น

class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill(WHITE)
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.speed = -10

    def update(self):
        self.rect.y += self.speed
        if self.rect.bottom < 0:
            self.kill()
  • ๅผพใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๅฎš็พฉใ—ใ€self.speed=-10ใงไธŠๆ–นๅ‘10pxใšใค็งปๅ‹•ใ—ใพใ™ใ€‚
  • updateใƒกใ‚ฝใƒƒใƒ‰ๅ†…ใงใ€ๅผพใŒ็”ป้ขใฎไธŠ็ซฏใ‚’่ถ…ใˆใŸๅ ดๅˆใซself.kill()ใ‚’ๅ‘ผใณๅ‡บใ—ใฆๅ‰Š้™คใ—ใฆใ„ใพใ™ใ€‚

5. ใƒกใ‚คใƒณใƒซใƒผใƒ—

ใ‚ฒใƒผใƒ ใฎๅˆๆœŸๅŒ–ใ€ใƒกใ‚คใƒณใƒซใƒผใƒ—ใ€ใ‚คใƒ™ใƒณใƒˆๅ‡ฆ็†ใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ›ดๆ–ฐใ€ๆ็”ปใ€ใ‚นใ‚ณใ‚ข่กจ็คบใ€ใ‚ฒใƒผใƒ ็ต‚ไบ†ๅˆคๅฎšใ‚’่กŒใ„ใพใ™ใ€‚

5-1. ๅˆๆœŸๅŒ–

    pygame.init()
  • Pygameใƒฉใ‚คใƒ–ใƒฉใƒชใ‚’ๅˆๆœŸๅŒ–ใ—ใพใ™ใ€‚

5-2. ็”ป้ข่จญๅฎš

    screen = pygame.display.set_mode((800, 600))
    pygame.display.set_caption("Space Invaders")
  • ใ‚ฒใƒผใƒ ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎใ‚ตใ‚คใ‚บใ‚’800×600ใƒ”ใ‚ฏใ‚ปใƒซใซ่จญๅฎšใ—ใ€ใ‚ฟใ‚คใƒˆใƒซใ‚’ใ€ŒSpace Invadersใ€ใซใ—ใพใ™ใ€‚

5-3. ใƒ•ใ‚ฉใƒณใƒˆ่จญๅฎš

    font = pygame.font.SysFont(None, 55)
  • ใ‚นใ‚ณใ‚ขใ‚„ใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่กจ็คบใ™ใ‚‹ใŸใ‚ใฎใƒ•ใ‚ฉใƒณใƒˆใ‚’่จญๅฎšใ—ใพใ™ใ€‚

5-4. ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฎไฝœๆˆ

    all_sprites = pygame.sprite.Group()
    aliens = pygame.sprite.Group()
    bullets = pygame.sprite.Group()
  • ใ‚ฒใƒผใƒ ๅ†…ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆ๏ผˆใƒ—ใƒฌใ‚คใƒคใƒผใ€ใ‚จใ‚คใƒชใ‚ขใƒณใ€ๅผพไธธ๏ผ‰ใ‚’็ฎก็†ใ™ใ‚‹ใŸใ‚ใฎใ‚ฐใƒซใƒผใƒ—ใ‚’ไฝœๆˆใ—ใพใ™ใ€‚

ใใ‚Œใžใ‚Œใฎใ‚ฐใƒซใƒผใƒ—ใซใฏไปฅไธ‹ใฎๅฝนๅ‰ฒใŒใ‚ใ‚Šใพใ™ใ€‚

  • all_spritesใ‚ฐใƒซใƒผใƒ—
    • ใ‚ฒใƒผใƒ ๅ†…ใฎใ™ในใฆใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ›ดๆ–ฐใจๆ็”ปใ‚’็ฎก็†ใ—ใพใ™ใ€‚ไพ‹ใˆใฐใ€all_sprites.update()ใ‚„all_sprites.draw(screen)ใ‚’ไฝฟใ†ใ“ใจใงใ€ๅ…จใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ›ดๆ–ฐใ‚„ๆ็”ปใ‚’ไธ€ๅบฆใซ่กŒใˆใพใ™ใ€‚
  • aliensใ‚ฐใƒซใƒผใƒ—
    • ใ‚จใ‚คใƒชใ‚ขใƒณใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ“ไฝœใ‚„ๅˆคๅฎšใ‚’่กŒใ†ใŸใ‚ใฎใ‚ฐใƒซใƒผใƒ—ใงใ™ใ€‚ไพ‹ใˆใฐใ€ๅผพไธธใจใฎ่ก็ชๅˆคๅฎšใ‚’่กŒใ†ๅ ดๅˆใ€pygame.sprite.groupcollide(bullets, aliens, True, True)ใ‚’ไฝฟใ†ใ“ใจใงใ€ๅผพไธธใจใ‚จใ‚คใƒชใ‚ขใƒณใฎ่ก็ชใ‚’ๅŠน็އ็š„ใซๅˆคๅฎšใงใใพใ™ใ€‚
  • bulletsใ‚ฐใƒซใƒผใƒ—
    • ๅผพไธธใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ“ไฝœใ‚„ๅˆคๅฎšใ‚’่กŒใ†ใŸใ‚ใฎใ‚ฐใƒซใƒผใƒ—ใงใ™ใ€‚ไพ‹ใˆใฐใ€ๅผพไธธใŒ็”ป้ขๅค–ใซๅ‡บใŸ้š›ใซๅ‰Š้™คใ™ใ‚‹ๅ‡ฆ็†ใ‚„ใ€ใ‚จใ‚คใƒชใ‚ขใƒณใจใฎ่ก็ชๅˆคๅฎšใ‚’่กŒใ†้š›ใซไฝฟ็”จใ—ใพใ™ใ€‚

5-5. ใƒ—ใƒฌใ‚คใƒคใƒผใจใ‚จใ‚คใƒชใ‚ขใƒณใฎ็”Ÿๆˆ

    player = Player()
    all_sprites.add(player)
    for i in range(10):
        for j in range(3):
            alien = Alien(50 + i * 50, 70 + j * 80)
            all_sprites.add(alien)
            aliens.add(alien)
  • ใƒ—ใƒฌใ‚คใƒคใƒผใจใ‚จใ‚คใƒชใ‚ขใƒณใ‚’็”Ÿๆˆใ—ใ€ใใ‚Œใžใ‚Œใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ—ใพใ™ใ€‚

5-6. ใ‚ฒใƒผใƒ ใƒซใƒผใƒ—

ใ‚ฒใƒผใƒ ใŒ็ต‚ไบ†ใ™ใ‚‹ใพใงใฎใƒกใ‚คใƒณใƒซใƒผใƒ—ใงใ™ใ€‚ใ‚คใƒ™ใƒณใƒˆๅ‡ฆ็†ใ‚„ใ‚นใƒ—ใƒฉใ‚คใƒˆใฎๆ›ดๆ–ฐใ€ๆ็”ปใ‚’่กŒใ„ใพใ™ใ€‚

    # ใ‚นใ‚ณใ‚ขใฎๅˆๆœŸๅŒ–
    score = 0

    # ใƒ•ใƒฉใ‚ฐ
    running = True
    game_over = False
    game_clear = False
    game_started = False

    while running:
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                running = False
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_SPACE and not game_over and not game_clear:
                    bullet = Bullet(player.rect.centerx, player.rect.top)
                    all_sprites.add(bullet)
                    bullets.add(bullet)
                if event.key == pygame.K_s:
                    game_started = True
  • ใ‚นใ‚ณใ‚ขใฎๅˆๆœŸๅŒ–๏ผˆscore = 0๏ผ‰: ใ‚ฒใƒผใƒ ้–‹ๅง‹ๆ™‚ใฎใ‚นใ‚ณใ‚ขใ‚’0ใซ่จญๅฎšใ—ใพใ™ใ€‚
  • running: ใ‚ฒใƒผใƒ ใƒซใƒผใƒ—ใ‚’ๅˆถๅพกใ™ใ‚‹ใŸใ‚ใฎใƒ•ใƒฉใ‚ฐใงใ™ใ€‚Trueใฎ้–“ใฏใ‚ฒใƒผใƒ ใŒๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚
  • game_over: ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใฎ็Šถๆ…‹ใ‚’ๅˆคๅฎšใ™ใ‚‹ใŸใ‚ใฎใƒ•ใƒฉใ‚ฐใงใ™ใ€‚Falseใฎ้–“ใฏใ‚ฒใƒผใƒ ใŒ็ถš่กŒใ•ใ‚Œใพใ™ใ€‚
  • game_clear: ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขใฎ็Šถๆ…‹ใ‚’ๅˆคๅฎšใ™ใ‚‹ใŸใ‚ใฎใƒ•ใƒฉใ‚ฐใงใ™ใ€‚Falseใฎ้–“ใฏใ‚ฒใƒผใƒ ใŒ็ถš่กŒใ•ใ‚Œใพใ™ใ€‚
  • game_started: ใ‚ฒใƒผใƒ ใŒ้–‹ๅง‹ใ•ใ‚ŒใŸใ‹ใฉใ†ใ‹ใ‚’ๅˆคๅฎšใ™ใ‚‹ใŸใ‚ใฎใƒ•ใƒฉใ‚ฐใงใ™ใ€‚Falseใฎ้–“ใฏใ‚ฒใƒผใƒ ใŒ้–‹ๅง‹ใ•ใ‚Œใฆใ„ใพใ›ใ‚“ใ€‚
  • while running:: runningใŒTrueใฎ้–“ใ€ใ‚ฒใƒผใƒ ใƒซใƒผใƒ—ใŒๅฎŸ่กŒใ•ใ‚Œใพใ™ใ€‚
  • pygame.event.get(): Pygameใฎใ‚คใƒ™ใƒณใƒˆใ‚ญใƒฅใƒผใ‹ใ‚‰ใ‚คใƒ™ใƒณใƒˆใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚
  • if event.type == pygame.QUIT:: ใ‚ฆใ‚ฃใƒณใƒ‰ใ‚ฆใฎ้–‰ใ˜ใ‚‹ใƒœใ‚ฟใƒณใŒๆŠผใ•ใ‚ŒใŸๅ ดๅˆใ€runningใ‚’Falseใซ่จญๅฎšใ—ใฆใ‚ฒใƒผใƒ ใƒซใƒผใƒ—ใ‚’็ต‚ไบ†ใ—ใพใ™ใ€‚
  • if event.type == pygame.KEYDOWN:: ใ‚ญใƒผใŒๆŠผใ•ใ‚ŒใŸๅ ดๅˆใฎๅ‡ฆ็†ใ‚’่กŒใ„ใพใ™ใ€‚
  • event.key == pygame.K_SPACE and not game_over: ใ‚นใƒšใƒผใ‚นใ‚ญใƒผใŒๆŠผใ•ใ‚Œใ€ใ‹ใคใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใงใชใ„ๅ ดๅˆใ€ๅผพใ‚’็™บๅฐ„ใ—ใพใ™ใ€‚
  • ๅผพใฎ็”Ÿๆˆ: bullet = Bullet(player.rect.centerx, player.rect.top)ใงใƒ—ใƒฌใ‚คใƒคใƒผใฎไฝ็ฝฎใ‹ใ‚‰ๅผพใ‚’็”Ÿๆˆใ—ใ€all_spritesใŠใ‚ˆใณbulletsใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ—ใพใ™ใ€‚
  • if event.key == pygame.K_s: Sใ‚ญใƒผใŒๆŠผใ•ใ‚ŒใŸๅ ดๅˆใ€game_startedใ‚’Trueใซ่จญๅฎšใ—ใ€ใ‚ฒใƒผใƒ ใ‚’้–‹ๅง‹ใ—ใพใ™ใ€‚

5-7. ่ก็ชๅˆคๅฎšใจใ‚นใ‚ณใ‚ขๆ›ดๆ–ฐ:

        if not game_over and not game_clear and game_started:
            # ๆ›ดๆ–ฐ
            all_sprites.update()
            # ่ก็ชๅˆคๅฎš
            hits = pygame.sprite.groupcollide(bullets, aliens, True, True)
            if hits:
                score += 10
  • ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใงใ‚‚ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ข็Šถๆ…‹ใงใ‚‚ใชใใ€ใ‚ฒใƒผใƒ ใŒ้–‹ๅง‹็Šถๆ…‹ใงใ‚ใ‚Œใฐใ€ๅ…จใฆใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚
  • ๅผพไธธใจใ‚จใ‚คใƒชใ‚ขใƒณใฎ่ก็ชใ‚’ๅˆคๅฎšใ—ใ€่ก็ชใŒใ‚ใ‚Œใฐใ‚นใ‚ณใ‚ขใ‚’ๆ›ดๆ–ฐใ—ใพใ™(10็‚นๅŠ ็ฎ—)ใ€‚
  • pygame.sprite.groupcollidemใƒกใ‚ฝใƒƒใƒ‰ใฎๅผ•ๆ•ฐTrue, Trueใฏใ€่ก็ชใ—ใŸๅผพใจใ‚จใ‚คใƒชใ‚ขใƒณใฎใ‚นใƒ—ใƒฉใ‚คใƒˆไธกๆ–นใ‚’ๅ‰Š้™คใ—ใพใ™ใ€‚
pygame.sprite.groupcollide(group1, group2, dokill1, dokill2, collided=None)
  • group1: ๆœ€ๅˆใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—๏ผˆไพ‹๏ผšbullets๏ผ‰ใ€‚
  • group2: 2็•ช็›ฎใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—๏ผˆไพ‹๏ผšaliens๏ผ‰ใ€‚
  • dokill1: Trueใฎๅ ดๅˆใ€group1ใฎ่ก็ชใ—ใŸใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๅ‰Š้™คใ—ใพใ™ใ€‚
  • dokill2: Trueใฎๅ ดๅˆใ€group2ใฎ่ก็ชใ—ใŸใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๅ‰Š้™คใ—ใพใ™ใ€‚
  • collided: ่ก็ชๅˆคๅฎšใซไฝฟ็”จใ™ใ‚‹ใ‚ซใ‚นใ‚ฟใƒ ้–ขๆ•ฐ๏ผˆ็œ็•ฅๅฏ่ƒฝ๏ผ‰ใ€‚ใƒ‡ใƒ•ใ‚ฉใƒซใƒˆใงใฏ็Ÿฉๅฝขใฎ่ก็ชๅˆคๅฎšใŒไฝฟ็”จใ•ใ‚Œใพใ™ใ€‚
  • ๆˆปใ‚Šๅ€ค: ่ก็ชใ—ใŸใ‚นใƒ—ใƒฉใ‚คใƒˆใฎใƒšใ‚ขใ‚’ๅซใ‚€่พžๆ›ธใ‚’่ฟ”ใ—ใพใ™ใ€‚่พžๆ›ธใฎใ‚ญใƒผใฏgroup1ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ€ๅ€คใฏใใ‚Œใซ่ก็ชใ—ใŸgroup2ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใฎใƒชใ‚นใƒˆใงใ™ใ€‚

5-8. ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขๅˆคๅฎš:

            # ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขๅˆคๅฎš
            if not aliens:
                game_clear = True
            # ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผๅˆคๅฎš๏ผˆใ‚จใ‚คใƒชใ‚ขใƒณใŒใƒ—ใƒฌใ‚คใƒคใƒผใฎไฝ็ฝฎใพใงๅˆฐ้”ใ—ใŸๅ ดๅˆ๏ผ‰
            for alien in aliens:
                if alien.rect.bottom >= player.rect.top:
                    game_over = True
  • ใ™ในใฆใฎใ‚จใ‚คใƒชใ‚ขใƒณใŒๅ€’ใ•ใ‚ŒใŸใ‚‰ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขใจใ—ใพใ™ใ€‚
  • ใ‚คใƒชใ‚ขใƒณใŒใƒ—ใƒฌใ‚คใƒคใƒผใฎไฝ็ฝฎใพใงๅˆฐ้”ใ—ใŸๅ ดๅˆใ€ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใจใ—ใพใ™ใ€‚

5-9. ๆ็”ปใจ็”ป้ขๆ›ดๆ–ฐ:

        # ๆ็”ป
        screen.fill(DARK_GREEN)
        all_sprites.draw(screen)
        # ใ‚นใ‚ณใ‚ข่กจ็คบ
        score_text = font.render(f"Score: {score}", True, WHITE)
        screen.blit(score_text, (10, 10))
        # ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผ่กจ็คบ
        if game_over:
            game_over_text = font.render("GAME OVER", True, WHITE)
            screen.blit(game_over_text, (300, 250))
            restart_text = font.render("Press 'R' to Restart", True, WHITE)
            screen.blit(restart_text, (250, 300))
            # ๅคใ„ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใฎๅ‰Š้™ค
            all_sprites.empty()
            aliens.empty()
            bullets.empty()
        # ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ข่กจ็คบ
        if game_clear:
            game_clear_text = font.render("GAME CLEAR", True, WHITE)
            screen.blit(game_clear_text, (300, 250))
  • ็”ป้ขใ‚’ๅก—ใ‚Šใคใถใ—ใ€ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚’ๆ็”ปใ—ใพใ™ใ€‚
  • ใ‚นใ‚ณใ‚ขใ‚„ๅˆคๅฎšใƒ•ใƒฉใ‚ฐใซๅฟœใ˜ใฆใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใ€ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขใƒกใƒƒใ‚ปใƒผใ‚ธใ‚’่กจ็คบใ—ใพใ™ใ€‚
  • ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผๆ™‚ใฏใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚’็ฉบใซใ—ใพใ™ใ€‚
  • ็”ป้ขใ‚’ๆ›ดๆ–ฐใ—ใ€ใƒ•ใƒฌใƒผใƒ ใƒฌใƒผใƒˆใ‚’่จญๅฎšใ—ใพใ™ใ€‚

5-10. ็ต‚ไบ†ๅ‡ฆ็†:

    pygame.quit()
    sys.exit()
  • ใ‚ฒใƒผใƒ ใ‚’็ต‚ไบ†ใ—ใ€ใ‚ทใ‚นใƒ†ใƒ ใ‚’็ต‚ไบ†ใ—ใพใ™ใ€‚

ใ€2ใ€‘ใ‚นใƒšใƒผใ‚นใ‚คใƒณใƒ™ใƒผใƒ€ใƒผใ‚ฒใƒผใƒ (็ฐกๆ˜“็‰ˆโ‘กๆ•ตใฎๅผพๅน•ใ‚’ๅฎŸ่ฃ…)

ๆฌกใซใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅผพๅน•ใ‚’ๅฎŸ่ฃ…ใ—ใ€ไปฅไธ‹ๅ‹•็”ปใฎใ‚ˆใ†ใซๆ”น่‰ฏใ—ใพใ™ใ€‚

ใ€2-1ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ก

Sใ‚ญใƒผใ‚’ๆŠผใ™ใจใ‚ฒใƒผใƒ ใŒ้–‹ๅง‹ใ•ใ‚Œใพใ™ใ€‚
ใ‚นใƒšใƒผใ‚นใ‚ญใƒผใงใƒ—ใƒฌใ‚คใƒคใƒผ๏ผˆ็ท‘๏ผ‰ใ‹ใ‚‰ๅผพใŒ็™บๅฐ„ใ•ใ‚Œใ€่ฟซใฃใฆใใ‚‹ใ‚จใ‚คใƒชใ‚ขใƒณใซๅฝ“ใŸใ‚‹ใจๆ’ƒใก่ฝใจใ™ใ“ใจใŒใงใใพใ™ใ€‚
ใ‚จใ‚คใƒชใ‚ขใƒณใŒใƒ—ใƒฌใ‚คใƒคใƒผใฎไฝ็ฝฎใพใงๅˆฐ้”ใ™ใ‚‹ใ‹ใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅผพใซใƒ—ใƒฌใ‚คใƒคใƒผใŒๅฝ“ใŸใ‚‹ใจใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใงใ™ใ€‚


ใ€2-2ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘กใฎ่งฃ่ชฌ

ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ ใจ็•ฐใชใ‚‹้ƒจๅˆ†ใ‚’ไธญๅฟƒใซ่งฃ่ชฌใ—ใพใ™ใ€‚

ใ‚จใ‚คใƒชใ‚ขใƒณใ‚ฏใƒฉใ‚น

# ใ‚จใ‚คใƒชใ‚ขใƒณใ‚ฏใƒฉใ‚น
class Alien(pygame.sprite.Sprite):
    def __init__(self, x, y, all_sprites, alien_bullets):
        super().__init__()
        self.image = pygame.Surface((30, 30))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.speed = 2
        self.all_sprites = all_sprites
        self.alien_bullets = alien_bullets

    def update(self):
        self.rect.x += self.speed
        if self.rect.right >= 800 or self.rect.left <= 0:
            self.speed = -self.speed
            self.rect.y += 40
        if random.randint(1, 300) == 1:  # 1/300ใฎ็ขบ็އใงๅผพใ‚’็™บๅฐ„
            bullet = AlienBullet(self.rect.centerx, self.rect.bottom)
            self.all_sprites.add(bullet)
            self.alien_bullets.add(bullet)
  • ๅˆๆœŸๅŒ–ใƒกใ‚ฝใƒƒใƒ‰ (__init__): ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅˆๆœŸ่จญๅฎšใ‚’่กŒใ„ใพใ™ใ€‚
    • xใจyใฏใ‚จใ‚คใƒชใ‚ขใƒณใฎๅˆๆœŸไฝ็ฝฎใงใ™ใ€‚
    • self.imageใฏใ‚จใ‚คใƒชใ‚ขใƒณใฎ่ฆ‹ใŸ็›ฎใ‚’ๅฎš็พฉใ™ใ‚‹ใŸใ‚ใฎใ‚ตใƒผใƒ•ใ‚งใ‚นใงใ™ใ€‚ใ‚ตใ‚คใ‚บใฏ30×30ใƒ”ใ‚ฏใ‚ปใƒซใงใ€่‰ฒใฏ่ตค๏ผˆRED๏ผ‰ใซ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™ใ€‚
    • self.rectใฏใ‚จใ‚คใƒชใ‚ขใƒณใฎไฝ็ฝฎใจใ‚ตใ‚คใ‚บใ‚’็ฎก็†ใ™ใ‚‹็Ÿฉๅฝข๏ผˆrect๏ผ‰ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ™ใ€‚
    • self.rect.topleftใฏใ‚จใ‚คใƒชใ‚ขใƒณใฎๅทฆไธŠใฎไฝ็ฝฎใ‚’่จญๅฎšใ—ใพใ™ใ€‚
    • self.speedใฏใ‚จใ‚คใƒชใ‚ขใƒณใฎ็งปๅ‹•้€Ÿๅบฆใ‚’่จญๅฎšใ—ใพใ™ใ€‚
    • self.all_spritesใจself.alien_bulletsใฏใ€ใ‚จใ‚คใƒชใ‚ขใƒณใŒๅผพใ‚’็™บๅฐ„ใ™ใ‚‹้š›ใซไฝฟ็”จใ™ใ‚‹ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใงใ™ใ€‚
  • ๆ›ดๆ–ฐใƒกใ‚ฝใƒƒใƒ‰ (__init__): ใ‚จใ‚คใƒชใ‚ขใƒณใฎๆ›ดๆ–ฐใ‚’่กŒใ„ใพใ™ใ€‚
    • self.rect.x += self.speedใงใ‚จใ‚คใƒชใ‚ขใƒณใ‚’ๅทฆๅณใซ็งปๅ‹•ใ•ใ›ใพใ™ใ€‚
    • ใ‚จใ‚คใƒชใ‚ขใƒณใŒ็”ป้ขใฎๅณ็ซฏ๏ผˆ800ใƒ”ใ‚ฏใ‚ปใƒซ๏ผ‰ใซ้”ใ™ใ‚‹ใจใ€self.rect.right >= 800ใŒ็œŸใจใชใ‚Šใ€้€Ÿๅบฆใฎ็ฌฆๅทใ‚’ๅ่ปขใ•ใ›ใพใ™๏ผˆself.speed = -self.speed๏ผ‰ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฏๅๅฏพๆ–นๅ‘ใซ็งปๅ‹•ใ—ใพใ™ใ€‚
    • ๅŒๆง˜ใซใ€ใ‚จใ‚คใƒชใ‚ขใƒณใŒ็”ป้ขใฎๅทฆ็ซฏใซ้”ใ™ใ‚‹ใจใ€ๅŒใ˜ๅ‡ฆ็†ใŒ่กŒใ‚ใ‚Œใพใ™ใ€‚
    • ใ‚จใ‚คใƒชใ‚ขใƒณใŒๆ–นๅ‘ใ‚’ๅค‰ใˆใ‚‹ใŸใณใซใ€self.rect.y += 40ใงใ‚จใ‚คใƒชใ‚ขใƒณใ‚’ไธ‹ใซ็งปๅ‹•ใ•ใ›ใพใ™ใ€‚
    • ๅผพใฎ็™บๅฐ„: random.randint(1, 300) == 1ใง1/300ใฎ็ขบ็އใงๅผพใ‚’็™บๅฐ„ใ—ใพใ™ใ€‚
    • AlienBulletใ‚ฏใƒฉใ‚นใฎใ‚คใƒณใ‚นใ‚ฟใƒณใ‚นใ‚’ไฝœๆˆใ—ใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฎไธญๅฟƒใ‹ใ‚‰ๅผพใ‚’็™บๅฐ„ใ—ใพใ™ใ€‚
    • ใ‚จใ‚คใƒชใ‚ขใƒณใŒๅผพใ‚’็™บๅฐ„ใ™ใ‚‹ๅบฆใซใ€ๆ–ฐใ—ใ„ๅผพใ‚’self.all_spritesใจself.alien_bulletsใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใซ่ฟฝๅŠ ใ—ใพใ™ใ€‚

ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅผพใ‚ฏใƒฉใ‚น

ใ“ใฎใ‚ฏใƒฉใ‚นใซใ‚ˆใ‚Šใ€ใ‚จใ‚คใƒชใ‚ขใƒณใŒ็™บๅฐ„ใ™ใ‚‹ๅผพใฏไธ‹ๆ–นๅ‘ใซ็งปๅ‹•ใ—ใ€็”ป้ขๅค–ใซๅ‡บใŸๅ ดๅˆใฏ่‡ชๅ‹•็š„ใซๅ‰Š้™คใ•ใ‚Œใพใ™ใ€‚

# ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅผพใ‚ฏใƒฉใ‚น
class AlienBullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        super().__init__()
        self.image = pygame.Surface((5, 10))
        self.image.fill(RED)
        self.rect = self.image.get_rect()
        self.rect.center = (x, y)
        self.speed = 5

    def update(self):
        self.rect.y += self.speed
        if self.rect.top > 600:
            self.kill()
  • ๅˆๆœŸๅŒ–ใƒกใ‚ฝใƒƒใƒ‰ (__init__): ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅผพใฎๅˆๆœŸ่จญๅฎšใ‚’่กŒใ„ใพใ™ใ€‚
    • xใจyใฏๅผพใฎๅˆๆœŸไฝ็ฝฎใงใ™ใ€‚
    • self.imageใฏๅผพใฎ่ฆ‹ใŸ็›ฎใ‚’ๅฎš็พฉใ™ใ‚‹ใŸใ‚ใฎใ‚ตใƒผใƒ•ใ‚งใ‚นใงใ™ใ€‚ใ‚ตใ‚คใ‚บใฏ5×10ใƒ”ใ‚ฏใ‚ปใƒซใงใ€่‰ฒใฏ่ตค๏ผˆRED๏ผ‰ใซ่จญๅฎšใ•ใ‚Œใฆใ„ใพใ™ใ€‚
    • self.rectใฏๅผพใฎไฝ็ฝฎใจใ‚ตใ‚คใ‚บใ‚’็ฎก็†ใ™ใ‚‹็Ÿฉๅฝข๏ผˆrect๏ผ‰ใ‚ชใƒ–ใ‚ธใ‚งใ‚ฏใƒˆใงใ™ใ€‚
    • self.rect.centerใฏๅผพใฎไธญๅฟƒไฝ็ฝฎใ‚’่จญๅฎšใ—ใพใ™ใ€‚
    • self.speedใฏๅผพใฎ็งปๅ‹•้€Ÿๅบฆใ‚’่จญๅฎšใ—ใพใ™ใ€‚
  • **updateใƒกใ‚ฝใƒƒใƒ‰
    • ็งปๅ‹•: self.rect.y += self.speedใงๅผพใ‚’ไธ‹ๆ–นๅ‘ใซ็งปๅ‹•ใ•ใ›ใพใ™ใ€‚
    • self.speedใฏๆญฃใฎๅ€คใชใฎใงใ€ๅผพใฏไธ‹ใซๅ‘ใ‹ใฃใฆ็งปๅ‹•ใ—ใพใ™ใ€‚
    • ็”ป้ขๅค–ใฎๅ‡ฆ็†: if self.rect.top > 600ใงๅผพใŒ็”ป้ขใฎไธ‹็ซฏ๏ผˆ600ใƒ”ใ‚ฏใ‚ปใƒซ๏ผ‰ใ‚’่ถ…ใˆใŸใ‹ใฉใ†ใ‹ใ‚’ใƒใ‚งใƒƒใ‚ฏใ—ใพใ™ใ€‚
    • ็”ป้ขๅค–ใซๅ‡บใŸๅผพใฏself.kill()ใงๅ‰Š้™คใ•ใ‚Œใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€ใƒกใƒขใƒชใฎ็„ก้ง„้ฃใ„ใ‚’้˜ฒใŽใพใ™ใ€‚

ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅผพ็”จใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ไฝœๆˆ

main้–ขๆ•ฐๅ†…ใงใ‚จใ‚คใƒชใ‚ขใƒณใŒ็™บๅฐ„ใ™ใ‚‹ๅผพใ‚’็ฎก็†ใ™ใ‚‹ใŸใ‚ใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚’ไฝœๆˆใ—ใฆใ„ใพใ™ใ€‚

alien_bullets = pygame.sprite.Group()

ๅผพใฎๆ›ดๆ–ฐ

ใƒกใ‚คใƒณใƒซใƒผใƒ—ๅ†…ใงใ€alien_bulletsใ‚ฐใƒซใƒผใƒ—ๅ†…ใฎใ™ในใฆใฎๅผพใ‚’ๆ›ดๆ–ฐใ—ใพใ™ใ€‚

alien_bullets.update()

ๅผพใฎๆ็”ป

alien_bulletsใ‚ฐใƒซใƒผใƒ—ๅ†…ใฎใ™ในใฆใฎๅผพใ‚’ๆ็”ปใ—ใพใ™ใ€‚

alien_bullets.draw(screen)

่ก็ชๅˆคๅฎš

ใƒ—ใƒฌใ‚คใƒคใƒผใจใ‚จใ‚คใƒชใ‚ขใƒณใฎๅผพใฎ่ก็ชใ‚’ๅˆคๅฎšใ—ใ€ๅผพใŒๅฝ“ใŸใฃใŸใ‚‰ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใจใ—ใพใ™ใ€‚

player_hits = pygame.sprite.spritecollide(player, alien_bullets, True)
if player_hits:
    game_over = True

ใƒชใ‚นใ‚ฟใƒผใƒˆๆ™‚ใฎๅˆๆœŸๅŒ–

ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผๅพŒใ€alien_bulletsใฎใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚‚็ฉบใซใ—ใพใ™ใ€‚

# ใ‚นใƒ—ใƒฉใ‚คใƒˆใ‚ฐใƒซใƒผใƒ—ใ‚’็ฉบใซใ™ใ‚‹
all_sprites.empty()
aliens.empty()
bullets.empty()
alien_bullets.empty()

ใ€3ใ€‘็”ปๅƒใจ้Ÿณๆฅฝใ‚’ไป˜ใ‘ใŸๅฎŒๆˆ็‰ˆ

ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘กใซ้Ÿณใจ็”ปๅƒใ‚’ๅ…ฅใ‚Œใฆใ€ไปฅไธ‹ๅ‹•็”ปใฎใ‚ˆใ†ใซใ‚ฒใƒผใƒ ใ‚‰ใ—ใใ—ใพใ™ใ€‚

ใ€ไฝฟ็”จใ—ใŸ้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใ€‘

  • shoot.mp3ใƒปใƒปใƒป8bitใ‚ทใƒงใƒƒใƒˆ3ใ‚’ใŠๅ€Ÿใ‚Šใพใ—ใŸใ€‚
  • hit.mp3ใƒปใƒปใƒป8bit็ˆ†็™บ2ใ‚’ใŠๅ€Ÿใ‚Šใพใ—ใŸใ€‚
  • clear.mp3ใƒปใƒปใƒป8bitๅ‹ๅˆฉ1ใ‚’ใŠๅ€Ÿใ‚Šใพใ—ใŸใ€‚
  • gameover.mp3ใƒปใƒปใƒป8bitๅคฑๆ•—3ใ‚’ใŠๅ€Ÿใ‚Šใพใ—ใŸใ€‚
  • gameplay.mp3ใƒปใƒปใƒปSF2ใ‚’ใŠๅ€Ÿใ‚Šใพใ—ใŸใ€‚

ใ€ไฝฟ็”จใ—ใŸ็”ปๅƒใƒ•ใ‚กใ‚คใƒซใ€‘

ใ€3-1ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ข


ใ€3-2ใ€‘ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘ขใฎ่งฃ่ชฌ

ใ‚ตใƒณใƒ—ใƒซใ‚ณใƒผใƒ‰โ‘กใจ็•ฐใชใ‚‹้ƒจๅˆ†ใ‚’ไธญๅฟƒใซ่งฃ่ชฌใ—ใพใ™ใ€‚

็”ปๅƒใจ้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚น

ใ‚ฒใƒผใƒ ๅ†…ใง็”ปๅƒใ‚„้Ÿณๅฃฐใ‚’่ชญใฟ่พผใ‚€้š›ใซไฝฟ็”จใ—ใพใ™ใ€‚

# ็”ปๅƒใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚น
PLAYER_IMG_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/img/player.png"
ALIEN_IMG_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/img/alien.png"

# ้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚น
SHOOT_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/shoot.mp3"
HIT_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/hit.mp3"
CLEAR_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/clear.mp3"
GAMEOVER_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/gameover.mp3"
GAMEPLAY_SOUND_PATH = "/Users/github/sample/python/pygame/invader/sample03/assets/sound/gameplay.mp3"
  • PLAYER_IMG_PATHใฏใ€ใƒ—ใƒฌใ‚คใƒคใƒผใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎ็”ปๅƒใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚
  • ALIEN_IMG_PATHใฏใ€ใ‚จใ‚คใƒชใ‚ขใƒณใ‚ญใƒฃใƒฉใ‚ฏใ‚ฟใƒผใฎ็”ปๅƒใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚
  • SHOOT_SOUND_PATHใฏใ€ใƒ—ใƒฌใ‚คใƒคใƒผใŒๅผพใ‚’็™บๅฐ„ใ™ใ‚‹้š›ใฎ้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚
  • HIT_SOUND_PATHใฏใ€ๅผพใŒใ‚จใ‚คใƒชใ‚ขใƒณใซๅฝ“ใŸใฃใŸใจใใฎ้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚
  • CLEAR_SOUND_PATHใฏใ€ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขๆ™‚ใฎ้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚
  • GAMEOVER_SOUND_PATHใฏใ€ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผๆ™‚ใฎ้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚
  • GAMEPLAY_SOUND_PATHใฏใ€ใ‚ฒใƒผใƒ ใƒ—ใƒฌใ‚คไธญใซๆตใ‚Œใ‚‹้Ÿณๆฅฝใฎใƒ•ใ‚กใ‚คใƒซใฎใƒ‘ใ‚นใงใ™ใ€‚

ใƒ—ใƒฌใ‚คใƒคใƒผใ‚ฏใƒฉใ‚นใฎๅฎš็พฉ

# ใƒ—ใƒฌใ‚คใƒคใƒผใ‚ฏใƒฉใ‚น
class Player(pygame.sprite.Sprite):
    def __init__(self):
        super().__init__()
        self.image = pygame.image.load(PLAYER_IMG_PATH).convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.center = (400, 550)
        self.speed = 5

    def update(self):
        keys = pygame.key.get_pressed()
        if keys[pygame.K_LEFT] and self.rect.left > 0:
            self.rect.x -= self.speed
        if keys[pygame.K_RIGHT] and self.rect.right < 800:
            self.rect.x += self.speed

  • self.imageใฏใ€ใƒ—ใƒฌใ‚คใƒคใƒผใฎ็”ปๅƒใ‚’่ชญใฟ่พผใฟใพใ™ใ€‚convert_alpha()ใ‚’ไฝฟใ†ใ“ใจใงใ€็”ปๅƒใฎ้€ๆ˜Ž้ƒจๅˆ†ใ‚’ๅ‡ฆ็†ใงใใพใ™ใ€‚
  • self.rectใฏใ€็”ปๅƒใฎ็Ÿฉๅฝข๏ผˆๅ››่ง’ๅฝข๏ผ‰้ ˜ๅŸŸใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€็”ปๅƒใฎไฝ็ฝฎใ‚„่ก็ชๅˆคๅฎšใ‚’็ฎก็†ใงใใพใ™ใ€‚
  • self.rect.centerใงใ€ใƒ—ใƒฌใ‚คใƒคใƒผใฎๅˆๆœŸไฝ็ฝฎใ‚’่จญๅฎšใ—ใพใ™ใ€‚(400, 550)ใฏใ€ใƒ—ใƒฌใ‚คใƒคใƒผใฎไธญๅฟƒๅบงๆจ™ใงใ™ใ€‚

ใ‚จใ‚คใƒชใ‚ขใƒณใ‚ฏใƒฉใ‚นใฎๅฎš็พฉ

# ใ‚จใ‚คใƒชใ‚ขใƒณใ‚ฏใƒฉใ‚น
class Alien(pygame.sprite.Sprite):
    def __init__(self, x, y, all_sprites, alien_bullets):
        super().__init__()
        self.image = pygame.image.load(ALIEN_IMG_PATH).convert_alpha()
        self.rect = self.image.get_rect()
        self.rect.topleft = (x, y)
        self.speed = 2
        self.all_sprites = all_sprites
        self.alien_bullets = alien_bullets
  • self.imageใฏใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฎ็”ปๅƒใ‚’่ชญใฟ่พผใฟใพใ™ใ€‚convert_alpha()ใ‚’ไฝฟใ†ใ“ใจใงใ€็”ปๅƒใฎ้€ๆ˜Ž้ƒจๅˆ†ใ‚’ๅ‡ฆ็†ใงใใพใ™ใ€‚
  • self.rectใฏใ€็”ปๅƒใฎ็Ÿฉๅฝข๏ผˆๅ››่ง’ๅฝข๏ผ‰้ ˜ๅŸŸใ‚’ๅ–ๅพ—ใ—ใพใ™ใ€‚ใ“ใ‚Œใซใ‚ˆใ‚Šใ€็”ปๅƒใฎไฝ็ฝฎใ‚„่ก็ชๅˆคๅฎšใ‚’็ฎก็†ใงใใพใ™ใ€‚
  • self.rect.topleftใงใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅˆๆœŸไฝ็ฝฎใ‚’่จญๅฎšใ—ใพใ™ใ€‚(x, y)ใฏใ€ใ‚จใ‚คใƒชใ‚ขใƒณใฎๅทฆไธŠใฎๅบงๆจ™ใงใ™ใ€‚

้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎใƒญใƒผใƒ‰

    gameplay_sound_played = False
    shoot_sound = pygame.mixer.Sound(SHOOT_SOUND_PATH)
    hit_sound = pygame.mixer.Sound(HIT_SOUND_PATH)
    clear_sound = pygame.mixer.Sound(CLEAR_SOUND_PATH)
    gameover_sound = pygame.mixer.Sound(GAMEOVER_SOUND_PATH)
    gameplay_sound = pygame.mixer.Sound(GAMEPLAY_SOUND_PATH)

    shoot_sound.set_volume(0.2)
    hit_sound.set_volume(0.2)
  • pygame.mixer.Soundใ‚’ไฝฟใฃใฆใ€ๅ„้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใ‚’ใƒญใƒผใƒ‰ใ—ใพใ™ใ€‚
    • shoot_soundใฏใ€ๅผพใ‚’็™บๅฐ„ใ™ใ‚‹้š›ใฎ้Ÿณๅฃฐใงใ™ใ€‚
    • hit_soundใฏใ€ๅผพใŒใ‚จใ‚คใƒชใ‚ขใƒณใซๅฝ“ใŸใฃใŸใจใใฎ้Ÿณๅฃฐใงใ™ใ€‚
    • clear_soundใฏใ€ใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขๆ™‚ใฎ้Ÿณๅฃฐใงใ™ใ€‚
    • gameover_soundใฏใ€ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผๆ™‚ใฎ้Ÿณๅฃฐใงใ™ใ€‚
    • gameplay_soundใฏใ€ใ‚ฒใƒผใƒ ใƒ—ใƒฌใ‚คไธญใซๆตใ‚Œใ‚‹้Ÿณๆฅฝใงใ™ใ€‚
  • set_volumeใƒกใ‚ฝใƒƒใƒ‰ใ‚’ไฝฟใฃใฆใ€shoot_soundใจhit_soundใฎ้Ÿณ้‡ใ‚’่จญๅฎšใ—ใพใ™ใ€‚ใ“ใ“ใงใฏใ€0.2๏ผˆๆœ€ๅคง้Ÿณ้‡ใฎ20%๏ผ‰ใง้Ÿณ้‡ใ‚’่จญๅฎšใ—ใพใ™ใ€‚

้Ÿณๅฃฐใƒ•ใ‚กใ‚คใƒซใฎๅ†็”Ÿ

if not gameplay_sound_played and not game_over and not game_clear and game_started:
            gameplay_sound.play(-1)
            gameplay_sound_played = True
  • ใ‚ฒใƒผใƒ ไธญ้ŸณๆฅฝใŒใพใ ๅ†็”Ÿใ•ใ‚Œใฆใ„ใชใ„ใ€ใ‚ฒใƒผใƒ ใŒ็ต‚ไบ†ใ—ใฆใ„ใชใ„ใ€ใ‚ฒใƒผใƒ ใŒใ‚ฏใƒชใ‚ขใ•ใ‚Œใฆใ„ใชใ„ใ€ใ‚ฒใƒผใƒ ใŒ้–‹ๅง‹ใ•ใ‚Œใฆใ„ใ‚‹ใจใ„ใ†4ใคใฎๆกไปถใ‚’ๅ…จใฆๆบ€ใŸใ—ใฆใ„ใ‚‹ๅ ดๅˆใ€gameplay_sound.play(-1)ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใงใ€ใ‚ฒใƒผใƒ ไธญ็”จใฎ้Ÿณๆฅฝใ‚’็„ก้™ใƒซใƒผใƒ—ใงๅ†็”Ÿใ—ใพใ™ใ€‚-1ใฏ็„ก้™ใƒซใƒผใƒ—ใ‚’ๆ„ๅ‘ณใ—ใพใ™ใ€‚
if event.key == pygame.K_SPACE and not game_over:
    shoot_sound.play()
  • play()ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใงใ€ๅผพใ‚’็™บๅฐ„ใ™ใ‚‹้Ÿณใ‚’ๅ†็”Ÿใ—ใพใ™ใ€‚
if hits:
    hit_sound.play()
  • play()ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใงใ€ๅผพใŒใ‚จใ‚คใƒชใ‚ขใƒณใซๅฝ“ใŸใฃใŸ้Ÿณใ‚’ๅ†็”Ÿใ—ใพใ™ใ€‚
if player_hits:
    gameover_sound.play()
  • play()ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใงใ€่‡ชๆฉŸใซๅผพใŒๅฝ“ใŸใฃใŸใจใใซใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใฎ้Ÿณใ‚’ๅ†็”Ÿใ—ใพใ™ใ€‚
if alien.rect.bottom >= player.rect.top:
    gameover_sound.play()
  • play()ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใงใ€ใ‚จใ‚คใƒชใ‚ขใƒณใŒ่‡ชๆฉŸใฎไฝ็ฝฎใพใงๅˆฐ้”ใ—ใŸใจใใซใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใฎ้Ÿณใ‚’ๅ†็”Ÿใ—ใพใ™ใ€‚
if not aliens and not game_clear:
    clear_sound.play()
  • play()ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใงใ€ใ‚จใ‚คใƒชใ‚ขใƒณใ‚’ๅ…จใฆๆ’ƒๅขœใ—ใŸใจใใซใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขใฎ้Ÿณใ‚’ๅ†็”Ÿใ—ใพใ™ใ€‚
if game_over:
    gameplay_sound.stop()
๏ผˆ็•ฅ๏ผ‰
if game_clear:
    gameplay_sound.stop()
  • stop()ใƒกใ‚ฝใƒƒใƒ‰ใ‚’ๅ‘ผใณๅ‡บใ™ใ“ใจใงใ€ใ‚ฒใƒผใƒ ใ‚ชใƒผใƒใƒผใ‚‚ใ—ใใฏใ‚ฒใƒผใƒ ใ‚ฏใƒชใ‚ขๆ™‚ใซใ€ใ‚ฒใƒผใƒ ใƒ—ใƒฌใ‚คไธญใฎBGMใ‚’ๅœๆญขใ—ใพใ™ใ€‚

้–ข้€ฃใƒšใƒผใ‚ธ

Pygameใฎไฝฟใ„ๆ–นใซใคใ„ใฆใฏไปฅไธ‹ใƒšใƒผใ‚ธใง่งฃ่ชฌใ—ใฆใ„ใพใ™ใ€‚

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

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

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

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

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

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