使用Pygame製作8位遊戲


Pygame是一個用於製作遊戲的開源Python庫。Pygame庫提供了各種用於建立遊戲、聲音處理和圖形的功能和工具。Pygame庫可用於在任何作業系統(如Windows、Linux和macOS)上建立遊戲,因為Pygame是一個跨平臺庫。

什麼是8位遊戲?

8位遊戲在20世紀80年代非常流行。8位影片遊戲包含使用8位技術建立的圖形和聲音,即使用有限的調色盤和聲音範圍(屬於8位範圍)來建立此類影片遊戲。在本文中,我們將使用Python中的Pygame庫建立一個圖形簡單的8位遊戲。

在使用Pygame建立8位遊戲之前,我們需要使用Python中的pip命令安裝Pygame,如下所示:

pip install pygame

建立8位遊戲

建立遊戲視窗

安裝Pygame庫後,我們可以用它來建立我們的遊戲。要建立遊戲,我們首先需要建立一個特定大小的視窗來顯示或玩遊戲。要建立視窗,我們需要:

  • 指定視窗的寬度和高度

  • 使用pygame.display.set_mode()函式建立視窗,並將寬度和高度傳遞給它。

  • 建立遊戲開始時在遊戲視窗頂部顯示的視窗名稱。使用display.set_caption()函式設定視窗名稱。

示例

import pygame

pygame.init()
width = 640
height = 480
screen = pygame.display.set_mode((width, height))
pygame.display.set_caption("My 8-bit Game")

建立8位精靈

建立遊戲視窗後,我們將建立8位精靈。精靈是8位遊戲的基本構建塊。精靈是在螢幕上移動的物件,可以由計算機或玩家移動。我們可以透過以下方式在8位遊戲中建立精靈:

  • 使用pygame.sprite.Sprite()類

  • 建立一個從精靈類繼承的玩家類

  • 定義類的屬性和函式

示例

class Player(pygame.sprite.Sprite):
   def __init__(self, x, y):
      super().__init__()
      self.image = pygame.Surface((16, 16))
      self.image.fill((255, 255, 255))
      self.rect = self.image.get_rect()
      self.rect.x = x
      self.rect.y = y

player = Player(0, 0)

在遊戲中建立敵人

為了使遊戲更具吸引力,我們可以為玩家建立一些敵人,當敵人與玩家碰撞時會對玩家造成傷害。我們可以透過建立一個從pygame.sprite.Sprite()類繼承的新敵人類來建立敵人,這將類似於玩家類。

在這裡,我們將:

  • 使用pygame.sprite.Sprite()類建立類似於玩家類的敵人類

  • 以紅色建立敵人

  • 水平移動敵人

  • 建立一個更新函式,設定移動敵人的速度。

# Define the Enemy class
class Enemy(pygame.sprite.Sprite):
   def __init__(self, x, y):
      super().__init__()
      self.image = pygame.Surface((32, 32))
      self.image.fill((0, 0, 255))
      self.rect = self.image.get_rect()
      self.rect.x = x
      self.rect.y = y
      self.speed = 2

   def update(self):
      self.rect.x += self.speed
      if self.rect.left > WIDTH:
      self.rect.right = 0

新增增強道具

我們可以為玩家建立增強道具,當玩家與增強道具碰撞時,將增加玩家的力量或速度。我們可以建立一個從pygame.sprite.Sprite()類繼承的新增強道具類,這將類似於玩家和敵人類。

在這裡,我們將:

  • 建立一個類似於玩家和敵人類的增強道具類,它將具有力量或速度屬性

  • 增強道具物件將為綠色

# Define the PowerUp class
class PowerUp(pygame.sprite.Sprite):
   def __init__(self, x, y, power):
      super().__init__()
      self.image = pygame.Surface((16, 16))
      self.image.fill((0, 255, 0))
      self.rect = self.image.get_rect()
      self.rect.x = x
      self.rect.y = y
      self.power = power

   def update(self):
      pass

建立玩家和敵人組及例項

為玩家、敵人和增強道具建立組,以便我們可以建立多個例項以使遊戲更具互動性。在這個遊戲中,我們將:

  • 建立5個Enemy類的例項並將它們新增到enemies組

  • 建立3個PowerUp類的例項並將它們新增到powerups組

# Create the player and enemy groups
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
powerups = pygame.sprite.Group()
player = Player()
all_sprites.add(player)
```

```
# Create 5 instances of the Enemy class and add them to the enemies group
for i in range(5):
   enemy = Enemy(random.randint(0, WIDTH), random.randint(0, HEIGHT))
   enemies.add(enemy)
   all_sprites.add(enemy)

# Create 3 instances of the PowerUp class and add them to the powerups group
for i in range(3):
   power = random.choice(['health', 'speed'])
   powerup = PowerUp(random.randint(0, WIDTH), random.randint(0, HEIGHT), power)
   powerups.add(powerup)
   all_sprites.add(powerup)

建立遊戲迴圈

我們可以使用鍵盤輸入為遊戲新增移動功能。我們可以使用pygame.key.get_pressed()函式處理遊戲中的鍵盤輸入,該函式返回一個布林值,指示當前按下了哪個鍵。

這裡:

  • 我們將建立一個無限迴圈來持續監聽事件

  • 如果使用者關閉視窗,我們將使用pygame.quit()和sys.exit()函式退出遊戲。

  • 使用**pygame.key.get_pressed()**函式獲取當前按下的鍵

  • 如果按下了左箭頭鍵,我們將透過從x座標減去5來向後移動玩家;如果按下了右箭頭鍵,我們將透過向玩家位置的x座標新增5來向前移動玩家;向上和向下箭頭鍵也是如此。

  • 使用pygame.sprite.spritecollide()函式檢查與敵人的碰撞

  • 使用pygame.sprite.spritecollide()函式檢查與增強道具的碰撞

  • 當敵人與玩家碰撞時更新敵人。

  • 使用screen.fill()函式用黑色填充螢幕

  • 使用screen.blit()函式在螢幕上顯示玩家

  • 使用pygame.display.flip()函式更新顯示。

# Game loop
while True:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         pygame.quit()
         sys.exit()

   keys = pygame.key.get_pressed()

   if keys[pygame.K_LEFT]:
      player.rect.x -= player.speed
   elif keys[pygame.K_RIGHT]:
      player.rect.x += player.speed
   elif keys[pygame.K_UP]:
      player.rect.y -= player.speed
   elif keys[pygame.K_DOWN]:
      player.rect.y += player.speed

   # Check for collisions with enemies
   if pygame.sprite.spritecollide(player, enemies, True):
      player.health -= 10

   # Check for collisions with power-ups
   powerups_collected = pygame.sprite.spritecollide(player, powerups, True)
   for powerup in powerups_collected:
      if powerup.power == 'health':
         player.health += 20
      elif powerup.power == 'speed':
         player.speed += 1
    
   # Update the enemies
   enemies.update()

   # Draw the sprites on the screen
   screen.fill((0, 0, 0))
   screen.blit(player.image, player.rect)
   enemies.draw(screen)
   powerups.draw(screen)

   pygame.display.flip()

完整的程式碼如下:

import pygame
import sys
import random


# Initialize Pygame
pygame.init()


# Set up the display
WIDTH = 800
HEIGHT = 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption('8-Bit Game')


# Set up the clock
clock = pygame.time.Clock()


# Define the Player class
class Player(pygame.sprite.Sprite):
   def __init__(self):
      super().__init__()
      self.image = pygame.Surface((32, 32))
      self.image.fill((255, 0, 0))
      self.rect = self.image.get_rect()
      self.rect.x = WIDTH // 2
      self.rect.y = HEIGHT // 2
      self.speed = 5
      self.health = 100


   def update(self):
      pass


# Define the Enemy class
class Enemy(pygame.sprite.Sprite):
   def __init__(self, x, y):
      super().__init__()
      self.image = pygame.Surface((32, 32))
      self.image.fill((0, 0, 255))
      self.rect = self.image.get_rect()
      self.rect.x = x
      self.rect.y = y
      self.speed = 2


   def update(self):
      self.rect.x += self.speed
      if self.rect.left > WIDTH:
         self.rect.right = 0


# Define the PowerUp class
class PowerUp(pygame.sprite.Sprite):
   def __init__(self, x, y, power):
      super().__init__()
      self.image = pygame.Surface((16, 16))
      self.image.fill((0, 255, 0))
      self.rect = self.image.get_rect()
      self.rect.x = x
      self.rect.y = y
      self.power = power


   def update(self):
      pass


# Create the player and enemy groups
all_sprites = pygame.sprite.Group()
enemies = pygame.sprite.Group()
powerups = pygame.sprite.Group()
player = Player()
all_sprites.add(player)


# Create 5 instances of the Enemy class and add them to the enemies group
for i in range(5):
   enemy = Enemy(random.randint(0, WIDTH), random.randint(0, HEIGHT))
   enemies.add(enemy)
   all_sprites.add(enemy)


# Create 3 instances of the PowerUp class and add them to the powerups group
for i in range(3):
   power = random.choice(['health', 'speed'])
   powerup = PowerUp(random.randint(0, WIDTH), random.randint(0, HEIGHT), power)
   powerups.add(powerup)
   all_sprites.add(powerup)


# Game loop
while True:
   for event in pygame.event.get():
      if event.type == pygame.QUIT:
         pygame.quit()
         sys.exit()


   keys = pygame.key.get_pressed()


   if keys[pygame.K_LEFT]:
      player.rect.x -= player.speed
   elif keys[pygame.K_RIGHT]:
      player.rect.x += player.speed
   elif keys[pygame.K_UP]:
      player.rect.y -= player.speed
   elif keys[pygame.K_DOWN]:
      player.rect.y += player.speed


   # Check for collisions with enemies
   if pygame.sprite.spritecollide(player, enemies, True):
      player.health -= 10


   # Check for collisions with power-ups
   powerups_collected = pygame.sprite.spritecollide(player, powerups, True)
   for powerup in powerups_collected:
      if powerup.power == 'health':
         player.health += 20
      elif powerup.power == 'speed':
         player.speed += 1
    
   # Update the enemies
   enemies.update()


   # Draw the sprites on the screen
   screen.fill((0, 0, 0))
   screen.blit(player.image, player.rect)
   enemies.draw(screen)
   powerups.draw(screen)


   pygame.display.flip()

輸出

結論

在本文中,我們透過建立一個包含玩家、敵人和增強道具的8位遊戲來探索Pygame庫,以使遊戲更有趣。Pygame庫可用於向遊戲新增更多功能和聲音,這可能會使程式碼更復雜。

更新於:2023年4月17日

1K+ 瀏覽量

啟動您的職業生涯

透過完成課程獲得認證

開始學習
廣告