python编程,外星人飞船
生活随笔
收集整理的這篇文章主要介紹了
python编程,外星人飞船
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
簡(jiǎn)介
根據(jù)《Python編程:從入門到實(shí)踐》這本書的指導(dǎo)所編寫的,基本沒(méi)有改動(dòng),只是增加了上下移動(dòng)和p鍵開始以及歷史最高分的記錄三個(gè)額外功能
因?yàn)橹皇前凑諘现谰帉?#xff0c;所以詳細(xì)的內(nèi)容其實(shí)并沒(méi)有學(xué)會(huì),只是為了熟悉流程和一部分知識(shí),其中歷史最高分的記錄必須一開始在文檔里輸入起始值才可以運(yùn)行游戲(這里是懶得繼續(xù)調(diào)試了)
另外有很多的不足之處也沒(méi)有改,但基本的功能都實(shí)現(xiàn)了,大家如果有按照這本書敲代碼的可以試著參考一下。
一共十個(gè)程序,兩個(gè)圖片,txt文件沒(méi)有放的必要
程序部分
- 簡(jiǎn)介
- alien_invasion.py(主程序)
- alien.py
- bullet.py
- button.py
- game_function.py(最重要的部分,函數(shù)功能基本都集中在這里)
- game_stats.py
- scoreboard.py
- settings.py(基本設(shè)置參數(shù))
- ship.py
- show_the_key.py
- 圖片
- the_highest_score為txt文件,記錄歷史最高分,一開始其中輸入了0
alien_invasion.py(主程序)
import pygamefrom settings import Settings from game_stats import GameStats from button import Button from ship import Ship import game_functions as gf from pygame.sprite import Group from scoreboard import Scoreboarddef run_game():#初始化游戲并創(chuàng)建一個(gè)屏幕對(duì)象pygame.init()ai_settings = Settings()screen = pygame.display.set_mode((ai_settings.screen_width,ai_settings.screen_height))pygame.display.set_caption("Alien Invasion_楚")play_button = Button(ai_settings, screen, "Play")stats = GameStats(ai_settings)sb = Scoreboard(ai_settings, screen, stats)ship = Ship(ai_settings,screen)bullets = Group()aliens = Group()gf.create_fleet(ai_settings, screen, ship, aliens)bg_color = (230, 230, 230)#change the colorwhile True:#用來(lái)監(jiān)視鍵盤和鼠標(biāo)活動(dòng)gf.check_events(ai_settings, screen, stats, sb, play_button, ship,aliens, bullets)if stats.game_active == True:ship.update()gf.update_bullets(ai_settings, screen, stats, sb, ship,aliens, bullets)gf.update_aliens(ai_settings, screen, stats, sb, ship,aliens, bullets)gf.update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets,play_button)run_game()alien.py
import pygame from pygame.sprite import Spriteclass Alien(Sprite):def __init__(self, ai_settings, screen):super().__init__()self.screen = screenself.ai_settings = ai_settingsself.image = pygame.image.load('images/alien.bmp')self.rect = self.image.get_rect()self.rect.x = self.rect.widthself.rect.y = self.rect.heightself.x = float(self.rect.x)def blitme(self):self.screen.blit(self.image, self.rect)def update(self):self.x += (self.ai_settings.alien_speed_factor *self.ai_settings.fleet_direction)self.rect.x = self.xdef check_edges(self):screen_rect = self.screen.get_rect()if self.rect.right >= screen_rect.right:return Trueelif self.rect.left <= 0:return Truebullet.py
import pygame from pygame.sprite import Spriteclass Bullet(Sprite):def __init__(self, ai_settings, screen, ship):super().__init__()self.screen = screenself.rect = pygame.Rect(0, 0, ai_settings.bullet_width,ai_settings.bullet_height)self.rect.centerx = ship.rect.centerxself.rect.top = ship.rect.topself.y = float(self.rect.y)self.color = ai_settings.bullet_colorself.speed_factor = ai_settings.bullet_speed_factordef update(self):self.y -= self.speed_factorself.rect.y = self.ydef draw_bullet(self):pygame.draw.rect(self.screen,self.color,self.rect)button.py
import pygame.fontclass Button:def __init__(self, ai_settings, screen, msg):self.screen = screenself.screen_rect = screen.get_rect()self.width, self.height = 200, 50self.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.rect.center = self.screen_rect.centerself.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.centerdef draw_button(self):self.screen.fill(self.button_color, self.rect)self.screen.blit(self.msg_image, self.msg_image_rect)game_function.py(最重要的部分,函數(shù)功能基本都集中在這里)
import sys import pygame from bullet import Bullet from alien import Alien from time import sleepdef check_keydown_events(event, ai_settings, screen, stats, sb, play_button,ship, aliens, bullets):if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueif event.key == pygame.K_UP:ship.moving_up = Trueelif event.key == pygame.K_DOWN:ship.moving_down = Trueelif event.key == pygame.K_SPACE:fire_bullet(ai_settings, screen, ship, bullets)elif event.key == pygame.K_q:pygame.quit()sys.exit()elif event.key == pygame.K_p:start_game(ai_settings, screen, stats, sb, play_button, ship, aliens,bullets)def check_keyup_events(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = Falseif event.key == pygame.K_UP:ship.moving_up = Falseelif event.key == pygame.K_DOWN:ship.moving_down = Falsedef check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:check_keydown_events(event, ai_settings, screen, stats, sb,play_button, ship,aliens, bullets)elif event.type == pygame.KEYUP:check_keyup_events(event,ship)elif event.type == pygame.MOUSEBUTTONDOWN:mouse_x, mouse_y = pygame.mouse.get_pos()check_play_button(ai_settings, screen, stats, sb, play_button, ship,aliens, bullets, mouse_x, mouse_y)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()pygame.display.flip()def update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets):bullets.update()for bullet in bullets.copy():if bullet.rect.bottom <= 0:bullets.remove(bullet)check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,aliens, bullets)def fire_bullet(ai_settings, screen, ship, bullets):if len(bullets) <= ai_settings.bullets_allowed:new_bullet = Bullet(ai_settings, screen, ship)bullets.add(new_bullet)def create_fleet(ai_settings, screen, ship, aliens):alien = Alien(ai_settings, screen)number_aliens_x = get_number_aliens_x(ai_settings, alien.rect.width)number_rows = get_number_rows(ai_settings, ship.rect.height,alien.rect.height)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)def get_number_aliens_x(ai_settings, alien_width):available_space_x = ai_settings.screen_width - 2 * alien_widthnumber_aliens_x = int(available_space_x / (2 * alien_width))return number_aliens_xdef create_alien(ai_settings, screen, aliens, alien_number, row_number):alien = Alien(ai_settings, screen)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * alien_numberalien.rect.x = alien.xalien.rect.y = alien.rect.height + 2 * alien.rect.height * row_numberaliens.add(alien)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_rowsdef update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets):check_fleet_edges(ai_settings, aliens)aliens.update()if pygame.sprite.spritecollideany(ship, aliens):ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets)def check_fleet_edges(ai_settings, aliens):for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)breakdef change_fleet_direction(ai_settings, aliens):for alien in aliens.sprites():alien.rect.y += ai_settings.fleet_drop_speedai_settings.fleet_direction *= -1def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship,aliens, bullets):collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)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 += 1sb.prep_level()create_fleet(ai_settings, screen, ship, aliens)def ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):if stats.ships_left > 0:stats.ships_left -= 1sb.prep_ships()aliens.empty()bullets.empty()create_fleet(ai_settings, screen, ship, aliens)ship.center_ship()sleep(0.5)else:stats.game_active = Falsepygame.mouse.set_visible(True)def check_aliens_bottom(ai_settings, screen, stats, sb, ship, aliens, bullets):screen_rect = screen.get_rect()for alien in aliens.sprites():if alien.rect.bottom >= screen_rect.bottom:ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets)breakdef check_play_button(ai_settings, screen, stats, sb, play_button, ship, aliens,bullets, mouse_x, mouse_y):button_clicked = play_button.rect.collidepoint(mouse_x, mouse_y)if button_clicked and not stats.game_active:start_game(ai_settings, screen, stats, sb, play_button,ship,aliens,bullets)def start_game(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets):ai_settings.initialize_dynamic_settings()pygame.mouse.set_visible(False)stats.reset_stats()stats.game_active = Truesb.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 check_high_score(stats, sb):if stats.score > stats.high_score:stats.high_score = stats.scoresb.prep_high_score()with open("The highest score.txt",'w') as f:f.write(str(stats.score))game_stats.py
class GameStats():def __init__(self, ai_settings):self.ai_settings = ai_settingsself.reset_stats()self.game_active = Falsewith open ('The highest score.txt') as f:self.high_score = int(f.read())def reset_stats(self):self.ships_left = self.ai_settings.ship_limitself.score = 0self.level = 1scoreboard.py
import pygame.font from pygame.sprite import Group from ship import Shipclass Scoreboard():def __init__(self, ai_settings, screen, stats):self.screen = screenself.screen_rect = screen.get_rect()self.ai_settings = ai_settingsself.stats = statsself.text_color = (30, 30, 30)self.font = pygame.font.SysFont(None, 48)self.prep_score()self.prep_high_score()self.prep_level()self.prep_ships()def prep_score(self):rounded_score = int(round(self.stats.score, -1))score_str = "{:,}".format(rounded_score)self.score_image = self.font.render(score_str, True, self.text_color,self.ai_settings.bg_color)self.score_rect = self.score_image.get_rect()self.score_rect.right = self.screen_rect.right - 20self.score_rect.top = 20def show_score(self):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)def prep_high_score(self):high_score = int(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.ai_settings.bg_color)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 prep_level(self):self.level_image = self.font.render(str(self.stats.level), True,self.text_color, self.ai_settings.bg_color)self.level_rect = self.level_image.get_rect()self.level_rect.right = self.score_rect.rightself.level_rect.top = self.score_rect.bottom + 10def prep_ships(self):self.ships = Group()for ship_number in range(self.stats.ships_left):ship = Ship(self.ai_settings, self.screen)ship.rect.x = 10 + ship_number * ship.rect.widthship.rect.y = 10self.ships.add(ship)settings.py(基本設(shè)置參數(shù))
class Settings():def __init__(self):self.screen_width = 1200self.screen_height = 800self.bg_color = (230,230,230)self.bullet_width = 3self.bullet_height = 15self.bullet_color = 60,60,60self.bullets_allowed = 3self.fleet_drop_speed = 5self.ship_limit = 3self.speedup_scale = 1.1self.score_scale = 1.5self.initialize_dynamic_settings()def initialize_dynamic_settings(self):self.ship_speed_factor = 1.5self.bullet_speed_factor = 3self.alien_speed_factor = 0.1self.fleet_direction = 1self.alien_points = 50def increase_speed(self):self.ship_speed_factor *= self.speedup_scaleself.bullet_speed_factor *= self.speedup_scaleself.alien_speed_factor *= self.speedup_scaleself.alien_points = int(self.alien_points * self.score_scale)ship.py
import pygame from pygame.sprite import Spriteclass Ship(Sprite):def __init__(self,ai_settings,screen):super().__init__()self.screen = screenself.ai_settings = ai_settingsself.image = pygame.image.load('images/ship.bmp')self.rect = self.image.get_rect()self.screen_rect = screen.get_rect()self.rect.centerx = self.screen_rect.centerxself.rect.bottom = self.screen_rect.bottomself.center = float(self.rect.centerx)self.bottom = float(self.rect.bottom)self.moving_right = Falseself.moving_left = Falseself.moving_up = Falseself.moving_down = Falsedef update(self):if self.moving_right and self.rect.right < self.screen_rect.right:self.center += self.ai_settings.ship_speed_factorif self.moving_left and self.rect.left > 0:self.center -= self.ai_settings.ship_speed_factorif self.moving_up and self.rect.top > 0:self.bottom -= self.ai_settings.ship_speed_factorif self.moving_down and self.rect.bottom < self.screen_rect.bottom:self.bottom += self.ai_settings.ship_speed_factorself.rect.centerx = self.centerself.rect.bottom = self.bottomdef blitme(self):self.screen.blit(self.image, self.rect)def center_ship(self):self.center = self.screen_rect.centerxself.bottom = self.screen_rect.bottomshow_the_key.py
import pygame import sysdef run_game():pygame.init()screen = pygame.display.set_mode((1200,800))pygame.display.set_caption("how will you do")while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()elif event.type == pygame.KEYDOWN:print(event.key) run_game()圖片
the_highest_score為txt文件,記錄歷史最高分,一開始其中輸入了0
總結(jié)
以上是生活随笔為你收集整理的python编程,外星人飞船的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 集合上二元关系性质判定的实现(pytho
- 下一篇: hive 语法检查_升级Hive3处理语