python 歷遍子彈_python之子彈移動

"""

新增功能:

完成我方坦克發射子彈的移動

"""

import pygame

import time

import random

win_width = 700

win_height = 500

bg_color = pygame.Color(0, 0, 0)

text_color = pygame.Color(255, 0, 0)

class MainGame():

window = None

my_tank = None

# 存儲敵方坦克的列表

enemyTankList = []

# 定義敵方坦克的數量

enemyTankCount = 5

# 存儲我方子彈的列表

myBulletList = []

def __init__(self):

pass

# 開始游戲

def startGame(self):

# 加載主窗口

# 初始化窗口

pygame.display.init()

# 設置窗口的大小以及顯示

MainGame.window = pygame.display.set_mode([win_width, win_height])

# 初始化我方坦克

MainGame.my_tank = Tank(200, 300)

# 初始化敵方坦克,并將敵方坦克添加到列表中

self.createEnemyTank()

# 設計標題

pygame.display.set_caption('坦克大戰1.0')

while True:

# 使用坦克移動的速度慢一些

time.sleep(0.02)

# 設置填充色

MainGame.window.fill(bg_color)

# 獲取事件

self.getEvent()

# 繪制文字

MainGame.window.blit(self.getTextSuface

('地方坦克剩余%d' % len(MainGame.enemyTankList)), (10, 10))

# 調用坦克顯示的方法

MainGame.my_tank.displayTank()

# 循環遍歷敵方坦克列表,展示敵方坦克

self.blitEnemyTank()

# 循環遍歷我方坦克的子彈

self.blitMyBullet()

# 調用移動方法

# 如果坦克的快關開啟,才可以移動

if not MainGame.my_tank.stop:

MainGame.my_tank.move()

pygame.display.update()

# 初始化敵方坦克,并將敵方坦克添加到列表中

def createEnemyTank(self):

top = 100

# 循環生成敵方坦克

for i in range(MainGame.enemyTankCount):

left = random.randint(0, 600)

speed = random.randint(1, 4)

enemy = EnemyTank(left, top, speed)

MainGame.enemyTankList.append(enemy)

# 循環遍歷敵方坦克列表,展示敵方坦克

def blitEnemyTank(self):

for enemyTank in MainGame.enemyTankList:

enemyTank.displayTank()

enemyTank.randMove()

# 循環遍歷我方坦克的子彈

def blitMyBullet(self):

for myBullet in MainGame.myBulletList:

myBullet.displayBullet()

# 調用子彈的移動方法

myBullet.move()

# 結束游戲

def endGame(self):

print('拜拜了您勒')

exit()

# 左上角文字的繪制

def getTextSuface(self, number):

# 查看所有的字體

# print('pygame.font.get_fonts()')

# 初始化字體模塊

pygame.font.init()

# 獲取字體Font對象

font = pygame.font.SysFont('華文行楷', 18)

# 繪制文字信息

textSurface = font.render(number, True, text_color)

return textSurface

# 獲取事件

def getEvent(self):

# 獲取所有事件

eventList = pygame.event.get()

# 遍歷事件

for event in eventList:

# 判斷按下的鍵是關閉,還是方向

# 如果按下的是退出

if event.type == pygame.QUIT:

self.endGame()

if event.type == pygame.KEYDOWN:

# 判斷按下的是上下左右

if event.key == pygame.K_LEFT:

MainGame.my_tank.direction = 'L'

# 修改坦克的開關狀態

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('左移')

elif event.key == pygame.K_RIGHT:

MainGame.my_tank.direction = 'R'

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('右移')

elif event.key == pygame.K_UP:

MainGame.my_tank.direction = 'U'

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('上移')

elif event.key == pygame.K_DOWN:

MainGame.my_tank.direction = 'D'

MainGame.my_tank.stop = False

# MainGame.my_tank.move()

print('下移')

elif event.key == pygame.K_SPACE:

print('發射子彈')

# 創建子彈 我方坦克發射

myBullet = Bullet(MainGame.my_tank)

MainGame.myBulletList.append(myBullet)

# 松開方向鍵,坦克停止移動,修改坦克的開關狀態

if event.type == pygame.KEYUP:

# 判斷松開的鍵是上下左右時候才停止坦克移動

if event.key == pygame.K_UP or event.key == pygame.K_DOWN or \

event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:

MainGame.my_tank.stop = True

class Tank():

# 距離上,左

def __init__(self, top, left):

# 保存加載的圖片

self.images = {'U': pygame.image.load('img/p1tankU.gif'),

'D': pygame.image.load('img/p1tankD.gif'),

'L': pygame.image.load('img/p1tankL.gif'),

'R': pygame.image.load('img/p1tankR.gif')}

# 方向

self.direction = 'U'

# 根據當前圖片的方向獲取圖片 surface

self.image = self.images[self.direction]

# 根據圖片獲取區域

self.rect = self.image.get_rect()

# 設置區域的left和top

self.rect.left = left

self.rect.top = top

# 速度 決定移動的快慢

self.speed = 2

# 坦克移動的開關

self.stop = True

# 移動

def move(self):

# 判斷坦克的方向進行移動

if self.direction == 'L':

if self.rect.left > 0:

self.rect.left -= self.speed

elif self.direction == 'U':

if self.rect.top > 0:

self.rect.top -= self.speed

elif self.direction == 'D':

if self.rect.top + self.rect.height < win_height:

self.rect.top += self.speed

elif self.direction == 'R':

if self.rect.left + self.rect.height < win_width:

self.rect.left += self.speed

# 射擊

def shoot(self):

pass

# 展示坦克

def displayTank(self):

# 獲取展示的對象

self.image = self.images[self.direction]

# 調用blit方法展示

MainGame.window.blit(self.image, self.rect)

# 我方坦克

class MyTank(Tank):

def __init__(self):

pass

# 敵方坦克

class EnemyTank(Tank):

def __init__(self, left, top, speed):

# 加載圖片集

self.images = {'U': pygame.image.load('img/enemy1U.gif'),

'D': pygame.image.load('img/enemy1D.gif'),

'L': pygame.image.load('img/enemy1L.gif'),

'R': pygame.image.load('img/enemy1R.gif')

}

# 方向,隨機生成敵方坦克的方向

self.direction = self.randDirection()

# 根據方向獲取圖片

self.image = self.images[self.direction]

# 區域

self.rect = self.image.get_rect()

# 對left和top進行賦值

self.rect.left = left

self.rect.top = top

# 速度

self.speed = speed

# 移動開關

self.stop = True

# 新增一個步數變量 step

self.step = 70

# 隨機生成敵方坦克的方向

def randDirection(self):

num = random.randint(1, 4)

if num == 1:

return 'U'

elif num == 2:

return 'D'

elif num == 3:

return 'L'

elif num == 4:

return 'R'

# 敵方隨機移動的方法

def randMove(self):

if self.step <= 0:

# 修改方向

self.direction = self.randDirection()

# 讓步數復位

self.step = 50

else:

self.move()

# 讓步數遞減

self.step -= 1

# 子彈類

class Bullet():

def __init__(self, tank):

# 加載圖片

self.image = pygame.image.load('img/enemymissile.gif')

# 坦克的方向決定子彈的方向

self.direction = tank.direction

# 獲取區域

self.rect = self.image.get_rect()

# 子彈的left和top與方向有關

if self.direction == 'U':

self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2

self.rect.top = tank.rect.top - self.rect.height

elif self.direction == 'D':

self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2

self.rect.top = tank.rect.top + tank.rect.height

elif self.direction == 'L':

self.rect.left = tank.rect.left - self.rect.width / 2 - self.rect.width / 2

self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2

elif self.direction == 'R':

self.rect.left = tank.rect.left + tank.rect.width

self.rect.top = tank.rect.top + tank.rect.width / 2 - self.rect.width / 2

# 子彈的速度

self.speed = 6

# 移動

def move(self):

if self.direction == 'U':

if self.rect.top > 0:

self.rect.top -= self.speed

else:

pass

elif self.direction == 'D':

if self.rect.top + self.rect.height < win_height:

self.rect.top += self.speed

else:

pass

elif self.direction == 'L':

if self.rect.left > 0:

self.rect.left -= self.speed

else:

pass

elif self.direction == 'R':

if self.rect.left + self.rect.width < win_width:

self.rect.left += self.speed

else:

pass

# 展示子彈

def displayBullet(self):

# 將圖片suface加載到窗口

MainGame.window.blit(self.image, self.rect)

# 墻壁

class Wall():

def __init__(self):

pass

# 展示墻壁

def displayWall(self):

pass

# 爆炸

class Explode():

def __init__(self):

pass

# 爆炸效果

def displayExplode(self):

pass

# 音效

class Music():

def __init__(self):

pass

# 展示音效

def displayMusic(self):

pass

if __name__ == '__main__':

MainGame().startGame()

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/535091.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/535091.shtml
英文地址,請注明出處:http://en.pswp.cn/news/535091.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【SpringBoot 2】(十)數據庫相關

寫在前面&#x1f6eb;更多知識總結見SpringBoot 2專欄 &#x1f695;本篇知識點總結自尚硅谷雷神的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

線性分組碼的最小漢明距為6_第二章 線性代數

2.1 標量、向量、矩陣和張量標量(scalar)一個標量就是一個單獨的數&#xff0c;用斜體表示標量。向量(vector)一個向量是一列有序排列的數&#xff0c;用粗寫的小寫字母表示。矩陣(matrix)矩陣式一個二維數組&#xff0c;其中的么一個元素由兩個索引(而非一個)所確定&#xff0…

【SpringBoot 2】(十一)單元測試JUnit 5 指標監控

寫在前面&#x1f6eb;更多知識總結見SpringBoot 2專欄 &#x1f695;本篇知識點總結自尚硅谷雷神的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

sklearn中lstm_分別用sklearn和tensorflow做房價預測

原標題&#xff1a;分別用sklearn和tensorflow做房價預測本篇是后面用tensorflow做回歸時的一個參照&#xff0c;忍不住要說的是sklearn真是簡單好用&#xff0c;要不是他沒有卷積cnn等時髦模型&#xff0c;真是不想用其他家的了。經典的sklearn集成模型結果&#xff1a;真是又…

多個containers 共用一個pvc_2020阜新PVC-UH市政管廠家-煙臺塑膠

2020阜新PVC-UH市政管廠家煙臺金沃泉塑膠有限公司主要產品PVC-U、PVC-M、PVC-UH聚氯乙烯給給水管材、HDPE高密度聚乙烯給水管材、CPVC氯化聚氯乙烯、MPP高壓電力電纜護套管、PERT-Ⅱ型熱力管道、高分子托輥管、水處理膜殼管。公司為電網、南方電網、電建集團、建筑集團、五礦集…

【SpringBoot 2】(十二) profile功能 自定義starter

寫在前面&#x1f6eb;更多知識總結見SpringBoot 2專欄 &#x1f695;本篇知識點總結自尚硅谷雷神的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

jpa transaction 回滾_我遇到的JPA中事務回滾的問題

在最近的項目中&#xff0c;做的是解析XML文件&#xff0c;解析過程中會有異常&#xff0c;比如&#xff1a;XML文件中節點的數據和與之對應的數據庫的字段中數據的類型不匹配&#xff1b;XML中數據長度超過數據庫定義的長度&#xff1b;有數據了的重復插入問題&#xff1b;讀取…

pb 怎么判斷是 小數_考試90分以上的孩子是怎么學數學的?聽聽老師怎么說?

一二年級&#xff0c;考試上九十分很輕松。但是&#xff0c;不少小朋友一上三年級&#xff0c;成績就落下來了。那么&#xff0c;我們來看看三年級起&#xff0c;考試還能夠保持在90分以上的孩子是怎么學習數學的吧&#xff01;第一&#xff0c;計算能力過關通過這兩張圖片的對…

快速上手Mybatis-Plus 入門案例

寫在前面&#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

交換機分布緩存_網絡交換機緩存在數據中心的作用

什么產生了緩存&#xff1f;網絡交換機要配置多少緩存才夠用&#xff1f;緩存容量是否有標準可以衡量&#xff1f; 當網絡交換機接口收到超出其所能處理的流量后&#xff0c;它會選擇要么將其緩存&#xff0c;或者將其丟棄。 緩存通常都是因為網絡接口速率不同造成的&#xff0…

黑蘋果 選擇語言 點不了_什么是天然的“黑鉆”?—科普貼

天然黑鉆也被成為“碳酸氫”&#xff0c;具有與白鉆相同的化學成分&#xff0c;然而黑鉆石的晶體結構是不同的&#xff0c;這意味著它們由許多小晶體組成&#xff0c;它們以隨機的形式粘在一起&#xff0c;而不是一個具有可識別自然線的固體錐形。天然黑鉆石有極高的含物&#…

sim卡沒壞但蘋果手機無服務_解決手機插SIM卡后都顯示“無SIM卡”的故障問題

故障現象顧客描述手機插SIM卡后都顯示“無SIM卡”。維修過程引起插入SIM卡卻顯示“無SIM卡”的故障&#xff0c;除了可能是SIM卡座的供電、時鐘、復位及SIM卡插入檢測信號不正常導致外&#xff0c;還有可能是基帶不正常導致的。插上手機卡&#xff0c;左上角提示“無SIM卡”&am…

Mybatis-Plus實現簡單的增刪改查 實體類上的注解

寫在前面&#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

webpack 讀取文件夾下的文件_webpack基本介紹及使用

1.什么是webpackwebpack是一個前端資源加載/打包工具。它根據模塊的依賴關系進行靜態分析&#xff0c;然后將這些模塊按照指定的規則生成對應的靜態資源。從上圖看出&#xff0c;webpack可以將多種靜態資源js&#xff0c;css&#xff0c;less轉換成一個靜態文件&#xff0c;減少…

conda失敗說沒有寫權限_愛情中,為什么男生表白失敗,女生還說可以繼續做朋友,想過沒有...

在愛情中&#xff0c;不是每個男生都是幸運的&#xff0c;也不是每次的表白都是如你所愿的。有成功總有失敗&#xff0c;成功是喜悅的&#xff0c;但是失敗卻是痛苦的。不過有的時候男生和女生表白以后&#xff0c;女生對男生說了這樣的一段&#xff0c;其實我希望以后我們還是…

Mybatis-Plus中Wrapper條件構造器的使用

寫在前面 &#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680…

springboot設置默認值_線上Bug無法復現?老司機教你一招,SpringBoot遠程調試不用愁!...

前言在部署線上項目時&#xff0c;相信大家都會遇到一個問題&#xff0c;線上的 Bug 但是在本地不會復現&#xff0c;多么無奈。此時最常用的就是取到前端傳遞的數據用接口測試工具測試&#xff0c;比如 POSTMAN&#xff0c;復雜不&#xff0c;難受不&#xff1f;今天陳某教你一…

Mybatis-Plus的分頁 樂觀鎖插件 通用枚舉 多數據源

寫在前面&#x1f6eb;更多知識總結見Mybatis-Plus專欄 &#x1f695;內容總結自尚硅谷楊博超老師的視頻 &#x1f692;博主對于該知識尚在學習階段 &#x1f684;如果發現存在問題請毫不吝嗇的指出 &#x1f680;&#x1f680;扎哇太棗糕的博客首頁&#x1f680;&#x1f680;…

學python哪個網站好-有哪些值得推薦的Python學習網站|

現在那個網站可以學習python爬蟲&#xff1f; 為大家分享Python學習經驗: 1、尋找一本Python書籍&#xff0c;要求淺顯易懂、全面細致程較好&#xff0c;專注于這一本&#xff0c;從頭開始研究&#xff0c;把整本書掌握透徹。 2、找一個項目練手&#xff0c;熟悉基礎后&#xf…

等待的操作過時_不會過時的6種網站seo優化操作

SEO優化一直在變化&#xff0c;百度和谷歌的算法也在不斷的迭代更新&#xff0c;所以競爭永遠不會停止。今天小編就來給大家分享一下&#xff0c;6種不會過時的網站seo優化操作。1.保持正常優化為網站訪客提供高質量的內容、卓越的用戶體驗和安全性以及卓越的技術網站。這可能需…