航空機戦争を達成するための500行のPythonコード

この記事の例では、参考のために航空機戦争を実現するためのpythonコードの特定のコードを共有しています。具体的な内容は次のとおりです。

import pygame
import sys
from pygame.sprite import Sprite
from pygame.sprite import Group
from time import sleep
import pygame.font
# ゲームのいくつかの新しい設定を変更します
classSettings():"""「エイリアンの侵略」のすべての設定を保存します"""
def __init__(self):"""ゲーム設定を初期化する"""
# 画面設定
self.screen_width =1200
self.screen_height =800
self.bg_color =(230,230,230) #ライトグレー
# 宇宙船のセットアップ、移動1.5ピクセル
self.ship_limit =3
# 弾丸の設定---幅3ピクセル、高さ15ピクセルの濃い灰色の弾丸を作成します
self.bullet_speed_factor =3
self.bullet_width =3
self.bullet_height =15
self.bullet_color =60,60,60
self.bullets_allowed =3
# エイリアンの設定
self.fleet_drop_speed =10
# ゲームのペースを速めるためにどのくらいの速度で
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
# fleet_方向は1右を意味します。-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)
# 船のクラスを作成する
classShip(Sprite):
def __init__(self, ai_settings, screen):"""宇宙船を初期化し、開始位置を設定します"""super(Ship, self).__init__()
self.screen = screen
self.ai_settings = ai_settings
# 宇宙船の画像をロードし、その境界の長方形を取得します
self.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.centerx
self.rect.bottom = self.screen_rect.bottom
# 宇宙船の属性センターに10進値を保存します----後でゲームのリズムをスピードアップするときに、宇宙船の速度をより詳細に制御します
self.center =float(self.rect.centerx)
# サインを動かす
self.moving_right = False
self.moving_left = False
def update(self):"""移動標識に従って宇宙船の位置を調整します"""
# rectの代わりに宇宙船の中心値を更新します
if self.moving_right and self.rect.right < self.screen_rect.right:
self.center += self.ai_settings.ship_speed_factor
if self.moving_left and self.rect.left   0:
self.center -= self.ai_settings.ship_speed_factor
# 自己によると.センターはrectオブジェクトを更新します
self.rect.centerx = self.center
def center_ship(self):"""宇宙船を画面の中央に配置します"""
self.center = self.screen_rect.centerx
def blitme(self):"""指定された場所に宇宙船を描きます"""
self.screen.blit(self.image, self.rect)
# エイリアンクラスを作成する
classAlien(Sprite):"""単一のエイリアンを表すクラス"""
def __init__(self, ai_settings, screen):"""エイリアンを初期化し、開始位置を設定します"""super(Alien, self).__init__()
self.screen = screen
self.ai_settings = ai_settings
# エイリアンイメージをロードし、そのrect属性を設定します
self.image = pygame.image.load('images/alien.bmp')
self.rect = self.image.get_rect()
# すべてのエイリアンは、最初は画面の左上隅の近くにいます
self.rect.x = self.rect.width
self.rect.y = self.rect.height
# エイリアンの正確な場所を保存します
self.x =float(self.rect.x)
def check_edges(self):"""エイリアンが画面の端にいる場合は、Trueを返します"""
screen_rect = self.screen.get_rect()if self.rect.right  = screen_rect.right:return True
elif self.rect.left <=0:return True
def update(self):"""エイリアンを左または右に動かす"""
self.x +=(self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction)
self.rect.x = self.x
def blitme(self):"""指定された場所にエイリアンを引き寄せる"""
self.screen.blit(self.image, self.rect)
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_width = alien.rect.width
alien.x = alien_width +2* alien_width * alien_number
alien.rect.x = alien.x
alien.rect.y = alien.rect.height +2* alien.rect.height * row_number
aliens.add(alien)
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 inrange(number_rows):for alien_number inrange(number_aliens_x):
# エイリアンを作成し、現在の行に追加します
create_alien(ai_settings, screen, aliens, alien_number, row_number)classBullet(Sprite):"""宇宙船が発射する弾丸を管理するクラス"""
def __init__(self, ai_settings, screen, ship):"""宇宙船がある場所に弾丸オブジェクトを作成します"""super(Bullet, self).__init__()
self.screen = screen
# に(0,0)弾丸を表す長方形を作成し、正しい位置を設定します
self.rect = pygame.Rect(0,0, ai_settings.bullet_width, ai_settings.bullet_height)
self.rect.centerx = ship.rect.centerx
self.rect.top = ship.rect.top
# 小数で表された弾丸の位置を保存します
self.y =float(self.rect.y)
# 弾丸の色と速度を設定する
self.color = ai_settings.bullet_color
self.speed_factor = ai_settings.bullet_speed_factor
def update(self):"""弾丸を上に移動"""
# 弾丸の位置を示す10進値を更新します
self.y -= self.speed_factor
# 弾丸を表す正しい位置を更新します
self.rect.y = self.y
def draw_bullet(self):"""画面に弾丸を描く"""
pygame.draw.rect(self.screen, self.color, self.rect)
# イベントを管理し、2つの機能を設定します。1つはKEYDOWNイベントを処理し、もう1つはKEYUPイベントを処理します。
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_bullets(ai_settings, screen, ship, bullets)
elif event.key == pygame.K_q:
sys.exit()
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):"""キー押下およびマウスイベントへの応答"""for event in pygame.event.get():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:
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 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:
# ゲーム設定をリセットする
ai_settings.initialize_dynamic_settings()
# カーソルを隠す
pygame.mouse.set_visible(False)
# ゲーム統計をリセット
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 fire_bullets(ai_settings, screen, ship, bullets):"""まだ制限に達していない場合は、弾丸を発射します"""
# 箇条書きを作成し、グループの箇条書きに追加します
iflen(bullets)< ai_settings.bullets_allowed:
new_bullet =Bullet(ai_settings, screen, ship)
bullets.add(new_bullet)
def check_bullet_alien_collisions(ai_settings, screen, stats, sb, ship, aliens, bullets):"""弾丸とエイリアンの衝突に対応する"""
# もしそうなら、対応する弾丸とエイリアンを削除します
collisions = pygame.sprite.groupcollide(bullets, aliens, True, True)iflen(aliens)==0:
# 既存の弾丸を排除し、ゲームのペースを速め、エイリアンの新しいグループを作成します
# エイリアンのグループ全体が一掃された場合は、1レベル上げます
bullets.empty()
ai_settings.increase_speed()
# レベルアップ
stats.level +=1
sb.prep_level()create_fleet(ai_settings, screen, ship, aliens)if collisions:for aliens in collisions.values():
stats.score += ai_settings.alien_points *len(aliens)
sb.prep_score()check_high_score(stats, sb)
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 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 check_fleet_edges(ai_settings, aliens):"""エイリアンが端に達したときに対応するための措置"""for alien in aliens.sprites():if alien.check_edges():change_fleet_direction(ai_settings, aliens)break
def ship_hit(ai_settings, screen, stats, sb, ship, aliens, bullets):"""エイリアンに襲われた宇宙船への対応"""if stats.ships_left   0:
# 発送します_左マイナス1
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
pygame.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)break
def 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)classGameStats():"""ゲーム統計を追跡する"""
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 =1classScoreboard():"""スコア情報を表示するクラス"""
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 =(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 -20
self.score_rect.top =20
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.centerx
self.high_score_rect.top = self.score_rect.top
def 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.right
self.level_rect.top = self.score_rect.bottom +10
def prep_ships(self):"""残りの船の数を表示します"""
self.ships =Group()for ship_number inrange(self.stats.ships_left):
ship =Ship(self.ai_settings, self.screen)
ship.rect.x =10+ ship_number * ship.rect.width
ship.rect.y =10
self.ships.add(ship)
def 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 check_high_score(stats, sb):"""新しい最高スコアが生まれるかどうかを確認します"""if stats.score   stats.high_score:
stats.high_score = stats.score
sb.prep_high_score()classButton():
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) #デフォルトの48ポイントフォントを使用
# ボタンのrectオブジェクトを作成し、中央に配置します
self.rect = pygame.Rect(0,0, self.width, self.height)
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)
# 画面上の画像を更新し、新しい画面に切り替えます
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 run_game():
# ゲームを初期化し、画面オブジェクトを作成します
pygame.init()
ai_settings =Settings()
screen = pygame.display.set_mode((ai_settings.screen_width, ai_settings.screen_height))
pygame.display.set_caption("Alien Invation")
# 宇宙船を作成する
ship =Ship(ai_settings, screen)
# エイリアンを作成する
alien =Alien(ai_settings, screen)
# 弾丸を保存するためのグループを作成します
bullets =Group()
# エイリアングループを作成する
aliens =Group()
# エイリアンの群衆を作成する
create_fleet(ai_settings, screen, ship, aliens)
# ゲーム統計を保存するインスタンスを作成し、スコアボードを作成します
stats =GameStats(ai_settings)
sb =Scoreboard(ai_settings, screen, stats)
# 再生ボタンを作成する
play_button =Button(ai_settings, screen,"Play")
# ゲームのメインループを開始します
while True:check_events(ai_settings, screen, stats, sb, play_button, ship, aliens, bullets)if stats.game_active:
ship.update()update_bullets(ai_settings, screen, stats, sb, ship, aliens, bullets)update_aliens(ai_settings, screen, stats, sb, ship, aliens, bullets)update_screen(ai_settings, screen, stats, sb, ship, aliens, bullets, play_button)run_game()

結果を以下に示します。

より興味深い古典的なミニゲームの実装トピック、あなたと共有してください:

C ++クラシックゲームの概要

Pythonクラシックゲームの概要

pythontetrisゲームコレクション

JavaScriptクラシックゲームは常にプレイされています

古典的なJavaゲームの概要

JavaScriptクラシックゲームの概要

以上が本稿の内容ですので、皆様のご勉強に役立てていただければ幸いです。

Recommended Posts

航空機戦争を達成するための500行のPythonコード
ヘビを実現するための200行のPythonコード
パイソンを使って航空機戦争ゲームを実現する
バグを見つけるためのPythonコード(2)
pythonコードにコメントする方法
バグを見つけるためのPythonコード(4)
バグを見つけるためのPythonコード(3)
バグを見つけるためのPythonコード(6)
バグを見つけるためのPythonコード(1)
バグを見つけるためのPythonコード(8)
バグを見つけるためのPythonコード(5)
ミニマリズムはPythonの魂です|バグを見つけるためのPythonコード(10)
pythonウェブページコードの表示方法
pythonコードでラップする方法
Pythonは航空機戦争プロジェクトを実装します
Pythonは実行する操作コードを処理します
Pythonを使用して飛行機の戦争ゲームを作成する
Pythonコードをインデントする必要がありますか
実際には非常に単純です|バグを見つけるためのPythonコード(12)
Pythonはスネークゲームのソースコードを実装しています
pythonでアシスタントを実行するコードを使用する方法
pythonでコード自動プロンプトを設定する方法
ファイルをダウンロードするためのPythonヘッドレスクローラーの実装
Pythonコードをまとめて正しく移動する方法
Pythonを使用してKSを計算する詳細な例
Python3.9の7つの機能
01.Pythonの概要
Pythonの紹介
Pythonでのパッケージの導入を理解する方法
pythonで番号のリストを理解する方法
pythonで写真を自動的にダウンロードする方法の例
プレイカードの配布を実現するためのPythonシミュレーション