🌈write in front🌈
🧸大家好,我是Aileen🧸.希望你看完之后,能对你有所帮助,不足请指正!共同学习交流.
🆔本文由Aileen_0v0🧸 原创 CSDN首发🐒 如需转载还请通知⚠️
📝个人主页:Aileen_0v0🧸—CSDN博客
🎁欢迎各位→点赞👍 + 收藏⭐️ + 留言📝
📣系列专栏:Aileen_0v0🧸的PYTHON学习系列专栏——CSDN博客
🗼我的格言:"没有罗马,那就自己创造罗马~"
目录
首先,在python上 安装pygame
然后,创建文件夹 要注意分级别
插入的图片
主函数 Aileen_invasion的文件
创建外星人aileen的文件
子弹bullet的文件
游戏数据game_stats的文件
游戏分数scoreboard的文件
游戏设置settings的文件
游戏飞船ship的文件
编辑 全屏模式下的游戏
编辑
小窗口下的游戏
首先,在python上 安装pygame
资源--->https://download.csdn.net/download/Aileenvov/88301424?spm=1001.2014.3001.5503
然后转到228页,根据步骤进行安装
然后,创建文件夹 要注意分级别
插入的图片
插入图片:需要注意图片的大小比例,否则可能显示不出来,这需要根据系统屏幕大小进行设置,
将所需要的图片和音乐拖到对应的文件夹,这是我的图片
主函数 Aileen_invasion的文件
import sys
from time import sleep
import pygame
from settings import Settings
from game_starts import GameStats
from scoreboard import Scoreboard
from button import Button
from ship import Ship
from bullet import Bullet
from aileen import Aileen
class AileenInvasion:"""Overall class to manage game assets and behavior.整体类来管理游戏资产和行为"""def __init__(self):#初始化"""Initialize the game, and create game resources."""pygame.init()self.settings = Settings()self.screen = pygame.display.set_mode((0,0),pygame.FULLSCREEN)self.settings.screen_width = self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().height# self.screen = pygame.display.set_mode(# (self.settings.screen_width,self.settings.screen_height))#类中变量前有self,说明该变量绑定在当前实例化本身pygame.display.set_caption("Aileen Invasion")# Creation an instance to store game statistics.self.stats = GameStats(self)# Create an instance to store game statics,# and create a scoreboard.self.sb = Scoreboard(self)self.ship = Ship(self)self.bullets = pygame.sprite.Group()#Group可以批量使用的函数self.aileens = pygame.sprite.Group()self._create_fleet()#Make the play button.self.play_button = Button(self,"Play")self.bg_color =(0,0,225) #代表红 绿 蓝 三颜色# def _create_fleet(self):# """Create the fleet of aileens."""# #Make a aileen# aileen = Aileen(self)# self.aileens.add(aileen)# #set the background color.def run_game(self): #功能:1监听事件,2处理事件,3更新屏幕事件"""Start the main loop for the game."""while True:# 1监听事件函数--监听和处理用户的行为self._check_events()#将监听事件(封装)外包给这个函数,减轻run_game的工作量---这个过程叫重构(refactory)if self.stats.game_active:# 2处理事件函数self.ship.update()#更新子弹self._update_bullets()self._update_aileens()# 3 屏幕更新函数self._update_screen()def _update_bullets(self):self.bullets.update()if not self.aileens:# Destory existing bullets and create new fleetself.bullets.empty()self._create_fleet()# Get rid of the bullets that have disappeared.for bullet in self.bullets.copy():if bullet.rect.bottom <= 0:self.bullets.remove(bullet)self._check_bullet_aileen_collisions()def _check_bullet_aileen_collisions(self):"""Respond to bullet-aileen collisions."""""" Remove any bullets and aileens that have collided """#👇collisions = pygame.sprite.groupcollide(self.bullets, self.aileens,True,True)if collisions: #collision是字典类型变量# for aileens in collisions.values():self.stats.score += self.settings.aileen_points #* len(aileens)for aileens in collisions.values():self.stats.score += self.settings.aileen_points * len(aileens)self.sb.prep_score()self.sb.check_high_score()self.sb.prep_high_score()if not self.aileens:# Destory existing bullets and create new fleet.self.bullets.empty()self._create_fleet()self.settings.increase_speed()# Increase levelself.stats.level += 1self.sb.prep_level()# print(len(self.bullets))# Watch for keyboard and mouse events. 监听用户在做什么操作--这里设置游戏菜单栏def _check_events(self): ##--snip--"""Respond to keypress and mouse events"""for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type == pygame.KEYDOWN:self._check_keydown_events(event)elif event.type == pygame.KEYUP:self._check_keyup_events(event)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_pos = pygame.mouse.get_pos()self._check_play_button(mouse_pos)def _check_play_button(self,mouse_pos):"""Start a new game when the player clicks Play."""button_clicked = self.play_button.rect.collidepoint(mouse_pos)if button_clicked and not self.stats.game_active:# Hide the mouse cursor.pygame.mouse.set_visible(False)# Reset the game statistics.self.stats.reset_stats()self.stats.game_active = True# 确保分数清0self.sb.prep_score()self.sb.prep_level()self.sb.prep_ships()# Get rid of any remaining aileens and bullets.self.aileens.empty()self.bullets.empty()#Create A new fleet and center the ship.self._create_fleet()self.ship.center_ship()#Reset the game settings.self.settings.initialize_dynamic_settings()pygame.mixer.init()pygame.mixer.music.load("music/香香 - 猪之歌.mp3")# pygame.mixer.music.set_volume(2)pygame.mixer.music.play()def _check_keydown_events(self,event):"""Respond to keypress"""#判断右键if event.key == pygame.K_RIGHT:#处理右键self.ship.moving_right = Trueelif event.key == pygame.K_LEFT:self.ship.moving_left = Trueelif event.key == pygame.K_UP:self.ship.moving_up = Trueelif event.key == pygame.K_DOWN:self.ship.moving_down = Trueelif event.key == pygame.K_q:#按q键退出游戏sys.exit()elif event.key == pygame.K_SPACE:self._fire_bullet()def _check_keyup_events(self,event):"""Respond to key release."""if event.key == pygame.K_RIGHT:self.ship.moving_right = Falseelif event.key == pygame.K_LEFT:self.ship.moving_left = False# Move the ship to the right.self.ship.rect.x += 1elif event.key == pygame.K_m:self.screen = pygame.display.set_mode((0, 0), pygame.FULLSCREEN)self.settings.screen_width =self.screen.get_rect().widthself.settings.screen_height = self.screen.get_rect().heightself.ship = Ship(self)self.aliens = pygame.sprite.Group()self._create_fleet()elif event.key == pygame.K_n:self.settings = Settings()self.screen = pygame.display.set_mode((self.settings.screen_width, self.settings.screen_height))self.ship = Ship(self)self.aliens = pygame.sprite.Group()self._create_fleet()elif event.key == pygame.K_UP:self.ship.moving_up = Falseelif event.key == pygame.K_DOWN:self.ship.moving_down = Falsedef _fire_bullet(self):"""create a new bullet and add it to the bullets group."""if len(self.bullets) < self.settings.bullets_allowed:new_bullet = Bullet(self)self.bullets.add(new_bullet)def _create_fleet(self):#self传的也是ai"""Create the fleet of aileens."""#Create an aileen and find the number of aileens in a row#Spacing between each aileen is equal to one aileen width.aileen = Aileen(self)aileen_width, aileen_height = aileen.rect.sizeavailable_space_x = self.settings.screen_width - (2 * aileen_width)print(available_space_x)print(self.settings.screen_width)print(2 * aileen_width)number_aileen_x = available_space_x // (2 * aileen_width)# Determine the number of rows of aileens that fit on the screen.ship_height =self.ship.rect.heightavailable_space_y = (self.settings.screen_height -(3 * aileen_height) - ship_height)number_rows = available_space_y // (2 * aileen_height)#Create the first row of aileens.for row_number in range(number_rows):for aileen_number in range(number_aileen_x):self._create_aileen(aileen_number, row_number)def _create_aileen(self,aileen_number, row_number):# Create an aileen and place it in row.# Make a aileenaileen = Aileen(self)aileen_width, aileen_height =aileen.rect.sizeaileen.x = aileen_width + 2 * aileen_width * aileen_numberaileen.rect.x = aileen.xaileen.rect.y = aileen.rect.height + 2 * aileen.rect.height * row_numberself.aileens.add(aileen)def _check_aileens_bottom(self):"""Check if any aileens have reached the bottom of the screen."""screen_rect = self.screen.get_rect()for aileen in self.aileens.sprites():if aileen.rect.bottom >= screen_rect.bottom:#Treat this the same as if the ship got hit.self._ship_hit()break# Redraw the screen during each pass through the loop. 更新画布颜色def _update_aileens(self):"""Check if the fleet is at an edge,then update the positions of all aliens in the fleet."""self._check_fleet_edges()"""Update the positions of all aileens in the fleet."""self.aileens.update()# Look for aileen-ship collisions.if pygame.sprite.spritecollideany(self.ship, self.aileens):self._ship_hit()print("Ship hit!!!")# Look for aileens hitting the bottom of the screenself._check_aileens_bottom()def _check_fleet_edges(self):"""Respond appropriately if any aileens have reached an edge."""for aileen in self.aileens.sprites():if aileen.check_edges():self._change_fleet_direction()breakdef _change_fleet_direction(self):"""Drop the entire fleet and change the fleet's direction."""for aileen in self.aileens.sprites():aileen.rect.y += self.settings.fleet_drop_speedself.settings.fleet_direction *= -1def _ship_hit(self):"""Respond to the ship being hit by an allien"""if self.stats.ships_left > 0:# Decrement ships_left.and update scoreboardself.stats.ships_left -= 1self.sb.prep_ships()# Get rid of any remaining aileens and bullets.self.aileens.empty()self.bullets.empty()# Create a new fleet and center the ship.self._create_fleet()self.ship.center_ship()# Pausesleep(0.5)else:self.stats.game_active = Falsepygame.mouse.set_visible(True)def _update_screen(self):"""Update images on the screen , and flip to the new screen"""self.screen.fill(self.settings.bg_color)self.ship.blitme()for bullet in self.bullets.sprites():bullet.draw_bullet()self.aileens.draw(self.screen)#Draw the score information.self.sb.show_score()# Draw the play button if the games is inactive.if not self.stats.game_active:self.play_button.draw_button()self.bullets.draw(self.screen)pygame.display.flip()def check_high_score(self):"""Check to see if there's a new high score."""if self.stats.score > self.stats.high_score:self.stats.high_score = self.stats.scoreself.prep_high_score()if __name__ == '__main__':# Make a game instance , and run the game.ai = AileenInvasion()#游戏本身的实例化,ai就是那个AileenInvasionai.run_game()
创建外星人aileen的文件
import pygame from pygame.sprite import Spriteclass Aileen(Sprite):"""A class to represent a single alien in the fleet"""def __init__(self,ai_game):"""Initilize the aileen and set its starting position."""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settings# Load the aileen image and set its rect attribute.self.image = pygame.image.load("images/aileen.png")self.rect = self.image.get_rect()# Start each new aileen near the top left of the screen.self.rect.x = self.rect.width#将矩形左上角的值作为外星人的宽度self.rect.y = self.rect.height#通过飞船左上角的坐标来控制其它图片的位置#Store the aileen's exact horizontal position.self.x = float(self.rect.x)def check_edges(self):"""Return True if aileen is at edge of screen"""screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right or self.rect.left <= 0:return Truedef update(self):"""Move the aileen to the right or left"""self.x += (self.settings.aileen_speed *self.settings.fleet_direction)self.rect.x = self.x
子弹bullet的文件
import pygame import random from pygame.sprite import Spriteclass Bullet(Sprite):#子弹bullet继承Sprite类--继承"""A class to manage bullets fired from the ship"""def __init__(self,ai_game):"""Create a bullet object at the ship's current position"""super().__init__()#调用父类初始化函数self.screen = ai_game.screenself.settings = ai_game.settingsself.color = self.settings.bullet_color# Load the aileen image and set its rect attribute.self.bullet_images = [pygame.image.load("images/heart.png"),pygame.image.load("images/banana.png"),pygame.image.load("images/cherry.png")]self.image = random.choice(self.bullet_images)self.rect = self.image.get_rect()#Create a bullet rect at(0,0) and then set correct position.self.rect =pygame.Rect(0,0,self.settings.bullet_width,self.settings.bullet_height)self.rect.midtop =ai_game.ship.rect.midtop#利用ai将船和子弹初始位置绑定,使得子弹在船中上方# Store the bullet's position as a decimal value.self.y = float(self.rect.y)def update(self):"""move the bullet up the screen."""#update the decimal position of the bullet.self.y -= self.settings.bullet_speed#update the rect position.self.rect.y = self.ydef draw_bullet(self):"""draw the bullet to the screen"""self.screen.blit(self.image,self.rect)pygame.draw.rect(self.screen, self.color, self.rect)
按钮button的文件
import pygame.fontclass Button:def __init__(self,ai_game,msg):"""Initialize button attributes."""self.screen = ai_game.screenself.screen_rect = self.screen.get_rect()# Set the dimensions and properties(财产,属性==attributes) of the buttonself.width, self.height = 200, 50self.button_color = (0, 255, 0)self.text_color = (255,255,255)self.font = pygame.font.SysFont(None, 48)# Build the button's rect object and center it.self.rect = pygame.Rect(0,0,self.width,self.height)self.rect.center = self.screen_rect.center# The button message needs to be prepped(准备) only once.self._prep_msg(msg)def _prep_msg(self,msg):"""Turn msg into a rendered image and center and center text on the button."""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.centerdef draw_button(self):# Draw blank button and then draw message.self.screen.fill(self.button_color,self.rect)self.screen.blit(self.msg_image,self.msg_image_rect)
游戏数据game_stats的文件
class GameStats:"""Track statics for Aileen Invasion."""def __init__(self,ai_game):# High score should never be reset.self.high_score = 0# Start Aileen Invasion in an active state.self.game_active = True"""Initiallize statistics."""self.settings = ai_game.settingsself.reset_stats()# Start game in an inactive state.self.game_active = Falsedef reset_stats(self):"""Initialize statistics that can change during the game."""self.ships_left = self.settings.ship_limitself.score = 0self.level=1
游戏分数scoreboard的文件
import pygame.font from pygame.sprite import Group from ship import Shipclass Scoreboard:"""A class to report scoring information."""def __init__(self,ai_game):"""Initialize scorekeeping attributes."""self.ai_game = ai_gameself.screen = ai_game.screenself.screen_rect = self.screen.get_rect()self.settings = ai_game.settingsself.stats = ai_game.stats# Font settings for scoring information.self.text_color = (30,30,30)self.font = pygame.font.SysFont(None,48)#Prepare the initial score image.self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_ships(self):"""Show how many ships are left."""self.ships = Group ()for ship_number in range(self.stats.ships_left):ship= Ship(self.ai_game)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship)def prep_score(self):"""Turn the score into a rendered image (将分数转换为渲染图像)"""score_str = str(self.stats.score)"""Turn the score into a rendered image."""rounded_score = round(self.stats.score,-1)score_str = "{:,}".format(rounded_score) #round 取整self.score_image = self.font.render(score_str,True,self.text_color,self.settings.bg_color)#Display the score at the top right of the screen.self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def prep_high_score(self):"""Turn the high score into a rendered image"""high_score = round(self.stats.high_score,-1)high_score_str = "{:,}".format(high_score)self.high_score_image = self.font.render(high_score_str,True,self.text_color,self.settings.bg_color)# Center the high score at the top of the screen.self.high_score_rect = self.high_score_image.get_rect()self.high_score_rect.centerx = self.screen_rect.centerxself.high_score_rect.top = self.score_rect.topdef check_high_score(self):"""Check to see if there's a new high score."""if self.stats.score > self.stats.high_score:self.stats.high_score = self.stats.scoreself.prep_high_score()def prep_level(self):"""Turn the level into a rendered image."""level_str = str(self.stats.level)self.level_image = self.font.render(level_str,True,self.text_color,self.settings.bg_color)#Position the level below the score.self.level_rect = self.level_image.get_rect()self.level_rect.right = self.score_rect.rightself.level_rect.top = self.score_rect.bottom + 10def show_score(self):"""Draw score,level,and ships to the screen"""self.screen.blit(self.score_image,self.score_rect)self.screen.blit(self.high_score_image,self.high_score_rect)self.screen.blit(self.level_image,self.level_rect)self.ships.draw(self.screen)
游戏设置settings的文件
class Settings:"""A class store all settings for Aileen Invasion."""def __init__(self):"""Initialize the game'settings """#Ship settingsself.ship_speed = 1.5self.ship_limit = 3# Screen settingsself.screen_width =1200self.screen_height=800self.bg_color =(255,255,255)# Bullet settingsself.bullet_speed = 1self.bullet_width = 3self.bullet_height = 15self.bullet_color = (60,60,60)self.bullets_allowed = 3#Aileen settingsself.aileen_speed = 1.0self.fleet_drop_speed = 10# How quickly the game speeds upself.speedup_scale = 2# How quickly the aileen point values increaseself.score_scale =1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):"""Initialize speed settings"""self.ship_speed = 1.5self.bullet_speed = 1.5self.aileen_speed = 10# Scoringself.aileen_points =50# fleet_direction of 1 represents right ; -1 represents left.self.fleet_direction = 1def increase_speed(self):"""Increase speed settings""""""Increase speed settings and aileen point values"""self.ship_speed *= self.speedup_scaleself.bullet_speed *= self.speedup_scaleself.aileen_speed *= self.speedup_scaleself.aileen_points = int(self.aileen_points * self.score_scale)print(self.aileen_points)
游戏飞船ship的文件
import pygame from pygame.sprite import Spriteclass Ship(Sprite):"""A class to manage the ship."""def __init__(self,ai_game):"""Initialize the ship and set its starting position."""super().__init__()self.screen = ai_game.screenself.settings = ai_game.settingsself.screen_rect = ai_game.screen.get_rect()#返回窗口矩形# Load the ship image and get its rect.self.image = pygame.image.load("images/ship.png")self.rect=self.image.get_rect()#取得屏幕的矩形 rect=rectangle 拿到图片矩形# Start each new ship at the bottom center of the screen.self.rect.midbottom = self.screen_rect.midbottom#通过赋值:图片的中下方的坐标,等于屏幕中下方的坐标# Store a decimal value for the ship's horizontal position.self.x = float(self.rect.x)self.y = float(self.rect.y)# Movement flagself.moving_right =Falseself.moving_left =Falseself.moving_up =Falseself.moving_down =Falsedef center_ship(self):"""Center the ship on the screen"""self.rect.midbottom = self.screen_rect.midbottomself.x = float(self.rect.x)def update(self):"""Update the ship's position based on the movement flag"""# Update the ship's value, not the rect.# if self.moving_right:if self.moving_right and self.rect.right < self.screen_rect.right:self.x += self.settings.ship_speed#不断增加飞船左上角的横坐标带动图片移动self.rect.x += 1# if self.moving_left:if self.moving_left and self.rect.left > 0:self.x -= self.settings.ship_speedself.rect.x -= 1#topif self.moving_up and self.rect.top > 720 :self.y -= self.settings.ship_speedself.rect.y -= 1if self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.y += self.settings.ship_speedself.rect.y += 1def blitme(self):#渲染函数,让图片显示出来"""Draw the ship at its current location."""self.screen.blit(self.image,self.rect)
全屏模式下的游戏
小窗口下的游戏
🐖今天的打猪游戏就分享到这里啦~🐖
🐖喜欢就一键三连支持一下吧♥~🐖
🐖谢谢家人们!🐖