class SpaceInvaders: def __init__(self): pygame.init() # Level Controller self.game_level = 0 g_level = 0 # Creating the screen self.screen = pygame.display.set_mode((800, 600)) # Title and icon pygame.display.set_caption("Space Cowboy") self.icon = pygame.image.load('assets\\spaceship_icon.png') pygame.display.set_icon(self.icon) # Delete bullet self.toBeDeleted = [] # Background self.background = pygame.image.load('assets\\desert.jpg') # Score self.score = 0 # Game self.liste2 = [] self.intro_checker = 0 self.running = True def creatingThePlayer(self): # Player playerImg = pygame.image.load('assets\\jet2.png') playerX = 10 playerY = 10 playerY_change = 0 self.player = Player(playerX, playerY, playerImg, playerY_change) def creatingTheBullets(self): # Bullet self.noOfBullets = [] bulletX = -5 bulletY = -5 bulletX_change = 0 bullet_state = "ready" self.bullet = Bullet(0, 0, bullet_state, bulletX_change) def setGameSpike(self): # Spike self.spikeX = random.randint(350, 550) self.spikeY = random.randint(200, 600) self.spikeX_change = -2 self.spikeImg = pygame.image.load('assets\\mace.png') self.margin_right = 0 def creatingTheEnemy(self): # Enemy self.enemy = Enemy() def run(self): while self.running: self.screen.fill((255, 255, 255)) self.screen.blit(self.background, (0, 0)) """ This if block checks: -If the user clicks Start at the intro,it will create the stone objects -If the user clicks Quit,it will quit the game basicly. """ if (self.intro_checker == 0): self.start = self.game_intro() if self.start == 1: self.intro_checker = 1 # No of enemies self.game_level = 0 self.numberOfEnemies = self.game_level_checker() elif self.start == 0: self.intro_checker = 0 self.running = False else: continue # If you clicked Start already,then it means we can get to our gameplay. if self.start == 1 and self.intro_checker == 1: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False if event.type == pygame.KEYDOWN: if event.key == pygame.K_q: self.running = False if event.key == pygame.K_UP: self.player.playerY_change = -5 if event.key == pygame.K_DOWN: self.player.playerY_change = 5 if event.key == pygame.K_SPACE: # To make sure we don't shoot multiple bullets too fast(one by one) if len(self.noOfBullets) != 0: if self.noOfBullets[-1].bulletX - self.player.playerX < 90: break self.bullet = Bullet(self.bullet.bulletX, self.bullet.bulletY, self.bullet.bullet_state, self.bullet.bulletX_change) self.noOfBullets.append(self.bullet) self.noOfBullets[-1].bulletX = self.player.playerX self.noOfBullets[-1].bulletY = self.player.playerY self.bullet.bulletX_change = 5 self.noOfBullets[-1].fire_bullet(self.noOfBullets[-1].bulletX, self.noOfBullets[-1].bulletY, self.noOfBullets[-1].bullet_state, self.screen) if event.type == pygame.KEYUP: if event.key == pygame.K_DOWN or event.key == pygame.K_UP: self.player.playerY_change = 0 # Player Moves self.player.playerY += self.player.playerY_change # Checking Boundries to make sure we do not jump out of range if self.player.playerY <= 32: self.player.playerY = 32 elif self.player.playerY >= 536: self.player.playerY = 536 # Bullet Moves self.bullet.bullet_moves(self.noOfBullets, self.screen) # Enemy Moves self.enemy.enemy_moves(self.numberOfEnemies) # Collision between the bullet and the enemy self.bulletCollisionWithEnemy() # Level Designs self.levelDesign() # Main Collision between rocks and player self.playerCollisionWithEnemy() # Display of our stone objects. e_c3 = 0 while e_c3 < len(self.numberOfEnemies): self.numberOfEnemies[e_c3].draw_player(self.numberOfEnemies[e_c3].enemyX, self.numberOfEnemies[e_c3].enemyY, self.numberOfEnemies[e_c3].enemyImg, self.screen) e_c3 += 1 # Display of our ingame objects. self.player.draw_player(self.player.playerX, self.player.playerY, self.player.playerImg, self.screen) self.draw_score() self.level() pygame.display.update() # This function is intro.It greets the player and ask if the user wants to play or quit. def game_intro(self): for event in pygame.event.get(): if event.type == pygame.QUIT: return 0 largeText = pygame.font.Font('freesansbold.ttf', 32) text1 = largeText.render("Welcome to Space Cowboy Game", True, (0, 0, 0)) self.screen.blit(text1, (150, 200)) mouse = pygame.mouse.get_pos() click = pygame.mouse.get_pressed() if 270 + 156 > mouse[0] > 270 and 260 + 32 > mouse[1] > 260: pygame.draw.rect(self.screen, (0, 232, 0), (270, 260, 156, 32)) if click[0] == 1: return 1 else: pygame.draw.rect(self.screen, (0, 200, 0), (270, 260, 156, 32)) if 270 + 156 > mouse[0] > 270 and 310 + 32 > mouse[1] > 310: pygame.draw.rect(self.screen, (232, 0, 0), (270, 310, 156, 32)) if click[0] == 1: return 0 else: pygame.draw.rect(self.screen, (200, 0, 0), (270, 310, 156, 32)) playText = pygame.font.Font('freesansbold.ttf', 24) text2 = playText.render("Play", True, (255, 255, 255)) self.screen.blit(text2, (315, 265)) quitText = pygame.font.Font('freesansbold.ttf', 24) text3 = quitText.render("Quit", True, (255, 255, 255)) self.screen.blit(text3, (315, 315)) pygame.display.update() return 2 def levelDesign(self): if len(self.numberOfEnemies) == 0 and self.game_level < 3: if self.game_level + 1 == 3: # The end of the game. self.congrats() self.intro_checker = 0 self.score = 0 return self.spikeX += self.spikeX_change self.draw_spike() # If you catch the spike,you level up. if self.collision(self.player.playerX, self.player.playerY, self.spikeX, self.spikeY): self.spikeX = 900 self.spikeY = 900 self.game_level += 1 self.numberOfEnemies = self.game_level_checker() self.spikeX = random.randint(350, 550) self.spikeY = random.randint(200, 600) # If you miss the spike,then you will have to replay that level. elif (self.spikeX < 0): self.spikeX = random.randint(350, 550) self.spikeY = random.randint(200, 600) self.numberOfEnemies = self.game_level_checker() self.score = self.score - (len(self.numberOfEnemies) + 5) def playerCollisionWithEnemy(self): e_c2 = 0 while e_c2 < len(self.numberOfEnemies): if self.mainCollision(self.player.playerX, self.player.playerY, self.numberOfEnemies[e_c2].enemyX, self.numberOfEnemies[e_c2].enemyY): self.noOfBullets.clear() self.game_over() self.score = 0 self.intro_checker = 0 e_c2 += 1 def bulletCollisionWithEnemy(self): e_c = 0 while e_c < len(self.numberOfEnemies): for i in range(len(self.noOfBullets)): if (self.collision(self.noOfBullets[i].bulletX, self.noOfBullets[i].bulletY, self.numberOfEnemies[e_c].enemyX, self.numberOfEnemies[e_c].enemyY)): self.numberOfEnemies.pop(e_c) self.toBeDeleted.append(self.noOfBullets[i]) self.score += 1 e_c = 0 break e_c += 1 """ -If block- below functions as: If i hit an stone object,i want to delete that bullet(the one i hit stone with) from my array. When collision between them happens,i append that bullet to toBeDeleted. And below,if the address of toBeDeleted item equals to one of our bullets',then it will be deleted. """ if len(self.toBeDeleted) != 0 and len(self.noOfBullets) != 0: croller = 0 while croller < len(self.noOfBullets): for j in range(0, len(self.toBeDeleted)): if self.toBeDeleted[j] == self.noOfBullets[croller]: self.noOfBullets.pop(croller) croller += 1 self.toBeDeleted.clear() # Collision between bullets and a stones def collision(self,bulletX, bulletY, enemyX, enemyY): col = math.sqrt(math.pow(enemyX - (bulletX + 59), 2) + math.pow(enemyY - (bulletY + 25), 2)) return col < 26 # This is the congrats window after you complete the game. def congrats(self): self.screen.blit(self.background, (0, 0)) c_text = pygame.font.Font('freesansbold.ttf', 32) text8 = c_text.render("Congrats! You've won the game!", True, (0, 0, 0)) self.screen.blit(text8, (210, 260)) score_text = pygame.font.Font('freesansbold.ttf', 32) text1 = score_text.render('Score : ' + str(self.score), True, (0, 0, 0)) self.screen.blit(text1, (340, 300)) pygame.display.update() pygame.time.wait(4000) # Drawing the spike def draw_spike(self): self.screen.blit(self.spikeImg, (self.spikeX, self.spikeY)) # This function decides the current level of the game. def game_level_checker(self): # When level increases,i'm increasing the enemy(stone object) number. enemy_number = 0 if self.game_level == 0: enemy_number = 15 elif self.game_level == 1: enemy_number = 20 elif self.game_level == 2: enemy_number = 25 noOfEnemies = [] for j in range(enemy_number): enemy = Enemy() noOfEnemies.append(enemy) return noOfEnemies # If a stone hits the player,the game will be over. def mainCollision(self,playerX, playerY, enemyX, enemyY): distance = math.sqrt(math.pow(enemyX - playerX, 2) + math.pow(enemyY - playerY, 2)) return distance < 24 # This is the game over window def game_over(self): self.screen.blit(self.background, (0, 0)) over_text = pygame.font.Font('freesansbold.ttf', 24) text3 = over_text.render("Game Over", True, (0, 0, 0)) self.screen.blit(text3, (350, 260)) score_text = pygame.font.Font('freesansbold.ttf', 32) text1 = score_text.render('Score : ' + str(self.score), True, (0, 0, 0)) self.screen.blit(text1, (340, 300)) pygame.display.update() pygame.time.wait(4000) # Drawing the score def draw_score(self): score_text = pygame.font.Font('freesansbold.ttf', 32) text1 = score_text.render('Score : ' + str(self.score), True, (255, 255, 255)) self.screen.blit(text1, (0, 0)) # Drawing the current level of the game. def level(self): self.margin_right = 0 for i in range(0, self.game_level + 1): self.margin_right += 40 self.screen.blit(self.spikeImg, (160 + self.margin_right, 10))