Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add files via upload #575

Open
wants to merge 1 commit into
base: main
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
163 changes: 163 additions & 0 deletions fruit_ninja.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,163 @@
import pygame, sys
import os
import random

player_lives = 3 #keep track of lives
score = 0 #keeps track of score
fruits = ['melon', 'orange', 'pomegranate', 'guava', 'bomb'] #entities in the game

# initialize pygame and create window
WIDTH = 800
HEIGHT = 500
FPS = 12 #controls how often the gameDisplay should refresh. In our case, it will refresh every 1/12th second
pygame.init()
pygame.display.set_caption('Fruit-Ninja Game -- DataFlair')
gameDisplay = pygame.display.set_mode((WIDTH, HEIGHT)) #setting game display size
clock = pygame.time.Clock()

# Define colors
WHITE = (255,255,255)
BLACK = (0,0,0)
RED = (255,0,0)
GREEN = (0,255,0)
BLUE = (0,0,255)

background = pygame.image.load('back.jpg') #game background
font = pygame.font.Font(os.path.join(os.getcwd(), 'comic.ttf'), 42)
score_text = font.render('Score : ' + str(score), True, (255, 255, 255)) #score display
lives_icon = pygame.image.load('images/white_lives.png') #images that shows remaining lives

# Generalized structure of the fruit Dictionary
def generate_random_fruits(fruit):
fruit_path = "images/" + fruit + ".png"
data[fruit] = {
'img': pygame.image.load(fruit_path),
'x' : random.randint(100,500), #where the fruit should be positioned on x-coordinate
'y' : 800,
'speed_x': random.randint(-10,10), #how fast the fruit should move in x direction. Controls the diagonal movement of fruits
'speed_y': random.randint(-80, -60), #control the speed of fruits in y-directionn ( UP )
'throw': False, #determines if the generated coordinate of the fruits is outside the gameDisplay or not. If outside, then it will be discarded
't': 0, #manages the
'hit': False,
}

if random.random() >= 0.75: #Return the next random floating point number in the range [0.0, 1.0) to keep the fruits inside the gameDisplay
data[fruit]['throw'] = True
else:
data[fruit]['throw'] = False

# Dictionary to hold the data the random fruit generation
data = {}
for fruit in fruits:
generate_random_fruits(fruit)

def hide_cross_lives(x, y):
gameDisplay.blit(pygame.image.load("images/red_lives.png"), (x, y))

# Generic method to draw fonts on the screen
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)

# draw players lives
def draw_lives(display, x, y, lives, image) :
for i in range(lives) :
img = pygame.image.load(image)
img_rect = img.get_rect() #gets the (x,y) coordinates of the cross icons (lives on the the top rightmost side)
img_rect.x = int(x + 35 * i) #sets the next cross icon 35pixels awt from the previous one
img_rect.y = y #takes care of how many pixels the cross icon should be positioned from top of the screen
display.blit(img, img_rect)

# show game over display & front display
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

# Game Loop
first_round = True
game_over = True #terminates the game While loop if more than 3-Bombs are cut
game_running = True #used to manage the game loop
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():
# checking for closing window
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'] #moving the fruits in x-coordinates
value['y'] += value['speed_y'] #moving the fruits in y-coordinate
value['speed_y'] += (1 * value['t']) #increasing y-corrdinate
value['t'] += 1 #increasing speed_y for next loop

if value['y'] <= 800:
gameDisplay.blit(value['img'], (value['x'], value['y'])) #displaying the fruit inside screen dynamically
else:
generate_random_fruits(key)

current_position = pygame.mouse.get_pos() #gets the current coordinate (x, y) in pixels of the mouse

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 the user clicks bombs for three time, GAME OVER message should be displayed and the window should be reset
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) # keep loop running at the right speed (manages the frame/second. The loop should update afer every 1/12th pf the sec


pygame.quit()