Python Project for A SHIP THAT FIRES BULLETS

1.Planning Your Project

2.Installing Pygame

python3 -m pip install --user pygame

3.Starting the Game Project

3.1 Creating a Pygame Window and Responding to User Input.


# import modules
import sys
import pygame

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        self.screen = pygame.display.set_mode((1200, 800))
        pygame.display.set_caption("Alien Invasion")

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            # Watch for keyboard and mouse events.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # Make the most recently drawn screen visible
            pygame.display.flip()

if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

3.2 Controlling the Frame Rate


# import modules
import sys
import pygame

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        self.screen = pygame.display.set_mode((1200, 800))
        pygame.display.set_caption("Alien Invasion")

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            # Watch for keyboard and mouse events.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # Make the most recently drawn screen visible
            pygame.display.flip()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

3.3 Setting the Background Color


# import modules
import sys
import pygame

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        self.screen = pygame.display.set_mode((1200, 800))
        pygame.display.set_caption("Alien Invasion")

        # Set the background color.
        self.bg_color = (230, 230, 230)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            # Watch for keyboard and mouse events.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                    
            # Redraw the screen during each pass through the loop.
            self.screen.fill(self.bg_color)

            # Make the most recently drawn screen visible
            pygame.display.flip()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

3.4 Creating a Setting Class

class Settings:
    """A class to store all settings for Alien Invasion"""
    def __init__(self):
        """Initialize the game's settings."""
        # Screen settings
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
        

To make an instance of Settings in the project and use it to access our settings, we need to modify alien_invasion.py as follows:


# import modules
import sys
import pygame
from settings import Settings

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")

        # Set the background color.
        self.bg_color = (230, 230, 230)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            # Watch for keyboard and mouse events.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # Redraw the screen during each pass through the loop.
            self.screen.fill(self.settings.bg_color)

            # Make the most recently drawn screen visible
            pygame.display.flip()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

3.5 Adding the Ship Image


# import modules
import sys
import pygame
from settings import Settings

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")

        # Set the background color.
        self.bg_color = (230, 230, 230)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            # Watch for keyboard and mouse events.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # Redraw the screen during each pass through the loop.
            self.screen.fill(self.settings.bg_color)

            # Make the most recently drawn screen visible
            pygame.display.flip()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

3.6 Drawing the Ship to the Screen


# import modules
import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")



        self.ship = Ship(self)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            # Watch for keyboard and mouse events.
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()

            # Redraw the screen during each pass through the loop.
            self.screen.fill(self.settings.bg_color)
            self.ship.blitme()

            # Make the most recently drawn screen visible
            pygame.display.flip()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

Alien Invasion with the ship at the bottom center of the screen.

3.7 Refactoring: The _check_events() and _update_screen() Methods

In Python, a single leading underscore indicates a helper method.

3.7.1 The _check_events() Method

# import modules
import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")


        # the call to Ship() requires one argument:an instance of AlienInvasion.
        self.ship = Ship(self)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()

            # Redraw the screen during each pass through the loop.
            self.screen.fill(self.settings.bg_color)
            # draw the ship on the screen by calling ship.blitme(),so the ship appears on top of the background.
            self.ship.blitme()

            # Make the most recently drawn screen visible
            pygame.display.flip()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

def _check_events(self):
    """Respond to keypresses and mouse events."""
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            sys.exit()


if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()
3.7.2 The _update_screen() Method

# import modules
import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")


        # the call to Ship() requires one argument:an instance of AlienInvasion.
        self.ship = Ship(self)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()
            self._update_screen()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

    def _check_events(self):
        """Respond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()

    def _update_screen(self):
        """Update images on the screen, and flip to the new screen."""
        # Redraw the screen during each pass through the loop.
        self.screen.fill(self.settings.bg_color)
        # draw the ship on the screen by calling ship.blitme(),so the ship appears on top of the background.
        self.ship.blitme()

        # Make the most recently drawn screen visible
        pygame.display.flip()


if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()

3.8 Piloting the Ship

3.8.1 Responding to a Keypress

# import modules
import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")


        # the call to Ship() requires one argument:an instance of AlienInvasion.
        self.ship = Ship(self)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()
            self._update_screen()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

    def _check_events(self):
        """Respond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    # Move the ship to the right.
                    self.ship.rect.x += 1

    def _update_screen(self):
        """Update images on the screen, and flip to the new screen."""
        # Redraw the screen during each pass through the loop.
        self.screen.fill(self.settings.bg_color)
        # draw the ship on the screen by calling ship.blitme(),so the ship appears on top of the background.
        self.ship.blitme()

        # Make the most recently drawn screen visible
        pygame.display.flip()


if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()
3.8.2 Allowing Continuous Movement
import pygame

class Ship:
    """A class to manage the ship."""

    def __init__(self, ai_game):
        """Initialize the ship and set its starting position."""
        self.screen = ai_game.screen
        self.screen_rect = ai_game.screen.get_rect()

        # Load the ship image and get its rect
        self.image = pygame.image.load('/Users/maxwellpan/selflearn/py_practise_learn/python_crash_course/chapter12/alien_invasion/images/ship.bmp')
        self.rect = self.image.get_rect()

        # Start each new ship at the bottom center of the screen.
        self.rect.midbottom = self.screen_rect.midbottom
        
        # Movement flag: start with a ship that's not moving.
        self.moving_right = False
    
    def update(self):
        """Update the ship's position based on the movement flag."""
        if self.moving_right:
            self.rect.x += 1

    def blitme(self):
        """Draw the ship at its current location."""
        self.screen.blit(self.image, self.rect)

3.8.3 Moving Both Left and Right

# import modules
import sys
import pygame
from settings import Settings
from ship import Ship

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        pygame.display.set_caption("Alien Invasion")


        # the call to Ship() requires one argument:an instance of AlienInvasion.
        self.ship = Ship(self)

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()
            self.ship.update()
            self._update_screen()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

    def _check_events(self):
        """Respond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = True
                elif event.key == pygame.K_LEFT:
                    self.ship.moving_left = True

            elif event.type == pygame.KEYUP:
                if event.key == pygame.K_RIGHT:
                    self.ship.moving_right = False
                elif event.key == pygame.K_LEFT:
                    self.ship.moving_left = False

    def _update_screen(self):
        """Update images on the screen, and flip to the new screen."""
        # Redraw the screen during each pass through the loop.
        self.screen.fill(self.settings.bg_color)
        # draw the ship on the screen by calling ship.blitme(),so the ship appears on top of the background.
        self.ship.blitme()

        # Make the most recently drawn screen visible
        pygame.display.flip()


if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()
3.8.4 alien_invasion.py

# import modules
import sys
import pygame
from settings import Settings
from ship import Ship
from bullet import Bullet

class AlienInvasion:
    """Overall class to manage game assets and behavior."""

    def __init__(self):
        """Initialize the game, and create game resources."""

        # the pygame.init() function initializes the background settings that Pygame need to work properly.
        pygame.init()
        # define the clock in the __init() method.ensure the clock ticks once on each pass through the main loop.
        self.clock = pygame.time.Clock()

        # create a display window. the argument (1200, 800) is a tuple that defines the dimensions of the game window,which will be 1200 pixels wide by 800 pixels high.
        #self.screen = pygame.display.set_mode((1200, 800))
        self.settings = Settings()
        #self.screen = pygame.display.set_mode((self.settings.screen_width,self.settings.screen_height))
        # Running the Game in Fullscreen Mode
        self.screen = pygame.display.set_mode((0,0), pygame.FULLSCREEN)
        self.settings.screen_width = self.screen.get_rect().width
        self.settings.screen_height = self.screen.get_rect().height
        pygame.display.set_caption("Alien Invasion")


        # the call to Ship() requires one argument:an instance of AlienInvasion.
        self.ship = Ship(self)

        # create the group that holds the bullets in __init__()
        self.bullets = pygame.sprite.Group()

    def run_game(self):
        """Start the main loop for the game."""
        while True:
            self._check_events()
            self.ship.update()
            self.bullets.update()
            self._update_bullets()

            self._update_screen()
            # the tick() method takes one argument: the frame rate for the game.
            self.clock.tick(60)

    def _check_events(self):
        """Respond to keypresses and mouse events."""
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                sys.exit()
            elif event.type == pygame.KEYDOWN:
                self._check_keydown_events(event)
            elif event.type == pygame.KEYUP:
                self._check_keyup_events(event)
    
    def _check_keydown_events(self,event):
         """Respond to keypresses."""
         if event.key == pygame.K_RIGHT:
            self.ship.moving_right = True
         elif event.key == pygame.K_LEFT:
            self.ship.moving_left = True
        # Pressing Q to Quit
         elif event.key == pygame.K_q:
             sys.exit()
         elif event.key == pygame.K_SPACE:
             self._fire_bullet()

    def _check_keyup_events(self,event):
        """Respond to releases."""
        if event.key == pygame.K_RIGHT:
            self.ship.moving_right = False
        elif event.key == pygame.K_LEFT:
            self.ship.moving_left = False
    
    def _fire_bullet(self):
        """Create a new bullet and add it to the bullets group."""
        # if len(self.bullets) < self.settings.bullet_allowed:
        new_bullet = Bullet(self)
        self.bullets.add(new_bullet)

    def _update_bullets(self):
        """Update position of bullets and get rid of old bullets."""
        #Update bullet positions.
        self.bullets.update()

        # Ged rid of bullets that have disappeared.
        for bullet in self.bullets.copy():
            if bullet.rect.bottom <= 0:
                self.bullets.remove(bullet)

    def _update_screen(self):
        """Update images on the screen, and flip to the new screen."""
        # Redraw the screen during each pass through the loop.
        self.screen.fill(self.settings.bg_color)
        # draw the ship on the screen by calling ship.blitme(),so the ship appears on top of the background.
        for bullet in self.bullets.sprites():
            bullet.draw_bullet()

        self.ship.blitme()

        # Make the most recently drawn screen visible
        pygame.display.flip()


if __name__ == '__main__':
    # Make a game instance, and run the game.
    ai = AlienInvasion()
    ai.run_game()
3.8.5 settings.py
class Settings:
    """A class to store all settings for Alien Invasion"""
    def __init__(self):
        """Initialize the game's settings."""
        # Screen settings
        self.screen_width = 1200
        self.screen_height = 800
        self.bg_color = (230, 230, 230)
        
        # Ship settings
        self.ship_speed = 1.5

        # Bullet settings
        self.bullet_speed = 2.0
        self.bullet_width = 3
        self.bullet_height = 15
        self.bullet_color = (60, 60, 60)
        # limiting the number of Bullets.
        # self.bullet_allowed = 3
3.8.6 ship.py
import pygame

class Ship:
    """A class to manage the ship."""

    def __init__(self, ai_game):
        """Initialize the ship and set its starting position."""
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.screen_rect = ai_game.screen.get_rect()

        # Load the ship image and get its rect
        self.image = pygame.image.load('/Users/maxwellpan/selflearn/py_practise_learn/python_crash_course/chapter12/alien_invasion/images/ship.bmp')
        self.rect = self.image.get_rect()

        # Start each new ship at the bottom center of the screen.
        self.rect.midbottom = self.screen_rect.midbottom

        # Store a float for the ship's exact horizontal position.
        self.x = float(self.rect.x)
        
        # Movement flag: start with a ship that's not moving.
        self.moving_right = False
        self.moving_left = False
    
    def update(self):
        """Update the ship's position based on the movement flag."""
        # Update the ship's x value, not the rect.
        if self.moving_right and self.rect.right < self.screen_rect.right:
            self.x += self.settings.ship_speed

        if self.moving_left and self.rect.left > 0:
            self.x -= self.settings.ship_speed
        # Update rect object from self.x.
        self.rect.x = self.x

    def blitme(self):
        """Draw the ship at its current location."""
        self.screen.blit(self.image, self.rect)
3.8.7 bullet.py
import pygame
from pygame.sprite import Sprite

class Bullet(Sprite):
    """A class to manage bullets fired from the ship."""

    def __init__(self, ai_game):
        """Create a bullet object at the ship's current position."""
        super().__init__()
        self.screen = ai_game.screen
        self.settings = ai_game.settings
        self.color = self.settings.bullet_color

        # Create a bullet rect at (0, 0) and then set correct position.
        self.rect = pygame.Rect(0, 0, self.settings.bullet_width,self.settings.bullet_height)
        self.rect.midtop = ai_game.ship.rect.midtop

        # Store the bullet's position as a float.
        self.y = float(self.rect.y)

    def update(self):
        """Move the bullet up the screen"""
        # Update the exact position of the bullet.
        self.y -= self.settings.bullet_speed
        # Update the rect position.
        self.rect.y = self.y
    
    def draw_bullet(self):
        """Draw the bullet to the screen."""
        pygame.draw.rect(self.screen, self.color, self.rect)

### 使用Python实现灾害场景模拟 对于灾害场景的模拟,可以采用多种方法和技术栈来完成这一任务。一种常见的做法是利用数值计算库和可视化工具来进行物理过程仿真与结果呈现。 #### 库的选择 为了高效地创建复杂的环境模型并执行相应的灾难情景下的行为预测,可以选择如下几个重要的Python库: - **NumPy**: 提供多维数组对象及其派生类的支持,能够快速操作大型数据集。 - **SciPy**: 基于NumPy之上开发的一系列科学运算功能模块,适用于解决线性代数、积分方程等问题。 - **Matplotlib/Seaborn**: 这些图形化库可以帮助更好地理解和解释模拟的数据输出。 - **Folium/geopandas**: 如果涉及到地理空间数据分析,则这两个库非常适合用来处理地图信息。 - **Simpy**: 是一个离散事件仿真的框架,在模拟排队系统或其他具有时间序列特性的过程中非常有用。 针对特定类型的自然灾害(如洪水),还可以考虑使用专门设计的应用程序接口(API),比如NOAA提供的API获取气象预报资料;或者借助开源项目OpenQuake Engine进行地震风险评估等。 #### 示例代码:简单的森林火灾蔓延模拟器 下面给出一段基于随机行走算法简单描述火势传播逻辑的小例子[^1]: ```python import numpy as np from matplotlib import pyplot as plt class ForestFireSimulation: def __init__(self, size=50, p_burn=.7): self.grid_size = (size, size) self.probability_of_spread = p_burn self.forest_state = np.zeros(self.grid_size) def initialize_forest(self): """Randomly place trees and set one tree on fire.""" for i in range(self.grid_size[0]): for j in range(self.grid_size[1]): if np.random.rand() < .8: self.forest_state[i][j] = 1 # Tree present start_fire_x, start_fire_y = int(np.floor(self.grid_size[0]/2)), \ int(np.floor(self.grid_size[1]/2)) self.forest_state[start_fire_x][start_fire_y] = -1 # Fire started here def spread_fire(self): new_fires = [] for x in range(1,self.grid_size[0]-1): for y in range(1,self.grid_size[1]-1): if self.forest_state[x,y]==-1: # If there is a burning cell... neighbors=[(-1,-1), (-1,0), (-1,+1), (+0,-1), (+0,+1), (+1,-1), (+1,0), (+1,+1)] for dx,dy in neighbors: nx=x+dx; ny=y+dy try: if self.forest_state[nx,ny]>0 and\ np.random.uniform()<self.probability_of_spread: new_fires.append((nx,ny)) except IndexError: pass for nf in new_fires: self.forest_state[nf]=-1 def run_simulation(self, steps=100): fig=plt.figure(figsize=(6,6)) ax=fig.add_subplot() im=ax.imshow(self.forest_state,cmap='RdYlGn') cbar=fig.colorbar(im,ticks=[-1,0,1]) cbar.ax.set_yticklabels(['On Fire','Empty Space', 'Tree']) plt.show(block=False) while True: prev=self.forest_state.copy() self.spread_fire() changed=np.any(prev!=self.forest_state) if not changed or all([all(row<=0)for row in self.forest_state]): break im.set_data(self.forest_state) plt.draw() plt.pause(.1) if __name__=='__main__': sim=ForestFireSimulation(size=30,p_burn=.9) sim.initialize_forest() sim.run_simulation(steps=50) ``` 这段脚本定义了一个`ForestFireSimulation` 类,通过初始化一片虚拟森林,并设定其中某处发生火灾作为起点,之后按照一定概率向周围扩散直到无法再燃烧为止。此案例展示了基本的空间分布型态下自然现象的发展趋势,同时也体现了Python编程语言的强大灵活性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值