no classification
no tag
no datas
posted on 2023-06-06 17:52 read(926) comment(0) like(8) collect(2)
Project name: python aircraft war
Programming language: python
Key knowledge used: pygame module, python basics, os file reading and writing, and object-oriented thinking methods!
Realized functions:
1: The movement of the aircraft, firing bullets, grenades, health, and life bar
2: The enemy aircraft has 3 forms (small, medium, and large). Different aircraft have different sizes, different health values, and different explosion animations. The same
3: Background music, explosion animation and sound effects when bullets hit the enemy and collide
4: Randomly generate supplies (double-shot bullets and full-screen bombs)
5: Gradually increase the difficulty (more planes appear on the same screen)
6: The highest score in history Record
Project analysis: a class file (Main.py), a total of more than 10 types of music and sound effects, a total of more than 30 photo materials, and a total of about 800 lines of code!
The code is as follows: (a class file (800 lines of code))
import pygame import sys import traceback from pygame.locals import * from random import * pygame.init() pygame.mixer.init() bg_size = width, height = 480, 700 screen = pygame.display.set_mode(bg_size) pygame.display.set_caption('Airplane War') background = pygame.image.load('images/background.png').convert() # define colors BLACK = (0, 0, 0) GREEN = (0, 255, 0) RED = (255, 0, 0) WHITE = (255, 255, 255) # load music pygame.mixer.music.load('sound/bjmusic.wav') pygame.mixer.music.set_volume(0.1) bullet_sound = pygame.mixer.Sound('sound/bullet.wav') bullet_sound.set_volume(0.2) bomb_sound = pygame.mixer.Sound('sound/use_bomb.wav') bomb_sound.set_volume(0.2) supply_sound = pygame.mixer.Sound('sound/supply.wav') supply_sound.set_volume(0.2) get_bomb_sound = pygame.mixer.Sound('sound/get_bomb.wav') get_bomb_sound.set_volume(0.2) get_bullet_sound = pygame.mixer.Sound('sound/get_bullet.wav') get_bullet_sound.set_volume(0.2) upgrade_sound = pygame.mixer.Sound('sound/upgrade.wav') upgrade_sound.set_volume(0.2) enemy3_fly_sound = pygame.mixer.Sound('sound/enemy3_flying.wav') enemy3_fly_sound.set_volume(0.6) enemy1_down_sound = pygame.mixer.Sound('sound/enemy1_down.wav') enemy1_down_sound.set_volume(0.2) enemy2_down_sound = pygame.mixer.Sound('sound/enemy2_down.wav') enemy2_down_sound.set_volume(0.2) enemy3_down_sound = pygame.mixer.Sound('sound/enemy3_down.wav') enemy3_down_sound.set_volume(0.2) me_down_sound = pygame.mixer.Sound('sound/me_down.wav') me_down_sound.set_volume(0.2) # set my plane class: set my plane class: set my plane class: set my plane class: set my plane class class MyPlane(pygame.sprite.Sprite): def __init__(self, bg_size): super(MyPlane, self).__init__() self.image1 = pygame.image.load('images/me1.png').convert_alpha() self.image2 = pygame.image.load('images/me2.png').convert_alpha() self.destroy_images = [] self.destroy_images.extend([ pygame.image.load('images/me_destroy_1.png').convert_alpha(), pygame.image.load('images/me_destroy_2.png').convert_alpha(), pygame.image.load('images/me_destroy_3.png').convert_alpha(), pygame.image.load('images/me_destroy_4.png').convert_alpha() ]) self.rect = self.image1.get_rect() self.width, self.height = bg_size[0], bg_size[1] self.active = True self.invincible = False self.mask = pygame.mask.from_surface(self.image2) self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, self.height - self.rect.height - 60 self.speed = 10 def moveUp(self): if self.rect.top > 0: self.rect.top -= self.speed else: self.rect.top = 0 def moveDown(self): if self.rect.bottom < self.height - 60: self.rect.bottom += self.speed else: self.rect.bottom = self.height - 60 def moveLeft(self): if self.rect.left > 0: self.rect.left -= self.speed else: self.rect.left = 0 def moveRight(self): if self.rect.right < self.width: self.rect.right += self.speed else: self.rect.right = self.width def reset(self): self.rect.left, self.rect.top = (self.width - self.rect.width) // 2, self.height - self.rect.height - 60 self.active = True self.invincible = True # Set enemy planes: # Set enemy planes: # Set enemy planes: # Set enemy planes: # Set enemy planes class SmallEnemy(pygame.sprite.Sprite): energy = 1 def __init__(self, bg_size): super(SmallEnemy, self).__init__() self.image = pygame.image.load('images/enemy1.png').convert_alpha() self.destroy_images = [] self.destroy_images.extend([ pygame.image.load('images/enemy1_down1.png').convert_alpha(), pygame.image.load('images/enemy1_down2.png').convert_alpha(), pygame.image.load('images/enemy1_down3.png').convert_alpha(), pygame.image.load('images/enemy1_down4.png').convert_alpha() ]) self.rect = self.image.get_rect() self.width, self.height = bg_size[0], bg_size[1] self.active = True self.mask = pygame.mask.from_surface(self.image) self.speed = 2 self.reset() self.energy = SmallEnemy.energy self.hit = False def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.reset() def reset(self): self.rect.left, self.rect.top = randint(0, self.width - self.rect.width), randint(-5 * self.height, 0) self.active = True self.energy = SmallEnemy.energy class MidEnemy(pygame.sprite.Sprite): energy = 8 def __init__(self, bg_size): super(MidEnemy, self).__init__() self.image = pygame.image.load('images/enemy2.png').convert_alpha() self.destroy_images = [] self.destroy_images.extend([ pygame.image.load('images/enemy2_down1.png').convert_alpha(), pygame.image.load('images/enemy2_down2.png').convert_alpha(), pygame.image.load('images/enemy2_down3.png').convert_alpha(), pygame.image.load('images/enemy2_down4.png').convert_alpha() ]) self.image_hit = pygame.image.load('images/enemy2_hit.png').convert_alpha() self.rect = self.image.get_rect() self.width, self.height = bg_size[0], bg_size[1] self.active = True self.speed = 1 self.mask = pygame.mask.from_surface(self.image) self.reset() self.energy = MidEnemy.energy self.hit = False def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.reset() def reset(self): self.rect.left, self.rect.top = randint(0, self.width - self.rect.width), randint(-10 * self.height, -self.height) self.active = True self.energy = MidEnemy.energy class BigEnemy(pygame.sprite.Sprite): energy = 20 def __init__(self, bg_size): super(BigEnemy, self).__init__() self.image1 = pygame.image.load('images/enemy3_n1.png').convert_alpha() self.image2 = pygame.image.load('images/enemy3_n2.png').convert_alpha() self.destroy_images = [] self.destroy_images.extend([ pygame.image.load('images/enemy3_down1.png').convert_alpha(), pygame.image.load('images/enemy3_down2.png').convert_alpha(), pygame.image.load('images/enemy3_down3.png').convert_alpha(), pygame.image.load('images/enemy3_down4.png').convert_alpha(), pygame.image.load('images/enemy3_down5.png').convert_alpha(), pygame.image.load('images/enemy3_down6.png').convert_alpha() ]) self.image_hit = pygame.image.load('images/enemy3_hit.png').convert_alpha() self.rect = self.image1.get_rect() self.width, self.height = bg_size[0], bg_size[1] self.active = True self.speed = 1 self.mask = pygame.mask.from_surface(self.image1) self.appear = False self.reset() self.energy = BigEnemy.energy self.hit = False def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.reset() def reset(self): self.rect.left, self.rect.top = randint(0, self.width - self.rect.width), randint(-20 * self.height, -10 * self.height) self.active = True self.energy = BigEnemy.energy # set supply: # set supply: # set supply: # set supply: # set supply class Bullet_Supply(pygame.sprite.Sprite): def __init__(self, bg_size): super(Bullet_Supply, self).__init__() self.image = pygame.image.load('images/bullet_supply.png').convert_alpha() self.rect = self.image.get_rect() self.width, self.height = bg_size[0], bg_size[1] self.rect.left, self.rect.bottom = randint(0, self.width - self.rect.width), -100 self.speed = 5 self.active = False self.mask = pygame.mask.from_surface(self.image) def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.active = False def reset(self): self.active = True self.rect.left, self.rect.bottom = randint(0, self.width - self.rect.width), -100 class Bomb_Supply(pygame.sprite.Sprite): def __init__(self, bg_size): super(Bomb_Supply, self).__init__() self.image = pygame.image.load('images/bomb_supply.png').convert_alpha() self.rect = self.image.get_rect() self.width, self.height = bg_size[0], bg_size[1] self.rect.left, self.rect.bottom = randint(0, self.width - self.rect.width), -100 self.speed = 5 self.active = False self.mask = pygame.mask.from_surface(self.image) def move(self): if self.rect.top < self.height: self.rect.top += self.speed else: self.active = False def reset(self): self.active = True self.rect.left, self.rect.bottom = randint(0, self.width - self.rect.width), -100 # Set our firing bullet class class Bullet1(pygame.sprite.Sprite): def __init__(self, position): super(Bullet1, self).__init__() self.image = pygame.image.load("images/bullet1.png").convert_alpha() self.rect = self.image.get_rect() self.rect.left, self.rect.top = position self.speed = 12 self.active = True self.mask = pygame.mask.from_surface(self.image) def move(self): self.rect.top -= self.speed if self.rect.top < 0: self.active = False def reset(self, position): self.rect.left, self.rect.top = position self.active = True class Bullet2(pygame.sprite.Sprite): def __init__(self, position): super(Bullet2, self).__init__() self.image = pygame.image.load("images/bullet2.png").convert_alpha() self.rect = self.image.get_rect() self.rect.left, self.rect.top = position self.speed = 14 self.active = False self.mask = pygame.mask.from_surface(self.image) def move(self): self.rect.top -= self.speed if self.rect.top < 0: self.active = False def reset(self, position): self.rect.left, self.rect.top = position self.active = True # Implementation of the main program: # Implementation of the main program: # Implementation of the main program: # Implementation of the main program: # Implementation of the main program def add_small_enemies(group1, group2, num): for i in range(num): e1 = SmallEnemy(bg_size) group1.add(e1) group2.add(e1) def add_mid_enemies(group1, group2, num): for i in range(num): e2 = MidEnemy(bg_size) group1.add(e2) group2.add(e2) def add_big_enemies(group1, group2, num): for i in range(num): e3 = BigEnemy(bg_size) group1.add(e3) group2. add(e3) def inc_speed(target, inc): for each in target: each.speed += inc def main(): # play music pygame.mixer.music.play(-1) # Instantiate our aircraft me =MyPlane(bg_size=bg_size) # Instantiate the enemy aircraft enemies = pygame.sprite.Group() # Instantiate the enemy small aircraft small_enemies = pygame.sprite.Group() add_small_enemies(small_enemies, enemies, 15) # Instantiate enemy medium aircraft mid_enemies = pygame.sprite.Group() add_mid_enemies(mid_enemies, enemies, 4) # Instantiate the enemy large aircraft big_enemies = pygame.sprite.Group() add_big_enemies(big_enemies, enemies, 2) # Instantiate normal bullets bullet1 = [] bullet1_index = 0 BULLET1_NUM = 4 for i in range(BULLET1_NUM): bullet1.append(Bullet1((me.rect.centerx-10 , me.rect.centery))) # instance super bullet bullet2 = [] bullet2_index = 0 BULLET2_NUM = 8 for i in range(BULLET2_NUM // 2): bullet2.append(Bullet2((me.rect.centerx - 33, me.rect.centery))) bullet2.append(Bullet2((me.rect.centerx + 30, me.rect.centery))) # shot image index e1_destroy_index = 0 e2_destroy_index = 0 e3_destroy_index = 0 me_destroy_index = 0 # Statistics score score = 0 score_font = pygame.font.Font("font/font1.ttf", 36) # flag whether to pause the game paused = False paused_nor_image = pygame.image.load("images/pause_nor.png").convert_alpha() paused_pressed_image = pygame.image.load( "images/pause_pressed.png").convert_alpha() resume_nor_image = pygame.image.load('images/resume_nor.png').convert_alpha() resume_pressed_image = pygame.image.load('images/resume_pressed.png').convert_alpha() paused_rect = paused_nor_image.get_rect() paused_rect.left, paused_rect.top = width - paused_rect.width - 10, 10 paused_image = paused_nor_image # set difficulty level = 1 # Full screen bomb bomb_image = pygame.image.load('images/bomb.png').convert_alpha() bomb_rect = bomb_image.get_rect() bomb_font = pygame.font.Font("font/font1.ttf", 48) bomb_num = 3 # Distribute a supply pack every 20 seconds bullet_supply = Bullet_Supply(bg_size) bomb_supply = Bomb_Supply(bg_size) SUPPLY_TIME = USEREVENT pygame.time.set_timer(SUPPLY_TIME, 20 * 1000) DOUBLE_BULLTET_TIME = USEREVENT + 1 INVINCIBLE_TIME = USEREVENT + 2 # Flag to use super bullets is_double_bullet = False # number of lives life_image = pygame.image.load('images/life.png').convert_alpha() life_rect = life_image.get_rect() life_num = 3 # Used to switch the picture of our aircraft switch_plane = True # Game over screen gameover_font = pygame.font.Font("font/font1.TTF", 48) again_image = pygame.image.load("images/again.png").convert_alpha() again_rect = again_image.get_rect() gameover_image = pygame.image.load("images/gameover.png").convert_alpha() gameover_rect = gameover_image.get_rect() # for delayed switching delay = 100 recorded = False clock = pygame.time.Clock() running = True while running: for event in pygame.event.get(): if event.type == QUIT: pygame.quit() sys.exit() elif event.type == MOUSEBUTTONDOWN: if event.button == 1 and paused_rect.collidepoint(event.pos): paused = not paused if paused: pygame.time.set_timer(SUPPLY_TIME, 0) pygame.mixer.music.pause() pygame.mixer.pause() else: pygame.time.set_timer(SUPPLY_TIME, 20 * 1000) pygame.mixer.music.unpause() pygame.mixer.unpause() elif event.type == MOUSEMOTION: if paused_rect.collidepoint(event.pos): if paused: paused_image = resume_pressed_image else: paused_image = paused_pressed_image else: if paused: paused_image = resume_nor_image else: paused_image = paused_nor_image elif event.type == KEYDOWN: if event.key == K_SPACE: if bomb_num: bomb_num -= 1 bomb_sound. play() for each in enemies: if each.rect.bottom > 0: each.active = False elif event.type == SUPPLY_TIME: supply_sound. play() if choice([True, False]): bomb_supply.reset() else: bullet_supply.reset() elif event.type == DOUBLE_BULLTET_TIME: is_double_bullet = False pygame.time.set_timer(DOUBLE_BULLTET_TIME, 0) elif event.type == INVINCIBLE_TIME: me.invincible = False pygame.time.set_timer(INVINCIBLE_TIME, 0) # Increase difficulty based on user score if level == 1 and score > 5000: level = 2 upgrade_sound. play() # Add 3 small enemy planes, 2 medium enemy planes and 1 large enemy plane add_small_enemies(small_enemies, enemies, 3) add_mid_enemies(mid_enemies, enemies, 2) add_big_enemies(big_enemies, enemies, 1) # Increase the speed of small enemy planes inc_speed(target=small_enemies, inc=1) elif level == 2 and score > 30000: level = 3 upgrade_sound. play() # Add 5 small enemy planes, 3 medium enemy planes and 2 large enemy planes add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # Increase the speed of small enemy planes inc_speed(target=small_enemies, inc=1) inc_speed(target=mid_enemies, inc=1) elif level == 3 and score > 60000: level = 4 upgrade_sound. play() # Add 5 small enemy planes, 3 medium enemy planes and 2 large enemy planes add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # Increase the speed of small enemy planes inc_speed(target=small_enemies, inc=1) inc_speed(target=mid_enemies, inc=1) elif level == 4 and score > 100000: level = 5 upgrade_sound. play() # Add 5 small enemy planes, 3 medium enemy planes and 2 large enemy planes add_small_enemies(small_enemies, enemies, 5) add_mid_enemies(mid_enemies, enemies, 3) add_big_enemies(big_enemies, enemies, 2) # Increase the speed of small enemy planes inc_speed(target=small_enemies, inc=1) inc_speed(target=mid_enemies, inc=1) inc_speed(target=big_enemies, inc=1) screen.blit(background, (0, 0)) if life_num and not paused: # Detect keyboard key presses key_pressed = pygame.key.get_pressed() if key_pressed[K_w] or key_pressed[K_UP]: me.moveUp() if key_pressed[K_s] or key_pressed[K_DOWN]: me.moveDown() if key_pressed[K_a] or key_pressed[K_LEFT]: me.moveLeft() if key_pressed[K_d] or key_pressed[K_RIGHT]: me.moveRight() # draw full screen bomb supply if bomb_supply.active: bomb_supply.move() screen.blit(bomb_supply.image, bomb_supply.rect) if pygame.sprite.collide_mask(me, bomb_supply): get_bomb_sound. play() if bomb_num < 3: bomb_num += 1 bomb_supply.active = False # draw the super bullet supply if bullet_supply.active: bullet_supply.move() screen.blit(bullet_supply.image, bullet_supply.rect) if pygame.sprite.collide_mask(me, bullet_supply): get_bullet_sound. play() # fire super bullets is_double_bullet = True pygame.time.set_timer(DOUBLE_BULLTET_TIME, 18 * 1000) bullet_supply.active = False # fire bullet if not(delay % 10): bullet_sound. play() if is_double_bullet: bullets = bullet2 bullets[bullet2_index].reset( (me.rect.centerx - 40, me.rect.centery)) bullets[bullet2_index + 1].reset((me.rect.centerx + 20, me.rect.centery)) bullet2_index = (bullet2_index + 2) % BULLET2_NUM else: bullets = bullet1 bullets[bullet1_index].reset((me.rect.centerx-10, me.rect.centery-10)) bullet1_index = (bullet1_index + 1) % BULLET1_NUM # Collision detection detects whether the bullet hits the enemy plane for b in bullets: if b.active: b.move() screen.blit(b.image, b.rect) enemy_hit = pygame.sprite.spritecollide( b, enemies, False, pygame.sprite.collide_mask) if enemy_hit: b.active = False for each in enemy_hit: each.hit = True each.energy -= 1 if each.energy == 0: each.active = False # draw the enemy mainframe for each in big_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: if switch_plane: screen.blit(each.image1, each.rect) else: screen.blit(each.image2, each.rect) # draw blood bars pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) energy_remain = each.energy / BigEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) if each.rect.bottom == -10: enemy3_fly_sound.play(-1) each.appear = True # leave the screen, turn off the sound if each.rect.bottom < -10 and each.appear: enemy3_fly_sound.stop() each.appear = False else: # destruction if e3_destroy_index == 0: enemy3_down_sound.play() if not(delay % 2): screen.blit(each.destroy_images[ e3_destroy_index], each.rect) e3_destroy_index = (e3_destroy_index + 1) % 6 if e3_destroy_index == 0: enemy3_fly_sound.stop() score += 1000 each.reset() # draw enemy medium for each in mid_enemies: if each.active: each.move() if each.hit: screen.blit(each.image_hit, each.rect) each.hit = False else: screen.blit(each.image, each.rect) # draw the blood slot pygame.draw.line(screen, BLACK, (each.rect.left, each.rect.top - 5), (each.rect.right, each.rect.top - 5), 2) # When the life is greater than 20%, it will display green, otherwise it will display red energy_remain = each.energy / MidEnemy.energy if energy_remain > 0.2: energy_color = GREEN else: energy_color = RED pygame.draw.line(screen, energy_color, (each.rect.left, each.rect.top - 5), (each.rect.left + each.rect.width * energy_remain, each.rect.top - 5), 2) else: # destruction if e2_destroy_index == 0: enemy2_down_sound.play() if not(delay % 2): screen.blit(each.destroy_images[ e2_destroy_index], each.rect) e2_destroy_index = (e2_destroy_index + 1) % 4 if e2_destroy_index == 0: score += 600 each.reset() # Draw enemy minicomputers for each in small_enemies: if each.active: each.move() screen.blit(each.image, each.rect) else: # destruction if e1_destroy_index == 0: enemy1_down_sound.play() if not(delay % 2): screen.blit(each.destroy_images[ e1_destroy_index], each.rect) e1_destroy_index = (e1_destroy_index + 1) % 4 if e1_destroy_index == 0: score += 100 each.reset() # detect our aircraft collision enemies_down = pygame.sprite.spritecollide( me, enemies, False, pygame.sprite.collide_mask) if enemies_down and not me.invincible: me.active = False for each in enemies_down: each.active = False # draw our plane if me.active: if switch_plane: screen.blit(me.image1, me.rect) else: screen.blit(me.image2, me.rect) else: # destruction if me_destroy_index == 0: me_down_sound. play() if not(delay % 2): screen.blit(me.destroy_images[me_destroy_index], me.rect) me_destroy_index = (me_destroy_index + 1) % 4 if me_destroy_index == 0: life_num -= 1 me.reset() pygame.time.set_timer(INVINCIBLE_TIME, 3 * 1000) # Draw the number of full screen bombs bomb_text = bomb_font.render("× %d" % bomb_num, True, WHITE) text_rect = bomb_text.get_rect() screen.blit(bomb_image, (10, height - 10 - bomb_rect.height)) screen.blit(bomb_text, (20 + bomb_rect.width,height - 5 - text_rect.height)) # draw the number of remaining lives if life_num: for i in range(life_num): screen.blit(life_image, ((width - 10 - (i + 1) * life_rect.width), height - 10 - life_rect.height)) # draw score score_text = score_font.render('Score : %d' % score, True, WHITE) screen.blit(score_text, (10, 5)) # Draw the game over screen elif life_num == 0: # background music stop pygame.mixer.music.stop() pygame.mixer.stop() # Stop distributing supplies pygame.time.set_timer(SUPPLY_TIME, 0) if not recorded: recorded =True # Read the highest score in history with open('record.txt', 'r') as f: record_score = int(f.read()) # Determine whether it is higher than the highest score in history if score > record_score: with open('record.txt', 'w') as f: f.write(str(score)) # Draw the end interface record_score_text = score_font.render("Best : %d" % record_score, True, (255, 255, 255)) screen.blit(record_score_text, (10, 45)) gameover_text1 = gameover_font.render("Your Score", True, (255, 255, 255)) gameover_text1_rect = gameover_text1.get_rect() gameover_text1_rect.left, gameover_text1_rect.top = (width - gameover_text1_rect.width) // 2, height // 3 screen.blit(gameover_text1, gameover_text1_rect) gameover_text2 = gameover_font.render(str(score), True, (255, 255, 255)) gameover_text2_rect = gameover_text2.get_rect() gameover_text2_rect.left, gameover_text2_rect.top =(width - gameover_text2_rect.width) // 2, gameover_text1_rect.bottom + 10 screen.blit(gameover_text2, gameover_text2_rect) again_rect.left, again_rect.top = (width - again_rect.width) // 2, gameover_text2_rect.bottom + 50 screen.blit(again_image, again_rect) gameover_rect.left, gameover_rect.top = (width - again_rect.width) // 2, again_rect.bottom + 10 screen.blit(gameover_image, gameover_rect) # If the user presses the left mouse button if pygame.mouse.get_pressed()[0]: # get mouse coordinates pos = pygame.mouse.get_pos() if again_rect.left < pos[0] < again_rect.right and again_rect.top < pos[1] < again_rect.bottom: main() elif gameover_rect.left < pos[0] < gameover_rect.right and gameover_rect.top < pos[1] < gameover_rect.bottom: pygame.quit() sys.exit() screen.blit(paused_image, paused_rect) if not(delay % 11): switch_plane = not switch_plane delay -= 1 if not delay: delay = 100 pygame.display.flip() clock.tick(60) if __name__ == '__main__': main() Partial running screenshot:
Author:Theheartoflove
link:http://www.pythonblackhole.com/blog/article/83328/6f16436ccfef8a2230bf/
source:python black hole net
Please indicate the source for any form of reprinting. If any infringement is discovered, it will be held legally responsible.
name:
Comment content: (supports up to 255 characters)
Copyright © 2018-2021 python black hole network All Rights Reserved All rights reserved, and all rights reserved.京ICP备18063182号-7
For complaints and reports, and advertising cooperation, please contact vgs_info@163.com or QQ3083709327
Disclaimer: All articles on the website are uploaded by users and are only for readers' learning and communication use, and commercial use is prohibited. If the article involves pornography, reactionary, infringement and other illegal information, please report it to us and we will delete it immediately after verification!