Code,注释详细,画的不好看
import pygame
import sys
import math
import time
import random
from pygame.locals import *
def f(x):
return x*2.5,x
pygame.init()
screen_width, screen_height = f(400)
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption('flappy bird')
def Over():
pygame.quit()
sys.exit()
class Bird:
def __init__(self):
self.x = screen_width / 7
self.y = screen_height / 2
self.size = 10
self.wing_angle = 0
self.wing_speed = 0.1
self.color = [(255, 0, 0),(255,136,0)]
self.speed = 0.01
self.angle = 0
def draw(self):
if self.y > screen_height:
self.y = 400
if self.y < 0:
self.y = 0
self.angle = self.wing_angle + math.pi / 6
wing_x1 = self.x - self.size * math.cos(self.wing_angle) * 5
wing_y1 = self.y - self.size * math.sin(self.wing_angle) * 5
wing_x2 = self.x - self.size * math.cos(self.angle) * 5
wing_y2 = self.y - self.size * math.sin(self.angle) * 5
points = [(wing_x1, wing_y1), (wing_x2, wing_y2), (self.x, self.y)]
surface1 = pygame.draw.polygon(screen, self.color[1], points, 0)
surface2 = pygame.draw.circle(screen, self.color[0], (self.x, self.y), self.size*2)
pygame.draw.circle(screen, (0, 0, 0), (self.x + self.size / 3 * 2, self.y - self.size / 2), self.size / 4)
self.surface = surface1.union(surface2)
self.wing_angle += self.wing_speed
if self.wing_angle > math.pi / 6:
self.wing_speed = -self.wing_speed
elif self.wing_angle < -math.pi / 6:
self.wing_speed = -self.wing_speed
self.y += 0.25
time.sleep(self.speed)
def __str__(self):
return self.surface
class Pipe:
def __init__(self):
self.x = screen_width
self.y = 0
self.size = random.randint(100, 250)
self.surface = None
self.surface2 = None
def draw(self):
surface1 = pygame.draw.rect(screen, (0, 255, 0), (self.x, self.y, 30, self.size))
surface2 = pygame.draw.ellipse(screen, (0, 255, 0), (self.x - 20, self.y + self.size - 15, 70, 30))
self.surface = surface1.union(surface2)
sz = 400 - self.size - 150
surface1 = pygame.draw.rect(screen, (0, 255, 0), (self.x, 400 - sz, 30, sz))
surface2 = pygame.draw.ellipse(screen, (0, 255, 0), (self.x - 20, 400 - sz - 15, 70, 30))
self.surface2 = surface1.union(surface2)
self.x -= 1
def __str__(self):
return self.surface
def main():
bird = Bird()
bird.draw()
pipe = [Pipe(),Pipe()]
for i in pipe:i.draw()
pipe[1].x = 1500
running = True
while running:
for event in pygame.event.get():
if event.type == QUIT:
pygame.quit()
sys.exit()
if event.type == KEYDOWN:
if event.key == K_SPACE or event.key == K_UP:
bird.y -= 10
if event.key == K_DOWN:
bird.y += 10
for i in pipe:
if bird.surface.colliderect(i.surface) or bird.surface.colliderect(i.surface2):
Over()
screen.fill((202, 235, 251))
bird.draw()
for i in pipe:
i.draw()
if i.x < 0:
pipe.remove(i)
pipe.append(Pipe())
pygame.display.update()
main()
main()