当我给表弟用python写了个雷霆战机后
才讀小學的表弟,一到周末就打擾我上分,別人都是三年高考五年模擬,那我不一樣,我直接給他寫了個游戲自己到一邊玩去,總不能教他爬蟲吧,小小年紀不合適~
一、準備工作
使用的軟件版本:
- Python3.6
- pycharm2019 專業版
你們用其它的也可以,沒有軟件的話我放在最后面了
這兩個模塊安裝一下
- pygame
- random
win+r打開運行框輸入cmd,按回車打開命令提示符窗口,輸入pip install 空格加上你要安裝的模塊,下載慢的話就換一下國內鏡像源,因為它默認下載的是國外的,所以會慢一點。
我們要準備這些東西
1、字體文件
2、背景音樂文件
3、背景圖片
可以自己設計,自己準備,名字改成一樣的就好了。
當然,你也可以改成其他名字,但是代碼里的名字你也得改
二、代碼展示
算了我直接放代碼吧,有點長,你們肯定堅持不下去看,我都放注釋里去講,這樣你們才看的下去。
#導入模塊 import pygame, os import time import random from pygame.sprite import Sprite from pygame.sprite import Groupdef fire\_music():pass# 設置開火音樂# effect = pygame.mixer.Sound('sounds/fire.wav')# pygame.mixer.Sound.play(effect)class Boss(Sprite):def \_\_init\_\_(self,boss\_img\_name):super().\_\_init\_\_()# 加載BOSS圖片self.image = pygame.image.load('圖片/'+boss\_img\_name+'.png').convert\_alpha()# 轉換BOSS大小# self.image = pygame.transform.scale(self.image, (1, 12))# 生成BOSS矩形框架self.rect = self.image.get\_rect()self.blood \= 1000# boss左右移動的速度self.speed = 3.5def move(self):if self.rect.centerx>=512:self.speed \=-self.speedif self.rect.centerx<=0:self.speed \= -self.speedself.rect.centerx +=self.speedclass Enemy(Sprite):def \_\_init\_\_(self,screen): super().\_\_init\_\_()# 獲取屏幕對象self.screen = screen# 隨機 生成5個編號alien\_num = random.randint(1,5)# 隨機 加載五個飛機中的某個self.image = pygame.image.load('圖片/alien\_' + str(alien\_num) + '.png')# picture = pygame.transform.scale(picture, (1280, 720))self.image = pygame.transform.scale(self.image,(62,62))# 獲取飛機的 rectself.rect = self.image.get\_rect()# 擊落本機獲得的分數self.score = 10# 加載子彈的圖片self.bullet\_img = pygame.image.load("圖片/alien\_bullet.png").convert\_alpha()self.bullet\_img \= pygame.transform.scale(self.bullet\_img, (12, 12))# 以下為可以調節子彈尺寸的代碼# picture = pygame.transform.scale(picture, (1280, 720))#飛機的移動速度self.speed = random.randint(3,5)#生成子彈精靈組合self.bullets = Group()# 敵機射擊頻率self.shoot\_frequency = 0# 飛機出現def move(self):self.rect.top += 5#暫時不用射擊# self.shoot()# self.moveBullet()# 發射子彈def shoot(self):if self.shoot\_frequency % 200 == 0:bullet \= Enemy\_Bullet(self.bullet\_img, self.rect.midbottom)self.bullets.add(bullet)self.shoot\_frequency += 1if self.shoot\_frequency > 200:self.shoot\_frequency \= 1# 刪除子彈def moveBullet(self):for bullet in self.bullets:bullet.move()if bullet.rect.bottom < 0:self.bullets.remove(bullet)# 繪制子彈def drawBullets(self, scr):self.bullets.draw(scr)class Enemy\_Bullet(pygame.sprite.Sprite):def \_\_init\_\_(self, init\_pos):pygame.sprite.Sprite.\_\_init\_\_(self)self.image \= pygame.image.load("圖片/alien\_bullet.png").convert\_alpha()self.image \= pygame.transform.scale(self.image, (12, 12))self.rect \= self.image.get\_rect()# 敵機子彈初始位置設置self.rect.midbottom = init\_posself.rect.centery +=36self.speed \= 8def move(self):self.rect.top += self.speed class MyHero(Sprite):\_rate \= 100 # 每幀停留的毫秒數def \_\_init\_\_(self,screen,size = 1):super().\_\_init\_\_()# 獲取屏幕對象self.screen = screen# 獲取整張圖片self.image\_big = pygame.image.load('圖片/hero.png').convert\_alpha()# subsurface 形成大圖的子表面框架# 獲取飛機正面圖片self.image = self.image\_big.subsurface(pygame.Rect(120, 0, 318 - 240, 87))# 獲取飛機正面矩形框架尺寸self.rect = self.image.get\_rect()# 獲取屏幕對象矩形self.screen\_rect = screen.get\_rect()# 獲取屏幕正中x坐標self.rect.centerx = self.screen\_rect.centerx# 獲取屏幕底部y坐標self.rect.centery = self.screen\_rect.bottom - self.rect.height# 設置飛機初始位置self.centerX = float(self.rect.centerx)self.centerY \= float(self.rect.centery)# 飛機尾焰self.air = None# 設置飛機尾焰位置self.air\_rect = pygame.Rect(self.centerX - 20,self.centerY+int((self.rect.height+72)/2)-10-36,40,72)#玩家所有發射子彈的集合self.bullets = Group()self.bullet\_image \= pygame.image.load('圖片/bullet\_1.png').convert\_alpha()# 子彈射擊def shoot(self):# 產生一顆子彈實例bullet = Bullet(self.bullet\_image,self.rect.midtop)# 在group子彈精靈集合中加入子彈self.bullets.add(bullet)# 子彈刪除def moveBullet(self):# 逐個檢查子彈精靈集合 到達屏幕頂端的子彈刪除for bullet in self.bullets:bullet.move()if bullet.rect.bottom < 0:self.bullets.remove(bullet)# 子彈顯示def drawBullets(self, scr):# 將精靈集合中的子彈繪制到屏幕上self.bullets.draw(scr)# 向上飛時,增加噴射火焰def set\_air(self, case):if case == 'up':air \= pygame.image.load('圖片/air.png').convert\_alpha()img \= air.subsurface(pygame.Rect(80, 0, 50, 87))self.air \= imgelif case == 'remove':self.air \= None# 根據移動方向獲取飛機移動狀態的圖片def set\_image(self, case):if case=='left':rect \= pygame.Rect(195,0,318-248,87)image \= self.image\_big.subsurface(rect)elif case =='right':rect \= pygame.Rect(195,0,318-248,87)image \= pygame.transform.flip(self.image\_big.subsurface(rect), True, False)elif case == 'up' or case == 'down':rect \= pygame.Rect(120, 0, 318 - 240, 87)image \= self.image\_big.subsurface(rect)self.image \= imageclass Bullet(pygame.sprite.Sprite):def \_\_init\_\_(self, bullet\_img, init\_pos):pygame.sprite.Sprite.\_\_init\_\_(self)self.image \= bullet\_imgself.rect \= bullet\_img.get\_rect()self.rect.midbottom \= init\_posself.speed \= 25def move(self):self.rect.top \-= self.speed# 初始化pygame pygame.init() # pygame.mixer.init() # pygame.mixer\_music.load('sounds/enviro.mp3') # 加載播放音樂 # pygame.mixer.music.play(-1) #-1 為循環播放 # 設置游戲主題 pygame.display.set\_caption('雷電飛機') # 初始化屏幕大小 screen = pygame.display.set\_mode((512,768))# 設置游戲背景圖片 # 游戲剛開始時的背景圖 bg\_img0 = pygame.image.load('圖片/start\_bg.jpg').convert() # 加載游戲開始圖標 start\_img = pygame.image.load('圖片/start.png').convert\_alpha() start\_rect \= start\_img.get\_rect() start\_rect.centerx \= 262 start\_rect.centery \= 455 # 游戲進行中的背景圖 bg\_img1 = pygame.image.load('圖片/map1.jpg').convert() bg\_img2 \= bg\_img1.copy() # 游戲結束時的背景圖 bg\_img3 = pygame.image.load('圖片/map3.jpg').convert() # 加載游戲結束圖標 gameover\_img = pygame.image.load('圖片/gameover.png').convert\_alpha() # 加載游戲成功圖標 gamesuccess = pygame.image.load('圖片/success.png').convert\_alpha()# 加載重玩圖標 restart\_img = pygame.image.load('圖片/restart.png').convert\_alpha() restart\_rect \= restart\_img.get\_rect() restart\_rect.centerx \= 249 restart\_rect.centery \= 420 # 背景圖片初始位置 pos\_y1 = -768 pos\_y2 \= 0# 實例化BOSS boss = Boss('boss\_1') bosses \= Group() bosses.add(boss) # 測試主角圖片 # air = pygame.image.load('圖片/air.png').convert\_alpha() # img = air.subsurface(pygame.Rect(80, 0, 50, 87)) # image\_big = pygame.image.load('圖片/hero.png').convert\_alpha() # image = image\_big.subsurface(pygame.Rect(195,0,318-248,87))# 生成我方飛機 student\_plane = MyHero(screen)# 生成敵方飛機 # 生成敵機group enemies = Group() # 生成敵機子彈 enemy\_bullets = Group() max\_enemies \= 9 # 設置敵機數量總數為9 # 敵機隨機出現的節奏 下方randint參數 為43,55 ran1,ran2 = 30,40# 生成計時頻率變量 sec = 0 # 生成分數 score = 0 # 設置系統字體 my\_font = pygame.font.Font('fonts/msyh.ttf', 18)# 游戲主循環 # 設置游戲狀態 開始 結束 game = 'wait'while True:# 游戲在等待狀態if game =='wait':# 最小游戲框架一個都不能省略for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()# 檢測鼠標是否按下 重新開始按鈕if event.type == pygame.MOUSEBUTTONDOWN:# 檢測鼠標點擊位置是否與重啟rect重疊if start\_rect.collidepoint(event.pos):student\_plane.\_\_init\_\_(screen)game \= 'ing'# 游戲結束游戲畫面暫停screen.blit(bg\_img0, (0, 0))screen.blit(start\_img, start\_rect)# 測試尾焰位置pygame.display.flip()time.sleep(0.05)# 游戲進行狀態elif game == 'ing':# 設置這3行 監聽事件 并且內部設定了延遲防止游戲卡死# 屏幕滾動-----------------------------------------------------screen.blit(bg\_img1, (0, pos\_y1))screen.blit(bg\_img2, (0, pos\_y2))# 測試尾焰位置# screen.blit(img, (100, 100))pos\_y1 += 1pos\_y2 += 1# 屏幕背景滾動完畢后重置位置if pos\_y1 >= 0:pos\_y1 \= -768if pos\_y2 >= 768:pos\_y2 \= 0for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()# 監聽鍵盤事件# 按鍵彈起取消飛機向上尾焰 矯正飛機姿勢if event.type == pygame.KEYUP:student\_plane.set\_image('down')student\_plane.air \= None# 發射子彈if event.type == pygame.KEYDOWN:if event.key == pygame.K\_SPACE and len(student\_plane.bullets) <6: # 檢查子彈集合的數量限制子彈最大數量fire\_music()# 產生一顆子彈實例# 在group子彈精靈集合中加入子彈student\_plane.shoot()# 將精靈集合中的子彈繪制到屏幕上student\_plane.drawBullets(screen)# 逐個檢查子彈精靈集合 到達屏幕頂端的子彈刪除student\_plane.moveBullet()keys \= pygame.key.get\_pressed()if keys\[pygame.K\_a\]:# 設置飛機狀態圖片student\_plane.set\_image('left')if student\_plane.rect.centerx>=40:student\_plane.rect.centerx \-=8.5elif keys\[pygame.K\_d\]:# 設置飛機狀態圖片student\_plane.set\_image('right')if student\_plane.rect.centerx <= 478:student\_plane.rect.centerx +=8.5elif keys\[pygame.K\_w\]:#設置飛機狀態圖片student\_plane.set\_image('up')student\_plane.set\_air('up')if student\_plane.rect.centery >= 45:student\_plane.rect.centery \-=8.5elif keys\[pygame.K\_s\]:# 設置飛機狀態圖片student\_plane.set\_image('down')if student\_plane.rect.centery <= 727:student\_plane.rect.centery +=8.5# 顯示飛機screen.blit(student\_plane.image,student\_plane.rect)if student\_plane.air != None:screen.blit(student\_plane.air, (student\_plane.rect.centerx\-30, student\_plane.rect.centery+33))# 敵機 ---------------------------------------------------------------------------------------# 敵機移動# 控制時間節奏 sec變量sec +=1#隨機控制生成敵機的節奏rhy = random.randint(ran1,ran2)# 敵機最多數量if sec%rhy ==0 and len(enemies) < max\_enemies or sec ==1: # 設置敵機數量總數為9# 生成一只敵機enemy = Enemy(screen)enemy.rect.centerx\=random.randint(0,512)# 生成上述敵機的子彈enemy\_bullet = Enemy\_Bullet((enemy.rect.centerx,enemy.rect.centery))# 敵機group 和 敵機子彈group加載敵機和子彈enemies.add(enemy)enemy\_bullets.add(enemy\_bullet)# 敵機出現 和 敵機子彈出現enemies.draw(screen)enemy\_bullets.draw(screen)# 迭代敵機集合for enemy in enemies:# 讓每個對象移動起來enemy.move()# 敵機超出屏幕邊界后 自動刪除敵機collision\_over1 = pygame.sprite.collide\_rect(student\_plane, enemy)if collision\_over1:# 為了重啟游戲時 防止有舊子彈和飛機存在enemies.remove(enemy)game \= 'over'if enemy.rect.bottom >768:enemies.remove(enemy)for enemy\_bullet in enemy\_bullets:# 讓每個對象移動起來enemy\_bullet.move()collision\_over2 \= pygame.sprite.collide\_rect(student\_plane, enemy\_bullet)if collision\_over2:# 為了重啟游戲時 防止有舊子彈和飛機存在enemy\_bullets.remove(enemy\_bullet)game \= 'over'# 敵機子彈超出屏幕邊界后 自動刪除敵機if enemy\_bullet.rect.bottom >768:enemy\_bullets.remove(enemy\_bullet)# -----------------------Boss --------------------------if score >=140:# 小敵機出現的節奏ran1,ran2 = 15,25max\_enemies \= 17screen.blit(boss.image,boss.rect)boss.move()for my\_bullet in student\_plane.bullets:hit\_boss \= pygame.sprite.collide\_rect(boss,my\_bullet)if hit\_boss:boss.blood \-=1.2score+=1if boss.blood <=0:game \= 'success'# 處理碰撞 ---------------------------碰撞檢測--------------------------------------------------# 參數:# group1:精靈組1。# group2:精靈組2。# dokill1:發生碰撞時,是否銷毀精靈組1中的發生碰撞的精靈。# dokill2:發生碰撞時,是否銷毀精靈組2中的發生碰撞的精靈。collisions = pygame.sprite.groupcollide(student\_plane.bullets, enemies, True, True)if collisions:score+=10# -----------游戲結束------------# 分數和獎勵的顯示-------------------------------------------------------------------------surface1 = my\_font.render(u"當前得分:%s"%(score),True,\[255,0,0\])screen.blit(surface1,\[20,20\])# 更新畫面pygame.display.flip()# 設置幀數和延遲time.sleep(0.05)#游戲結束狀態elif game == 'over':score \= 0# 最小游戲框架一個都不能省略for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()# 檢測鼠標是否按下 重新開始按鈕if event.type == pygame.MOUSEBUTTONDOWN:# 檢測鼠標點擊位置是否與重啟rect重疊if restart\_rect.collidepoint(event.pos):student\_plane.\_\_init\_\_(screen)game \= 'ing'# 游戲結束游戲畫面暫停screen.blit(bg\_img1, (0, pos\_y1))screen.blit(bg\_img2, (0, pos\_y2))screen.blit(gameover\_img, (163, 310))screen.blit(restart\_img, restart\_rect)# 測試尾焰位置# screen.blit(img, (100, 100))pos\_y1 += 0pos\_y2 += 0pygame.display.flip()time.sleep(0.05)# surface2 = my\_font.render("Game Over" , True, \[255, 0, 0\])# screen.blit(surface1, \[250, 350\])elif game == 'success':score \= 0boss.blood \= 1000# 最小游戲框架一個都不能省略for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()# 檢測鼠標是否按下 重新開始按鈕if event.type == pygame.MOUSEBUTTONDOWN:# 檢測鼠標點擊位置是否與重啟rect重疊if restart\_rect.collidepoint(event.pos):student\_plane.\_\_init\_\_(screen)game \= 'ing'# 游戲結束游戲畫面暫停screen.blit(bg\_img1, (0, pos\_y1))screen.blit(bg\_img2, (0, pos\_y2))screen.blit(gamesuccess, (170, 220))screen.blit(restart\_img, restart\_rect)# 測試尾焰位置# screen.blit(img, (100, 100))pos\_y1 += 0pos\_y2 += 0pygame.display.flip()time.sleep(0.05)三、效果展示
我們來看看運行效果,玩的有點菜
兄弟們,代碼我都直接給你們了,看完點個贊轉發一下唄~
***
這里我為大家準備了一份針對零基礎的Python學習資料,有興趣的同學可以看看哦。
「 Python經驗分享 」
學好 Python 不論是就業還是做副業賺錢都不錯,但要學會 Python 還是要有一個學習規劃。最后給大家免費分享一份全套的 Python 學習資料,給那些想學習 Python 的小伙伴們一點幫助!
一、Python所有方向的學習路線
Python所有方向路線就是把Python常用的技術點做整理,形成各個領域的知識點匯總,它的用處就在于,你可以按照上面的知識點去找對應的學習資源,保證自己學得較為全面。
二、學習軟件
工欲善其事必先利其器。學習Python常用的開發軟件都在這里了,給大家節省了很多時間。
三、入門學習視頻
我們在看視頻學習的時候,不能光動眼動腦不動手,比較科學的學習方法是在理解之后運用它們,這時候練手項目就很適合了。
四、實戰案例
光學理論是沒用的,要學會跟著一起敲,要動手實操,才能將自己的所學運用到實際當中去,這時候可以搞點實戰案例來學習。
五、面試資料
我們學習Python必然是為了找到高薪的工作,下面這些面試題是來自阿里、騰訊、字節等一線互聯網大廠最新的面試資料,并且有阿里大佬給出了權威的解答,刷完這一套面試資料相信大家都能找到滿意的工作。
這份完整版的Python全套學習資料已經上傳CSDN
朋友們如果需要可以微信掃描下方CSDN官方認證二維碼免費領取【保證100%免費】。
總結
以上是生活随笔為你收集整理的当我给表弟用python写了个雷霆战机后的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 重庆计算机一级考试试题及答案,全新重庆计
- 下一篇: 【Python杂记】:课程表生成日历程序