电脑知识|欧美黑人一区二区三区|软件|欧美黑人一级爽快片淫片高清|系统|欧美黑人狂野猛交老妇|数据库|服务器|编程开发|网络运营|知识问答|技术教程文章 - 好吧啦网

您的位置:首頁技術(shù)文章
文章詳情頁

python3實現(xiàn)飛機大戰(zhàn)

瀏覽:10日期:2022-07-03 18:10:17

本文實例為大家分享了python3實現(xiàn)飛機大戰(zhàn)的具體代碼,供大家參考,具體內(nèi)容如下

以下是親測Python飛機大戰(zhàn)全部代碼,在保證有pygame環(huán)境支持并且有Python3解釋器的話完全沒問題!

如果大家喜歡的話麻煩點個贊!

運行效果如下圖:

python3實現(xiàn)飛機大戰(zhàn)

#!/usr/bin/env python3# -*- coding: utf-8 -*-# 導(dǎo)入需要使用的模塊import pygamefrom pygame.locals import *from sys import exit import random# 設(shè)置屏幕大小的變量SCREEN_WIDTH = 480SCREEN_HEIGHT = 800import codecs# 子彈類class Bullet(pygame.sprite.Sprite): def __init__(self,bullet_img,init_pos): # 實現(xiàn)父類的初始化方法 pygame.sprite.Sprite.__init__(self) self.image = bullet_img self.rect = self.image.get_rect() self.rect.midbottom = init_pos self.speed = 10 def move(self): self.rect.top -= self.speed # 玩家飛機類class Player(pygame.sprite.Sprite): def __init__(self,plane_img,player_rect,init_pos): pygame.sprite.Sprite.__init__(self) self.image=[] for i in range(len(player_rect)): self.image.append(plane_img.subsurface(player_rect[i]).convert_alpha()) self.rect = player_rect[0] self.rect.topleft = init_pos self.speed = 8 self.bullets = pygame.sprite.Group() #玩家飛機發(fā)射子彈的集合 self.img_index = 0 self.is_hit = False # 發(fā)射子彈 def shoot(self,bullet_img): bullet = Bullet(bullet_img,self.rect.midtop) self.bullets.add(bullet) # 將子彈放入玩家飛機的子彈集合 # 向上移動 def moveUp(self): if self.rect.top <= 0: self.rect.top = 0 else: self.rect.top -= self.speed # 向下移動 def moveDown(self): if self.rect.top >= SCREEN_HEIGHT - self.rect.height: self.rect.top = SCREEN_HEIGHT - self.rect.height else: self.rect.top += self.speed # 向左移動 def moveLeft(self): if self.rect.left <= 0: self.rect.left = 0 else: self.rect.left -= self.speed # 向右移動 def moveRight(self): if self.rect.left >= SCREEN_WIDTH - self.rect.width: self.rect.left = SCREEN_WIDTH - self.rect.width else: self.rect.left += self.speed# 敵機類class Enemy(pygame.sprite.Sprite): # 飛機的圖片 敵機墜毀的圖片 敵機的位置 def __init__(self,enemy_img,enemy_down_imgs,init_pos): pygame.sprite.Sprite.__init__(self) self.image = enemy_img self.rect = self.image.get_rect() self.rect.topleft = init_pos self.down_imgs = enemy_down_imgs self.speed = 2 self.down_index = 0 # 移動 def move(self): self.rect.top += self.speed # 對文件的操作# 寫入文本# 要寫入的內(nèi)容,寫入方式,寫入文件所在的位置def write_txt(contert, strim, path): f = codecs.open(path,strim, ’utf8’) f.write(str(contert)) f.close()# 讀取文本def read_txt(path): with open(path,’r’,encoding=’utf8’) as f: lines = f.readlines() return lines # 初始化pygamepygame.init()# 設(shè)置游戲界面的大小,背景圖片,標題# 界面startGame(screen = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT))# 標題pygame.display.set_caption(’飛機大戰(zhàn)’)# 圖標ic_launcher = pygame.image.load(’resources/image/ic_launcher.png’).convert_alpha()pygame.display.set_icon(ic_launcher)# 背景圖background = pygame.image.load(’resources/image/background.png’).convert()# 游戲結(jié)束game_over = pygame.image.load(’resources/image/gameover.png’)# 飛機及子彈的圖片plane_img = pygame.image.load(’resources/image/shoot.png’)def startGame(): # 1.設(shè)置玩家飛機不同狀態(tài)的圖片列表,多張圖片展示為動畫效果 player_rect = [] # 玩家飛機的圖片 player_rect.append(pygame.Rect(0,99,102,126)) player_rect.append(pygame.Rect(165,360,102,126)) # 玩家飛機爆炸的圖片 player_rect.append(pygame.Rect(165,234,102,126)) player_rect.append(pygame.Rect(330,634,102,126)) player_rect.append(pygame.Rect(330,498,102,126)) player_rect.append(pygame.Rect(432,624,102,126)) player_pos = [200,600] # 生成玩家飛機類 player = Player(plane_img,player_rect,player_pos) # 加入子彈的圖片 bullet_rect = pygame.Rect(69,77,10,21) bullet_img = plane_img.subsurface(bullet_rect) # 加入敵機圖片 enemy1_rect = pygame.Rect(534,612,57,43) #沒有爆炸前的圖片 enemy1_img = plane_img.subsurface(enemy1_rect) enemy1_down_imgs = [] #飛機銷毀后的圖片 enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267,347,57,43))) enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(873,679,57,43))) enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(267,296,57,43))) enemy1_down_imgs.append(plane_img.subsurface(pygame.Rect(930,697,57,43))) # 存儲敵機的集合 enmies1 = pygame.sprite.Group() # 存儲被擊毀的敵機的集合 enemies_down = pygame.sprite.Group() # 初始子彈射擊頻率 shoot_frequency = 0 # 初始化敵機生成頻率 enemy_frequency = 0 # 玩家飛機被擊中后的效果處理 player_down_index = 16 # 設(shè)置游戲的幀數(shù) clock = pygame.time.Clock() # 初始化成績 score = 0 # 判斷循環(huán)結(jié)束的參數(shù) running = True while running: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() screen.fill(0) screen.blit(background,(0,0)) clock.tick(60) # 生成子彈 判斷玩家有沒有被擊中 if not player.is_hit: if shoot_frequency % 15 == 0: player.shoot(bullet_img) shoot_frequency += 1 if shoot_frequency >= 15: shoot_frequency = 0 for bullet in player.bullets: bullet.move() if bullet.rect.bottom<0: player.bullets.remove(bullet) # 顯示子彈 player.bullets.draw(screen) # 生成敵機,..需要控制頻率 if enemy_frequency % 50 == 0: #生成隨機的位置 enemy1_pos = [random.randint(0,SCREEN_WIDTH-enemy1_rect.width),0] # 初始化敵機 enemy1 = Enemy(enemy1_img,enemy1_down_imgs,enemy1_pos) # 存儲到集合中 enmies1.add(enemy1) enemy_frequency += 1 # 敵機生成到 100 則重新循環(huán) if enemy_frequency >= 100: enemy_frequency = 0 # 敵機的移動 for enemy in enmies1: enemy.move() # 敵機與玩家碰撞效果處理 if pygame.sprite.collide_circle(enemy,player): # pygame判定是否相撞的方法 enemies_down.add(enemy) # 將敵機加入到墜毀的集合中 enmies1.remove(enemy) # 從敵機集合中移除 player.is_hit = True break # 移動出屏幕的敵機 if enemy.rect.top < 0: enmies1.remove(enemy) # 與子彈碰撞 enemies1_down = pygame.sprite.groupcollide(enmies1,player.bullets,1,1) for enemy_down in enemies1_down: enemies_down.add(enemy_down) # 繪制玩家飛機 if not player.is_hit: screen.blit(player.image[player.img_index],player.rect) # 實現(xiàn)飛機動效 player.img_index = shoot_frequency // 8 else: # 玩家飛機被擊毀后的動畫效果 player.img_index = player_down_index // 8 screen.blit(player.image[player.img_index],player.rect) player_down_index += 1 if player_down_index > 47: running = False # 敵機被擊中的效果 for enemy_down in enemies_down: if enemy_down.down_index == 0: pass if enemy_down.down_index > 7: enemies_down.remove(enemy_down) score += 100 continue # 繪制碰撞動畫 screen.blit(enemy_down.down_imgs[enemy_down.down_index // 2],enemy_down.rect) enemy_down.down_index += 1 # 顯示敵機 enmies1.draw(screen) # 繪制當前得分 score_font = pygame.font.Font(None,36) score_text = score_font.render(str(score),True,(128,128,128)) text_rect = score_text.get_rect() text_rect.topleft = [10,10] screen.blit(score_text,text_rect) # 獲取鍵盤的輸入 key_pressed = pygame.key.get_pressed() if key_pressed[K_UP] or key_pressed[K_w]: player.moveUp() if key_pressed[K_DOWN] or key_pressed[K_s]: player.moveDown() if key_pressed[K_LEFT] or key_pressed[K_a]: player.moveLeft() if key_pressed[K_RIGHT] or key_pressed[K_d]: player.moveRight() pygame.display.update() # 繪制游戲結(jié)束畫面 screen.blit(game_over,(0,0)) # 繪制Game Over顯示最終分數(shù) font = pygame.font.Font(None,48) text = font.render('Score:'+str(score),True,(255,0,0)) text_rect = text.get_rect() text_rect.centerx = screen.get_rect().centerx # x軸位置 text_rect.centery = screen.get_rect().centery + 24 # y軸位置 screen.blit(text,text_rect) # 使用字體 xtfont = pygame.font.SysFont('jamrul',30) # 繪制重新開始按鈕 textstart = xtfont.render(’Start’,True,(255,0,0)) text_rect = textstart.get_rect() text_rect.centerx = screen.get_rect().centerx # x軸位置 text_rect.centery = screen.get_rect().centery + 120 # y軸位置 screen.blit(textstart,text_rect) # 排行榜按鈕 textstart = xtfont.render(’Ranking’,True,(255,0,0)) text_rect = textstart.get_rect() text_rect.centerx = screen.get_rect().centerx # x軸位置 text_rect.centery = screen.get_rect().centery + 180 # y軸位置 screen.blit(textstart,text_rect) # 判斷得分更新排行榜 # 臨時變量 j = 0 # 讀取文件 arrayscore = read_txt(r’score.txt’)[0].split(’mr’) # 循環(huán)分數(shù)列表在列表里排序 for i in range(0,len(arrayscore)): if score > int(arrayscore[i]): # 大于排行榜上的內(nèi)容 把分數(shù)和當前分數(shù)進行替換 j = arraysco.re[i] arrayscore[i] = str(score) score = 0 # 替換下來的分數(shù)移動一位 if int(j) > int(arrayscore[i]): k = arrayscore[i] arrayscore[i] = str(j) j = k # 循環(huán)分數(shù)列表 寫入文檔 for i in range(0,len(arrayscore)): # 判斷列表的第一個分數(shù) if i == 0: write_txt(arrayscore[i]+’mr’,’w’,r’score.txt’) else: # 判斷是否是最后一個 if (i==9): # 最近添加內(nèi)容最后一個分數(shù)不加 mr write_txt(arrayscore[i],’a’,r’score.txt’) else: # 不是最后一個分數(shù),添加的時候加 mr write_txt(arrayscore[i]+’mr’,’a’,r’score.txt’)# 定義排行榜函數(shù)def gameRanking(): # 繪制背景圖片 screen2 = pygame.display.set_mode((SCREEN_WIDTH,SCREEN_HEIGHT)) screen2.fill(0) screen2.blit(background,(0,0)) # 使用系統(tǒng)字體 xtfont = pygame.font.SysFont(’jamrul’,30) # 1.繪制標題 textstart = xtfont.render(’Ranking’,True,(255,0,0)) text_rect = textstart.get_rect() text_rect.centerx = screen.get_rect().centerx # x軸位置 text_rect.centery = 50 # y軸位置 screen.blit(textstart,text_rect) # 2.繪制重新開始按鈕 textstart = xtfont.render(’Start’,True,(255,0,0)) text_rect = textstart.get_rect() text_rect.centerx = screen.get_rect().centerx # x軸位置 text_rect.centery = screen.get_rect().centery + 120 # y軸位置 screen.blit(textstart,text_rect) # 3.展示排行榜的數(shù)據(jù) arrayscore = read_txt(r’score.txt’)[0].split(’mr’) for i in range(0,len(arrayscore)): font = pygame.font.Font(None,48) # 編寫排名 k = i+1 text = font.render(str(k) + ' '+arrayscore[i],True,(255,0,0)) text_rect = text.get_rect() text_rect.centerx = screen2.get_rect().centerx text_rect.centery = 80 + 30*k # 繪制分數(shù) screen2.blit(text,text_rect)startGame()while True: for event in pygame.event.get(): if event.type == pygame.QUIT: exit() # 監(jiān)控鼠標的點擊 elif event.type == pygame.MOUSEBUTTONDOWN: # 判定重新開始范圍 if screen.get_rect().centerx - 70 <= event.pos[0] and event.pos[0] <= screen.get_rect().centerx + 50 and screen.get_rect().centery + 100 <= event.pos[1] and screen.get_rect().centery + 140 >= event.pos[1]: startGame() # 判定排行榜范圍 if screen.get_rect().centerx - 70 <= event.pos[0] and event.pos[0] <= screen.get_rect().centerx + 50 and screen.get_rect().centery + 160 <= event.pos[1] and screen.get_rect().centery + 200 >= event.pos[1]: gameRanking()pygame.display.update()

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持好吧啦網(wǎng)。

標簽: Python 編程
相關(guān)文章:
主站蜘蛛池模板: 免费网站网址收录网_海企优网站推荐平台 | 水稻烘干机,小麦烘干机,大豆烘干机,玉米烘干机,粮食烘干机_巩义市锦华粮食烘干机械制造有限公司 水环真空泵厂家,2bv真空泵,2be真空泵-淄博真空设备厂 | 电动葫芦-河北悍象起重机械有限公司 | 德国BOSCH电磁阀-德国HERION电磁阀-JOUCOMATIC电磁阀|乾拓百科 | 环氧树脂地坪_防静电地坪漆_环氧地坪漆涂料厂家-地壹涂料地坪漆 环球电气之家-中国专业电气电子产品行业服务网站! | 减速机三参数组合探头|TSM803|壁挂式氧化锆分析仪探头-安徽鹏宸电气有限公司 | 企业管理培训,企业培训公开课,企业内训课程,企业培训师 - 名课堂企业管理培训网 | 迪威娱乐|迪威娱乐客服|18183620002 | 品牌策划-品牌设计-济南之式传媒广告有限公司官网-提供品牌整合丨影视创意丨公关活动丨数字营销丨自媒体运营丨数字营销 | 郑州大巴车出租|中巴车租赁|旅游大巴租车|包车|郑州旅游大巴车租赁有限公司 | 南京种植牙医院【官方挂号】_南京治疗种植牙医院那个好_南京看种植牙哪里好_南京茀莱堡口腔医院 尼龙PA610树脂,尼龙PA612树脂,尼龙PA1010树脂,透明尼龙-谷骐科技【官网】 | 隐形纱窗|防护纱窗|金刚网防盗纱窗|韦柏纱窗|上海青木装潢制品有限公司|纱窗国标起草单位 | 博莱特空压机|博莱特-阿特拉斯独资空压机品牌核心代理商 | 电动卫生级调节阀,电动防爆球阀,电动软密封蝶阀,气动高压球阀,气动对夹蝶阀,气动V型调节球阀-上海川沪阀门有限公司 | 天津市能谱科技有限公司-专业的红外光谱仪_红外测油仪_紫外测油仪_红外制样附件_傅里叶红外光谱技术生产服务厂商 | 成都APP开发-成都App定制-成都app开发公司-【未来久】 | 胶辊硫化罐_胶鞋硫化罐_硫化罐厂家-山东鑫泰鑫智能装备有限公司 意大利Frascold/富士豪压缩机_富士豪半封闭压缩机_富士豪活塞压缩机_富士豪螺杆压缩机 | 乐之康护 - 专业护工服务平台,提供医院陪护-居家照护-居家康复 | ◆大型吹塑加工|吹塑加工|吹塑代加工|吹塑加工厂|吹塑设备|滚塑加工|滚塑代加工-莱力奇塑业有限公司 | 北京公积金代办/租房发票/租房备案-北京金鼎源公积金提取服务中心 | 衡阳耐适防护科技有限公司——威仕盾焊接防护用品官网/焊工手套/焊接防护服/皮革防护手套 | IIS7站长之家-站长工具-爱网站请使用IIS7站长综合查询工具,中国站长【WWW.IIS7.COM】 | 全自动不干胶贴标机_套标机-上海今昂贴标机生产厂家 | 高楼航空障碍灯厂家哪家好_航空障碍灯厂家_广州北斗星障碍灯有限公司 | 电地暖-电采暖-发热膜-石墨烯电热膜品牌加盟-暖季地暖厂家 | NMRV减速机|铝合金减速机|蜗轮蜗杆减速机|NMRV减速机厂家-东莞市台机减速机有限公司 | 桥架-槽式电缆桥架-镀锌桥架-托盘式桥架 - 上海亮族电缆桥架制造有限公司 | 洛阳防爆合格证办理-洛阳防爆认证机构-洛阳申请国家防爆合格证-洛阳本安防爆认证代办-洛阳沪南抚防爆电气技术服务有限公司 | 智慧水务|智慧供排水利信息化|水厂软硬件系统-上海敢创 | 岛津二手液相色谱仪,岛津10A液相,安捷伦二手液相,安捷伦1100液相-杭州森尼欧科学仪器有限公司 | 钢结构厂房造价_钢结构厂房预算_轻钢结构厂房_山东三维钢结构公司 | 美国HASKEL增压泵-伊莱科elettrotec流量开关-上海方未机械设备有限公司 | 罗茨真空机组,立式无油往复真空泵,2BV水环真空泵-力侨真空科技 | 展厅设计公司,展厅公司,展厅设计,展厅施工,展厅装修,企业展厅,展馆设计公司-深圳广州展厅设计公司 | 手机存放柜,超市储物柜,电子储物柜,自动寄存柜,行李寄存柜,自动存包柜,条码存包柜-上海天琪实业有限公司 | 称重传感器,测力传感器,拉压力传感器,压力变送器,扭矩传感器,南京凯基特电气有限公司 | 袋式过滤器,自清洗过滤器,保安过滤器,篮式过滤器,气体过滤器,全自动过滤器,反冲洗过滤器,管道过滤器,无锡驰业环保科技有限公司 | China plate rolling machine manufacturer,cone rolling machine-Saint Fighter | 四川实木门_成都实木门 - 蓬溪聚成门业有限公司 | 伊卡洛斯软装首页-电动窗帘,别墅窗帘,定制窗帘,江浙沪1000+别墅窗帘案例 | 除尘器布袋骨架,除尘器滤袋,除尘器骨架,电磁脉冲阀膜片,卸灰阀,螺旋输送机-泊头市天润环保机械设备有限公司 |