外星人入侵,使用python开发的2D游戏

开学自学的python,通过敲代码练习的项目《外星人入侵》。

游戏介绍:游戏在玩家每消灭一群向下移动的外星人后,都将玩家的等级提高一个等级;而等级越高,游戏的节奏越快,难度越大

我使用的是python 3.7,在Windows系统中首先要检查是否安装了pip,开发2D游戏前,还得安装Pygame。

下面游戏的模板,包含各种类。

alien_invasion.py , game_functions.py , ship.py , alien.py , bullet.py , game_stats.py , settings.py , button.py , scoreboard.py 。

代码:

alien_invasion.py:

# -*-coding:utf-8-*-

import pygame#pygame库

from settings import Settings

from ship import Ship

import game_functions as gf

from pygame.sprite import Group

from alien import Alien

from game_stats import GameStats

from scoreboard import Scoreboard

from button import Button

def run_game():

pygame.init()

ai_settings=Settings()

(ai_settings.screen_width,ai_settings.screen_height))

play_button=Button(ai_settings,screen,"play")

#创建一个用于存储游戏统计信息的事例

stats=GameStats(ai_settings)

sb=Scoreboard(ai_settings,screen,stats)

ship=Ship(ai_settings,screen)

bullets=Group()

alien=Alien(ai_settings,screen)

aliens=Group()

gf.create_fleet(ai_settings,screen,ship,aliens)

while True:

gf.check_events(ai_settings,screen,stats,sb,play_button,

ship,aliens,bullets)

if stats.game_active:

ship.update()

gf.update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets)

gf.update_aliens(ai_settings,stats,sb,screen,ship,aliens,bullets)

gf.update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,

play_button)

run_game()

game_functions.py:

import sys

import pygame

from bullet import Bullet

from alien import Alien

from time import sleep

def check_keydown_events(event,ai_settings,screen,ship,bullets):

if event.key==pygame.K_RIGHT:

ship.moving_right=True

elif event.key==pygame.K_LEFT:

ship.moving_left=True

elif event.key==pygame.K_SPACE:

fire_bullet(ai_settings,screen,ship,bullets)

elif event.key==pygame.K_q:

sys.exit()

def fire_bullet(ai_settings,screen,ship,bullets):

if len(bullets)

new_bullet = Bullet(ai_settings,screen,ship)

bullets.add(new_bullet)

def check_keyup_events(event,ship):

if event.key==pygame.K_RIGHT:

ship.moving_right=False

elif event.key==pygame.K_LEFT:

ship.moving_left=False

def check_events(ai_settings,screen,stats,sb,play_button,ship,aliens,bullets):

if event.type==pygame.QUIT:

sys.exit()

elif event.type==pygame.KEYDOWN:

check_keydown_events(event,ai_settings,screen,ship,bullets)

elif event.type==pygame.KEYUP:

check_keyup_events(event,ship)

elif event.type==pygame.MOUSEBUTTONDOWN:

check_play_button(ai_settings,screen,ship,aliens,stats,sb,bullets,

play_button,mouse_x,mouse_y)

def check_play_button(ai_settings,screen,ship,aliens,stats,sb,bullets,

play_button,mouse_x,mouse_y):

if button_clicked and not stats.game_active:

ai_settings.initialize_dynamic_settings()

stats.reset_stats()

stats.game_active=True

sb.prep_score()

sb.prep_high_score()

sb.prep_level()

sb.prep_ships()

aliens.empty()

bullets.empty()

create_fleet(ai_settings,screen,ship,aliens)

ship.center_ship()

def update_screen(ai_settings,screen,stats,sb,ship,aliens,bullets,play_button):

screen.fill(ai_settings.bg_color)

for bullet in bullets.sprites():

bullet.draw_bullet()

ship.blitme()

aliens.draw(screen)

sb.show_score()

if not stats.game_active:

play_button.draw_button()

def update_bullets(ai_settings,screen,stats,sb,ship,aliens,bullets):

bullets.update()

for bullet in bullets.copy():

bullets.remove(bullet)

#print(len(bullets))

check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets)

def check_bullet_alien_collisions(ai_settings,screen,stats,sb,ship,aliens,bullets):

if collisions:

for aliens in collisions.values():

stats.score+=ai_settings.alien_points*len(aliens)

sb.prep_score()

check_high_score(stats,sb)

if len(aliens)==0:

bullets.empty()

ai_settings.increase_speed()

stats.level +=1

sb.prep_level()

create_fleet(ai_settings,screen,ship,aliens)

def get_number_aliens_x(ai_settings,alien_width):

available_space_x=ai_settings.screen_width-2*alien_width

number_aliens_x=int(available_space_x/(2*alien_width))

return number_aliens_x

def get_number_rows(ai_settings,ship_height,alien_height):

available_space_y=(ai_settings.screen_height-(3*alien_height)-ship_height)

number_rows=int(available_space_y/(2*alien_height))

return number_rows

def create_alien(ai_settings,screen,aliens,alien_number,row_number):

alien=Alien(ai_settings,screen)

alien.x=alien_width+2*alien_width*alien_number

alien.rect.x=alien.x

aliens.add(alien)

def create_fleet(ai_settings,screen,ship,aliens):

alien=Alien(ai_settings,screen)

#available_space_x=ai_settings.screen_width-2*alien_width

#number_aliens_x=int(available_space_x/(2*alien_width))

for row_number in range(number_rows):

for alien_number in range(number_aliens_x):

create_alien(ai_settings,screen,aliens,alien_number,row_number)

#alien=Alien(ai_settings,screen)

#alien.x=alien_width+2*alien_width*alien_number

#alien.rect.x=alien.x

#aliens.add(alien)

def check_fleet_edges(ai_settings,aliens):

for alien in aliens.sprites():

if alien.check_edges():

change_fleet_direction(ai_settings,aliens)

break

def change_fleet_direction(ai_settings,aliens):

for alien in aliens.sprites():

alien.rect.y+=ai_settings.fleet_drop_speed

ai_settings.fleet_direction*=-1

def ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets):

if stats.ships_left>0:

stats.ships_left -=1

sb.prep_ships()

aliens.empty()

bullets.empty()

create_fleet(ai_settings,screen,ship,aliens)

ship.center_ship()

sleep(0.5)

else:

stats.game_active=False

def check_aliens_bottom(ai_settings,stats,sb,screen,ship,aliens,bullets):

screen_rect=screen.get_rect()

for alien in aliens.sprites():

ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets)

break

def update_aliens(ai_settings,stats,sb,screen,ship,aliens,bullets):

check_fleet_edges(ai_settings,aliens)

aliens.update()

ship_hit(ai_settings,stats,sb,screen,ship,aliens,bullets)

check_aliens_bottom(ai_settings,stats,sb,screen,ship,aliens,bullets)

def check_high_score(stats,sb):

if stats.score>stats.high_score:

stats.high_score= stats.score

sb.prep_high_score()

ship.py:

import pygame

from pygame.sprite import Sprite

class Ship(Sprite):

def __init__(self,ai_settings,screen):

super(Ship,self).__init__()

self.screen=screen

self.ai_settings=ai_settings

self.screen_rect=screen.get_rect()

self.moving_right=False

self.moving_left=False

def update(self):

self.center += self.ai_settings.ship_speed_factor

self.center -= self.ai_settings.ship_speed_factor

def blitme(self):

def center_ship(self):

self.center=self.screen_rect.centerx

alien.py:

import pygame

from pygame.sprite import Sprite

class Alien(Sprite):

def __init__(self,ai_settings,screen):

super(Alien,self).__init__()

self.screen=screen

self.ai_settings=ai_settings

self.x=float(self.rect.x)

def blitme(self):

def check_edges(self):

return True

return True

def update(self):

self.x+=(self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)

self.rect.x=self.x

bullet.py:

import pygame

from pygame.sprite import Sprite

class Bullet(Sprite):

def __init__(self,ai_settings,screen,ship):

super().__init__()

self.screen=screen

self.rect=pygame.Rect(0,0,ai_settings.bullet_width,

ai_settings.bullet_height)

self.y=float(self.rect.y)

self.color=ai_settings.bullet_color

self.speed_factor=ai_settings.bullet_speed_factor

def update(self):

self.y-=self.speed_factor

self.rect.y=self.y

def draw_bullet(self):

game_stats.py:

class GameStats():

def __init__(self,ai_settings):

self.ai_settings=ai_settings

self.reset_stats()

self.game_active=False

self.high_score = 0

def reset_stats(self):

self.ships_left=self.ai_settings.ship_limit

self.score = 0

self.level=1

settings.py:

class Settings():

def __init__(self):

self.screen_width=1200

self.screen_height=800

self.bg_color=(230,230,230)

self.ship_speed_factor=9

self.ship_limit=2

self.bullet_speed_factor=6

self.bullet_width=3000

self.bullet_height=20

self.bullet_color=150,150,150

self.bullets_allowed=1200

self.alien_speed_factor=2

self.fleet_drop_speed=10

self.fleet_direction=1

self.speedup_scale = 1.1

self.score_scale=1.5

self.initialize_dynamic_settings()

def initialize_dynamic_settings(self):

self.ship_speed_factor = 1.5

self.bullet_speed_factor = 3

self.alien_speed_factor = 1

self.fleet_direction=1

self.alien_points=50

def increase_speed(self):

self.ship_speed_factor *=self.speedup_scale

self.bullet_speed_factor *=self.speedup_scale

self.alien_speed_factor *=self.speedup_scale

self.alien_points = int(self.alien_points*self.score_scale)

#print(self.alien_points)

button.py:

import pygame.font

class Button():

def __init__(self,ai_settings,screen,msg):

self.screen=screen

self.screen_rect=screen.get_rect()

self.width,self.height=200,50

self.button_color=(0,255,0)

self.text_color=(255,255,255)

self.font=pygame.font.SysFont(None,48)

self.rect=pygame.Rect(0,0,self.width,self.height)

self.prep_msg(msg)

def prep_msg(self,msg):

self.button_color)

self.msg_image_rect=self.msg_image.get_rect()

def draw_button(self):

scoreboard.py:

import pygame.font

from pygame.sprite import Group

from ship import Ship

class Scoreboard():

def __init__(self,ai_settings,screen,stats):

self.screen=screen

self.screen_rect=screen.get_rect()

self.ai_settings=ai_settings

self.stats=stats

self.text_color=(255,30,30)

self.font=pygame.font.SysFont(None,55)

self.prep_score()

self.prep_high_score()

self.prep_level()

self.prep_ships()

def prep_score(self):

score_str = "{:,}".format(rounded_score)

self.ai_settings.bg_color)

self.score_rect=self.score_image.get_rect()

self.score_rect.right=self.screen_rect.right-20

self.score_rect.top=20

def prep_high_score(self):

high_score_str="{:,}".format(high_score)

self.text_color,self.ai_settings.bg_color)

self.high_score_rect=self.high_score_image.get_rect()

self.high_score_rect.centerx=self.screen_rect.centerx

self.high_score_rect.top=self.screen_rect.top

def prep_level(self):

self.text_color,self.ai_settings.bg_color)

self.level_rect=self.level_image.get_rect()

self.level_rect.right=self.score_rect.right

self.level_rect.top=self.score_rect.bottom+10

def prep_ships(self):

self.ships=Group()

ship=Ship(self.ai_settings,self.screen)

ship.rect.y=10

def show_score(self):

ps:

1、游戏中使用的飞船和外星人图形文件,使用的是位图(.bmp),首先你得把图形文件新建一个images文件和类放在一起。

2、最后执行alien_invasion.py,游戏界面就会出现。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180623G0TVOR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券