Krok 8: eliksir czasu

Kryształowa jaskinia - Gry w Pythonie - przykłady (Python)

Coś dla gracza: eliksir czasu. `Potion` jest na początku niewidoczny i liczy własne ticki. Co 300 ticków (10 sekund) pojawia się w losowym miejscu na 90 ticków (`timer`). Złapany oddaje 5 sekund, ale `game.ticks` nie spada poniżej zera.

import random

class Game(Sprite):
  def __init__(self):
    self.size = 14
    self.color = (99, 102, 241)
    self.points = 0
    self.ticks = 0
    self.state = "start"
    self.text = "Kryształowa jaskinia\nSpacja = start"

  def update(self):
    if self.state == "start" and world.key('space'):
      self.state = "play"
    if self.state == "play":
      self.ticks = self.ticks + 1
      left = 30 - self.ticks // 30
      self.position = (0, 88)
      self.text = f"Kryształy: {self.points}  Czas: {left}"
      if left <= 0:
        self.state = "over"
    if self.state == "over":
      self.position = (0, 0)
      self.text = f"Koniec czasu! Kryształy: {self.points}"

class Player(Sprite):
  def __init__(self):
    self.image = 0
    self.color = (124, 58, 237)
    self.size = 25
    self.rotate = False

  def update(self):
    if game.state != "play":
      return
    if world.key('right'):
      self.x = self.x + 3
    if world.key('left'):
      self.x = self.x - 3
    if world.key('up'):
      self.y = self.y + 3
    if world.key('down'):
      self.y = self.y - 3

class Crystal(Sprite):
  def __init__(self):
    self.image = 43
    self.color = (14, 165, 233)
    self.size = 18
    self.position = (random.randint(-85, 85), random.randint(-85, 70))

  def update(self):
    if game.state != "play":
      return
    if self.touches(player):
      game.points = game.points + 1
      self.position = (random.randint(-85, 85), random.randint(-85, 70))
      if game.points % 5 == 0:
        add_bat()

class Bat(Sprite):
  def __init__(self):
    self.image = 20
    self.color = (71, 85, 105)
    self.size = 22
    self.rotate = False
    self.position = (random.randint(-80, 80), 80)
    self.vx = random.choice([-2, 2])
    self.vy = random.choice([-2, 2])

  def update(self):
    if game.state != "play":
      return
    self.x = self.x + self.vx
    self.y = self.y + self.vy
    if self.x >= 92 or self.x <= -92:
      self.vx = -self.vx
    if self.y >= 92 or self.y <= -92:
      self.vy = -self.vy
    if self.touches(player):
      game.ticks = game.ticks + 150
      player.position = (0, 0)

class Potion(Sprite):
  def __init__(self):
    self.image = 50
    self.color = (22, 163, 74)
    self.size = 18
    self.visible = False
    self.ticks = 0
    self.timer = 0

  def update(self):
    if game.state != "play":
      return
    self.ticks = self.ticks + 1
    if self.ticks % 300 == 0:
      self.position = (random.randint(-85, 85), random.randint(-85, 70))
      self.visible = True
      self.timer = 90
    if self.visible:
      self.timer = self.timer - 1
      if self.timer <= 0:
        self.visible = False
      if self.touches(player):
        game.ticks = game.ticks - 150
        if game.ticks < 0:
          game.ticks = 0
        self.visible = False

def add_bat():
  bat = Bat()
  bats.append(bat)
  world.add(bat)

game = Game()
player = Player()
crystal = Crystal()
bats = []
potion = Potion()
world.add(game)
world.add(player)
world.add(crystal)
world.add(potion)
add_bat()
world.start()

Ładowanie interaktywnego edytora... Jeśli się nie pojawi, włącz JavaScript.

Wszystkie lekcje kursu Gry w Pythonie - przykłady·Zaloguj się, aby zapisać postęp na koncie.