Author: our model links: segmentfault.com/a/119000001…

The development train of thought

Full project Address:

Github.com/371854496/p…

Learn more about Python and learn more about Python. Get 100 free machine learning ebooks

  1. Introduce the required modules, configure the picture path, set the interface width and height background color, create the main entrance of the game.
#1 Import the required modules
import pygame
import random
#1 Configure the image address
IMAGE_PATH = 'imgs/'
#1 Set the page width and height
scrrr_width=800
scrrr_height =560
#1 Create a state that controls the end of the game
GAMEOVER = False
The main program # 1
class MainGame(a):
     #1 Load the game window
    def init_window(self):
        Call initialization of the display module
        pygame.display.init()
        #1 Create window
        MainGame.window = pygame.display.set_mode([scrrr_width,scrrr_height])  #
    #1 Start the game
    def start_game(self):
        Initialize the window
        self.init_window()
        #1 Keep looping until the game is over
        while not GAMEOVER:
            #1 Render white background
            MainGame.window.fill((255.255.255))
            #1 Live updates
            pygame.display.update()
1 Start the main program
if __name__ == '__main__':
    game = MainGame()
    game.start_game()
Copy the code
  1. Text drawing, creating properties to change dynamically, rendering positions
#2 Create level number, score, remaining score, money number
shaoguan = 1
score = 0
remnant_score = 100
money = 200
#2 Text drawing
def draw_text(self, content, size, color):
    pygame.font.init()
    font = pygame.font.SysFont('kaiti', size)
    text = font.render(content, True, color)
    return text

#2 Load help tips
def load_help_text(self):
    text1 = self.draw_text('1. Left click to create Sunflower 2. Right click to create Pea Shooter '.26, (255.0.0))
    MainGame.window.blit(text1, (5.5))

#2 Render text and coordinate positions
        MainGame.window.blit(self.draw_text('Current amount $: {}'.format(MainGame.money), 26, (255.0.0)), (500.40))
        MainGame.window.blit(self.draw_text(
            'Current level {}, score {}, still {} points away from the next level'.format(MainGame.shaoguan, MainGame.score, MainGame.remnant_score), 26,
            (255.0.0)), (5.40))
        self.load_help_text()
Copy the code
  1. Create a map class, initialize the map and coordinates
Create a map class
class Map(a):
    #3 Store two different color image names
    map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png']
    Initialize the map
    def __init__(self, x, y, img_index):
        self.image = pygame.image.load(Map.map_names_list[img_index])
        self.position = (x, y)
        # Whether it can be planted
        self.can_grow = True
    #3 Load the map
    def load_map(self):
         MainGame.window.blit(self.image,self.position)

    Store all map coordinate points
    map_points_list = []
    #3 Store all map blocks
    map_list = []

    Initialize coordinate points
    def init_plant_points(self):
        for y in range(1.7):
            points = []
            for x in range(10):
                point = (x, y)
                points.append(point)
            MainGame.map_points_list.append(points)
            print("MainGame.map_points_list", MainGame.map_points_list)

    Initialize the map
    def init_map(self):
        for points in MainGame.map_points_list:
            temp_map_list = list()
            for point in points:
                # map = None
                if (point[0] + point[1]) % 2= =0:
                    map = Map(point[0] * 80, point[1] * 80.0)
                else:
                    map = Map(point[0] * 80, point[1] * 80.1)
                Add the map block to the window
                temp_map_list.append(map)
                print("temp_map_list", temp_map_list)
            MainGame.map_list.append(temp_map_list)
        print("MainGame.map_list", MainGame.map_list)

    #3 Load the map into the window
    def load_map(self):
        for temp_map_list in MainGame.map_list:
            for map in temp_map_list:
                map.load_map()

    Initialize coordinates and maps
    self.init_plant_points()
    self.init_map()

    #3 requires repeatedly loading the map
    self.load_map()
Copy the code
  1. Create plant class, picture load error processing, load plant method
#4 Image loading error processing
LOG = 'Method :{} error in file :{}'.format(__file__,__name__)
# 4 plants
class Plant(pygame.sprite.Sprite):
    def __init__(self):
        super(Plant, self).__init__()
        self.live=True

    # loading images
    def load_image(self):
        if hasattr(self, 'image') and hasattr(self, 'rect'):
            MainGame.window.blit(self.image, self.rect)
        else:
            print(LOG)

#4 Store a list of all plants
plants_list = []
Copy the code

5. Create sunflower class

#5 Sunflower
class Sunflower(Plant):
    def __init__(self,x,y):
        super(Sunflower, self).__init__()
        self.image = pygame.image.load('imgs/sunflower.png')
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.price = 50
        self.hp = 100
        #5 Time counter
        self.time_count = 0

    #5 Function: Generate sunshine (Produce money)
    def produce_money(self):
        self.time_count += 1
        if self.time_count == 25:
            MainGame.money += 5
            self.time_count = 0
    #5 Sunflower added to window
    def display_sunflower(self):
        MainGame.window.blit(self.image,self.rect)
Copy the code
  1. Create the pea Shooter class
    #6 Pea shooter
class PeaShooter(Plant):
    def __init__(self,x,y):
        super(PeaShooter, self).__init__()
        # self. Image is a surface
        self.image = pygame.image.load('imgs/peashooter.png')
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.price = 50
        self.hp = 200
        #6 Emission counter
        self.shot_count = 0

    #6 Added shooting methods
    def shot(self):
        #6 Record whether shots should be fired
        should_fire = False
        for zombie in MainGame.zombie_list:
            if zombie.rect.y == self.rect.y and zombie.rect.x < 800 and zombie.rect.x > self.rect.x:
                should_fire = True
        #6 If alive
        if self.live and should_fire:
            self.shot_count += 1
            # counter to 25 fire once
            if self.shot_count == 25:
                #6 Creates bullets based on the current pea shooter position
                peabullet = PeaBullet(self)
                #6 Stores the bullet in the bullet list
                MainGame.peabullet_list.append(peabullet)
                self.shot_count = 0

    #6 Method to add pea shooter to window
    def display_peashooter(self):
        MainGame.window.blit(self.image,self.rect)

    #6 Added pea-shooter shot processing
    def load_plants(self):
        for plant in MainGame.plants_list:
            #6 Optimize processing logic for loading plants
            if plant.live:
                if isinstance(plant, Sunflower):
                    plant.display_sunflower()
                    plant.produce_money()
                elif isinstance(plant, PeaShooter):
                    plant.display_peashooter()
                    plant.shot()
            else:
                MainGame.plants_list.remove(plant)
     Call the method to load the plant
     self.load_plants()
Copy the code
  1. Create bullet class
#7 Pea bullets
class PeaBullet(pygame.sprite.Sprite):
    def __init__(self,peashooter):
        self.live = True
        self.image = pygame.image.load('imgs/peabullet.png')
        self.damage = 50
        self.speed  = 10
        self.rect = self.image.get_rect()
        self.rect.x = peashooter.rect.x + 60
        self.rect.y = peashooter.rect.y + 15

    def move_bullet(self):
        #7 Move to the right within the screen
        if self.rect.x < scrrr_width:
            self.rect.x += self.speed
        else:
            self.live = False

    #7 added bullet/zombie collision
    def hit_zombie(self):
        for zombie in MainGame.zombie_list:
            if pygame.sprite.collide_rect(self,zombie):
                After hitting a zombie, change the state of the bullet,
                self.live = False
                # Zombies bleed
                zombie.hp -= self.damage
                if zombie.hp <= 0:
                    zombie.live = False
                    self.nextLevel()
    #7 Entry method
    def nextLevel(self):
        MainGame.score += 20
        MainGame.remnant_score -=20
        for i in range(1.100) :if MainGame.score==100*i and MainGame.remnant_score==0:
                    MainGame.remnant_score=100*i
                    MainGame.shaoguan+=1
                    MainGame.produce_zombie+=50

    def display_peabullet(self):
        MainGame.window.blit(self.image,self.rect)

    Store a list of all pea bullets
    peabullet_list = []

    #7 Method of loading all bullets
def load_peabullets(self):
    for b in MainGame.peabullet_list:
        if b.live:
            b.display_peabullet()
            b.move_bullet()
            #7 Calls the method to see if the bullet hit the zombie
            b.hit_zombie()
        else:
            MainGame.peabullet_list.remove(b)
    #7 Call the method to load all bullets
    self.load_peabullets()
Copy the code
  1. The event processing
#8 Event processing

def deal_events(self):
    Get all events
    eventList = pygame.event.get()
    #8 Traverse the event list and judge
    for e in eventList:
        if e.type == pygame.QUIT:
            self.gameOver()
        elif e.type == pygame.MOUSEBUTTONDOWN:
            # print(' press the mouse button ')
            print(e.pos)
            Print (e.button)# print(e.button)# print(e.button)# print(e.button)# print(e.button

            x = e.pos[0] / /80
            y = e.pos[1] / /80
            print(x, y)
            map = MainGame.map_list[y - 1][x]
            print(map.position)
            #8 Added map loading judgment and money judgment at build time
            if e.button == 1:
                if map.can_grow and MainGame.money >= 50:
                    sunflower = Sunflower(map.position[0], map.position[1])
                    MainGame.plants_list.append(sunflower)
                    print('Current plant list length :{}'.format(len(MainGame.plants_list)))
                    map.can_grow = False
                    MainGame.money -= 50
            elif e.button == 3:
                if map.can_grow and MainGame.money >= 50:
                    peashooter = PeaShooter(map.position[0], map.position[1])
                    MainGame.plants_list.append(peashooter)
                    print('Current plant list length :{}'.format(len(MainGame.plants_list)))
                    map.can_grow = False
                    MainGame.money -= 50

                    Call the event-handling method
                    self.deal_events()
Copy the code
  1. Creating a zombie class
# 9 zombie class
class Zombie(pygame.sprite.Sprite):
    def __init__(self,x,y):
        super(Zombie, self).__init__()
        self.image = pygame.image.load('imgs/zombie.png')
        self.rect = self.image.get_rect()
        self.rect.x = x
        self.rect.y = y
        self.hp = 1000
        self.damage = 2
        self.speed = 1
        self.live = True
        self.stop = False
    #9 Zombie movement
    def move_zombie(self):
        if self.live and not self.stop:
            self.rect.x -= self.speed
            if self.rect.x < - 80.:
                #8 Call the game end method
                MainGame().gameOver()

    #9 Determine if zombies have collided with plants, if so, call the plant attack method
    def hit_plant(self):
        for plant in MainGame.plants_list:
            if pygame.sprite.collide_rect(self,plant):
                #8 Zombie movement changes
                self.stop = True
                self.eat_plant(plant)
    #9 Zombies attack plants
    def eat_plant(self,plant):
        Plant health has been reduced
        plant.hp -= self.damage
        #9 State modification after plant death, and map state modification
        if plant.hp <= 0:
            a = plant.rect.y // 80 - 1
            b = plant.rect.x // 80
            map = MainGame.map_list[a][b]
            map.can_grow = True
            plant.live = False
            #8 Change the movement state of zombies
            self.stop = False

    #9 Load zombies into the map
    def display_zombie(self):
        MainGame.window.blit(self.image,self.rect)

    #9 Added a list to store all zombies
    zombie_list = []
    count_zombie = 0
    produce_zombie = 100     

    #9 Added a zombie initialization method
    def init_zombies(self):
        for i in range(1.7):
            dis = random.randint(1.5) * 200
            zombie = Zombie(800 + dis, i * 80)
            MainGame.zombie_list.append(zombie)

    #9 Load all zombies into the map
    def load_zombies(self):
        for zombie in MainGame.zombie_list:
            if zombie.live:
                zombie.display_zombie()
                zombie.move_zombie()
                # v2.0 calls the method on whether or not the plant is hit
                zombie.hit_plant()
            else:
                MainGame.zombie_list.remove(zombie)

    Call the zombie initialization method
        self.init_zombies()

    #9 Call the show zombie method
            self.load_zombies()
            The #9 counter grows and calls the zombie initialization method every time it reaches 100
            MainGame.count_zombie += 1
            if MainGame.count_zombie == MainGame.produce_zombie:
                self.init_zombies()
                MainGame.count_zombie = 0
            #9 PyGame itself is dormant
            pygame.time.wait(10)
Copy the code
  1. Game End method
#10 Program end method
def gameOver(self):
    MainGame.window.blit(self.draw_text('Game over'.50, (255.0.0)), (300.200))
    pygame.time.wait(400)
    global GAMEOVER
    GAMEOVER = True
Copy the code