Maison  >  Article  >  développement back-end  >  Jeu de briques coupant des fruits implémenté en Python

Jeu de briques coupant des fruits implémenté en Python

WBOY
WBOYavant
2023-04-22 18:58:061694parcourir

Le gameplay de Fruit Ninja est très simple, il suffit de couper autant que possible les fruits lancés.

Aujourd'hui, Xiao Wu utilisera python pour simplement simuler ce jeu. Dans ce projet simple, nous utilisons la souris pour sélectionner le fruit à couper, et la bombe sera cachée dans le fruit. Si la bombe est coupée trois fois, le joueur échouera.

Jeu de briques coupant des fruits implémenté en Python

1. Paquets qui doivent être importés

import pygame, sys
import os
import random

2. Paramètres de l'interface de la fenêtre

# 游戏窗口
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. Générer aléatoirement des positions de fruits

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)
  • Cette fonction est utilisée pour générer aléatoirement des fruits et enregistrer des données sur les fruits.
  • 'x' et 'y' stockent la position du fruit sur les coordonnées x et y.
  • Speed_x et speed_y stockent la vitesse de déplacement du fruit dans les directions x et y. Il contrôle également le mouvement diagonal du fruit.
  • lancer, utilisé pour déterminer si les coordonnées des fruits générés sont hors jeu. S'il est à l'extérieur, il sera jeté.
  • Le dictionnaire de données est utilisé pour stocker les données des fruits générés aléatoirement.

4. Dessiner des polices

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)
  • La fonction Draw_text peut dessiner du texte sur l'écran.
  • get_rect() renvoie un objet Rect.
  • X et y sont les positions dans les directions X et Y.
  • blit() dessine une image ou écrit du texte à un emplacement spécifié sur l'écran.

5. Conseils pour la vie du joueur

# 绘制玩家的生命
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 obtient les coordonnées (x, y) de l'icône en forme de croix (située en haut à droite).
  • img_rect .x définit l'icône de croix suivante à 35 pixels de l'icône précédente.
  • img_rect.y est chargé de déterminer où commence l'icône en forme de croix en haut de l'écran.

6. Écrans de début et de fin de jeu

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
  • La fonction show_gameover_screen() affiche l'écran de jeu initial et l'écran de fin de jeu.
  • pygame.display.flip() ne mettra à jour qu'une partie de l'écran, mais si aucun argument n'est transmis, tout l'écran sera mis à jour.
  • pygame.event.get() renverra tous les événements stockés dans la file d'attente des événements pygame.
  • Si le type d'événement est égal à quitter, alors pygame se fermera.
  • événement event.KEYUP, un événement qui se produit lorsque la touche est enfoncée et relâchée.

7. Boucle principale du jeu

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()
  • C'est la boucle principale du jeu
  • Si plus de 3 bombes sont coupées, game_over termine le jeu et boucle en même temps.
  • game_running permet de gérer la boucle du jeu.
  • Si le type d'événement est exit, alors la fenêtre de jeu sera fermée.
  • Dans cette boucle de jeu, nous affichons dynamiquement les fruits sur l'écran.
  • Si un fruit n'est pas coupé, il ne lui arrivera rien. Si le fruit est coupé, une image à moitié coupée du fruit devrait apparaître à la place du fruit.
  • Si l'utilisateur clique trois fois sur la bombe, le message GAME OVER s'affichera et la fenêtre sera réinitialisée.
  • clock.tick() maintiendra la boucle à la bonne vitesse. La boucle doit être mise à jour toutes les 1/12 secondes.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer