190 lines
5.4 KiB
Python
190 lines
5.4 KiB
Python
|
# -----------------------------------------------------------------------------
|
||
|
#
|
||
|
# Balloon Shooter
|
||
|
# Language - Python
|
||
|
# Modules - pygame, sys, random, math
|
||
|
#
|
||
|
# Controls - Mouse
|
||
|
#
|
||
|
# By - Jatin Kumar Mandav
|
||
|
#
|
||
|
# Website - https://jatinmandav.wordpress.com
|
||
|
#
|
||
|
# YouTube Channel - https://www.youtube.com/channel/UCdpf6Lz3V357cIZomPwjuFQ
|
||
|
# Twitter - @jatinmandav
|
||
|
#
|
||
|
# -----------------------------------------------------------------------------
|
||
|
|
||
|
import pygame
|
||
|
import sys
|
||
|
import random
|
||
|
from math import *
|
||
|
|
||
|
pygame.init()
|
||
|
|
||
|
width = 500
|
||
|
height = 500
|
||
|
|
||
|
display = pygame.display.set_mode((width, height))
|
||
|
pygame.display.set_caption("Balloon Shooter")
|
||
|
clock = pygame.time.Clock()
|
||
|
|
||
|
margin = 100
|
||
|
lowerBound = 100
|
||
|
|
||
|
score = 0
|
||
|
|
||
|
# Colors
|
||
|
white = (230, 230, 230)
|
||
|
lightBlue = (174, 214, 241)
|
||
|
red = (231, 76, 60)
|
||
|
lightGreen = (25, 111, 61)
|
||
|
darkGray = (40, 55, 71)
|
||
|
darkBlue = (21, 67, 96)
|
||
|
green = (35, 155, 86)
|
||
|
yellow = (244, 208, 63)
|
||
|
blue = (46, 134, 193)
|
||
|
purple = (155, 89, 182)
|
||
|
orange = (243, 156, 18)
|
||
|
|
||
|
font = pygame.font.SysFont("Snap ITC", 25)
|
||
|
|
||
|
# Balloon Class
|
||
|
class Balloon:
|
||
|
def __init__(self, speed):
|
||
|
self.a = random.randint(30, 40)
|
||
|
self.b = self.a + random.randint(0, 10)
|
||
|
self.x = random.randrange(margin, width - self.a - margin)
|
||
|
self.y = height - lowerBound
|
||
|
self.angle = 90
|
||
|
self.speed = -speed
|
||
|
self.probPool = [-1, -1, -1, 0, 0, 0, 0, 1, 1, 1]
|
||
|
self.length = random.randint(50, 100)
|
||
|
self.color = random.choice([red, green, purple, orange, yellow, blue])
|
||
|
|
||
|
# Move balloon around the Screen
|
||
|
def move(self):
|
||
|
direct = random.choice(self.probPool)
|
||
|
|
||
|
if direct == -1:
|
||
|
self.angle += -10
|
||
|
elif direct == 0:
|
||
|
self.angle += 0
|
||
|
else:
|
||
|
self.angle += 10
|
||
|
|
||
|
self.y += self.speed*sin(radians(self.angle))
|
||
|
self.x += self.speed*cos(radians(self.angle))
|
||
|
|
||
|
if (self.x + self.a > width) or (self.x < 0):
|
||
|
if self.y > height/5:
|
||
|
self.x -= self.speed*cos(radians(self.angle))
|
||
|
else:
|
||
|
self.reset()
|
||
|
if self.y + self.b < 0 or self.y > height + 30:
|
||
|
self.reset()
|
||
|
|
||
|
# Show/Draw the balloon
|
||
|
def show(self):
|
||
|
pygame.draw.line(display, darkBlue, (self.x + self.a/2, self.y + self.b), (self.x + self.a/2, self.y + self.b + self.length))
|
||
|
pygame.draw.ellipse(display, self.color, (self.x, self.y, self.a, self.b))
|
||
|
pygame.draw.ellipse(display, self.color, (self.x + self.a/2 - 5, self.y + self.b - 3, 10, 10))
|
||
|
|
||
|
# Check if Balloon is bursted
|
||
|
def burst(self):
|
||
|
global score
|
||
|
pos = pygame.mouse.get_pos()
|
||
|
|
||
|
if onBalloon(self.x, self.y, self.a, self.b, pos):
|
||
|
score += 1
|
||
|
self.reset()
|
||
|
|
||
|
# Reset the Balloon
|
||
|
def reset(self):
|
||
|
self.a = random.randint(30, 40)
|
||
|
self.b = self.a + random.randint(0, 10)
|
||
|
self.x = random.randrange(margin, width - self.a - margin)
|
||
|
self.y = height - lowerBound
|
||
|
self.angle = 90
|
||
|
self.speed -= 0.002
|
||
|
self.probPool = [-1, -1, -1, 0, 0, 0, 0, 1, 1, 1]
|
||
|
self.length = random.randint(50, 100)
|
||
|
self.color = random.choice([red, green, purple, orange, yellow, blue])
|
||
|
|
||
|
balloons = []
|
||
|
noBalloon = 10
|
||
|
for i in range(noBalloon):
|
||
|
obj = Balloon(random.choice([1, 1, 2, 2, 2, 2, 3, 3, 3, 4]))
|
||
|
balloons.append(obj)
|
||
|
|
||
|
def onBalloon(x, y, a, b, pos):
|
||
|
if (x < pos[0] < x + a) and (y < pos[1] < y + b):
|
||
|
return True
|
||
|
else:
|
||
|
return False
|
||
|
|
||
|
# show the location of Mouse
|
||
|
def pointer():
|
||
|
pos = pygame.mouse.get_pos()
|
||
|
r = 25
|
||
|
l = 20
|
||
|
color = lightGreen
|
||
|
for i in range(noBalloon):
|
||
|
if onBalloon(balloons[i].x, balloons[i].y, balloons[i].a, balloons[i].b, pos):
|
||
|
color = red
|
||
|
pygame.draw.ellipse(display, color, (pos[0] - r/2, pos[1] - r/2, r, r), 4)
|
||
|
pygame.draw.line(display, color, (pos[0], pos[1] - l/2), (pos[0], pos[1] - l), 4)
|
||
|
pygame.draw.line(display, color, (pos[0] + l/2, pos[1]), (pos[0] + l, pos[1]), 4)
|
||
|
pygame.draw.line(display, color, (pos[0], pos[1] + l/2), (pos[0], pos[1] + l), 4)
|
||
|
pygame.draw.line(display, color, (pos[0] - l/2, pos[1]), (pos[0] - l, pos[1]), 4)
|
||
|
|
||
|
def lowerPlatform():
|
||
|
pygame.draw.rect(display, darkGray, (0, height - lowerBound, width, lowerBound))
|
||
|
|
||
|
def showScore():
|
||
|
scoreText = font.render("Balloons Bursted : " + str(score), True, white)
|
||
|
display.blit(scoreText, (150, height - lowerBound + 50))
|
||
|
|
||
|
|
||
|
def close():
|
||
|
pygame.quit()
|
||
|
sys.exit()
|
||
|
|
||
|
def game():
|
||
|
global score
|
||
|
loop = True
|
||
|
|
||
|
while loop:
|
||
|
for event in pygame.event.get():
|
||
|
if event.type == pygame.QUIT:
|
||
|
close()
|
||
|
if event.type == pygame.KEYDOWN:
|
||
|
if event.key == pygame.K_q:
|
||
|
close()
|
||
|
if event.key == pygame.K_r:
|
||
|
score = 0
|
||
|
game()
|
||
|
|
||
|
if event.type == pygame.MOUSEBUTTONDOWN:
|
||
|
for i in range(noBalloon):
|
||
|
balloons[i].burst()
|
||
|
|
||
|
display.fill(lightBlue)
|
||
|
|
||
|
for i in range(noBalloon):
|
||
|
balloons[i].show()
|
||
|
|
||
|
pointer()
|
||
|
|
||
|
for i in range(noBalloon):
|
||
|
balloons[i].move()
|
||
|
|
||
|
|
||
|
lowerPlatform()
|
||
|
showScore()
|
||
|
pygame.display.update()
|
||
|
clock.tick(60)
|
||
|
|
||
|
|
||
|
game()
|