Python code game - Star Wars

♥️Author : Xiao Liu at Station C

♥️Personal homepage: Xiao Liu's homepage

♥️ Share cloud computing network operation and maintenance classroom notes every day, hard work may not necessarily pay off, but there will be gains, come on! Work hard together for a better life!

♥️Under the setting sun, it is the most beautiful bloom, the tree is thousands of feet tall, and the fallen leaves return to the roots. Life is not easy, and the true love in the world

Table of contents

1. Introduction to Python

2. Game effect presentation

 3. Main code

four.cfg

Five. README

Six. sprites

7. Voting


1. Introduction to Python

Python was designed by Guido van Rossum of the Netherlands Research Society for Mathematics and Computer Science in the early 1990s as an alternative to a language called ABC. Python provides efficient high-level data structures and simple and effective object-oriented programming. Python syntax and dynamic types, as well as the nature of interpreted languages, make it a programming language for writing scripts and rapidly developing applications on most platforms. Development of large projects.

2. Game effect presentation

 3. Main code

'''
Function:
    外星人入侵小游戏

'''
import os
import sys
import cfg
import random
import pygame
from modules import *


'''开始游戏'''
def startGame(screen):
    clock = pygame.time.Clock()
    # 加载字体
    font = pygame.font.SysFont('arial', 18)
    if not os.path.isfile('score'):
        f = open('score', 'w')
        f.write('0')
        f.close()
    with open('score', 'r') as f:
        highest_score = int(f.read().strip())
    # 敌方
    enemies_group = pygame.sprite.Group()
    for i in range(55):
        if i < 11:
            enemy = enemySprite('small', i, cfg.WHITE, cfg.WHITE)
        elif i < 33:
            enemy = enemySprite('medium', i, cfg.WHITE, cfg.WHITE)
        else:
            enemy = enemySprite('large', i, cfg.WHITE, cfg.WHITE)
        enemy.rect.x = 85 + (i % 11) * 50
        enemy.rect.y = 120 + (i // 11) * 45
        enemies_group.add(enemy)
    boomed_enemies_group = pygame.sprite.Group()
    en_bullets_group = pygame.sprite.Group()
    ufo = ufoSprite(color=cfg.RED)
    # 我方
    myaircraft = aircraftSprite(color=cfg.GREEN, bullet_color=cfg.WHITE)
    my_bullets_group = pygame.sprite.Group()
    # 用于控制敌方位置更新
    # --移动一行
    enemy_move_count = 24
    enemy_move_interval = 24
    enemy_move_flag = False
    # --改变移动方向(改变方向的同时集体下降一次)
    enemy_change_direction_count = 0
    enemy_change_direction_interval = 60
    enemy_need_down = False
    enemy_move_right = True
    enemy_need_move_row = 6
    enemy_max_row = 5
    # 用于控制敌方发射子弹
    enemy_shot_interval = 100
    enemy_shot_count = 0
    enemy_shot_flag = False
    # 游戏进行中
    running = True
    is_win = False
    # 主循环
    while running:
        screen.fill(cfg.BLACK)
        for event in pygame.event.get():
            # --点右上角的X或者按Esc键退出游戏
            if event.type == pygame.QUIT:
                pygame.quit()
                sys.exit()
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.exit()
            # --射击
            if event.type == pygame.MOUSEBUTTONDOWN:
                my_bullet = myaircraft.shot()
                if my_bullet:
                    my_bullets_group.add(my_bullet)
        # --我方子弹与敌方/UFO碰撞检测
        for enemy in enemies_group:
            if pygame.sprite.spritecollide(enemy, my_bullets_group, True, None):
                boomed_enemies_group.add(enemy)
                enemies_group.remove(enemy)
                myaircraft.score += enemy.reward
        if pygame.sprite.spritecollide(ufo, my_bullets_group, True, None):
            ufo.is_dead = True
            myaircraft.score += ufo.reward
        # --更新并画敌方
        # ----敌方子弹
        enemy_shot_count += 1
        if enemy_shot_count > enemy_shot_interval:
            enemy_shot_flag = True
            enemies_survive_list = [enemy.number for enemy in enemies_group]
            shot_number = random.choice(enemies_survive_list)
            enemy_shot_count = 0
        # ----敌方移动
        enemy_move_count += 1
        if enemy_move_count > enemy_move_interval:
            enemy_move_count = 0
            enemy_move_flag = True
            enemy_need_move_row -= 1
            if enemy_need_move_row == 0:
                enemy_need_move_row = enemy_max_row
            enemy_change_direction_count += 1
            if enemy_change_direction_count > enemy_change_direction_interval:
                enemy_change_direction_count = 1
                enemy_move_right = not enemy_move_right
                enemy_need_down = True
                # ----每次下降提高移动和射击速度
                enemy_move_interval = max(15, enemy_move_interval-3)
                enemy_shot_interval = max(50, enemy_move_interval-10)
        # ----遍历更新
        for enemy in enemies_group:
            if enemy_shot_flag:
                if enemy.number == shot_number:
                    en_bullet = enemy.shot()
                    en_bullets_group.add(en_bullet)
            if enemy_move_flag:
                if enemy.number in range((enemy_need_move_row-1)*11, enemy_need_move_row*11):
                    if enemy_move_right:
                        enemy.update('right', cfg.SCREENSIZE[1])
                    else:
                        enemy.update('left', cfg.SCREENSIZE[1])
            else:
                enemy.update(None, cfg.SCREENSIZE[1])
            if enemy_need_down:
                if enemy.update('down', cfg.SCREENSIZE[1]):
                    running = False
                    is_win = False
                enemy.change_count -= 1
            enemy.draw(screen)
        enemy_move_flag = False
        enemy_need_down = False
        enemy_shot_flag = False
        # ----敌方爆炸特效
        for boomed_enemy in boomed_enemies_group:
            if boomed_enemy.boom(screen):
                boomed_enemies_group.remove(boomed_enemy)
                del boomed_enemy
        # --敌方子弹与我方飞船碰撞检测
        if not myaircraft.one_dead:
            if pygame.sprite.spritecollide(myaircraft, en_bullets_group, True, None):
                myaircraft.one_dead = True
        if myaircraft.one_dead:
            if myaircraft.boom(screen):
                myaircraft.resetBoom()
                myaircraft.num_life -= 1
                if myaircraft.num_life < 1:
                    running = False
                    is_win = False
        else:
            # ----更新飞船
            myaircraft.update(cfg.SCREENSIZE[0])
            # ----画飞船
            myaircraft.draw(screen)
        if (not ufo.has_boomed) and (ufo.is_dead):
            if ufo.boom(screen):
                ufo.has_boomed = True
        else:
            # ----更新UFO
            ufo.update(cfg.SCREENSIZE[0])
            # ----画UFO
            ufo.draw(screen)
        # --画我方飞船子弹
        for bullet in my_bullets_group:
            if bullet.update():
                my_bullets_group.remove(bullet)
                del bullet
            else:
                bullet.draw(screen)
        # --画敌方子弹
        for bullet in en_bullets_group:
            if bullet.update(cfg.SCREENSIZE[1]):
                en_bullets_group.remove(bullet)
                del bullet
            else:
                bullet.draw(screen)
        if myaircraft.score > highest_score:
            highest_score = myaircraft.score
        # --得分每增加2000我方飞船增加一条生命
        if (myaircraft.score % 2000 == 0) and (myaircraft.score > 0) and (myaircraft.score != myaircraft.old_score):
            myaircraft.old_score = myaircraft.score
            myaircraft.num_life = min(myaircraft.num_life + 1, myaircraft.max_num_life)
        # --敌人都死光了的话就胜利了
        if len(enemies_group) < 1:
            is_win = True
            running = False
        # --显示文字
        # ----当前得分
        showText(screen, 'SCORE: ', cfg.WHITE, font, 200, 8)
        showText(screen, str(myaircraft.score), cfg.WHITE, font, 200, 24)
        # ----敌人数量
        showText(screen, 'ENEMY: ', cfg.WHITE, font, 370, 8)
        showText(screen, str(len(enemies_group)), cfg.WHITE, font, 370, 24)
        # ----历史最高分
        showText(screen, 'HIGHEST: ', cfg.WHITE, font, 540, 8)
        showText(screen, str(highest_score), cfg.WHITE, font, 540, 24)
        # ----FPS
        showText(screen, 'FPS: ' + str(int(clock.get_fps())), cfg.RED, font, 8, 8)
        # --显示剩余生命值
        showLife(screen, myaircraft.num_life, cfg.GREEN)
        pygame.display.update()
        clock.tick(cfg.FPS)
    with open('score', 'w') as f:
        f.write(str(highest_score))
    return is_win


'''主函数'''
def main():
    # 初始化
    pygame.init()
    pygame.display.set_caption('外星人入侵 ')
    screen = pygame.display.set_mode(cfg.SCREENSIZE)
    pygame.mixer.init()
    pygame.mixer.music.load(cfg.BGMPATH)
    pygame.mixer.music.set_volume(0.4)
    pygame.mixer.music.play(-1)
    while True:
        is_win = startGame(screen)
        endInterface(screen, cfg.BLACK, is_win)


'''run'''
if __name__ == '__main__':
    main()

four.cfg

'''Configuration file'''
import os


'''some colors'''
WHITE = (255, 255, 255)
BLACK = (0, 0, 0)
GREEN = (50, 250, 5)
RED = (255, 0, 0)
'''FPS'' '
FPS = 60
'''Background Music'''
BGMPATH = os.path.join(os.getcwd(), 'resources/bgm.mp3')
'''Screen Size'''
SCREENSIZE = (800, 600)

Five. README

# Introduction
https://mp.weixin.qq.com/s/9UylZkV3sVTQLjThIaVObg

# Environment
```
OS: Windows10
Python: Python3.5+(have installed necessary dependencies)
```

# Usage
```
Step1:
pip install -r requirements.txt
Step2:
run "python Game13.py"
```

# Game Display
![giphy](demonstration/running.gif)

requirements:pygame

Six. sprites

'''
Function:
    Define the sprite class

'''
import sys
import pygame


'''Our spaceship class'''
class aircraftSprite(pygame.sprite.Sprite):
    def __init__(self, color, bullet_color, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        # life value
        self.num_life = 3
        self.max_num_life = 5
        # minimum unit
        self.cell = [3, 3]
        self.num_cols = 15
        self.num_rows = 8
        # used for collision detection
        self.rect = pygame.Rect(0, 550, self.cell[ 0] * self.num_cols, self.cell[0] * self.num_rows)
        # fill color area
        self.filled_cells = [7,21,22,23,36,37,38,46,47,48,49,50,51,52,53,54,55,56,57,58,60,61,62 ,63,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80,81,82,83,84,85,86,87 ,88,89,90,91,92,93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112,113,114,115,116,117,118,119]
        # spaceship Color
        self.color = color
        # Spaceship bullet color
        self.bullet_color = bullet_color
        # Whether the bullet is cooling
        self. is_cooling = False
        self.init_count = 35
        self.cooling_count = self.init_count
        # score
        self.score = 0
        # avoid repeated increase in health
        self.old_score = -1
        self.resetBoom()
    '''shooting'''
    def shot(self):
        if self.is_cooling:
            return None
        self.is_cooling = True
        self.cooling_count = self.init_count
        return myBulletSprite(self.rect.x + self.rect.width // 2, self.rect.y, self.bullet_color)
    '''在屏幕上画出来'''
    def draw(self, screen):
        for i in range(0, len(self.filled_cells)):
            y = self.filled_cells[i] // self.num_cols
            x = self.filled_cells[i] % self.num_cols
            rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
            pygame.draw.rect(screen, self.color, rect)
    '''更新飞船位置等信息'''
    def update(self, WIDTH):
        # 位置信息
        x = pygame.mouse.get_pos()[0] - (self.rect.width // 2)
        if x < 0:
            x = pygame.mouse.get_pos()[0]
        elif x > WIDTH - self.rect.width:
            x = WIDTH - self.rect.width
        self.rect.x = x
        # 子弹信息
        if self.is_cooling:
            self.cooling_count -= 1
            if self.cooling_count == 0:
                self.is_cooling = False
    '''被击中后爆炸'''
    def boom(self, screen):
        self.boomed_rect.x = self.rect.x
        self.boomed_rect.y = self.rect.y
        self.boomed_count += 1
        if self.boomed_count % 1 == 0:
            self.boomed_frame += 1
            for i in range(0, len(self.boomed_filled_cells)):
                y = self.boomed_filled_cells[i] // self.boomed_num_cols
                x = self.boomed_filled_cells[i] % self.boomed_num_cols
                rect = [x * self.boomed_cell[0] + self.boomed_rect[0], y * self.boomed_cell[1] + self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
                pygame.draw.rect(screen, self.color, rect)
        if self.boomed_frame > 4:
            return True
        else:
            return False
    '''重置爆炸所用到的数据'''
    def resetBoom(self):
        # 被击中爆炸时用
        self.one_dead = False
        self.boomed_filled_cells = [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81, 83,86,91,95]
        self.boomed_cell = [3, 3]
        self.boomed_num_cols = 11
        self.boomed_num_rows = 9
        self.boomed_rect = pygame.Rect(0, 0, self.boomed_num_cols*self.boomed_cell[0], self.boomed_num_rows*self.boomed_cell[1])
        # Control the time of each frame
        self.boomed_count = 0
        # The current frame of the explosion effect
        self.boomed_frame = 0


'''ufo类'''
class ufoSprite(pygame.sprite.Sprite):
    def __init__(self, color, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        # 击中该类获得的奖励
        self.reward = 200
        self.color = color
        self.reset()
    '''在屏幕上画出来'''
    def draw(self, screen):
        if self.is_dead:
            return None
        for i in range(0, len(self.filled_cells)):
            y = self.filled_cells[i] // self.num_cols
            x = self.filled_cells[i] % self.num_cols
            rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
            pygame.draw.rect(screen, self.color, rect)
    '''更新UFO位置等信息'''
    def update(self, WIDTH):
        if self.rect.x + self.rect.width < 0 or self.rect.x > WIDTH:
            self.rect.x += self.low_speed
        else:
            self.rect.x += self.high_speed
        if self.rect.x > WIDTH + 500:
            self.reset()
    '''被击中后爆炸'''
    def boom(self, screen):
        self.boomed_rect.x = self.rect.x
        self.boomed_rect.y = self.rect.y
        self.boomed_count += 1
        if self.boomed_count % 1 == 0:
            self.boomed_frame += 1
            for i in range(0, len(self.boomed_filled_cells)):
                y = self.boomed_filled_cells[i] // self.boomed_num_cols
                x = self.boomed_filled_cells[i] % self.boomed_num_cols
                rect = [x * self.boomed_cell[0] + self.boomed_rect[0], y * self.boomed_cell[1] + self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
                pygame.draw.rect(screen, self.color, rect)
        if self.boomed_frame > 4:
            return True
        else:
            return False
    '''重置'''
    def reset(self):
        self.cell = [3, 3]
        self.num_cols = 16
        self.num_rows = 7
        self.rect = pygame.Rect(-500 - self.num_cols * self.cell[0], 60, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
        self.filled_cells = [5,6,7,8,9,10,19,20,21,22,23,24,25,26,27,28,34,35,36,37,38,39,40,41,42,43,44,45,49,50,52,53,55,56,58,59,61,62,64,65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,82,83,84,87,88,91,92,93,99,108]
        self.low_speed = 1
        self.high_speed = 2
        self.is_dead = False
        # 被击中爆炸时用
        self.has_boomed = False
        self.boomed_filled_cells = [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81,83,86,91,95]
        self.boomed_cell = [3, 3]
        self.boomed_num_cols = 11
        self.boomed_num_rows = 9
        self.boomed_rect = pygame.Rect(0, 0, self.boomed_num_cols*self.boomed_cell[0], self.boomed_num_rows*self.boomed_cell[1])
        self.boomed_count = 0
        self.boomed_frame = 0


'''敌方类'''
class enemySprite(pygame.sprite.Sprite):
    def __init__(self, category, number, color, bullet_color, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.cell = [3, 3]
        # 编号
        self.number = number
        # 种类
        self.category = category
        if category == 'small':
            self.reward = 20
            self.num_cols = 8
            self.num_rows = 8
            self.rect = pygame.Rect(0, 0, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
            self.filled_cells = [[3,4,10,11,12,13,17,18,19,20,21,22,24,25,27,28,30,31,32,33,34,35,36,37,38,39,42,45,49,51,52,54,56,58,61,63],
                                 [3,4,10,11,12,13,17,18,19,20,21,22,24,25,27,28,30,31,32,33,34,35,36,37,38,39,41,43,44,46,48,55,57,62]]
        elif category == 'medium':
            self.reward = 15
            self.num_cols = 11
            self.num_rows = 8
            self.rect = pygame.Rect(0, 0, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
            self.filled_cells = [[2,8,11,14,18,21,22,24,25,26,27,28,29,30,32,33,34,35,37,38,39,41,42,43,44,45,46,47,48,49,50,51,52,53,54,56,57,58,59,60,61,62,63,64,68,74,78,86],
                                 [2,8,14,18,24,25,26,27,28,29,30,34,35,37,38,39,41,42,44,45,46,47,48,49,50,51,52,53,54,55,57,58,59,60,61,62,63,65,66,68,74,76,80,81,83,84]]
        elif category == 'large':
            self.reward = 10
            self.num_cols = 12
            self.num_rows = 8
            self.rect = pygame.Rect(0, 0, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
            self.filled_cells = [[4,5,6,7,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,41,42,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,62,63,64,67,68,69,73,74,77,78,81,82,86,87,92,93],
                                 [4,5,6,7,13,14,15,16,17,18,19,20,21,22,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,41,42,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,63,64,67,68,74,75,77,78,80,81,84,85,94,95]]
        self.color = color
        self.bullet_color = bullet_color
        self.speed = [8, 20]
        self.change_count = 0
        self.change_flag = False
        # 被击中爆炸时用
        self.boomed_filled_cells = [3,7,12,15,17,20,24,30,36,40,44,45,53,54,58,62,68,74,78,81,83,86,91,95]
        self.boomed_cell = [3, 3]
        self.boomed_num_cols = 11
        self.boomed_num_rows = 9
        self.boomed_rect = pygame.Rect(0, 0, self.boomed_num_cols * self.boomed_cell[0], self.boomed_num_rows * self.boomed_cell[1])
        self.boomed_count = 0
        self.boomed_frame = 0
    '''射击'''
    def shot(self):
        return enemyBulletSprite(self.rect.x + self.rect.width // 2, self.rect.y, self.bullet_color)
    '''Draw it on the screen'''
    def draw(self, screen):
        if self.change_count > 50:
            self.change_count = 0
            self.change_flag = not self.change_flag
        if self.change_flag:
            for i in range(0, len(self.filled_cells[0])):
                y = self.filled_cells[0][i] // self.num_cols
                x = self.filled_cells[0][i] % self.num_cols
                rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
                pygame.draw.rect(screen, self.color, rect)
        else:
            for i in range(0, len(self.filled_cells[1])):
                y = self.filled_cells[1][i] // self.num_cols
                x = self.filled_cells[1][i] % self.num_cols
                rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
                pygame.draw.rect(screen, self.color, rect)
    '''更新敌方位置等信息'''
    def update(self, direction, HEIGHT):
        # 用于改变形状
        self.change_count += 1
        # 更新位置信息
        if direction == 'right':
            self.rect.x += self.speed[0]
        elif direction == 'left':
            self.rect.x -= self.speed[0]
        elif direction == 'down':
            self.rect.y += self.speed[1]
        if self.rect.y >= HEIGHT - self.rect.height:
            return True
        else:
            return False
    '''被击中后爆炸'''
    def boom(self, screen):
        self.boomed_rect.x = self.rect.x
        self.boomed_rect.y = self.rect.y
        self.boomed_count += 1
        if self.boomed_count % 1 == 0:
            self.boomed_frame += 1
            for i in range(0, len(self.boomed_filled_cells)):
                y = self.boomed_filled_cells[i] // self.boomed_num_cols
                x = self.boomed_filled_cells[i] % self.boomed_num_cols
                rect = [x * self.boomed_cell[0] + self.boomed_rect[0], y * self.boomed_cell[1] + self.boomed_rect[1], self.boomed_cell[0], self.boomed_cell[1]]
                pygame.draw.rect(screen, self.color, rect)
        if self.boomed_frame > 4:
            return True
        else:
            return False


'''我方子弹精灵类'''
class myBulletSprite(pygame.sprite.Sprite):
    def __init__(self, x, y, color, **kwargs):
        pygame.sprite.Sprite.__init__(self)
        self.cell = [2, 2]
        self.num_cols = 1
        self.num_rows = 4
        self.rect = pygame.Rect(x, y, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
        self.filled_cells = [0,1,2,3]
        self.speed = 8
        self.color = color
    '''在屏幕上画出来'''
    def draw(self, screen):
        for i in range(0, len(self.filled_cells)):
            y = self.filled_cells[i] // self.num_cols
            x = self.filled_cells[i] % self.num_cols
            rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
            pygame.draw.rect(screen, self.color, rect)
    '''更新子弹位置等信息'''
    def update(self):
        self.rect.y -= self.speed
        if self.rect.y + self.rect.height < 0:
            return True
        else:
            return False


'''敌方子弹精灵类'''
class enemyBulletSprite(pygame.sprite.Sprite):
    def __init__(self, x, y, color):
        pygame.sprite.Sprite.__init__(self)
        self.cell = [3, 3]
        self.num_cols = 3
        self.num_rows = 7
        self.rect = pygame.Rect(x, y, self.num_cols * self.cell[0], self.num_rows * self.cell[1])
        self.filled_cells = [[0,4,8,10,12,16,20],
                             [2,4,6,10,14,16,18]]
        self.change_count = 0
        self.change_flag = False
        self.speed = 4
        self.color = color
    '''在屏幕上画出来'''
    def draw(self, screen):
        if self.change_count > 2:
            self.change_count = 0
            self.change_flag = not self.change_flag
        if self.change_flag:
            for i in range(0, len(self.filled_cells[0])):
                y = self.filled_cells[0][i] // self.num_cols
                x = self.filled_cells[0][i] % self.num_cols
                rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
                pygame.draw.rect(screen, self.color, rect)
        else:
            for i in range(0, len(self.filled_cells[1])):
                y = self.filled_cells[1][i] // self.num_cols
                x = self.filled_cells[1][i] % self.num_cols
                rect = [x * self.cell[0] + self.rect[0], y * self.cell[1] + self.rect[1], self.cell[0], self.cell[1]]
                pygame .draw.rect(screen, self.color, rect)
    '''Update bullet position and other information'''
    def update(self, HEIGHT):
        # Count used to change bullet shape
        self.change_count += 1
        # Position information
        self .rect.y += self.speed
        if self.rect.y > HEIGHT:
            return True
        else:
            return False

7. Voting

♥️Following is the driving force for my creation

♥️Like, is the greatest recognition for me

♥️This is Xiaoliu, I am inspiring to do every article well, thank you everyone

Guess you like

Origin blog.csdn.net/lzl10211345/article/details/129048176