Search code examples
pythonlistloopsincrement

Python - loop to increment a value in list append to another list just add sum's total


people! I'm trying to code a Space Invaders Python program to learning purposes but keep stumbling in list and data manipulation issues inside loops. I just created a Class Squid to envelope the data for a circle to PyGame in the form: RGB, [X,Y] int

class Space_Ship:

    def space_ship():

        space_ship_X = 100
        space_ship_Y = 550
        space_ship_color = (255, 255, 255)
        space_ship_radius = 10
        space_ship = space_ship_color, [space_ship_X, space_ship_Y], space_ship_radius

        return space_ship
   class Squid:

    def squid():
        squid_X = 100
        squid_Y = 100
        squid_radius = 10
        squid_color = (255, 0, 0)
        squid = [squid_color, [squid_X, squid_Y], squid_radius]
        
        return squid

I need a squid's squad later, so I created an empty list and tried to increment the squid_X value before adding the "squid" to the list, but the counter just sums the total (600) and add it to every element in the list... [(255, 0, 0), [600, 100], 10]

from invader_squid.squid import Squid
from space_ship.space_ship import Space_Ship

import pygame
from pygame.constants import K_LEFT, K_RIGHT

pygame.init()

pygame.display.set_caption("Space Invaders - for poors")
clock = pygame.time.Clock()
FPS = 60

color_background = (0, 0, 0)
screen = pygame.display.set_mode((800, 600))

''' space contenders '''
space_ship = Space_Ship.space_ship()
squid = Squid.squid()

''' game logic '''
space_ships = 1
squids = 10
crabs = 10
octopusses = 5
mother_ships = 3

Loop:

squids = 10
squadron_squids = []

i = 0
while i < squids:
    print('squid ' + str( squid[1][0]))

    squid[1][0] += 50

    print('New squid ' + str( squid[1][0]))

    squadron_squids.append(squid)

    i += 1

print('squid_X: ' + str(squid[1][0]) + '\nsquadron_squids ' + str(squadron_squids))

Game Loop

loop = True

while loop:
    clock.tick(FPS)
    # mandatory exit condition
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            loop = False

    # screen draw
    screen.fill(color_background)
    # space_ship
    pygame.draw.circle(screen, *space_ship) # *args 'scatter'
    # squid
    '''for i in range(squids):
        pygame.draw.circle(screen, squadron_squids[i])
    '''
    ''' 
        MOVEMENT
        user input - move left or right
        circle can't surpass screen size
    '''
    keys = pygame.key.get_pressed()
    
    if keys[K_LEFT]:
        space_ship[1][0] -= 5
        if space_ship[1][0] < 10:
            space_ship[1][0] = 10
    if keys[K_RIGHT]:
        space_ship[1][0] += 5
        if space_ship[1][0] > 790:
            space_ship[1][0] = 790
    
    pygame.display.update()
    

pygame.quit()


Print output:

squid_X 100
New squid_X 150
squid_X 150    
New squid_X 200
squid_X 200    
New squid_X 250
squid_X 250    
New squid_X 300
squid_X 300
New squid_X 350
squid_X 350
New squid_X 400
squid_X 400
New squid_X 450
squid_X 450
New squid_X 500
squid_X 500
New squid_X 550
squid_X 550
New squid_X 600

squid_X: 600
squadron_squids [[(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10], [(255, 0, 0), [600, 100], 10]]

Thanks in advance! Any reading source to deepen the subject will be welcome!


Solution

  • Here's my suggestion:

    Use a class Squid as a blueprint for squids and create squid instances from your class. Each squid instance has a position, a radius (with a default if you don't specify it) and a color (also with a default).

    We then generate new squids and add them to a list, our squad. While doing so, we use the iteration index as our respective X position, while keeping the Y value constant - just for the sake of example.

    class Squid:
        def __init__(self, x, y, radius = 10, color = (255, 0, 0)):
            # bind all the values passed in this function to the object we're constructing here
            self.x = x
            self.y = y
            self.radius = radius
            self.color = color
        
        def __str__(self):
            # What happens when we call str(mySquid)?
            # Let's return something human readible
            # You can compare this to the output when calling repr(mySquid)
            return f'Squid([x={self.x}, y={self.y}], r={self.radius}, col={self.color})'
    
    num_squids = 10
    squad = []
    
    # repeat num_squids=10 times
    y = 10
    for i in range(num_squids):
        sq = Squid(i, y)
        squad.append(sq)
        print(f'Squid {i+1} is ready: {sq}!')
    
    print()
    print("Here is my squad...")
    for squid in squad:
        print(str(squid))
    

    Output:

    Squid 1 is ready: Squid([x=0, y=10], r=10, col=(255, 0, 0))!
    Squid 2 is ready: Squid([x=1, y=10], r=10, col=(255, 0, 0))!
    Squid 3 is ready: Squid([x=2, y=10], r=10, col=(255, 0, 0))!
    Squid 4 is ready: Squid([x=3, y=10], r=10, col=(255, 0, 0))!
    Squid 5 is ready: Squid([x=4, y=10], r=10, col=(255, 0, 0))!
    Squid 6 is ready: Squid([x=5, y=10], r=10, col=(255, 0, 0))!
    Squid 7 is ready: Squid([x=6, y=10], r=10, col=(255, 0, 0))!
    Squid 8 is ready: Squid([x=7, y=10], r=10, col=(255, 0, 0))!
    Squid 9 is ready: Squid([x=8, y=10], r=10, col=(255, 0, 0))!
    Squid 10 is ready: Squid([x=9, y=10], r=10, col=(255, 0, 0))!
    
    Here is my squad...
    Squid([x=0, y=10], r=10, col=(255, 0, 0))
    Squid([x=1, y=10], r=10, col=(255, 0, 0))
    Squid([x=2, y=10], r=10, col=(255, 0, 0))
    Squid([x=3, y=10], r=10, col=(255, 0, 0))
    Squid([x=4, y=10], r=10, col=(255, 0, 0))
    Squid([x=5, y=10], r=10, col=(255, 0, 0))
    Squid([x=6, y=10], r=10, col=(255, 0, 0))
    Squid([x=7, y=10], r=10, col=(255, 0, 0))
    Squid([x=8, y=10], r=10, col=(255, 0, 0))
    Squid([x=9, y=10], r=10, col=(255, 0, 0))