python坦克大战_Life is short,you need Python——Python实现坦克大战(一)
先展示一下效果
搓搓小手手,坦克大戰(zhàn)即將開(kāi)始……h(huán)ttps://www.zhihu.com/video/1140743290784817152一、游戲引擎的安裝
安裝方式有兩種:1.pip安裝
windows + R --> cmd --> pip install pygame
2.pycharm安裝
File -->setting -->project -->prioect Interpreter -->右側(cè) + install --> 搜索輸入pygame -->左下方installpackage
驗(yàn)證pygame安裝是否成功
import pygame運(yùn)行結(jié)果: pygame 1.9.6 Hello from the pygame community. https://www.pygame.org/contribute.html二.項(xiàng)目的需求(基于面向?qū)ο蟮姆治?:
有哪些類,不同的類具有的功能
1.主邏輯類
開(kāi)始游戲
結(jié)束游戲
2.坦克類(1.我方坦克 2.敵方坦克)
移動(dòng)
射擊
展示
3.子彈類
移動(dòng)
展示
4.爆炸效果類
展示爆炸效果
5.墻壁類
屬性:坦克和子彈是否可以通過(guò)
6.音效類
播放背景音樂(lè),射擊音效,爆炸音效
三.坦克大戰(zhàn)項(xiàng)目框架的搭建
涉及到的類,用代碼簡(jiǎn)單的實(shí)現(xiàn)
import pygameclass MainGame:"""主游戲類"""def __init__(self):passdef startGame(self):"""開(kāi)始游戲"""passdef endGame(self):"""結(jié)束游戲"""passclass Tank:"""坦克類"""def __init__(self):passdef move(self):"""坦克的移動(dòng)"""passdef shot(self):"""坦克的射擊"""passdef displayTank(self):"""展示坦克"""passclass MyTank(Tank):"""我方坦克類"""def __init__(self):passclass EnemyTank(Tank):"""敵方坦克類"""def __init__(self):passclass Bullet:"""子彈類"""def __init__(self):passdef move(self):"""子彈的移動(dòng)"""passdef displayBullet(self):"""展示子彈"""passclass Explode:"""爆炸效果類"""def __init__(self):passdef displayExplode(self):"""展示爆炸效果"""passclass Wall:"""墻壁類"""def __init__(self):passdef dispalyWall(self):"""展示墻壁"""passclass Music:"""音效類"""def __init__(self):passdef play(self):"""開(kāi)始播放音樂(lè)"""pass四.項(xiàng)目開(kāi)始:
1.創(chuàng)建游戲窗口
用到游戲引擎中的功能模塊:
查看官方開(kāi)發(fā)文檔 http://www.pygame.org/docs/
運(yùn)行結(jié)果:
2.事件處理
運(yùn)行結(jié)果:
3.實(shí)現(xiàn)左上角文字提示內(nèi)容
模塊:font
import pygame_display = pygame.display COLOR_BLACK = pygame.Color(0, 0, 0) # 窗口顏色 COLOR_RED = pygame.Color(255, 0, 0) # 窗口左上角文字顏色class MainGame:"""主游戲類"""window = None # 游戲主窗口SCREEN_HEIGHT = 500 # 窗口的高度SCREEN_WIDTH = 800 # 窗口的寬度def __init__(self):passdef startGame(self):"""開(kāi)始游戲"""_display.init() # 初始化窗口# 創(chuàng)建窗口并加載窗口(借鑒官方文檔)MainGame.window = _display.set_mode([MainGame.SCREEN_WIDTH, MainGame.SCREEN_HEIGHT])_display.set_caption("坦克大戰(zhàn)v1.05") # 設(shè)置游戲的標(biāo)題# 讓窗口持續(xù)刷新while True:MainGame.window.fill(COLOR_BLACK) # 給窗口完成一個(gè)填充顏色# 將繪制文字的小畫(huà)布粘貼到窗口中MainGame.window.blit(self.getTextSurface("剩余敵方坦克{(lán)}輛".format(5)), (5, 5))self.getEvent() # 在循環(huán)中持續(xù)完成事件的獲取_display.update() # 窗口的刷新def getEvent(self):"""獲取程序運(yùn)行期間所有的鼠標(biāo)和鍵盤事件"""eventList = pygame.event.get() # 獲取所有的事件# 對(duì)事件進(jìn)行判斷處理(1.點(diǎn)擊鼠標(biāo)關(guān)閉按鈕 2.按下鍵盤上的某個(gè)按鍵)for event in eventList:# 判斷event.type是否為QUIT,如果是,直接調(diào)用程序結(jié)束方法if event.type == pygame.QUIT:self.endGame()# 判斷事件是否為鍵盤按鍵操作,如果是,繼續(xù)判斷按鍵是哪一個(gè)按鍵,并進(jìn)行對(duì)應(yīng)的處理if event.type == pygame.KEYDOWN:# 具體是哪個(gè)按鍵的處理if event.key == pygame.K_LEFT:print("坦克向左調(diào)頭,移動(dòng)")elif event.key == pygame.K_RIGHT:print("坦克向右調(diào)頭,移動(dòng)")elif event.key == pygame.K_UP:print("坦克向上調(diào)頭,移動(dòng)")elif event.key == pygame.K_DOWN:print("坦克向下調(diào)頭,移動(dòng)")elif event.key == pygame.K_SPACE:print("發(fā)射子彈")def getTextSurface(self, text):pygame.font.init() # 初始化字體模塊# fontList = pygame.font.get_fonts() # 查看系統(tǒng)支持的所有字體# print(fontList)font = pygame.font.SysFont('kaiti', 20) # 選一個(gè)合適的字體textSurface = font.render(text, True, COLOR_RED) # 使用對(duì)應(yīng)的字符完成相關(guān)內(nèi)容的繪制return textSurfacedef endGame(self):"""結(jié)束游戲"""print("謝謝使用")exit() # 結(jié)束python解釋器class Tank:"""坦克類"""def __init__(self):passdef move(self):"""坦克的移動(dòng)"""passdef shot(self):"""坦克的射擊"""passdef displayTank(self):"""展示坦克"""passclass MyTank(Tank):"""我方坦克類"""def __init__(self):passclass EnemyTank(Tank):"""敵方坦克類"""def __init__(self):passclass Bullet:"""子彈類"""def __init__(self):passdef move(self):"""子彈的移動(dòng)"""passdef displayBullet(self):"""展示子彈"""passclass Explode:"""爆炸效果類"""def __init__(self):passdef displayExplode(self):"""展示爆炸效果"""passclass Wall:"""墻壁類"""def __init__(self):passdef dispalyWall(self):"""展示墻壁"""passclass Music:"""音效類"""def __init__(self):passdef play(self):"""開(kāi)始播放音樂(lè)"""passMainGame().startGame()運(yùn)行結(jié)果:
4.加載我方坦克
素材:
import pygame_display = pygame.display COLOR_BLACK = pygame.Color(0, 0, 0) # 窗口顏色 COLOR_RED = pygame.Color(255, 0, 0) # 窗口左上角文字顏色class MainGame:"""主游戲類"""window = None # 游戲主窗口SCREEN_WIDTH = 800 # 窗口的寬度SCREEN_HEIGHT = 500 # 窗口的高度TANK_P1 = None # 我方坦克def __init__(self):passdef startGame(self):"""開(kāi)始游戲"""_display.init() # 初始化窗口# 創(chuàng)建窗口并加載窗口(借鑒官方文檔)MainGame.window = _display.set_mode([MainGame.SCREEN_WIDTH, MainGame.SCREEN_HEIGHT])MainGame.TANK_P1 = Tank(MainGame.SCREEN_WIDTH // 2, MainGame.SCREEN_HEIGHT - 70) # 創(chuàng)建我方坦克_display.set_caption("坦克大戰(zhàn)v1.06") # 設(shè)置游戲的標(biāo)題# 讓窗口持續(xù)刷新while True:MainGame.window.fill(COLOR_BLACK) # 給窗口完成一個(gè)填充顏色# 將繪制文字的小畫(huà)布粘貼到窗口中MainGame.window.blit(self.getTextSurface("剩余敵方坦克{(lán)}輛".format(5)), (5, 5))# 將我方坦克加入到窗口中MainGame.TANK_P1.displayTank()self.getEvent() # 在循環(huán)中持續(xù)完成事件的獲取_display.update() # 窗口的刷新def getEvent(self):"""獲取程序運(yùn)行期間所有的鼠標(biāo)和鍵盤事件"""eventList = pygame.event.get() # 獲取所有的事件# 對(duì)事件進(jìn)行判斷處理(1.點(diǎn)擊鼠標(biāo)關(guān)閉按鈕 2.按下鍵盤上的某個(gè)按鍵)for event in eventList:# 判斷event.type是否為QUIT,如果是,直接調(diào)用程序結(jié)束方法if event.type == pygame.QUIT:self.endGame()# 判斷事件是否為鍵盤按鍵操作,如果是,繼續(xù)判斷按鍵是哪一個(gè)按鍵,并進(jìn)行對(duì)應(yīng)的處理if event.type == pygame.KEYDOWN:# 具體是哪個(gè)按鍵的處理if event.key == pygame.K_LEFT:print("坦克向左調(diào)頭,移動(dòng)")elif event.key == pygame.K_RIGHT:print("坦克向右調(diào)頭,移動(dòng)")elif event.key == pygame.K_UP:print("坦克向上調(diào)頭,移動(dòng)")elif event.key == pygame.K_DOWN:print("坦克向下調(diào)頭,移動(dòng)")elif event.key == pygame.K_SPACE:print("發(fā)射子彈")def getTextSurface(self, text):pygame.font.init() # 初始化字體模塊# fontList = pygame.font.get_fonts() # 查看系統(tǒng)支持的所有字體# print(fontList)font = pygame.font.SysFont('kaiti', 20) # 選一個(gè)合適的字體textSurface = font.render(text, True, COLOR_RED) # 使用對(duì)應(yīng)的字符完成相關(guān)內(nèi)容的繪制return textSurfacedef endGame(self):"""結(jié)束游戲"""print("謝謝使用")exit() # 結(jié)束python解釋器class Tank:"""坦克類"""def __init__(self, left, top):self.images = {'D': pygame.image.load('img/tank_1_D.jpg'),'U': pygame.image.load('img/tank_1_U.jpg'),'L': pygame.image.load('img/tank_1_L.jpg'),'R': pygame.image.load('img/tank_1_R.jpg'),} # 四個(gè)方向,四個(gè)圖片self.direction = 'U' # 初始方向?yàn)樯蟬elf.image = self.images[self.direction] # 根據(jù)方向選擇對(duì)應(yīng)的圖片# 坦克所在的區(qū)域 Rect-->self.rect = self.image.get_rect()# 指定坦克初始化位置分別距x,y軸的位置self.rect.left = leftself.rect.top = topdef move(self):"""坦克的移動(dòng)"""passdef shot(self):"""坦克的射擊"""passdef displayTank(self):"""展示坦克(將坦克繪制到窗口中,使用blit())"""# 重新設(shè)置坦克的圖片self.image = self.images[self.direction]# 將坦克加載到窗口中MainGame.window.blit(self.image, self.rect)class MyTank(Tank):"""我方坦克類"""def __init__(self):passclass EnemyTank(Tank):"""敵方坦克類"""def __init__(self):passclass Bullet:"""子彈類"""def __init__(self):passdef move(self):"""子彈的移動(dòng)"""passdef displayBullet(self):"""展示子彈"""passclass Explode:"""爆炸效果類"""def __init__(self):passdef displayExplode(self):"""展示爆炸效果"""passclass Wall:"""墻壁類"""def __init__(self):passdef dispalyWall(self):"""展示墻壁"""passclass Music:"""音效類"""def __init__(self):passdef play(self):"""開(kāi)始播放音樂(lè)"""passMainGame().startGame()運(yùn)行結(jié)果:
5.坦克類新增speed屬性,用來(lái)控制坦克移動(dòng)快慢
6.事件處理:
運(yùn)行結(jié)果:
可以朝各個(gè)方向移動(dòng)了https://www.zhihu.com/video/1141070523843960832字?jǐn)?shù)上限,新開(kāi)一篇……
Life is short,you need Python——Python實(shí)現(xiàn)坦克大戰(zhàn)(二)
皮卡丘比特:Life is short,you need Python——Python實(shí)現(xiàn)坦克大戰(zhàn)(二)?zhuanlan.zhihu.com總結(jié)
以上是生活随笔為你收集整理的python坦克大战_Life is short,you need Python——Python实现坦克大战(一)的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Struts2_2_解决配置文件冗余_动
- 下一篇: python子进程修改父进程内变量_如何