游戏截图:
个人最高纪录11级,九百万分(手指头给点烂了.jpg)
玩法介绍!!!!
鼠标点击play开始游戏
wasd键控制上下左右
空格发射子弹
q键退出游戏
注意:
1,本游戏数值增加很快,到了后面会出现发射子弹结果外星人穿过去的结果.jpg
2,开局只能发射五颗子弹,后面不缺
3,只有三条命,用完就结束,可以点play重玩
整体代码分为多个模块还有图片和音乐文件,所有文件已打包,解压后,image和music文件夹中是图片和音乐,.exe是游戏主体,双击开始游戏(emm)
参考文章如下:
1,打包软件:
2,pygame中加入图片:
3,pygame中加入音乐:
代码如下:
1,主体
import sys
import pygame
from settings import Settings
from time import sleep
from game_stats import GameStats
from my_ship import MY_ship
from bullets import Bullet
from alien import Alien
from button import Button
from score import Score
class Alien_game:
def __init__(self):
"""初始化"""
pygame.init()
self.settings = Settings()
"""屏幕界面"""
self.clock = pygame.time.Clock()
self.screen = pygame.display.set_mode(
(self.settings.screen_width, self.settings.screen_height))
self.ship = MY_ship(self)
pygame.display.set_caption('Player vs Alien')
"""组"""
self.aliens = pygame.sprite.Group()
self.bullets = pygame.sprite.Group()
"""添加外星人"""
self._creat_fleet()
self.stats = GameStats(self)
"""结束条件"""
self.game_over = False
"""图"""
self.play_button = Button(self,'play')
self.s_b = Score(self)
def run_game(self):
pygame.font.init()
background = pygame.image.load('images/1-1.png').convert()
pygame.init()
pygame.mixer.init()
pygame.mixer.music.load('music/BJ_1.ogg')
pygame.mixer.music.play(-1, start=0)
while pygame.mixer.music.get_busy():
# pygame.time.Clock().tick(10)
self._check_events()
if self.game_over:
self._alien_update()
self._update_bullets()
self.ship.update()
self._update_screen(background)
self.clock.tick(60)
def _update_screen(self, background):
self.screen.fill(self.settings.sc_color)
self.screen.blit(background, (0,0))
self.ship.blitem() # 绘制飞船
for bullet in self.bullets.sprites():
bullet.draw_bullet()
self.s_b.show_score()
self.aliens.draw(self.screen)
if not self.game_over:
self.play_button.draw_button()
pygame.display.flip()
def check_alien(self):
for alien in self.aliens.sprites():
#print(1)
if alien.rect.left <= 0:
print(1)
self._ship_hit()
break
# 玩家碰撞后结果
def _ship_hit(self):
if self.stats.ships_left >1 :
self.stats.ships_left -= 1
# print(self.stats.ships_left)
self.bullets.empty() # 重置子弹和alien
self.aliens.empty()
self._creat_fleet() # 新建外星人和重置玩家位置
self.ship.center_ship()
sleep(0.5) # 暂停0.5秒
else:
self.game_over = False
pygame.mouse.set_visible(True)
# 检测alien碰撞墙壁
def _check_fleet_edges(self):
for alien in self.aliens.sprites():
if alien.check_edges():
self._change_fleet_direction()
break
# 重置alien位移方向
def _change_fleet_direction(self):
for alien in self.aliens.sprites():
alien.rect.x -= self.settings.alien_x_speed
self.settings.fleet_direction *= -1
# 检测外星人碰撞
def _alien_update(self):
self._check_fleet_edges()
self.aliens.update()
if pygame.sprite.spritecollideany(self.ship, self.aliens):
self._ship_hit()
# print('重铸1096之光,人人有责!')
self.check_alien()
# 生成alien并控制外星人位移
def _creat_fleet(self):
alien = Alien(self)
alien_width, alien_height = alien.rect.size
current_y, current_x = 2 * alien_height, 25 * alien_width
while current_x < (self.settings.screen_width - alien_width):
while current_y < (self.settings.screen_height - 2 * alien_height):
self._current_y(current_y, current_x)
current_y += 2 * alien_width
current_y = 2 * alien_height
current_x += 2 * alien_width
# 控制alien
def _current_y(self, current_y, current_x):
new_alien = Alien(self)
new_alien.y = current_y
new_alien.rect.y = current_y
new_alien.rect.x = current_x
self.aliens.add(new_alien)
# 生成子弹
def _update_bullets(self):
self.bullets.update()
for bullet in self.bullets.copy():
if bullet.rect.left >= self.settings.screen_width:
self.bullets.remove(bullet)
self._check_bullet_()
# 检测子弹的碰撞
def _check_bullet_(self):
collisions = pygame.sprite.groupcollide(
self.bullets, self.aliens, True, True
)
if collisions:
for aliens in collisions.values():
self.stats.score += self.settings.alien_points *len(aliens)
self.s_b.prep_score()
if not self.aliens:
self.bullets.empty()
self._creat_fleet()
self.settings.speed_up()
self.stats.level += 1
self.s_b.prep_level()
# 键盘控制
def _check_events(self):
'''游戏主体循环'''
for event in pygame.event.get():
if event.type == pygame.QUIT:
sys.exit()
elif event.type == pygame.MOUSEBUTTONDOWN:
mous_pop = pygame.mouse.get_pos()
self._check_button(mous_pop)
elif event.type == pygame.KEYDOWN:
self._KEY_TR(event)
elif event.type == pygame.KEYUP:
self._KEY_FA(event)
def _check_button(self,mous_pos):
button_clicked = self.play_button.rect.collidepoint(mous_pos)
if button_clicked and not self.game_over:
self.game_over = True
self.stats.rest_stats()
self.s_b.prep_score()
self.s_b.prep_level()
self.bullets.empty()
self.aliens.empty()
self.ship.center_ship()
self._creat_fleet()
self.settings.speed_reduction()
pygame.mouse.set_visible(False)
# 刷新屏幕
# 开火
def _fire_bullet(self):
if len(self.bullets) < self.settings.bullet_allowed:
new_bullets = Bullet(self)
self.bullets.add(new_bullets)
def _KEY_TR(self, event):
if event.key == pygame.K_d:
self.ship.moving_right = True
if event.key == pygame.K_a:
self.ship.moving_left = True
if event.key == pygame.K_w:
self.ship.moving_top = True
if event.key == pygame.K_s:
self.ship.moving_bottom = True
elif event.key == pygame.K_q:
sys.exit()
elif event.key == pygame.K_SPACE:
self._fire_bullet()
def _KEY_FA(self, event):
if event.key == pygame.K_d:
self.ship.moving_right = False
if event.key == pygame.K_a:
self.ship.moving_left = False
if event.key == pygame.K_w:
self.ship.moving_top = False
if event.key == pygame.K_s:
self.ship.moving_bottom = False
if __name__ == '__main__':
ai = Alien_game()
ai.run_game()
2,外星人的属性
import pygame
from pygame.sprite import Sprite
class Alien(Sprite):
def __init__(self, ai_game):
super().__init__()
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
"""图片"""
self.image = pygame.image.load('images/enemy.png')
self.rect = self.image.get_rect()
"""位置"""
self.rect.topright = self.screen_rect.topright
"""记录水平位置"""
self.x = self.rect.x
self.y = self.rect.y
self.settings = ai_game.settings
def update(self):
self.y += self.settings.alien_y_speed * self.settings.fleet_direction
self.rect.y = self.y
def check_edges(self):
screen_rect = self.screen.get_rect()
return (self.rect.top <= 0) or (self.rect.bottom >= screen_rect.bottom)
3, 子弹设置
import pygame
class Bullet(pygame.sprite.Sprite):
def __init__(self, ai_game):
super().__init__() # 调用父类
self.screen = ai_game.screen
self.settings = ai_game.settings
self.color = self.settings.bullet_color
self.rect = pygame.Rect(
0, 0, self.settings.bullet_width, self.settings.bullet_height)
self.rect.midleft = ai_game.ship.rect.midright
self.x = self.rect.x
def update(self):
self.x += self.settings.bullet_speed
self.rect.x = self.x
def draw_bullet(self):
pygame.draw.rect(self.screen, self.color, self.rect)
4, 按钮设置
import pygame.font
class Button:
def __init__(self,ai_game,msg):
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
self.width,self.heigt = 200,50
self.button_color = (0,135,0)
self.text_color = (255,255,255)
self.font = pygame.font.SysFont(None,48)
self.rect = pygame.Rect(0,0,self.width,self.heigt)
self.rect.center = self.screen_rect.center
self._prep_msg(msg)
def _prep_msg(self,msg):
self.msg_image = self.font.render(msg,True,
self.text_color,self.button_color)
self.msg_image_rect = self.msg_image.get_rect()
self.msg_image_rect.center = self.rect.center
def draw_button(self):
self.screen.fill(self.button_color,self.rect)
self.screen.blit(self.msg_image,self.msg_image_rect)
5, 分值设置
class GameStats:
def __init__(self,ai_game):
self.settings = ai_game.settings
self.rest_stats()
def rest_stats(self):
self.ships_left = self.settings.ship_limit
self.score = 0
self.level = 1
6,玩家飞船的设置
import pygame
from settings import Settings
class MY_ship:
def __init__(self, ai_game):
"""初始化"""
self.settings = Settings()
"""获取屏幕大小信息"""
self.screen = ai_game.screen
self.screen_rect = ai_game.screen.get_rect()
"""获取图片信息"""
self.image = pygame.image.load('images/player.png')
self.rect = self.image.get_rect()
"""控制飞船位置"""
self.rect.midleft = self.screen_rect.midleft
self.moving_right = False
self.moving_left = False
self.moving_top = False
self.moving_bottom = False
def update(self):
if self.moving_right and self.rect.right < self.screen_rect.right:
self.rect.x += self.settings.sp_x
if self.moving_left and self.rect.left > 0:
self.rect.x -= self.settings.sp_x
if self.moving_top and self.rect.top > 0:
self.rect.y -= self.settings.sp_y
if self.moving_bottom and self.rect.bottom < self.screen_rect.bottom:
self.rect.y += self.settings.sp_y
def blitem(self):
self.screen.blit(self.image, self.rect)
def center_ship(self):
self.rect.midleft = self.screen_rect.midleft
self.y = self.rect.y
self.x = self.rect.x
7, 把分数渲染成图片
import pygame.font
class Score:
def __init__(self,ai_game):
self.screen = ai_game.screen
self.screen_rect = self.screen.get_rect()
self.settings = ai_game.settings
self.stats = ai_game.stats
self.text_color = (30,30,30)
self.font = pygame.font.SysFont(None,48)
self.prep_score()
self.prep_level()
def prep_level(self):
level_str = str(self.stats.level)
self.level_image = self.font.render(level_str,True,self.text_color,self.settings.sc_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_score(self):
rounded_score = round(self.stats.score,-1)
score_str = f'{rounded_score:,}'
self.score_image = self.font.render(score_str,True,self.text_color,self.settings.sc_color)
self.score_rect = self.score_image.get_rect()
self.score_rect.left = self.screen_rect.left + 20
self.score_rect.bottom = 50
def show_score(self):
self.screen.blit(self.score_image,self.score_rect)
self.screen.blit(self.level_image,self.level_rect)
8,游戏数值设置
class Settings:
def __init__(self):
"""屏幕颜色和高宽"""
self.sc_color = (230, 230, 230)
self.screen_width = 1200
self.screen_height = 800
"""飞船速度"""
self.sp_x = 10
self.sp_y = 10
self.ship_limit = 3
"""子弹设置"""
self.bullet_speed = 10
self.bullet_width = 3
self.bullet_height = 25
self.bullet_color = (215, 45, 205)
self.bullet_allowed = 5
"""alien速度"""
self.alien_y_speed = 2
self.alien_x_speed = 2
self.fleet_direction = 1
"""速度提升"""
self.speed_up_number = 1.5
self.alien_points_upspeed = 2
"""还原"""
self.speed_reduction()
def speed_reduction(self):
self.alien_y_speed = 2
self.alien_x_speed = 2
self.fleet_direction = 1
self.sp_x = 5
self.sp_y = 5
self.ship_limit = 3
self.bullet_speed = 10
self.bullet_width = 3
self.bullet_height = 25
self.alien_points = 50
def speed_up(self):
self.alien_y_speed *= self.speed_up_number
self.alien_x_speed *= self.speed_up_number
self.sp_x *= self.speed_up_number
self.sp_y *= self.speed_up_number
self.bullet_speed *= self.speed_up_number
self.bullet_width *=self.speed_up_number
self.bullet_height *=self.speed_up_number
self.alien_points *=self.alien_points_upspeed
每天都是杂鱼❤ 呢