Harika bir uzay gemisi savaşı yapmak için Python'u kullanın! Güç Projesi

Yazar | AI Advanced

Baş Editör | Guo Rui

Üretildi | CSDN Blogu

Bu makale, bir uzay gemisi savaş oyunu uygulamak için Python kullanıyor, söylenecek fazla bir şey değil, doğrudan konuya!

Bir uzay gemisi sınıfı oluşturun

Pygame'i içe aktar pygame.sprite'dan içe aktarma Sprite sınıf Gemi (Sprite): def __içinde__ (self, ai_settings, ekran): "" "Gemiyi başlatın ve başlangıç konumunu ayarlayın." "" super (Ship, self) .__ init__ self.screen = ekran self.ai_settings = ai_settings # Gemi görüntüsünü yükleyin ve doğru şeklini alın. self.image = pygame.image.load ('images / ship.bmp') self.rect = self.image.get_rect self.screen_rect = screen.get_rect # Her yeni gemiyi ekranın alt orta kısmından başlatın. self.rect.centerx = self.screen_rect.centerx self.rect.bottom = self.screen_rect.bottom # Geminin merkezi için ondalık bir değer kaydedin. self.center = float (self.rect.centerx) # Hareket bayrakları. self.moving_right = Yanlış self.moving_left = Yanlış def center_ship (kendi): "" "Gemiyi ekranda ortalayın." "" self.center = self.screen_rect.centerx def Güncelleme (kendi): "" "Geminin konumunu hareket bayraklarına göre güncelleyin." "" # Yön değil, geminin merkez değerini güncelleyin. eğer self.moving_right ve self.rect.right < self.screen_rect.right: self.center + = self.ai_settings.ship_speed_factor self.moving_left ve self.rect.left ise > 0: self.center - = self.ai_settings.ship_speed_factor # Self.center'dan rect nesnesini güncelleyin. self.rect.centerx = self.center def yıldırım (kendi): "" "Gemiyi mevcut konumunda çizin." "" self.screen.blit (self.image, self.rect)

Ayarlar sınıfı oluştur

sınıf Ayarları: "" "Alien Invasion için tüm ayarları depolamak için bir sınıf." "" def __init __ (öz): "" "Oyunun statik ayarlarını başlatın." "" # Ekran ayarları. self.screen_width = 1200 self.screen_height = 800 self.bg_color = (230, 230, 230) # Gemi ayarları. self.ship_limit = 3 # Madde işareti ayarları. self.bullet_width = 3 self.bullet_height = 15 self.bullet_color = 60, 60, 60 self.bullets_allowed = 3 # Uzaylı ayarları. self.fleet_drop_speed = 10 # Oyunun ne kadar hızlı hızlandığı. self.speedup_scale = 1.1 # Yabancı nokta değerlerinin ne kadar hızlı arttığı. self.score_scale = 1.5 self.initialize_dynamic_settings def initialize_dynamic_settings (self): "" "Oyun boyunca değişen ayarları başlatın." "" self.ship_speed_factor = 1.5 self.bullet_speed_factor = 3 self.alien_speed_factor = 1 # Puanlama. self.alien_points = 50 # 1'in filo_yönü sağı, -1 solu temsil eder. self.fleet_direction = 1 def artış_ hızı (öz): "" "Hız ayarlarını ve yabancı nokta değerlerini artırın." "" 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)

Madde işareti sınıfı oluştur

Pygame'i içe aktar pygame.sprite'dan içe aktarma Sprite sınıf Bullet (Sprite): "" "Gemiden ateşlenen mermileri yöneten bir sınıf." "" def __init __ (self, ai_settings, screen, ship): "" "Geminin mevcut konumunda bir mermi nesnesi oluşturun." "" süper (Bullet, self) .__ init__ self.screen = ekran # (0, 0) 'da doğru madde işareti oluşturun, ardından doğru konumu ayarlayın. 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 # Madde işaretinin konumu için ondalık bir değer kaydedin. self.y = float (self.rect.y) self.color = ai_settings.bullet_color self.speed_factor = ai_settings.bullet_speed_factor def güncelleme (kendi kendine): "" "Mermiyi ekranda yukarı taşıyın." "" # Madde işaretinin ondalık konumunu güncelleyin. self.y - = self.speed_factor # Dik konumu güncelleyin. self.rect.y = self.y def draw_bullet (öz): "" "Mermiyi ekrana çizin." "" pygame.draw.rect (self.screen, self.color, self.rect)

Oyun işlevi sınıfı oluşturun

ithalat sys zamandan itibaren içe aktar Pygame'i içe aktar mermi ithalatından Bullet yabancı ithalattan Alien def check_keydown_events (olay, ai_settings, ekran, gemi, madde işaretleri): "" "Tuşlara basışlara yanıt verin." "" event.key == pygame.K_RIGHT ise: ship.moving_right = Doğru elif event.key == pygame.K_LEFT: ship.moving_left = Doğru elif event.key == pygame.K_SPACE: fire_bullet (ai_settings, ekran, gemi, madde işaretleri) elif event.key == pygame.K_q: sys.e xi t def check_keyup_events (etkinlik, gemi): "" "Anahtar sürümlere yanıt verin." "" event.key == pygame.K_RIGHT ise: ship.moving_right = Yanlış elif event.key == pygame.K_LEFT: ship.moving_left = Yanlış def check_events (ai_settings, ekran, istatistikler, sb, play_button, gemi, yabancılar, mermiler): "" "Tuşlara ve fare olaylarına yanıt verin." "" pygame.event.get içindeki olay için: event.type == pygame.QUIT ise: sys.e xi t elif event.type == pygame.KEYDOWN: check_keydown_events (olay, ai_settings, ekran, gemi, madde işaretleri) elif event.type == pygame.KEYUP: check_keyup_events (etkinlik, gemi) elif event.type == pygame.MOUSEBUTTONDOWN: mouse_x, mouse_y = pygame.mouse.get_pos check_play_button (ai_settings, ekran, istatistikler, sb, play_button, gemi, uzaylılar, mermiler, mouse_x, mouse_y) def check_play_button (ai_settings, screen, stats, sb, play_button, ship, uzaylılar, mermiler, mouse_x, mouse_y): "" "Oyuncu Oyna'yı tıkladığında yeni bir oyun başlatın." "" button_clicked = play_button.rect.collidepoint (mouse_x, mouse_y) button_clicked ise ve stats.game_active: # Oyun ayarlarını sıfırlayın. ai_settings.initialize_dynamic_settings # Fare imlecini gizleyin. pygame.mouse.set_visible (Yanlış) # Oyun istatistiklerini sıfırlayın. stats.reset_stats stats.game_active = True # Çetele görüntülerini sıfırlayın. sb.prep_score sb.prep_high_score sb.prep_level sb.prep_ships # Uzaylıların ve mermilerin listesini boşaltın. uzaylılar. boş bullets.empty # Yeni bir filo oluşturun ve gemiyi ortalayın. create_fleet (ai_settings, ekran, gemi, uzaylılar) ship.center_ship def fire_bullet (ai_settings, screen, ship, bullets): "" "Sınıra henüz ulaşılmadıysa, bir mermi ateşleyin." "" # Yeni bir madde işareti oluşturun, a gg mermi grubuna. eğer len (mermi) < ai_settings.bullets_allowed: new_bullet = Bullet (ai_settings, ekran, gemi) bullets.a gg (yeni_bullet) def update_screen (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler, oynatma düğmesi): "" "Ekrandaki resimleri güncelleyin ve yeni ekrana geçin." "" # Ekranı yeniden çizin, her biri döngüden geçer. screen.fill (ai_settings.bg_color) # Gemi ve uzaylıların arkasındaki tüm mermileri yeniden çizin. bullets.sprites içindeki mermi için: bullet.draw_bullet ship.blitme aliens.draw (ekran) # Puan bilgilerini çizin. sb.show_score # Oyun aktif değilse oynat düğmesini çizin. stats.game_active değilse: play_button.draw_button # En son çizilmiş ekranı görünür hale getirin. pygame.display.flip def update_bullets (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler): "" "Mermilerin konumunu güncelleyin ve eski mermilerden kurtulun." "" # Madde işareti konumlarını güncelleyin. bullets.update # Kaybolan mermilerden kurtulun. bullets.copy içindeki madde işareti için: bullet.rect.bottom < = 0: bullets.remove (madde işareti) check_bullet_alien_collisions (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler) def check_high_score (istatistikler, sb): "" "Yeni bir yüksek puan olup olmadığını kontrol edin." "" eğer stats.score > stats.high_score: stats.high_score = stats.score sb.prep_high_score def check_bullet_alien_collisions (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler): "" "Kurşun uzaylı çarpışmalarına yanıt verin." "" # Çarpışan mermileri ve uzaylıları kaldırın. collisions = pygame.sprite.groupcollide (mermiler, uzaylılar, Doğru, Doğru) çarpışmalar varsa: çarpışmalardaki yabancılar için. değerler: stats.score + = ai_settings.alien_points * len (uzaylılar) sb.prep_score check_high_score (istatistikler, sb) eğer len (uzaylılar) == 0: # Tüm filo yok edilirse, yeni bir seviyeye başlayın. bullets.empty ai_settings.increase_speed # Seviyeyi artırın. stats.level + = 1 sb.prep_level create_fleet (ai_settings, ekran, gemi, uzaylılar) def check_fleet_edges (ai_settings, uzaylılar): "" "Herhangi bir uzaylı sınıra ulaştıysa uygun şekilde yanıt verin." "" yabancılardaki uzaylılar için. sprites: alien.check_edges ise: change_fleet_direction (ai_settings, uzaylılar) kırmak def change_fleet_direction (ai_settings, yabancılar): "" "Tüm filoyu bırak ve filonun yönünü değiştir." "" yabancılardaki uzaylılar için. sprites: alien.rect.y + = ai_settings.fleet_drop_speed ai_settings.fleet_direction * = -1 def ship_hit (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler): "" "Uzaylı tarafından vurulan gemiye yanıt verin." "" eğer stats.ships_left > 0: # Ship_left değerini azaltın. stats.ships_left - = 1 # Puan tablosunu güncelleyin. sb.prep_ships Başka: stats.game_active = False pygame.mouse.set_visible (Doğru) # Uzaylıların ve mermilerin listesini boşaltın. uzaylılar. boş bullets.empty # Yeni bir filo oluşturun ve gemiyi ortalayın. create_fleet (ai_settings, ekran, gemi, uzaylılar) ship.center_ship # Duraklat. uyku (0.5) def check_aliens_bottom (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler): "" "Ekranın altına uzaylıların ulaşıp ulaşmadığını kontrol edin." "" screen_rect = screen.get_rect yabancılardaki uzaylılar için. sprites: eğer alien.rect.bottom > = screen_rect.bottom: # Buna, sanki gemi çarpmış gibi davran. ship_hit (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler) kırmak def update_aliens (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler): "" " Filonun sınırda olup olmadığını kontrol edin, ardından filodaki tüm uzaylıların görevlerini güncelleyin. "" " check_fleet_edges (ai_settings, uzaylılar) uzaylılar.update # Uzaylı-gemi çarpışmalarını ara. pygame.sprite.spritecollideany (gemi, uzaylılar) ise: ship_hit (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler) # Ekranın altına vuran uzaylıları arayın. check_aliens_bottom (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler) def get_number_aliens_x (ai_settings, alien_width): "" "Bir sıraya sığan uzaylıların sayısını belirleyin." "" available_space_x = ai_settings.screen_width-2 * alien_width number_aliens_x = int (available_space_x / (2 * alien_width)) dönüş number_aliens_x def get_number_rows (ai_settings, ship_height, alien_height): "" "Ekrana sığan uzaylı sıralarının sayısını belirleyin." "" available_space_y = (ai_settings.screen_height- (3 * alien_height) -ship_height) number_rows = int (available_space_y / (2 * alien_height)) number_rows döndür def create_alien (ai_settings, screen, yabancılar, alien_number, row_number): "" "Bir uzaylı yaratın ve onu sıraya yerleştirin." "" alien = Alien (ai_settings, ekran) 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 * satır_sayısı uzaylılar.a gg (yabancı) def create_fleet (ai_settings, screen, ship, uzaylılar): "" "Tam bir uzaylı filosu oluşturun." "" # Bir uzaylı yaratın ve arka arkaya uzaylıların sayısını bulun. alien = Alien (ai_settings, ekran) 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) # Uzaylılardan oluşan filoyu oluşturun. aralıktaki satır_numarası için (sayı_sıra): aralıktaki alien_number için (number_aliens_x): create_alien (ai_settings, screen, uzaylılar, alien_number, satır numarası)

Ana işlev

Pygame'i içe aktar pygame.sprite import Grubundan ayarlardan içe aktarma Ayarları game_stats'tan GameStats'i içe aktar çetele içe aktarmadan Puan Tablosu düğmeden içe aktarma Düğmesinden gemi ithalat gemisinden game_functions'ı gf olarak içe aktar def run_game: # Pygame, ayarlar ve ekran nesnesini başlatın. pygame.init ai_settings = Ayarlar screen = pygame.display.set_mode ( (ai_settings.screen_width, ai_settings.screen_height)) pygame.display.set_caption ("Uzaylı İstilası") # Oynat düğmesini yapın. play_button = Düğme (ai_settings, ekran, "Oynat") # Oyun istatistiklerini saklamak için bir örnek ve bir puan tablosu oluşturun. istatistikler = GameStats (ai_settings) sb = Skor Tablosu (ai_settings, ekran, istatistikler) # Arka plan rengini ayarlayın. bg_color = (230, 230, 230) # Bir gemi, bir grup mermi ve bir grup uzaylı yapın. ship = Ship (ai_settings, ekran) bullets = Grup uzaylılar = Grup # Uzaylılardan oluşan filoyu oluşturun. gf.create_fleet (ai_settings, screen, ship, uzaylılar) # Oyun için ana döngüyü başlatın. True iken: gf.check_events (ai_settings, screen, stats, sb, play_button, ship, uzaylılar, mermiler) stats.game_active ise: ship.update gf.update_bullets (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler) gf.update_aliens (ai_settings, ekran, istatistikler, sb, gemi, uzaylılar, mermiler) gf.update_screen (ai_settings, screen, stats, sb, ship, uzaylılar, madde işaretleri, play_button) run_game

Uzaylılar oluşturun

Pygame'i içe aktar pygame.sprite'dan içe aktarma Sprite sınıf Alien (Sprite): "" "Filodaki tek bir uzaylıyı temsil eden bir sınıf." "" def __init __ (self, ai_settings, ekran): "" "Uzaylıyı başlatın ve başlangıç konumunu ayarlayın." "" super (Alien, self) .__ init__ self.screen = ekran self.ai_settings = ai_settings # Yabancı resmi yükleyin ve rect niteliğini ayarlayın. self.image = pygame.image.load ('images / alien.bmp') self.rect = self.image.get_rect # Ekranın sol üst köşesine yakın her yeni uzaylıyı başlatın. self.rect.x = self.rect.width self.rect.y = self.rect.height # Uzaylının tam konumunu saklayın. self.x = float (self.rect.x) def check_edges (öz): "" "Uzaylı ekranın kenarındaysa True döndür." "" screen_rect = self.screen.get_rect eğer öz. doğruysa > = screen_rect.right: True döndür elif self.rect.left < = 0: True döndür def güncelleme (kendi kendine): "" "Uzaylıyı sağa veya sola hareket ettirin." "" self.x + = (self.ai_settings.alien_speed_factor * self.ai_settings.fleet_direction) self.rect.x = self.x def blitme (kendi): "" "Uzaylıyı mevcut konumunda çizin." "" self.screen.blit (self.image, self.rect)

Bir oyun başlatma düğmesi oluşturun

pygame.font içe aktar sınıf Düğmesi: def __içinde__ (self, ai_settings, screen, msg): "" "Düğme özelliklerini başlatın." "" self.screen = ekran self.screen_rect = screen.get_rect # Düğmenin boyutlarını ve özelliklerini ayarlayın. self.width, self.height = 200, 50 self.button_color = (0, 255, 0) self.text_color = (255, 255, 255) self.font = pygame.font.SysFont (Yok, 48) # Düğmenin rect nesnesini oluşturun ve ortalayın. self.rect = pygame.Rect (0, 0, self.width, self.height) self.rect.center = self.screen_rect.center # Düğme mesajının yalnızca bir kez hazırlanması gerekir. self.prep_msg (msg) def prep_msg (öz, mesaj): "" "Mesajı işlenmiş bir resme dönüştürün ve düğmenin üzerindeki metni ortalayın." "" 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 (kendi): # Boş düğme çizin, ardından mesajı çizin. self.screen.fill (self.button_color, self.rect) self.screen.blit (self.msg_image, self.msg_image_rect)

Oyun durumu sınıfı oluştur

sınıf GameStats: "" "Uzaylı İstilası için istatistikleri izleyin." "" def __init __ (self, ai_settings): "" "İstatistikleri başlatın." "" self.ai_settings = ai_settings self.reset_stats # Oyunu aktif olmayan bir durumda başlatın. self.game_active = False # Yüksek puan asla sıfırlanmamalıdır. self.high_score = 0 def reset_stats (self): "" "Oyun sırasında değişebilen istatistikleri başlatın." "" self.ships_left = self.ai_settings.ship_limit self.score = 0 self.level = 1

Bir puan tablosu oluşturun

pygame.font içe aktar pygame.sprite import Grubundan gemi ithalat gemisinden sınıf Puan Tablosu: "" "Puanlama bilgilerini bildirmek için bir sınıf." "" def __içinde__ (self, ai_settings, ekran, istatistikler): "" "Puan tutma niteliklerini başlatın." "" self.screen = ekran self.screen_rect = screen.get_rect self.ai_settings = ai_settings self.stats = stats # Puanlama bilgileri için yazı tipi ayarları. self.text_color = (30, 30, 30) self.font = pygame.font.SysFont (Yok, 48) # İlk puan görüntülerini hazırlayın. self.prep_score self.prep_high_score self.prep_level self.prep_ships def prep_score (kendi): "" "Puanı oluşturulmuş bir resme dönüştürün." "" 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) # Ekranın sağ üst köşesinde puanı görüntüleyin. 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 (kendi): "" "Yüksek puanı işlenmiş bir görüntüye dönüştürün." "" 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) # Ekranın üst kısmında en yüksek puanı ortalayın. 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 (kendi): "" "Seviyeyi oluşturulmuş bir görüntüye dönüştürün." "" self.level_image = self.font.render (str (self.stats.level), True, self.text_color, self.ai_settings.bg_color) # Seviyeyi puanın altına yerleştirin. 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 (kendi): "" "Kaç tane gemi kaldığını göster." "" self.ships = Grup aralıktaki ship_number için (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.a gg (gemi) def show_score (kendi): "" "Puanı ekrana çizin." "" 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) # Gemileri çizin. self.ships.draw (self.screen)

Program çalışma etkisi aşağıdaki gibidir:

Oynat'a tıklayın:

Gemiyi hareket ettirmek için ok tuşlarını basılı tutun, mermi ateşlemek için boşluk çubuğunu basılı tutun.

Sorumluluk Reddi: Bu makale, CSDN blogger "AI Advanced" in yalnızca teknik alışverişler için kullanılan orijinal makalesidir.

"Linux bilmiyorum, nasıl programcı olabilirim?" Röportajcı: Ortadan kaldırılmayı bekliyorum
önceki
Bir bakışta 2020 teknoloji trendleri: AutoML, birleşik öğrenme, bulut oligark döneminin sonu
Sonraki
Dharma Academy 2020 Tahmini: Modülerlik Çip Tasarımının Eşiğini Düşürüyor | Çin'in BT Teknoloji Evrimi Hakkında Sorular
HTML5 kodu "cazibesi" ile arama motorlarının dikkatini nasıl çekebilir?
Python için en iyi 30 uygulama, ipucu ve püf noktası
Rust giriş kılavuzu: satır üstüne satır | CSDN blog seçimi
Her genç geliştiricinin bilmesi gereken altı şey
Guangxi, taşkın mevsiminde dağ demiryollarının güvenliğini sağlamak için demiryolu ağlarının bakımı için "uçak gemisi" gönderiyor
Wuxi Yuantouzhu kiraz çiçekleri en iyi izleme dönemine girer, turistler "Romantik Tarih" e gider
Yemek önerisi: lezzetli ananaslı kruvasan ekmeği
Geri dönüşüm kutusu kurtarma ücreti var mı? Dosyaları 1 dakika içinde bulmayı öğretmek
Eyalet Büyük Veri Bürosu "ikili kayıt" çalışmasını derinleştiriyor ve "yardım topluluğu salgını önleme" gönüllü faaliyetlerini başlatıyor
Baidu Industry Recovery Big Data: İşe alım arama popülaritesi% 165 arttı
Büyük ve küçük boncuklar yeşim tabağına düşer Loudinin kültür endüstrisinin gelişimini teşvik etmek için "Beş Ünlü Projesi" nin özeti
To Top