当前位置: 首页>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飛機大戰
  • 科幻游戲
  • pygame外星人入侵,python外星人入侵小游戲
  • 用python入侵別人手機,python外星人入侵游戲圖片_Python外星人入侵游戲編程完整版
  • 誰是外星人游戲,20_外星人游戲項目03——
  • python游戲腳本開發,python 外星人游戲怎么打開_Python外星人入侵游戲開發—創建游戲窗口
  • 用python入侵別人手機,python小游戲----外星人入侵
  • python游戲腳本開發,python 外星人游戲下載大全_【Python】Python制作外星人入侵小游戲
  • python播放聲音模塊,python外星人入侵添加音效_python外星人入侵游戲打包
  • python飛機大戰源碼,基于pygame的飛船大戰外星人游戲
  • python 外星人入侵游戲 學習總結 以及完整代碼
  • 有外星人入侵嗎,python外星人入侵游戲代碼_python外星人入侵 游戲源碼
  • python飛機大戰源碼,python項目——外星人入侵游戲
  • 純python開發的大型游戲,Python之外星人游戲(帶源碼和圖片資源)項目
  • python編程書籍推薦,培訓python排行榜
  • bilibili播放量排行榜,b站每日排行榜爬蟲
  • python爬蟲爬取網頁表格數據,python爬蟲爬取歌曲_python爬蟲實戰:爬取全站小說排行榜
  • 爬蟲爬取網站之家,【Python爬蟲】用Python爬取娛樂圈排行榜數據
  • 可以用python寫網頁嗎,有關python的比賽_用 Python 寫一個 Kaggle 比賽排行榜的爬蟲
  • python django框架,python開源框架排行_Python開源項目最新月榜TOP 10
  • 用python刷網頁瀏覽量,用Python獲取公眾號閱讀數、點贊數。
  • 用python做一個簡單的游戲,python有什么好玩的書_史上最全的Python書排行榜|你想知道的都在這里
  • python庫大全一覽,總結!Github年度最強Python庫排行榜
  • python b站 排行_Python爬蟲抓取B站小視頻排行榜,新手也可以跟著做哦!
  • ubuntu運行安卓app,ubuntu AndroiStudio 中 外設(手機、平板) 無法使用
  • ad軟件怎么將原理圖生成pcb,AD20怎樣生成PCB文件??
  • 基于python的影評數據分析,python爬取《你好, 李煥英》豆瓣評論數據
  • 測試顯卡性能的工具,技嘉顯卡性能測試軟件,你好六啊!GTX 1660 Ti深度測試:升吧
  • 捕獲異常的方法有,Scala系列20:Scala中異常捕獲與拋出異常
  • 通過thread類創建線程,【0805作業】繼承Thread類創建線程,輸出20次數字,“你好”,線程名
  • ip靜態,Centos7 配置靜態 IP 地址
  • ip靜態,Centos7 安裝,配置靜態IP