Skip to content

Instantly share code, notes, and snippets.

@shiracamus
Created December 22, 2019 14:02
Show Gist options
  • Save shiracamus/9df8484dc9312d4f7dd5d42d168ab1d7 to your computer and use it in GitHub Desktop.
Save shiracamus/9df8484dc9312d4f7dd5d42d168ab1d7 to your computer and use it in GitHub Desktop.
import math
import sys
import pygame
from pygame.locals import *
from random import randint
import time
pygame.init()
WIDTH, HEIGHT = 800, 600
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Game")
sysfont = pygame.font.SysFont(None, 36)
pygame.key.set_repeat(5, 5)
FPSCLOCK = pygame.time.Clock()
FPS = 15
class Cannon:
image = pygame.image.load("cannon.png")
def __init__(self):
self.radian = 45
self.bullet = Bullet()
def up(self):
if self.radian < 89:
self.radian += 1
def down(self):
if self.radian > 0:
self.radian -= 1
def fire(self):
self.bullet.fire(self.radian)
def hit(self, target):
return self.bullet.hit(target)
def move(self):
self.bullet.move()
def draw(self):
image = pygame.transform.rotate(self.image, self.radian - 45)
rect = image.get_rect()
rect.center = (84, 536)
screen.blit(image, rect)
self.bullet.draw()
class Bullet:
image = pygame.image.load("bullet.png")
def __init__(self):
self.reset()
def reset(self):
self.x = 68
self.y = HEIGHT - 80
self.speed = 50
self.time = 0
self.fired = False
def fire(self, radian):
if not self.fired:
self.radian = math.radians(radian)
self.fired = True
def hit(self, target):
return self.fired and target.hit(self.x, self.y)
def move(self):
if not self.fired:
return
gravity = 9.8
speed_x = self.speed * math.cos(self.radian)
speed_y = self.speed * math.sin(self.radian)
self.x = self.x + speed_x
self.y = self.y - speed_y + gravity * self.time
self.time += 0.2
if self.x > WIDTH or self.y > HEIGHT:
self.reset()
def draw(self):
if self.fired:
screen.blit(self.image, (self.x, self.y))
class Balloon:
balloon_image = pygame.image.load("balloon-red.png")
pang_image = pygame.image.load("pang.png")
def __init__(self):
self.reset()
def reset(self):
self.x = randint(500, 700)
self.y = 600
self.create_time = time.time()
self.hit_time = None
self.hit_rect = None
def hit(self, bullet_x, bullet_y):
if self.hit_time:
return False
distance_y = ((self.y + 15) - (bullet_y + 16))**2
distance_x = ((self.x + 20) - (bullet_x + 16))**2
distance = (distance_x + distance_y)**(1 / 2)
if distance > 31:
return False
self.hit_rect = self.pang_image.get_rect()
self.hit_rect.center = (self.x + 20, self.y + 15)
self.hit_time = time.time()
return True
def move(self):
if self.hit_time:
now = time.time()
if now - self.hit_time > 1:
self.reset()
return
self.y -= 12
if time.time() - self.create_time > 4:
self.reset()
def draw(self):
if self.hit_rect:
screen.blit(self.pang_image, self.hit_rect)
else:
screen.blit(self.balloon_image, (self.x, self.y))
class CannonGame:
def __init__(self):
self.cannon = Cannon()
self.balloon = Balloon()
self.score = 0
def play(self):
while True:
self.event()
self.move()
if self.cannon.hit(self.balloon):
self.score += 100
self.draw()
FPSCLOCK.tick(FPS)
def event(self):
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
exit(0)
if event.type != KEYDOWN:
return
if event.key == K_SPACE:
self.cannon.fire()
elif event.key == K_UP:
self.cannon.up()
elif event.key == K_DOWN:
self.cannon.down()
def move(self):
self.cannon.move()
self.balloon.move()
def draw(self):
screen.fill((255, 255, 255))
self.cannon.draw()
self.balloon.draw()
score_image = sysfont.render(f"score : {self.score}", True, (0, 0, 255))
screen.blit(score_image, (10, 20))
pygame.display.update()
if __name__ == '__main__':
CannonGame().play()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment