当前位置: 首页>Python>正文

python飛機大戰源碼,基于pygame的飛船大戰外星人游戲

python飛機大戰源碼,基于pygame的飛船大戰外星人游戲

作為一名熱愛玩游戲且正在學習Python的小白,自然對“做游戲”產生了濃厚的興趣。正好《Python從入門到實踐》一書中有一個游戲項目,自己便拿來邊學邊練手。
真正自己做游戲才明白開發游戲是一件多么難的事,但凡有一個方面考慮不周可能游戲就會產生bug,所以對游戲的那些狗策劃倒也有了些同情,,,
言歸正傳,下面是游戲的代碼,左右鍵移動,空格鍵射擊,諸君可以自己運行玩一玩。
整個游戲代碼主要由以下幾部分組成:

  1. 主函數gogo.py
  2. 飛船模塊Ship.py
  3. 外星人模塊alien.py
  4. 設置模塊Setting.py
  5. 包含大部分系統功能的模塊game_function.py
  6. 子彈模塊biu.py
  7. 負責存儲系統信息的模塊gamestate.py
  8. 按鈕模塊button.py
  9. 計分板模塊scoreboard.py

gogo.py

import pygame
import game_function as gf
#設置
from Settings import Settings
#宇宙飛船類
from Ship import Ship
#創建子彈編組
from pygame.sprite import Group
#w外星人
from alien import Alien
#數據存儲類
from gamestate import Gamestate
#按鈕類
from button import Button
#計分板
from scoreboard import Scoreboard
#運行游戲
def main():pygame.init()setting=Settings()screen=pygame.display.set_mode((setting.screen_width,setting.screen_height))pygame.display.set_caption("Alien Invasion")ship=Ship(setting,screen)bius=Group()aliens=Group()gf.creat_aliens(setting,screen,aliens,ship)state=Gamestate(setting)play_button=Button(screen,setting,'PLAY')score_board=Scoreboard(screen,setting,state)while True:gf.check_events(ship,setting,screen,bius,play_button,state,aliens,score_board)if state.alive and state.game:ship.move()gf.biu_update(aliens, bius, setting, screen, ship, state, score_board)# gf.jiancepengzhuang(aliens,bius,setting,screen,ship,state,score_board)gf.update_aliens(aliens,setting,ship,state,screen,bius,score_board)gf.update_screen(screen,setting,ship,bius,aliens,play_button,state,score_board)if __name__=='__main__':main()

Ship.py

import pygame
from pygame.sprite import Sprite
from Settings import Settings
class Ship(Sprite):#初始化飛船def __init__(self,setting,screen):super(Ship,self).__init__()self.screen=screenself.image=pygame.image.load('D:/ship.BMP')self.rect=self.image.get_rect()self.seting=Settings()self.screen_rect=screen.get_rect()#放置位置self.rect.centerx=self.screen_rect.centerxself.locate=float(self.rect.centerx)self.rect.bottom=self.screen_rect.bottomself.moving_right=Falseself.moving_left=Falsedef move(self):if self.moving_right and self.rect.centerx<self.screen_rect.right:self.locate+=self.seting.ship_speedif self.moving_left and self.rect.centerx>0:self.locate-=self.seting.ship_speedself.rect.centerx=self.locatedef Blitme(self):self.screen.blit(self.image,self.rect)def center_ship(self):self.center=self.screen_rect.centerx

Setting.py

import pygame
import sys
class Settings(object):def __init__(self):#屏幕設置self.screen_color=(230,230,230)self.screen_width=1200self.screen_height=600#飛船設置self.ship_num = 1#子彈設置self.biu_height=15self.biu_color=(60,60,60)self.biu_num=10self.alien_speed=1self.alien_downspeed=5self.flag=1self.ship_num=1self.game_speed=1.1self.static_gg()def static_gg(self):self.ship_speed = 1.5self.biu_speed = 1self.biu_width = 5self.alien_speed = 1self.alien_point = 50def level_up(self):self.ship_speed*=self.game_speedself.biu_speed*=self.game_speedself.biu_width *=1.5self.alien_speed*=self.game_speedself.alien_point=int(self.alien_point*self.game_speed)

alien.py

import pygame
from pygame.sprite import Spriteclass Alien(Sprite):def __init__(self,screen,setting):super().__init__()self.screen=screenself.setting=settingself.image=pygame.image.load('D://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 check_edge(self):screen_rect=self.screen.get_rect()if self.rect.right>screen_rect.right:return Trueelif self.rect.left<0:return Truedef update(self):self.x+=self.setting.alien_speed*self.setting.flagself.rect.x=self.xdef blitalien(self):self.screen.blit(self.image,self.rect)

game_function.py

import pygame
import sys
from biu import Biu
from alien import Alien
from time import sleep
#鍵位按下
def key_down(event,ship,setting,bius,screen):if event.key == pygame.K_RIGHT:ship.moving_right = Trueelif event.key == pygame.K_LEFT:ship.moving_left = Trueelif event.key==pygame.K_SPACE:if len(bius)<=setting.biu_num:new_biu=Biu(setting,screen,ship)bius.add(new_biu)
#鍵位抬開
def key_up(event,ship):if event.key == pygame.K_RIGHT:ship.moving_right = Falseelif event.key == pygame.K_LEFT:ship.moving_left = False#檢查事件
def check_play_button(state,play_button,mouse_x,mouse_y,aliens,ship,bius,setting,screen,score_board):if play_button.rect.collidepoint(mouse_x,mouse_y):setting.static_gg()state.rest_stats()state.game=Truealiens.empty()bius.empty()creat_aliens(setting,screen,aliens,ship)ship.center_ship()score_board.creatscore()score_board.creatlevel()score_board.creatship()
def check_events(ship,setting,screen,bius,play_button,state,aliens,score_board):for event in pygame.event.get():if event.type == pygame.QUIT:sys.exit()elif event.type==pygame.KEYDOWN:key_down(event,ship,setting,bius,screen)elif event.type==pygame.KEYUP:key_up(event,ship)elif event.type==pygame.MOUSEBUTTONDOWN:mouse_x,mouse_y=pygame.mouse.get_pos()check_play_button(state,play_button,mouse_x,mouse_y,aliens,ship,bius,setting,screen,score_board)#子彈發射
def biu_update(aliens, bius, setting, screen, ship, state, score_board):bius.update()# 刪除已經飛出屏幕的子彈for biu in bius.copy():if biu.rect.bottom < 0:bius.remove(biu)jiancepengzhuang(aliens, bius, setting, screen, ship, state, score_board)
def get_num_x(setting,alien_width):allowed_long = setting.screen_width - 2 * alien_widthnum_aliens_x = int(allowed_long / (2 * alien_width))return num_aliens_x
def get_num_y(setting,ship_height,alien_height):allowed_y=(setting.screen_height-3*alien_height-ship_height)num_aliens_y=int(allowed_y/(2*alien_height))return num_aliens_ydef creat_alien(setting,screen,aliens,num_aliens_x,num_aliens_y):alien = Alien(screen, setting)alien_width = alien.rect.widthalien.x = alien_width + 2 * alien_width * num_aliens_xalien.y = alien.rect.height+2*alien.rect.height*num_aliens_yalien.rect.x=alien.xalien.rect.y=alien.yaliens.add(alien)
def creat_aliens(setting,screen,aliens,ship):alien=Alien(screen,setting)num_aliens_x=get_num_x(setting,alien.rect.width)num_aliens_y=get_num_y(setting,ship.rect.height,alien.rect.height)for numy in range(num_aliens_y):for num in range(num_aliens_x):creat_alien(setting,screen,aliens,num,numy)
def change(setting,aliens):for alien in aliens:alien.rect.y+=setting.alien_downspeedsetting.flag*=-1
def checkedge(setting,aliens):for alien in aliens:if alien.check_edge():change(setting,aliens)break
def ship_hit(setting,state,screen,ship,aliens,bius,score_board):if state.ship_left>0:state.ship_left-=1score_board.creatship()aliens.empty()bius.empty()creat_aliens(setting,screen,aliens,ship)ship.center_ship()sleep(0.5)else:state.alive=Falsestate.game=False
def update_aliens(aliens,setting,ship,state,screen,bius,score_board):checkedge(setting,aliens)aliens.update()if pygame.sprite.spritecollideany(ship,aliens):ship_hit(setting,state,screen,ship,aliens,bius,score_board)check_alien_bottom(setting,state,screen,ship,aliens,bius)
def jiancepengzhuang(aliens,bius,setting,screen,ship,state,score_board):gg=pygame.sprite.groupcollide(bius,aliens,True,True)for aliens in gg.values():state.score+=setting.alien_point*len(aliens)score_board.creatscore()score_board.show_score()if len(aliens)==0:setting.level_up()bius.empty()state.level+=1score_board.creatlevel()score_board.show_score()creat_aliens(setting,screen,aliens,ship)
def check_alien_bottom(setting,state,screen,ship,aliens,bius):screen_rect=screen.get_rect()for alien in aliens:if alien.rect.bottom>=screen_rect.bottom:ship_hit(setting, state, screen, ship, aliens, bius)breakdef update_screen(screen,setting,ship,bius,aliens,paly_button,state,score_board):screen.fill(setting.screen_color)ship.Blitme()for biu in bius:biu.draw()aliens.draw(screen)score_board.show_score()if not state.game:paly_button.draw_button()# 讓最新變化可見pygame.display.flip()

biu.py

import pygame
from pygame.sprite import Spriteclass Biu(Sprite):def __init__(self,setting,screen,ship):super(Biu,self).__init__()self.screen=screenself.rect=pygame.Rect(0,0,setting.biu_width,setting.biu_height)self.rect.centerx=ship.rect.centerxself.rect.top=ship.rect.topself.y=float(self.rect.y)self.color=setting.biu_colorself.speed=setting.biu_speeddef update(self):self.y-=self.speedself.rect.y=self.ydef draw(self):pygame.draw.rect(self.screen,self.color,self.rect)

gamestate.py

class Gamestate():def __init__(self,setting):self.setting=settingself.rest_stats()self.game=Falsedef rest_stats(self):self.ship_left=self.setting.ship_numself.alive=Trueself.score=0self.level=1

button.py

import pygame.fontclass Button():def __init__(self,screen,setting,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.creatmsg(msg)def creatmsg(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)

scordboard.py

import pygame.font
from pygame.sprite import Group
from Ship import Ship
class Scoreboard():def __init__(self,screen,setting,state):self.screen=screenself.screen_rect=screen.get_rect()self.setting=settingself.state=stateself.text_color=(30,30,30)self.font=pygame.font.SysFont(None,48)self.creatscore()self.creatlevel()self.creatship()def creatship(self):self.ships=Group()for ship_num in range(self.state.ship_left):ship=Ship(self.setting,self.screen)ship.rect.x=10+ship_num*ship.rect.widthship.rect.y=10self.ships.add(ship)def creatlevel(self):self.level_image=self.font.render(str(self.state.level),True,self.text_color,self.setting.screen_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 creatscore(self):rounded_score=int(round(self.state.score,-1))score_str="{:,}".format(rounded_score)self.image=self.font.render(score_str,True,self.text_color,self.setting.screen_color)self.score_rect=self.image.get_rect()self.score_rect.right=self.screen_rect.right-20self.score_rect.top=20def show_score(self):self.screen.blit(self.image,self.score_rect)self.screen.blit(self.level_image,self.level_rect)self.ships.draw(self.screen)

游戲運行的時候如圖(單擊play開始):

代碼暫時就是這樣,還有一些補充后序我會更新的,比如最高分當然游戲還是有bug,如果你太強了,玩到子彈大約有三個屏幕寬的時候游戲便會炸掉orz,溜了
最大的毛病就是幾乎沒有注釋,經過做一次這種項目我是深深了解了注釋有多么重要!如果我還有時間一定會回來把這個補充完整的!

在這里插入圖片描述

https://www.nshth.com/python/338572.html
>

相关文章:

  • python飛機大戰源碼
  • py飛機大戰簡單代碼
  • pygame做的著名游戲
  • 機甲大戰外星人
  • python外星人入侵游戲
  • 星際飛船游戲
  • pygame飛機大戰
  • 科幻游戲
  • 國二python難嗎,python字符串(二)
  • 電腦軟件下載app,在電腦上體驗了 16 款手機 App 后,我很失望
  • elasticsearch中文文檔,Elastic安全分析新利器 —— Event Query Language (EQL) 介紹
  • 數據結構與算法python,[FreeCodeCamp筆記] Python 數據結構和算法1 二分搜索 Binary Search
  • 黑蘋果macOS系統鏡像工具,MacOS Monterey 12.2.1 (21D62) OC 0.7.8 / Cl 5144 / PE 三分區原版黑蘋果鏡像
  • 51單片機畢業設計論文,【畢業設計】基于單片機無線充電的4軸飛行器 -物聯網 嵌入式 stm32
  • 數據庫基礎知識整理,數據庫筆記整理
  • python運行不報錯又無任何結果輸出,linux 正確錯誤輸出_報告錯誤的正確方法
  • 計算機組成原理第六版課后答案,杭電計算機組成原理實驗九R-I,杭電計組實驗9-實現R-I型指令的CPU設計實驗.doc
  • python面向對象,Python零基礎速成班-第10講-Python面向對象編程(下),Property屬性、特殊方法、設計模式、鏈表應用
  • 數據庫視圖是什么,【SpringMVC】SpringMVC模型數據+視圖解析器
  • mp3格式轉換器,FFmpeg支持的音頻和視頻編解碼格式
  • 音樂學校招生要求,學校的音樂樓
  • c語言輸入兩個數輸出較大數,C語言求兩個數的較大值
  • 定義一個函數求三個數的最大值,輸入兩個整數,要求輸出其中值較大者。要求用函數求出最大值
  • MySQL學習 DAY1
  • 一個眼神一個微笑就讓人滿足,看得到的微笑
  • centos7安裝MySQL,centos7下載spark連接mysql數據庫提取數據(pyspark,Scala,python獨立執行)
  • node.js開發,從零開始nodejs系列文章-nodejs到底能干什么
  • python控制軟件自動化,Python實現網站自動登錄---傻瓜教程
  • get all of,resent = msg.get_all('Resent-Date') AttributeError: 'str' object h
  • opencv人體動作識別,torchvision使用keypoint rcnn 進行人體關鍵點定位
  • 深度卷積神經網絡原理與實踐,卷積神經網絡resent網絡實踐
  • 服務器,win服務器系統路由器,Windows server 2012 之路由功能
  • 小青蛙走迷宮的問題
  • 漢諾塔-小青蛙
  • 小青蛙oracle跟蹤,在小青蛙TOAD中用oracle語句寫
  • 音頻頻譜分析儀安卓版,[Android]自定義繪制一個簡易的音頻條形圖,附上對MP3音頻波形數據的采集與展現
  • 連乘符號∏的運算法則,∏這個是什么符號?
  • 用例失敗jenkins卻構建成功,jenkins 構建異常_jenkins構建失敗的原因是什么?