Home  >  Article  >  Backend Development  >  Fruit cutting brick game implemented in Python

Fruit cutting brick game implemented in Python

WBOY
WBOYforward
2023-04-22 18:58:061659browse

The gameplay of Fruit Ninja is very simple, just cut the thrown fruits as much as possible.

Today Xiaowu will use python to simply simulate this game. In this simple project, we use the mouse to select the fruit to cut, and the bomb will be hidden in the fruit. If the bomb is cut three times, the player will fail.

Fruit cutting brick game implemented in Python

1. Packages that need to be imported

import pygame, sys
import os
import random

2. Window interface settings

# 游戏窗口
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. Randomly generate fruit positions

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)
  • This function is used to randomly generate fruits and save fruit data.
  • 'x' and 'y' store the position of the fruit on the x and y coordinates.
  • Speed_x and speed_y store the moving speed of the fruit in the x and y directions. It also controls the diagonal movement of the fruit.
  • throw, used to determine whether the generated fruit coordinates are outside the game. If it is outside, it will be discarded.
  • The data dictionary is used to store randomly generated fruit data.

4. Drawing fonts

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)
  • The Draw_text function can draw text on the screen.
  • get_rect() returns a Rect object.
  • X and y are the positions in the X and Y directions.
  • blit() draws an image or writes text at a specified location on the screen.

5. Tips for player life

# 绘制玩家的生命
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 gets the (x, y) coordinates of the cross icon (located at the top right).
  • img_rect .x Set the next cross icon to be 35 pixels away from the previous icon.
  • img_rect.y is responsible for determining where the cross icon starts from the top of the screen.

6. Game start and end screens

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() function displays the initial game screen and the game end screen.
  • pygame.display.flip() will only update part of the screen, but if no arguments are passed, the entire screen will be updated.
  • pygame.event.get() will return all events stored in the pygame event queue.
  • If the event type is equal to quit, then pygame will exit.
  • event.KEYUP event, an event that occurs when the key is pressed and released.

7. Game main loop

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()
  • This is the main loop of the game
  • If more than 3 bombs are cut off , game_over terminates the game and loops at the same time.
  • game_running is used to manage the game loop.
  • If the event type is exit, then the game window will be closed.
  • In this game loop, we dynamically display the fruits on the screen.
  • If a fruit is not cut, nothing will happen to it. If the fruit is cut, then a half-cut image of the fruit should appear in its place.
  • If the user clicks the bomb three times, the GAME OVER message will be displayed and the window will be reset.
  • clock.tick() will keep the loop running at the correct speed. The loop should update after every 1/12 seconds.

The above is the detailed content of Fruit cutting brick game implemented in Python. For more information, please follow other related articles on the PHP Chinese website!

Statement:
This article is reproduced at:51cto.com. If there is any infringement, please contact admin@php.cn delete