Heim >Backend-Entwicklung >Python-Tutorial >Obstschneidesteinspiel, implementiert in Python

Obstschneidesteinspiel, implementiert in Python

WBOY
WBOYnach vorne
2023-04-22 18:58:061747Durchsuche

Das Gameplay von Fruit Ninja ist sehr einfach: Schneiden Sie einfach die geworfenen Früchte so weit wie möglich ab.

Heute wird Xiaowu Python verwenden, um dieses Spiel einfach zu simulieren. In diesem einfachen Projekt wählen wir mit der Maus die zu schneidende Frucht aus und die Bombe wird in der Frucht versteckt. Wenn die Bombe dreimal geschnitten wird, wird der Spieler scheitern.

Obstschneidesteinspiel, implementiert in Python

1. Pakete, die importiert werden müssen

import pygame, sys
import os
import random

2. Fensterschnittstelleneinstellungen

# 游戏窗口
WIDTH = 800
HEIGHT = 500
FPS = 15 # gameDisplay的帧率,1/12秒刷新一次
pygame.init()
pygame.display.set_caption('水果忍者') # 标题
gameDisplay = pygame.display.set_mode((WIDTH, HEIGHT)) # 固定窗口大小
clock = pygame.time.Clock()
# 用到的颜色
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)
background = pygame.image.load('背景.jpg') # 背景
font = pygame.font.Font(os.path.join(os.getcwd(), 'comic.ttf'), 42) # 字体
score_text = font.render('Score : ' + str(score), True, (255, 255, 255)) # 得分字体样式
#🎜🎜 #3, Obstpositionen zufällig generieren

def generate_random_fruits(fruit):
fruit_path = "images/" + fruit + ".png"
data[fruit] = {
'img': pygame.image.load(fruit_path),
'x' : random.randint(100,500),
'y' : 800,
'speed_x': random.randint(-10,10),
'speed_y': random.randint(-80, -60),
'throw': False,
't': 0,
'hit': False,
}
if random.random() >= 0.75:
data[fruit]['throw'] = True
else:
data[fruit]['throw'] = False
data = {}
for fruit in fruits:
generate_random_fruits(fruit)

  • Diese Funktion wird verwendet, um Früchte zufällig zu generieren und Fruchtdaten zu speichern .
  • 'x' und 'y' speichern die Position der Frucht auf den x- und y-Koordinaten.
  • Speed_x und speed_y speichern die Bewegungsgeschwindigkeit der Frucht in x- und y-Richtung. Es steuert auch die diagonale Bewegung der Frucht.
  • Wurf, der verwendet wird, um festzustellen, ob die generierten Fruchtkoordinaten außerhalb des Spiels liegen. Wenn es draußen ist, wird es verworfen.
  • Das Datenwörterbuch wird zum Speichern zufällig generierter Fruchtdaten verwendet.
4. Schriftarten zeichnen

font_name = pygame.font.match_font('comic.ttf')
def draw_text(display, text, size, x, y):
font = pygame.font.Font(font_name, size)
text_surface = font.render(text, True, WHITE)
text_rect = text_surface.get_rect()
text_rect.midtop = (x, y)
gameDisplay.blit(text_surface, text_rect)

    Die Draw_text-Funktion kann Text auf dem Bildschirm zeichnen.
  • get_rect() gibt ein Rect-Objekt zurück.
  • X und y sind die Positionen in X- und Y-Richtung.
  • blit() zeichnet ein Bild oder schreibt Text an einer bestimmten Stelle auf dem Bildschirm.
5. Tipps für das Spielerleben

# 绘制玩家的生命
def draw_lives(display, x, y, lives, image) :
for i in range(lives) :
img = pygame.image.load(image)
img_rect = img.get_rect()
img_rect.x = int(x + 35 * i)
img_rect.y = y
display.blit(img, img_rect)
def hide_cross_lives(x, y):
gameDisplay.blit(pygame.image.load("images/red_lives.png"), (x, y))

    img_rect ruft die (x, y)-Koordinaten des Kreuzsymbols (oben rechts) ab ).
  • img_rect .x Legen Sie fest, dass das nächste Kreuzsymbol 35 Pixel vom vorherigen Symbol entfernt ist.
  • img_rect.y ist dafür verantwortlich, zu bestimmen, wo das Kreuzsymbol oben auf dem Bildschirm beginnt.
6. Start- und Endbildschirme des Spiels

def show_gameover_screen():
gameDisplay.blit(background, (0,0))
draw_text(gameDisplay, "FRUIT NINJA!", 90, WIDTH / 2, HEIGHT / 4)
if not game_over :
draw_text(gameDisplay,"Score : " + str(score), 50, WIDTH / 2, HEIGHT /2)
draw_text(gameDisplay, "Press a key to begin!", 64, WIDTH / 2, HEIGHT * 3 / 4)
pygame.display.flip()
waiting = True
while waiting:
clock.tick(FPS)
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
if event.type == pygame.KEYUP:
waiting = False

  • show_gameover_screen() Die Funktion zeigt den Startbildschirm des Spiels und den Endbildschirm des Spiels an .
  • pygame.display.flip() aktualisiert nur einen Teil des Bildschirms, aber wenn keine Argumente übergeben werden, wird der gesamte Bildschirm aktualisiert.
  • pygame.event.get() gibt alle in der Pygame-Ereigniswarteschlange gespeicherten Ereignisse zurück.
  • Wenn der Ereignistyp gleich quit ist, wird Pygame beendet.
  • event.KEYUP-Ereignis, ein Ereignis, das auftritt, wenn die Taste gedrückt und losgelassen wird.
7. Hauptschleife des Spiels

first_round = True
game_over = True
game_running = True
while game_running :
if game_over :
if first_round :
show_gameover_screen()
first_round = False
game_over = False
player_lives = 3
draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')
score = 0
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_running = False
gameDisplay.blit(background, (0, 0))
gameDisplay.blit(score_text, (0, 0))
draw_lives(gameDisplay, 690, 5, player_lives, 'images/red_lives.png')
for key, value in data.items():
if value['throw']:
value['x'] += value['speed_x']
value['y'] += value['speed_y']
value['speed_y'] += (1 * value['t'])
value['t'] += 1
if value['y'] <= 800:
gameDisplay.blit(value['img'], (value['x'], value['y']))
else:
generate_random_fruits(key)
current_position = pygame.mouse.get_pos()
if not value['hit'] and current_position[0] > value['x'] and current_position[0] < value['x']+60 
and current_position[1] > value['y'] and current_position[1] < value['y']+60:
if key == 'bomb':
player_lives -= 1
if player_lives == 0:
hide_cross_lives(690, 15)
elif player_lives == 1 :
hide_cross_lives(725, 15)
elif player_lives == 2 :
hide_cross_lives(760, 15)
if player_lives < 0 :
show_gameover_screen()
game_over = True
half_fruit_path = "images/explosion.png"
else:
half_fruit_path = "images/" + "half_" + key + ".png"
value['img'] = pygame.image.load(half_fruit_path)
value['speed_x'] += 10
if key != 'bomb' :
score += 1
score_text = font.render('Score : ' + str(score), True, (255, 255, 255))
value['hit'] = True
else:
generate_random_fruits(key)
pygame.display.update()
clock.tick(FPS)
pygame.quit()

  • Dies ist die Hauptschleife des Spiels #🎜 🎜# Wenn mehr als 3 Bomben abgeschnitten werden, beendet game_over das Spiel und führt gleichzeitig eine Schleife durch.
  • game_running wird verwendet, um die Spielschleife zu verwalten.
  • Wenn der Ereignistyp „Beenden“ ist, wird das Spielfenster geschlossen.
  • In dieser Spielschleife zeigen wir die Früchte dynamisch auf dem Bildschirm an.
  • Wenn eine Frucht nicht geschnitten wird, passiert ihr nichts. Wenn die Frucht angeschnitten ist, sollte anstelle der Frucht ein halb angeschnittenes Bild der Frucht erscheinen.
  • Wenn der Benutzer dreimal auf die Bombe klickt, wird die Meldung „GAME OVER“ angezeigt und das Fenster wird zurückgesetzt.
  • clock.tick() sorgt dafür, dass die Schleife mit der richtigen Geschwindigkeit läuft. Die Schleife sollte alle 1/12 Sekunde aktualisiert werden.

Das obige ist der detaillierte Inhalt vonObstschneidesteinspiel, implementiert in Python. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:51cto.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen