Created
December 22, 2019 14:02
-
-
Save shiracamus/9df8484dc9312d4f7dd5d42d168ab1d7 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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