def main(): '''This function defines the 'mainline logic' for our pyPong game.''' # DISPLAY pygame.display.set_caption("Thunder") screen = pygame.display.set_mode((480, 800)) # ENTITIES # Background initialization background = pygame.image.load('resources/image/background.png').convert() screen.blit(background, (0, 0)) #Images loading game_over = pygame.image.load('resources/image/gameover.png').convert() plane_img =pygame.image.load('resources/image/shoot.png') # Config rect for bullets bullet_rect = pygame.Rect(1004, 987, 9, 21) bullet_img = plane_img.subsurface(bullet_rect) # Player Config player_rect = [] # Player Sprite area player_rect.append(pygame.Rect(0, 99, 102, 126)) player_rect.append(pygame.Rect(165, 360, 102, 126)) # Player explosion sprite area player_rect.append(pygame.Rect(165, 234, 102, 126)) player_rect.append(pygame.Rect(330, 624, 102, 126)) player_rect.append(pygame.Rect(330, 498, 102, 126)) player_rect.append(pygame.Rect(432, 624, 102, 126)) player_pos = [200, 600] # Sprite for player plane player = pySprites.Player(plane_img, player_rect, player_pos,screen) # Config Rect for enemy plane enemy1_rect = pygame.Rect(534, 612, 57, 43) # Sprite for enemy plane enemies1 = pygame.sprite.Group() shield_pos = [random.randint(0, background.get_width() - enemy1_rect.width), 0] shield = pySprites.Shield(shield_pos) # Save down plane for explosion enemies_down = pygame.sprite.Group() #bullets sprites bullets = pygame.sprite.Group() # Sprite for score keeper score_keeper = pySprites.ScoreKeeper(screen) allSprites = pygame.sprite.OrderedUpdates(enemies1,enemies_down,shield,score_keeper,bullets,player) #initialize setting shoot_frequency = 25 enemy_frequency = 50 #keep track of frame and current score frame=0 score = 0 # Background Music and Sound Effects bullet_sound = pygame.mixer.Sound('resources/sound/bullet.wav') enemy1_down_sound = pygame.mixer.Sound('resources/sound/enemy1_down.wav') game_over_sound = pygame.mixer.Sound('resources/sound/game_over.wav') bullet_sound.set_volume(0.3) enemy1_down_sound.set_volume(0.3) game_over_sound.set_volume(0.3) pygame.mixer.music.load('resources/sound/game_music.wav') pygame.mixer.music.play(-1, 0.0) pygame.mixer.music.set_volume(0.25) # ASSIGN clock = pygame.time.Clock() keepGoing = True # Hide the mouse pointer pygame.mouse.set_visible(False) # LOOP while keepGoing: # TIME, 60 FPS for smoother play clock.tick(60) # EVENT HANDLING: Player uses keyboard, left arrow/A for left, right #arrow/D for right, up/W for up, down/S for down for event in pygame.event.get(): if event.type == pygame.QUIT: keepGoing = False if not player.is_hit: if pygame.key.get_pressed()[pygame.K_w] or pygame.key.get_pressed()[pygame.K_UP]: player.moveUp() if pygame.key.get_pressed()[pygame.K_s] or pygame.key.get_pressed()[pygame.K_DOWN]: player.moveDown() if pygame.key.get_pressed()[pygame.K_a] or pygame.key.get_pressed()[pygame.K_LEFT]: player.moveLeft() if pygame.key.get_pressed()[pygame.K_d] or pygame.key.get_pressed()[pygame.K_RIGHT]: player.moveRight() frame += 1 score=score_keeper.get_score() # Fire bullets if frame % shoot_frequency == 0: bullet_sound.play() bullet = pySprites.Bullet(bullet_img,player.rect.midtop) bullets.add(bullet) #if score if more than 10000 increase the speed #more than 20000 increase speed again and increase shoot frequency, #more than 30000 increase spped again and increase shoot frequency again if score >10000: enemy_frequency=40 shoot_frequency=20 if score >20000: enemy_frequency=25 shoot_frequency=15 if score >30000: enemy_frequency=20 shoot_frequency=13 #generate shield if frame % 1000 == 0: shield.reset() #generate enemy plane if frame % enemy_frequency == 0: enemy1_pos = [random.randint(0, background.get_width() - enemy1_rect.width), 0] enemy1 = pySprites.Enemy(enemy1_pos) enemies1.add(enemy1) #detect if bullet is out of screen, if it is, remove the bullet for bullet in bullets: if bullet.rect.bottom < 0: bullets.remove(bullet) for enemy in enemies1: #detect if the player is hit or out of screen, if it is, deduct one life and removes the plane if pygame.sprite.collide_circle(enemy, player) or enemy.rect.top > background.get_height(): enemies_down.add(enemy) enemies1.remove(enemy) score_keeper.deduct_life() player.is_hit=1 if score_keeper.dead(): player.is_hit=1 pygame.mixer.music.fadeout(2000) if player.finish==1: keepGoing=False if shield.rect.colliderect(player): score_keeper.add_life() shield.hit=1 # detect if bullet hits the plane, if so then plus 1000 score and removes the plane enemies1_down = pygame.sprite.groupcollide(enemies1, bullets, 1, 1) for enemy_down in enemies1_down: enemies_down.add(enemy_down) score_keeper.player_scored(1000) for enemy_down in enemies_down: if enemy_down.index == 0: enemy1_down_sound.play() enemy_down.enemy_down() if enemy_down.index >= len(enemy_down.images): enemies_down.remove(enemy_down) continue allSprites = pygame.sprite.OrderedUpdates(enemies1,enemies_down,shield,score_keeper,bullets,player) # REFRESH SCREEN screen.blit(background, (0, 0)) allSprites.clear(screen,background) allSprites.update() allSprites.draw(screen) pygame.display.flip() # Display "Game Over" graphic and unhide the mouse pointer game_over_sound.play() font = pygame.font.Font(None, 48) text = font.render('Score: '+ str(score_keeper.get_score()), True, (255, 0, 0)) text_rect = text.get_rect() text_rect.centerx = screen.get_rect().centerx text_rect.centery = screen.get_rect().centery + 24 screen.blit(game_over, (0, 0)) screen.blit(text, text_rect) pygame.display.flip() pygame.mouse.set_visible(True) time.sleep(5) pygame.quit()
def main(): '''This function defines the 'mainline logic' for our pyPong game.''' # D - DISPLAY screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("pyPong! v1.0") # E - ENTITIES #background = pygame.Surface(screen.get_size()) #background = background.convert() #background.fill((255, 255, 255)) background = pygame.image.load("beach.jpg").convert() screen.blit(background, (0, 0)) pygame.mixer.music.load("pirate.ogg") pygame.mixer.music.set_volume(0.6) pygame.mixer.music.play(-1) boing = pygame.mixer.Sound("shotgun.wav") boing.set_volume(0.8) canon = pygame.mixer.Sound("canon.wav") canon.set_volume(1.0) mySystemFont = pygame.font.SysFont("Arial", 60) label1 = mySystemFont.render("GAME OVER!", True, (255, 255, 0)) # Initialize Joystick objects. joysticks = [] for joystick_no in range(pygame.joystick.get_count()): stick = pygame.joystick.Joystick(joystick_no) stick.init() joysticks.append(stick) # Sprites for: ScoreKeeper label, End Zones, Ball, and Players scoreKeeper = pySprites.ScoreKeeper() ball = pySprites.Ball(screen) player1 = pySprites.Player(screen, 1) player1Endzone = pySprites.EndZone(screen, 0) player2 = pySprites.Player(screen, 2) player2Endzone = pySprites.EndZone(screen, 639) allSprites = pygame.sprite.OrderedUpdates(scoreKeeper, player1Endzone, \ player2Endzone, ball, player1, player2) # A - ACTION # A - ASSIGN clock = pygame.time.Clock() keepGoing = True # Hide the mouse pointer pygame.mouse.set_visible(False) # L - LOOP while keepGoing: # TIME clock.tick(30) # E - EVENT HANDLING: Player 1 uses joystick, Player 2 uses arrow keys for event in pygame.event.get(): if event.type == pygame.QUIT: keepGoing = False #elif event.type == pygame.JOYHATMOTION: # player1.changeDirection(event.value) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: player2.changeDirection((0, 1)) if event.key == pygame.K_DOWN: player2.changeDirection((0, -1)) if event.key == pygame.K_w: player1.changeDirection((0, 1)) if event.key == pygame.K_s: player1.changeDirection((0, -1)) # Check if player 1 scores (i.e., ball hits player 2 endzone) if ball.rect.colliderect(player2Endzone): boing.play() scoreKeeper.player1Scored() ball.changeDirection() # Check if player 2 scores (i.e., ball hits player 1 endzone) if ball.rect.colliderect(player1Endzone): boing.play() scoreKeeper.player2Scored() ball.changeDirection() # Check for game over (if a player gets 3 points) if scoreKeeper.winner(): screen.blit(label1, (30, 255)) keepGoing = False # Check if ball hits Player 1 or 2 # If so, change direction, and speed up the ball a little if ball.rect.colliderect(player1.rect) or\ ball.rect.colliderect(player2.rect): canon.play() ball.changeDirection() # R - REFRESH SCREEN allSprites.clear(screen, background) allSprites.update() allSprites.draw(screen) pygame.display.flip() # Unhide the mouse pointer pygame.mouse.set_visible(True) # Close the game window pygame.time.delay(3000) pygame.quit()
def game(screen): """ This is the main game. it sets up all of the aliens and wall and player objects. """ # display background = pygame.image.load("./background stuff/honeycomb wall2.jpg") background.convert() screen.blit(background, (0, 0)) # entities points = 0 barriers = [] invadersList = [] image_num = [1,1,2,2,3] image_num2 = [1,1,1,2,2,3] image_num3 = [1,1,1,2,2,2,3] boss_active = False level_2 = False level_3 = False # makes barriers barrier_y = 630 for barrierNum in range(4): for barrierRow in range(7): for barrierCol in range(13): barriers.append(pySprites.Barrier((barrierNum *250) + (barrierCol * 10) + 100, barrier_y)) barrier_y -= 10 barrier_y = 630 # makes the first wave of invaders invader_y = 280 for row in range(5): for column in range(11): image = image_num[row] invadersList.append(pySprites.Invader(((column + 1)*37), invader_y, screen.get_width()-(((9) - column)*37) , (column*37), (row+1)*10 , 5,7, image)) invader_y -= 30 player_shoot = pygame.mixer.Sound("./sounds/shoot.wav") player_shoot.set_volume(0.3) alien_shoot = pygame.mixer.Sound("./sounds/shoot2.wav") alien_shoot.set_volume(0.3) invader_death = pygame.mixer.Sound("./sounds/invaderkilled.wav") invader_death.set_volume(0.3) player_death = pygame.mixer.Sound("./sounds/playerkilled.wav") player_death.set_volume(0.3) player = pySprites.Player(screen) barriers = pygame.sprite.OrderedUpdates(barriers) bullets = pygame.sprite.OrderedUpdates() enemyBullets = pygame.sprite.OrderedUpdates() invaders = pygame.sprite.OrderedUpdates(invadersList) bullet = pySprites.Bullet(player.rect.centerx , player.rect.top + 9, -25, True) boss_health = pySprites.Boss_health() zone = pySprites.Zone(80) # test test_bullet = pygame.sprite.OrderedUpdates() life = pySprites.Life() score = pySprites.Score(points) allSprites = pygame.sprite.OrderedUpdates(zone, score, life, bullet, barriers, invaders, player) # alter / assign keepGoing = True clock = pygame.time.Clock() # loop while keepGoing: # time clock.tick(30) # events key = pygame.key.get_pressed() # checks for keys pressed for event in pygame.event.get(): if event.type == pygame.QUIT: return False, score.get_score(), life.get_life() if key[pygame.K_SPACE] and not bullet.get_control(): bullet.set_control(True) bullet.reset(player.rect.centerx , player.rect.centery - 5) player_shoot.play() if key[pygame.K_LEFT]: player.go_left() if not bullet.get_control(): bullet.go_left() if key[pygame.K_RIGHT]: player.go_right() if not bullet.get_control(): bullet.go_right() if key[pygame.K_ESCAPE]: return False, score.get_score(), life.get_life() # test if key[pygame.K_z]: test = pySprites.Bullet(player.rect.centerx, player.rect.centery, - 15 , True) test.set_control(True) test_bullet.add(test) allSprites.add(test_bullet) for op in invaders: if random.randrange(1500) == 9: bullet1 = pySprites.Bullet(op.rect.centerx, op.rect.centery, 15, False) bullet1.set_control(True) enemyBullets.add(bullet1) allSprites.add(enemyBullets) alien_shoot.play() # enemy bullet to player collition playerHit = pygame.sprite.spritecollide(player, enemyBullets, False) if playerHit: for x in playerHit: player_death.play() bullet.force_set((640, -10)) bullet.set_control(True) player.set_value(True) x.kill() life.set_life() bullet.set_control(False) if life.get_life() <= 0 and not player.get_value(): return True ,score.get_score(), life.get_life() # player bullet to invader collition invaderHit = pygame.sprite.spritecollide(bullet, invaders, False) if invaderHit: for x in invaderHit: invader_death.play() bullet.reset(player.rect.centerx , player.rect.centery - 5) bullet.set_control(False) point = x.get_point() score.set_score(point) x.kill() #test for a in test_bullet: for b in invaders: if a.rect.colliderect(b.rect): a.kill() b.kill() # barrier to invader collition for barrier in barriers: for invader in invaders: if barrier.rect.colliderect(invader.rect): barrier.kill() # enemy bullet to barrier collition for enemybullet in enemyBullets: for barrier in barriers: if enemybullet.rect.colliderect(barrier.rect): enemybullet.kill() barrier.kill() # invader to player collition for invade in invaders: if player.rect.colliderect(invade.rect): life.instance_lose() return True, score.get_score(), life.get_life() # player bullet to barrier collition for barrier in barriers: if bullet.rect.colliderect(barrier.rect): barrier.kill() bullet.reset(player.rect.centerx , player.rect.centery - 5) bullet.set_control(False) if bullet.rect.colliderect(zone.rect): bullet.set_control(False) bullet.reset(player.rect.centerx, player.rect.centery -5) # makes the second wave of invaders if len(invaders) == 0 and not boss_active and not level_2 and not level_3: invadersList = [] y = 290 for row in range(6): for column in range(13): image = image_num2[row] invadersList.append(pySprites.Invader(((column + 1)*37), y, screen.get_width()-(((11) - column)*37) , (column*37), (row+1)*10 , 6,8, image)) y -= 30 invaders.add(invadersList) allSprites.add(invaders) level_2 = True # makes the thrid wave of invadeders if len(invaders) == 0 and not boss_active and level_2 and not level_3: invadersList = [] y = 300 for row in range(7): for column in range(15): image = image_num3[row] invadersList.append(pySprites.Invader(((column + 1)*37), y, screen.get_width()-(((13) - column)*37) , (column*37), (row+1)*10 , 7,9, image)) y -= 30 invaders.add(invadersList) allSprites.add(invaders) level_3 = True # makes the boss if len(invaders) == 0 and not boss_active and level_2 and level_3: boss = pySprites.Invader(screen.get_width() /2, 180, screen.get_width(), 0, 500, 8,13, 10) allSprites.add(boss, boss_health) boss_active = True if boss_active and len(invaders) == 0: # makes the boss shoot if random.randrange(30) == 9: bullet1 = pySprites.Bullet(boss.rect.centerx, boss.rect.centery, 15, False) bullet1.set_control(True) bullet2 = pySprites.Bullet(boss.rect.left, boss.rect.centery, 15, False) bullet2.set_control(True) bullet3 = pySprites.Bullet(boss.rect.right, boss.rect.centery, 15, False) bullet3.set_control(True) enemyBullets.add(bullet1, bullet2, bullet3) allSprites.add(enemyBullets) # boss collition if boss.rect.colliderect(bullet.rect): bullet.reset(player.rect.centerx, player.rect.centery -5) bullet.set_control(False) boss_health.resize() boss_health.set_health() # checks boss health if boss_health.get_health() < 0: invader_death.play() points = boss.get_point() score.set_score(points) boss.kill() boss_active = False if len(invaders) == 0 and not boss_active and level_2 and level_3: return True, score.get_score(), life.get_life() # refresh allSprites.clear(screen, background) allSprites.update() allSprites.draw(screen) pygame.display.flip()
def game(): '''This function defines the main game for Space Invaders, it takes no parameters, and returns nothing, which causes the main function to exit meaning the game has ended. ''' # DISPLAY screen = pygame.display.set_mode((640, 480)) pygame.display.set_caption("Space Invaders by AYUSH") # ENTITIES background = pygame.Surface(screen.get_size()) #ALIENS CREATION y_coordinate = 200 alien_list = [] #A row of aliens are created and appended to two lists, one list that contains #groups of the aliens based on its row, and one that contains all the aliens together for alien_row in range (5): alien = 0 points = (alien_row+1)*10 for x_coordinate in range(0,550,50): alien = pySprites.Alien(screen,alien_row,(79+x_coordinate,y_coordinate), points) alien_list.append(alien) y_coordinate -= 30 #Sound Effects laser_sound = pygame.mixer.Sound("sounds/lasersound.wav") laser_sound.set_volume(0.8) alien_sound = pygame.mixer.Sound("sounds/aliensound.wav") alien_sound.set_volume(0.8) alien_pop = pygame.mixer.Sound("sounds/alienpop.wav") alien_pop.set_volume(0.7) bonussound = pygame.mixer.Sound("sounds/bonussound.wav") bonussound.set_volume(0.8) gameover_music = pygame.mixer.Sound("sounds/gameover.wav") gameover_music.set_volume(0.8) #SPRITES gameover = pygame.image.load("images/gameover.png") bonusmissile = pySprites.Missile(screen) wall = wallcreate(screen) bonusalien = pySprites.BonusAlien(screen) player = pySprites.Player(screen) scorekeeper = pySprites.ScoreKeeper(screen) liveskeeper = pySprites.LifeKeeper(screen) background_image = pySprites.Background(screen) endzoneleft = pySprites.EndZone(screen,0) endzoneright = pySprites.EndZone(screen,639) endzonebottom = pySprites.EndZone(screen,0,True) laser = pySprites.Laser(screen) endzoneSprites = pygame.sprite.Group(endzoneright,endzoneleft) playergroup = pygame.sprite.Group(player) alienSprites = pygame.sprite.Group(alien_list) alienlasers = pygame.sprite.Group() extra_lives = pygame.sprite.Group() speedboostGroup = pygame.sprite.Group() bottomlayer = [background_image,scorekeeper,liveskeeper,endzoneSprites,endzonebottom] toplayer = [player,alienSprites,bonusalien,laser,alienlasers,wall,extra_lives,speedboostGroup,bonusmissile] allSprites = pygame.sprite.OrderedUpdates(bottomlayer,toplayer) # ASSIGN keepGoing = True clock = pygame.time.Clock() bonusaliendead = False alienshoot_speed = 27 heartspawn = False damagedelay = 0 # Hide the mouse pointer pygame.mouse.set_visible(False) # LOOP while keepGoing: # TIME clock.tick(30) # EVENT HANDLING for event in pygame.event.get(): if event.type == pygame.QUIT: scorekeeper.set_highscore() keepGoing = False elif event.type == pygame.KEYDOWN: if event.key == pygame.K_SPACE and laser.rect.bottom < 0: laser_sound.play() laser.reset((player.rect.centerx,player.rect.top)) #Movement based on user pressing or holding right or left keys keys = pygame.key.get_pressed() if keys[pygame.K_LEFT]: player.go_left() elif keys[pygame.K_RIGHT]: player.go_right() if (liveskeeper.life_status() <= 0) or (len(alienSprites) == 0): scorekeeper.set_highscore() keepGoing = False if (random.randrange(200) == 0) and (bonusalien.rect.left > 800) and (not bonusaliendead): bonusalien.reset() #If the player laser collides with the bonus alien then the bonus alien's #death animation is played and is killed if laser.rect.colliderect(bonusalien) and (not bonusaliendead): scorekeeper.add_score(40) bonusalien.death() laser.remove() bonusaliendead = True #For each wall pixel a random number is generated, if the number is 0, #and the alien is in +- 10 pixels of range of the wall pixel then a missile is dropped for wallpixel in wall: bonus_missile = random.randrange(400) if bonus_missile == 0 and bonusalien.rect.centerx in range(wallpixel.rect.centerx-10,wallpixel.rect.centerx+10): bonusmissile.reset((bonusalien.rect.centerx,bonusalien.rect.bottom)) bonussound.play() #if the bonus alien's missile collides with a wall chunks of it are removed if pygame.sprite.spritecollide(bonusmissile, wall, True): damagedelay += 1 #By delaying the time the laser is removed it allows it to progress further #into the walls if damagedelay == 6: bonusmissile.remove() damagedelay = 0 for aliens in alienSprites: shoot = random.randrange(alienshoot_speed*16) shoot_random = random.randrange(alienshoot_speed*700) #If randrange is equal to 1 and the aliens are in range of the players x coordinate they shoot if shoot == 1 and aliens.rect.centerx in range (player.rect.centerx-20,player.rect.centerx+20): alien_laser = pySprites.AlienLaser(screen,(aliens.rect.centerx,aliens.rect.bottom)) alienlasers.add(alien_laser) alien_sound.play() allSprites = pygame.sprite.OrderedUpdates(bottomlayer,toplayer) #If randrange is equal to 1 the alien shoots this is to make it have #there are two separate scenarios to have it seem kind of random #and at the same time make it difficult for the player if shoot_random == 1: alien_laser = pySprites.AlienLaser(screen,(aliens.rect.centerx,aliens.rect.bottom)) alienlasers.add(alien_laser) alien_sound.play() allSprites = pygame.sprite.OrderedUpdates(bottomlayer,toplayer) #When an alien collides with the endzones they all change direction and move down 3 pixels alien_bottomwall = pygame.sprite.spritecollide(endzonebottom,alienSprites,False) for endzones in endzoneSprites: alien_wallcollision = pygame.sprite.spritecollide(endzones,alienSprites,False) if alien_wallcollision != []: for aliens in alienSprites: if alien_bottomwall == []: aliens.switch_direction() aliens.go_down() aliens.speed_up() alienshoot_speed = aliens.get_speed() else: aliens.switch_direction() #If alien lasers collide with the player, the player loses a live and the #laser is killed for alien_laser in alienlasers: player_hit = pygame.sprite.spritecollide(alien_laser, playergroup, False) if player_hit != []: alien_laser.kill() liveskeeper.remove_life() #To check for collision between a piece of the wall and the laser for alien_laser in alienlasers: wall_hit = pygame.sprite.spritecollide(alien_laser,wall,False) if wall_hit !=[]: alien_laser.kill() for wallpieces in wall_hit: wallpieces.kill() #If the player laser collides with an alien, the alien is killed, points are #added to the score and the laser is removed alien_collided = pygame.sprite.spritecollide(laser, alienSprites, False) for aliens in alien_collided : scorekeeper.add_score(aliens.get_points()) #This creates an extralife powerup based on a 5% chance when an alien is killed if random.randrange(15) == 0: heartspawn = True heart = pySprites.Heart(screen,aliens.rect.center) extra_lives.add(heart) allSprites = pygame.sprite.OrderedUpdates(bottomlayer,toplayer) #This creates a speedboost powerup by a random 5% chance, and ensures #that a extralife and speedboost don't come from the same one alien if (random.randrange(15) == 0) and (not heartspawn): speedboost = pySprites.SpeedBoost(screen,aliens.rect.center) speedboostGroup.add(speedboost) allSprites = pygame.sprite.OrderedUpdates(bottomlayer,toplayer) heartspawn = False alien_pop.play() aliens.death() laser.remove() #If the player collides with the heart they recieve an additional life if pygame.sprite.spritecollide(player, extra_lives, True): liveskeeper.add_life() #If the player collides with the speedboost powerup they recieve a temporary #movespeed increase and are able to shoot faster for about 5seconds if pygame.sprite.spritecollide(player, speedboostGroup, True): player.speed_up() laser.speed_up() #If the players lasers collide with the walls, the piece of the wall is #killed and the laser is removed not killed wall_collided = pygame.sprite.spritecollide(laser,wall,False) for wallpieces in wall_collided: laser.remove() wallpieces.kill() # Refresh Screen allSprites.clear(screen, background) allSprites.update() allSprites.draw(screen) pygame.display.flip() screen.blit(gameover, (0, 0)) gameover_music.play() pygame.display.flip() return
def main(): '''This function defines the main game''' # DISPLAY pygame.display.set_caption("Super High School Level Dodger! v0.1") screen = pygame.display.set_mode((640, 480)) # ENTITIES # Instantiate music and sound effects # Background music pygame.mixer.music.load('sound/background.mp3') pygame.mixer.music.set_volume(0.3) # Sound effect when a bomb explodes explosionSound = pygame.mixer.Sound("sound/explosion.wav") explosionSound.set_volume(0.1) # Sound effect when the player gets hit by an object hitSound = pygame.mixer.Sound("sound/hit.wav") hitSound.set_volume(0.5) # Sound effect when the player gets hit by a stain stainHitSound = pygame.mixer.Sound("sound/stainHit.wav") stainHitSound.set_volume(0.8) # Sound effect when the player gets a life-up lifeUpSound = pygame.mixer.Sound("sound/lifeUp.wav") lifeUpSound.set_volume(0.5) # Sound effect when the game starts startUpSound = pygame.mixer.Sound("sound/startUp.wav") startUpSound.set_volume(0.5) # Sound effect when the game ends gameOverSound = pygame.mixer.Sound("sound/gameOver.wav") gameOverSound.set_volume(0.5) # Instantiate the font used for the game font = pygame.font.Font("goodbyeDespair.ttf", 30) # Instantiates the background background = pygame.image.load('images/background.png') background = background.convert() screen.blit(background, (0, 0)) # Instantiate the ground ground = pySprites.Ground(screen) # Instantiate the player player = pySprites.Player(screen, ground.returnTopGround()) # Instantiate the lakitu lakitu = pySprites.Lakitu(screen) # Instantiate a power up powerUp = pySprites.PowerUp(screen) powerUp.safeSpace() # Instantiate the live counter liveCounter = pySprites.LiveCounter() # Instantiate the score keeper scoreKeeper = pySprites.ScoreKeeper(screen) # Creates list to temporarily store meteors for a row tempMeteorRow = [] # Two rows of meteors for meteorRow in range(2): # Eight meteors per row for meteorCol in range(8): tempMeteorRow.append(pySprites.Meteor(meteorRow, meteorCol)) # Seperates meteors into groups based on row number if meteorRow == 0: firstMeteorGroup = pygame.sprite.Group(tempMeteorRow) elif meteorRow == 1: secondMeteorGroup = pygame.sprite.Group(tempMeteorRow) # Empty the tempMeteorRow list del tempMeteorRow[:] # Instantiate a sprite group to hold all the meteors meteorGroup = pygame.sprite.Group(firstMeteorGroup) # Instantiate a sprite group to hold all the stains stainGroup = pygame.sprite.Group() # Instantiate a sprite group to hold all the puddles puddleGroup = pygame.sprite.Group() # Instantiate a sprite group to hold all the bombs bombGroup = pygame.sprite.Group() # Instantiate a sprite group to hold all the explosions explosionGroup = pygame.sprite.Group() # Instantiate a sprite group to hold the power up powerUpGroup = pygame.sprite.Group(powerUp) # Instantiate a sprite group holding all the sprites allSprites = pygame.sprite.OrderedUpdates(player, ground, lakitu, stainGroup, puddleGroup, bombGroup, powerUpGroup, explosionGroup, meteorGroup, liveCounter, scoreKeeper) # ASSIGN clock = pygame.time.Clock() keepGoing = True # This variable keeps track if the player is moving to the left player_left = False # This variable keeps track if the player is moving to the right player_right = False # This variable keeps track if a meteor still needs to be created minimumMeteor = random.randrange(0,2) # This variable keeps track if there still needs to be an empty space between meteors minimumHole = True # This variable keeps track if a stain is currently slowing down the player stainSlowed = False # This variable will be used later for keeping track of the time since last collision collisonTime = 0 # This variable will be used later for keeping track how long since the lakitu has thrown an oil stain thrownTime = 0 # This variable will keep track how long it would take for the lakitu to throw an oil stain randomly throwDelay = random.randrange(1000,6000,1000) # This variable will keep track how long the stain effect should be stainCollisionTime = 0 # Hide the mouse pointer pygame.mouse.set_visible(False) # LOOP while keepGoing: # TIME clock.tick(30) # EVENT HANDLING: Player uses arrow keys, left control button and left shift button for event in pygame.event.get(): if event.type == pygame.QUIT: keepGoing = False gameOver = font.render("Game Over!", 1, (255, 255, 255)) screen.blit(gameOver, (242,230)) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_LEFT: player_left = True if event.key == pygame.K_RIGHT: player_right = True if event.key == pygame.K_LCTRL: player.useMop() if event.key == pygame.K_LSHIFT: player.useAxe() if event.key == pygame.K_SPACE and player.getStand(): player.jump() elif event.type == pygame.KEYUP: if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT: player_left = False player_right = False # Go left if variable is set to True if player_left: player.go_left() # Go right if variable is set to True if player_right: player.go_right() # Jump if variable is set to True if player.getJump(): player.jumpFall(5) # Make the lakitu start the throw animation if time has passed the throwDelay variable if pygame.time.get_ticks() - thrownTime > throwDelay: lakitu.setThrown(True) throwDelay = random.randrange(1000,6000,1000) # Reset the thrownTime clock thrownTime = pygame.time.get_ticks() # Make the lakitu throw a stain at its 16th sprite image if lakitu.getAnimationFrame() == 16: stains = pySprites.Stain(lakitu.getCoords()) stainGroup.add(stains) allSprites = pygame.sprite.OrderedUpdates(player, ground, lakitu, stainGroup, puddleGroup, bombGroup, powerUpGroup, explosionGroup, meteorGroup, liveCounter, scoreKeeper) screen.blit(background,(0,0)) # Check if any stains have collided with the ground stainGround = pygame.sprite.spritecollide(ground, stainGroup, False) # Create a puddle for each stain that hits the ground and kill the stain for eachStain in stainGround: puddle = pySprites.Puddle(screen, eachStain.getCoords()) eachStain.kill() puddleGroup.add(puddle) allSprites = pygame.sprite.OrderedUpdates(player, ground, lakitu, stainGroup, puddleGroup, bombGroup, powerUpGroup, explosionGroup, meteorGroup, liveCounter, scoreKeeper) screen.blit(background,(0,0)) # Check if any stains have collided with the player stainHit = pygame.sprite.spritecollide(player, stainGroup, False) # Slow down the player temporarily if the player hits the stain for eachStain in stainHit: player.slow(0.35) stainHitSound.play() eachStain.kill() stainSlowed = True # Reset the stainCollisionTime clock stainCollisionTime = pygame.time.get_ticks() # Check if a power up has collided with the ground powerUpGround = pygame.sprite.spritecollide(ground, powerUpGroup, False) # Make each power up land for eachPowerUp in powerUpGround: eachPowerUp.land() # If the player collides with a power up, gain a life and reset the power up powerUpPlayer = pygame.sprite.spritecollide(player, powerUpGroup, False) for powerUp in powerUpPlayer: powerUp.safeSpace() lifeUpSound.play() scoreKeeper.addScore(100) liveCounter.gainLife() # Check if any meteors from the first row collided with the ground if pygame.sprite.spritecollide(ground, firstMeteorGroup, False): for row in firstMeteorGroup: # At least have one meteor present if minimumMeteor: row.setRespawn(True) minimumMeteor = False else: # At least have one empty space present if minimumHole: row.setRespawn(False) minimumHole = False # Reset the positions of the meteor row row.reset() # Set all variables back to true minimumMeteor = True minimumHole = True # Check if the second meteors from the second row collided with the ground hittedGround = pygame.sprite.spritecollide(ground, secondMeteorGroup, False) for meteor in hittedGround: # Reset the positions of the meteor row meteor.reset() # Check if player has collided with the a puddle mopHit = pygame.sprite.spritecollide(player, puddleGroup, False) if mopHit: # Slow the player half speed if not currently slowed down if not(stainSlowed): player.slow(0.5) for eachMopHit in mopHit: # If the player is currently using the mop, kill the puddle and break out of the loop if player.getMop(): scoreKeeper.addScore(25) eachMopHit.kill() break # Check if a bomb has collided with the ground bombGround = pygame.sprite.spritecollide(ground, bombGroup, False) # For each bomb that collided with the ground for bombs in bombGround: # Start the ticking bomb bombs.land(ground.returnTopGround()) # If the bomb is about to explode, create an explosion and reset bomb if bombs.getAnimationFrame() == 4: explosion = pySprites.Explosion(screen, bombs.getCoords(), bombs.getBombType()) bombs.safeSpace() explosionGroup.add(explosion) explosionSound.play() allSprites = pygame.sprite.OrderedUpdates(player, ground, lakitu, stainGroup, puddleGroup, bombGroup, powerUpGroup, explosionGroup, meteorGroup, liveCounter, scoreKeeper) screen.blit(background,(0,0)) # Check if player has collided with the a bomb bombHit = pygame.sprite.spritecollide(player, bombGroup, False) if bombHit: for eachBombHit in bombHit: # If the player is currently using the axe, kill the bomb and break out of the loop if player.getAxe(): eachBombHit.safeSpace() scoreKeeper.addScore(50) break for aBomb in bombGroup: if (random.randrange(200)) == 1 and aBomb.getSafeSpace() == True: aBomb.reset() for aPowerUp in powerUpGroup: if (random.randrange(1000)) == 1 and aPowerUp.getSafeSpace() == True: aPowerUp.reset() # Check if player collided with any explosions if pygame.sprite.spritecollide(player, explosionGroup, False) and not(player.getInvincible()): # Set player to be invincible and lose a life player.setInvincible(True) hitSound.play() liveCounter.loseLife(2) # Reset the collisionTime clock collisonTime = pygame.time.get_ticks() # Check if player collided with any meteor if pygame.sprite.spritecollide(player, meteorGroup, False) and not(player.getInvincible()): # Set player to be invincible and lose a life player.setInvincible(True) hitSound.play() liveCounter.loseLife(1) # Reset the collisionTime clock collisonTime = pygame.time.get_ticks() # Takes three seconds before you are no longer invisible if pygame.time.get_ticks() - collisonTime > 3000: player.setInvincible(False) # Takes three seconds before a stain effect wears off if pygame.time.get_ticks() - stainCollisionTime > 3000 and not(mopHit): player.slow(1) stainSlowed = False # Create a bomb every time the score is divisible by 2000, 5 bombs maximum if scoreKeeper.getScore() % 1500 == 0 and scoreKeeper.getScore() < 10000: bomb = pySprites.Bomb(screen, random.randrange(0,5)) bombGroup.add(bomb) allSprites = pygame.sprite.OrderedUpdates(player, ground, lakitu, stainGroup, puddleGroup, bombGroup, powerUpGroup, explosionGroup, meteorGroup, liveCounter, scoreKeeper) screen.blit(background,(0,0)) # Second meteor group is spawned when the score reaches 7500 if scoreKeeper.getScore() == 5000: meteorGroup.add(secondMeteorGroup) allSprites = pygame.sprite.OrderedUpdates(player, ground, lakitu, stainGroup, puddleGroup, bombGroup, powerUpGroup, explosionGroup, meteorGroup, liveCounter, scoreKeeper) screen.blit(background,(0,0)) # Show the start-up screen once if scoreKeeper.getScore() == 0: gameStart = font.render("Ready?", 1, (255, 255, 255)) screen.blit(gameStart, (265,230)) if scoreKeeper.getScore() == 1: startUpSound.play() pygame.time.delay(6000) pygame.mixer.music.play(-1) # Add the score by 1 each time the loop instantiates scoreKeeper.addScore(1) # Blit the Game-over screen if lives are zero if liveCounter.getLife() <= 0: keepGoing = False gameOver = font.render("Game Over!", 1, (255, 255, 255)) screen.blit(gameOver, (242,230)) # REFRESH SCREEN allSprites.clear(screen, background) allSprites.update() allSprites.draw(screen) pygame.display.flip() # Unhide the mouse pointer pygame.mouse.set_visible(True) # Play the GameOver music and go back to the start menu pygame.mixer.music.fadeout(0) gameOverSound.play() pygame.time.delay(7000) startMenu()
def main(): '''This function defines the 'mainline logic' for our pyPong game.''' # DISPLAY pygame.display.set_caption("pyPong! v1.0") # ENTITIES background = pygame.Surface(screen.get_size()) background = background.convert() background.fill((255, 255, 255)) screen.blit(background, (0, 0)) # Sprites for: ScoreKeeper label, End Zones, Ball, and Players score_keeper = pySprites.ScoreKeeper() ball = pySprites.Ball(screen) player1 = pySprites.Player(screen, 1) player1_endzone = pySprites.EndZone(screen, 0) player2 = pySprites.Player(screen, 2) player2_endzone = pySprites.EndZone(screen, 639) allSprites = pygame.sprite.Group(score_keeper, player1_endzone, \ player2_endzone, ball, player1, player2) # ASSIGN clock = pygame.time.Clock() keepGoing = True # Hide the mouse pointer pygame.mouse.set_visible(False) # LOOP while keepGoing: # TIME clock.tick(30) # EVENT HANDLING: Player 1 uses joystick, Player 2 uses arrow keys for event in pygame.event.get(): if event.type == pygame.QUIT: keepGoing = False elif event.type == pygame.JOYHATMOTION: player1.change_direction(event.value) elif event.type == pygame.KEYDOWN: if event.key == pygame.K_UP: player2.change_direction((0, 1)) if event.key == pygame.K_DOWN: player2.change_direction((0, -1)) # Check if player 1 scores (i.e., ball hits player 2 endzone) if ball.rect.colliderect(player2_endzone): score_keeper.player1_scored() ball.change_direction() # Check if player 2 scores (i.e., ball hits player 1 endzone) if ball.rect.colliderect(player1_endzone): score_keeper.player2_scored() ball.change_direction() # Check for game over (if a player gets 3 points) if score_keeper.winner(): keepGoing = False # Check if ball hits Player 1 or 2 # If so, change direction, and speed up the ball a little if ball.rect.colliderect(player1.rect) or\ ball.rect.colliderect(player2.rect): ball.change_direction() # REFRESH SCREEN allSprites.clear(screen, background) allSprites.update() allSprites.draw(screen) pygame.display.flip() # Unhide the mouse pointer pygame.mouse.set_visible(True) # Close the game window pygame.quit()