Python developers Zombies game

Development of ideas

1. The introduction of necessary modules, image path configuration, width and height of the background color setting interface, create a game main entrance.

# 1 need to introduce modules
import pygame
import random
# 1 configuration picture address
IMAGE_PATH = 'imgs/'
# 1 set the page width and height
scrrr_width=800
scrrr_height =560
# 1 Create a game over state control
GAMEOVER = False
The main program # 1
class MainGame():
     # 1 load the game window
    def init_window(self):
        # 1 calling the display module initialization
        pygame.display.init()
        # 1 Create a Window
        MainGame.window = pygame.display.set_mode([scrrr_width,scrrr_height])  #
    # 1 to start the game
    def start_game(self):
        # 1 Initialization window
        self.init_window()
        # 1 as long as the game is not over, has been circulating
        while not GAMEOVER:
            # 1 render a white background
            MainGame.window.fill((255, 255, 255))
            Live Update # 1
            pygame.display.update()
# 1 Start the main program
if __name__ == '__main__':
    game = MainGame()
    game.start_game()

2. The text drawing, create dynamically change the properties, rendering location

# 2 Create number off, score, remaining fraction, the amount of money
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

Help Tip # 2 is loaded
def load_help_text(self):
    text1 = self.draw_text ( '1. Press Create button 2. Create pea shooter sunflower Right', 26, (255, 0, 0))
    MainGame.window.blit (text1, (5, 5))

# 2 rendering of text and coordinate positions
        MainGame.window.blit (self.draw_text ( '当前 钱 数 $ {}'. Format (MainGame.money), 26, (255, 0, 0)), (500, 40))
        MainGame.window.blit (self.draw_text (
            'Off current number {} {} score, Shimonoseki distance short of points {}' .format (MainGame.shaoguan, MainGame.score, MainGame.remnant_score), 26,
            (255, 0, 0)), (5, 40))
        self.load_help_text()

3. Create a map class, and initialize the map coordinates

# 3 Create a class map
class Map():
    # 3 store two different colors of the image name
    map_names_list = [IMAGE_PATH + 'map1.png', IMAGE_PATH + 'map2.png']
    # 3 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)
        # Is able to grow
        self.can_grow = True
    Load Map # 3
    def load_map(self):
         MainGame.window.blit(self.image,self.position)
    
    # 3 store all the map coordinates of the points
    map_points_list = []
    # 3 stores all map tiles
    map_list = []
    
    # 3 initialization 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)

    # 3 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)
                # Will be added to the block 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)

    Map # 3 will be loaded into the window
    def load_map(self):
        for temp_map_list in MainGame.map_list:
            for map in temp_map_list:
                map.load_map()
    
    # 3 initialization coordinates and maps
    self.init_plant_points()
    self.init_map()
    
    # 3 need to repeatedly load the map
    self.load_map()

4. Create a plant-based, image loading error handling, loading plant method

# 4 image loading error process
LOG = 'file: {} in the method: {error}' .format (__ file __, __ name__)
Plant # 4
class Plant(pygame.sprite.Sprite):
    def __init__(self):
        super(Plant, self).__init__()
        self.live=True

    # Load picture
    def load_image(self):
        if hasattr(self, 'image') and hasattr(self, 'rect'):
            MainGame.window.blit(self.image, self.rect)
        else:
            print(LOG)
        
A list of all the # 4 storage plants
plants_list = []

5. Create sunflowers class

Sunflower Class # 5
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

    Function # 5: Generate Sunshine (production money)
    def produce_money(self):
        self.time_count += 1
        if self.time_count == 25:
            MainGame.money += 5
            self.time_count = 0
    # 5 added to the window Sunflower
    def display_sunflower(self):
        MainGame.window.blit(self.image,self.rect)

6. Create a pea shooter category

Pea shooter type # 6
class PeaShooter(Plant):
    def __init__(self,x,y):
        super(PeaShooter, self).__init__()
        # Self.image to 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 launch counter
        self.shot_count = 0

    # 6 increase shooting method
    def shot(self):
        Whether the records should be shot # 6
        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
            To launch a counter # 25
            if self.shot_count == 25:
                # 6 based on the location of the current pea shooter to create bullet
                peabullet = PeaBullet(self)
                # 6 bullets stored in the bullet list
                MainGame.peabullet_list.append(peabullet)
                self.shot_count = 0

    # 6 The method was added to the pea shooter window
    def display_peashooter(self):
        MainGame.window.blit(self.image,self.rect)
        
    # 6 increased transmission processing pea shooter
    def load_plants(self):
        for plant in MainGame.plants_list:
            # 6 loading logic optimization processing 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)
     # 6 calling the method to load plants
     self.load_plants()

7. Create bullet class

Bullet pea class # 7
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 within the screen, moved to the right to achieve
        if self.rect.x < scrrr_width:
            self.rect.x += self.speed
        else:
            self.live = False

    # 7 collision add bullets and zombies
    def hit_zombie(self):
        for zombie in MainGame.zombie_list:
            if pygame.sprite.collide_rect(self,zombie):
                # After the hit zombie, modify the state of the bullet,
                self.live = False
                # Zombie DOT
                zombie.hp -= self.damage
                if zombie.hp <= 0:
                    zombie.live = False
                    self.nextLevel()
    # 7 checkpoints 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)
   
    List # 7 stores all the bullets peas
    peabullet_list = []
    
    # 7 load all the bullets methods
def load_peabullets(self):
    for b in MainGame.peabullet_list:
        if b.live:
            b.display_peabullet()
            b.move_bullet()
            # 7 call whether the bullet hit the zombies approach
            b.hit_zombie()
        else:
            MainGame.peabullet_list.remove(b) 
    # 7 call load all the bullets methods
    self.load_peabullets()

8. Event Processing

# 8 Event Processing

def deal_events(self):
    # 8 Get all events
    eventList = pygame.event.get()
    # 8 traversing the list of events, judge
    for e in eventList:
        if e.type == pygame.QUIT:
            self.gameOver()
        elif e.type == pygame.MOUSEBUTTONDOWN:
            # Print ( 'presses the mouse button')
            print (e.pos)
            # Print (e.button) # 1 button is pressed on the transfer roller 2 under the turn roller 4 to the roller 3 to 5 Right

            x = e.pos[0] // 80
            y = e.pos[1] // 80
            print (x, y)
            map = MainGame.map_list[y - 1][x]
            print(map.position)
            # 8 increase map loading money judgment and judgment to create 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 ( 'Plant current length of the list: {}'. 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 ( 'Plant current length of the list: {}'. format (len (MainGame.plants_list)))
                    map.can_grow = False
                    MainGame.money -= 50
                    
                    Method # 8 call event handling
                    self.deal_events()

9. Create a zombie

# 9 zombie
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 moves
    def move_zombie(self):
        if self.live and not self.stop:
            self.rect.x -= self.speed
            if self.rect.x < -80:
                # 8 calls the end of the game method
                MainGame().gameOver()

    # 9 to determine whether the zombie hits the plant, if the collision, calling the attack a plant method
    def hit_plant(self):
        for plant in MainGame.plants_list:
            if pygame.sprite.collide_rect(self,plant):
                Modification # 8 zombie movement state
                self.stop = True
                self.eat_plant(plant)
    # 9 zombie attack plants
    def eat_plant(self,plant):
        # 9 reduce the value of plant life
        plant.hp -= self.damage
        Modify the status of # 9 modified plants die, as well as a map of the state
        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 modified zombie movement state
            self.stop = False



    # 9 is loaded into the zombie map
    def display_zombie(self):
        MainGame.window.blit(self.image,self.rect)
    
    # 9 New store a list of all zombies
    zombie_list = []
    count_zombie = 0
    produce_zombie = 100     
       
    # 9 New method to initialize the zombies
    def init_zombies(self):
        for i in range(1, 7):
            random.randint dis = (1, 5) * 200
            zombie = Zombie(800 + dis, i * 80)
            MainGame.zombie_list.append(zombie)

    # 9 will be loaded into all zombies map
    def load_zombies(self):
        for zombie in MainGame.zombie_list:
            if zombie.live:
                zombie.display_zombie()
                zombie.move_zombie()
                # V2.0 whether to call the collision of a plant
                zombie.hit_plant()
            else:
                MainGame.zombie_list.remove(zombie)                 

    # 9 calls the initialize method of zombies
        self.init_zombies()
        
    # 9 calls the method zombie show
            self.load_zombies()
            # 9 counter grows every count to 100, calls the initialization method zombie
            MainGame.count_zombie += 1
            if MainGame.count_zombie == MainGame.produce_zombie:
                self.init_zombies()
                MainGame.count_zombie = 0
            # 9 pygame their sleep
            pygame.time.wait(10)

10. The game is over method

# 10 End of program methods
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

Guess you like

Origin blog.csdn.net/zhoulei124/article/details/91338499