目前正在自學python,前幾天做了一個比較簡單的坦克大戰游戲,分享出來,想搞一搞的朋友,可以參考。


import pygame,sys,time
from random import randint
from pygame.locals import *

#主界面對象的顯示
class TankMain(object):
"""坦克大戰的主窗口"""
width=800
height=700
my_tank_missile_list = []
my_tank =None
wall=None
enemy_list =pygame.sprite.Group()#敵方坦克組
explode_lsit=[]
enemy_missile_list=pygame.sprite.Group()
#開始游戲的方法
def startGame(self):
pygame.init()#pygame模塊初始化,加載系統資源
screem=pygame.display.set_mode((TankMain.width,TankMain.height),0,32)
#給窗口設置一個標題
pygame.display.set_caption("坦克大戰")
#創建牆
TankMain.wall=Wall(screem,80,150,50,200)
TankMain.my_tank = My_Tank(screem)
if len(TankMain.enemy_list)==0:
for i in range(1,6):#游戲開始的時候,初始化5個敵方坦克
TankMain.enemy_list.add(Enemy_Tank(screem))#把敵方坦克放到組里面

while True:
if len(TankMain.enemy_list) < 5:
TankMain.enemy_list.add(Enemy_Tank(screem))
#color RGB(0,100,200),(0,0,0)黑色 (255.255.255)白色
#設置窗口的背景色為黑色。
screem.fill((0,0,0))
#顯示左上角的文字
for i,text in enumerate(self.write_text(),0):
screem.blit(text,(0,5+(15*i)))
#顯示游戲中的牆,並且對其他對象進行檢測
TankMain.wall.display()

self.get_event(TankMain.my_tank,screem)#獲取事件,根據或許的事件去處理。
if TankMain.my_tank:
TankMain.my_tank.hit_enemy_missile()
if TankMain.my_tank and TankMain.my_tank.live:
TankMain.my_tank.display()#屏幕上顯示我方坦克
TankMain.my_tank.move()#我方坦克移動
else:
TankMain.my_tank=None



for enemy in TankMain.enemy_list:
enemy.display()#顯示敵方坦克。
enemy.random_move()#敵方坦克移動
enemy.random_fire()
#顯示所有的我方炮彈
for m in TankMain.my_tank_missile_list:
if m.live:
m.display()
m.hit_tank()#炮彈是否擊中敵方坦克
m.move()
else:
TankMain.my_tank_missile_list.remove(m)

#顯示敵方所有炮彈
for m in TankMain.enemy_missile_list:
if m.live:
m.display()
m.move()
else:
TankMain.enemy_missile_list.remove(m)
#顯示爆炸效果
for explode in TankMain.explode_lsit:
explode.display()


# 顯示重置.
time.sleep(0.01)
pygame.display.update()
#獲取所有的事件,(敲擊鍵盤)
def get_event(self,my_tank,screem):
for event in pygame.event.get():

if event.type == QUIT:
self.stopGame()#程序退出
if event.type == KEYDOWN and not my_tank and event.key==K_F1:
TankMain.my_tank = My_Tank(screem)
if event.type == KEYDOWN and my_tank:
if event.key ==K_LEFT or event.key==K_a:
my_tank.direction="L"
my_tank.stop=False
#my_tank.move()
if event.key ==K_RIGHT:
my_tank.direction="R"
my_tank.stop = False
#my_tank.move()
if event.key ==K_UP:
my_tank.direction = "U"
my_tank.stop = False
#my_tank.move()
if event.key ==K_DOWN:
my_tank.direction = "D"
my_tank.stop = False
#my_tank.move()
if event.key ==K_ESCAPE:#敲擊鍵盤esc件,程序退出
self.stopGame()
if event.key == K_x:
m= my_tank.fire()
m.good=True#我方坦克發射的炮彈
TankMain.my_tank_missile_list.append(m)
if event.type ==KEYUP and my_tank:
if event.key==K_LEFT or event.key==K_RIGHT or event.key==K_UP or event.key==K_DOWN:
my_tank.stop=True
#關閉游戲的方法
def stopGame(self):
sys.exit()

def write_text(self):

font = pygame.font.SysFont("simsunnsimsun",12)#定義一個字體
text_sf1=font.render("敵方坦克數量為:%d"%len(TankMain.enemy_list),True,(255,0,0))#根>據字體創建一個文字的圖像。
text_sf2=font.render("我方炮彈的數量:%d"%len(TankMain.my_tank_missile_list),True,(255, 0, 0))

return text_sf1,text_sf2
#坦克大戰游戲中所有對象的類。

class BaseTtem(pygame.sprite.Sprite):
def __init__(self,screem):
pygame.sprite.Sprite.__init__(self)
#所有對象共享的屬性
self.screem=screem
#在游戲中顯示當前對象。
def display(self):
if self.live:
self.image = self.images[self.direction]
self.screem.blit(self.image,self.rect)

#坦克的公共父類
class Tank(BaseTtem):
#定義類屬性,所有坦克的高和寬是一樣的
width=50
height=50
def __init__(self,screem,left,top):
super().__init__(screem)
self.screem=screem
self.direction="U"#坦克的默認方向向下
self.speed=5#坦克移動的速度
self.stop=False
self.images={}#坦克的所有圖片,key為方向,value為圖片
self.images["L"]=pygame.image.load("images/tankL.jpg")
self.images["R"]=pygame.image.load("images/tankR.jpg")
self.images["U"]=pygame.image.load("images/tankU.jpg")
self.images["D"]=pygame.image.load("images/tankD.jpg")
self.image=self.images[self.direction]#坦克的圖片由方向決定
self.rect=self.image.get_rect()
self.rect.left=left
self.rect.top=top
self.live=True#決定坦克是否死亡

# 坦克移動方法
def move (self):
if not self.stop:#如果坦克不是停止狀態
if self.direction=="L":
if self.rect.left>0:#判斷坦克是否還能移動
self.rect.left-=self.speed
else:
self.rect.left=0
elif self.direction=="R":
if self.rect.right < TankMain.width:
self.rect.right+=self.speed
else:
self.rect.right=TankMain.width


elif self.direction=="D":
if self.rect.bottom < TankMain.height:
self.rect.top+=self.speed
else:
self.rect.bottom=TankMain.height
elif self.direction=="U":
if self.rect.top > 0:
self.rect.top-=self.speed
else:
self.rect.top = 0

def fire(self):
m = Missile(self.screem,self)
return m

#我方坦克
class My_Tank(Tank):
def __init__(self,screem):
super().__init__(screem,280,450)#創建一個我方坦克
self.stop=True
self.live=True
def hit_enemy_missile(self):
hit_list=pygame.sprite.spritecollide(self,TankMain.enemy_missile_list,False)
for m in hit_list:#我方坦克被擊中
m.live=False
TankMain.enemy_missile_list.remove(m)
self.live=False
exploed =Explode(self.screem,self.rect)
TankMain.explode_lsit.append(exploed)

#敵方坦克
class Enemy_Tank(Tank):

def __init__(self,screem):
super().__init__(screem,randint(1,5)*100,200)
self.speed=2
self.step=10 # 坦克按照某個方向連續移動的步數
self.get_random_direction()


def get_random_direction(self):
r = randint(0,4) # 得到一個坦克移動方向和停止的隨機數
if r == 4 :
self.stop=True
elif r ==1:
self.direction="L"
self.stop=False
elif r ==2:
self.direction="R"
self.stop = False
elif r ==0:
self.direction="D"
self.stop = False
elif r ==3:
self.direction="U"
self.stop = False

#敵方坦克,按照一個隨機的方向,連續移動6步,然后再次改變方向。
def random_move(self):
if self.live:
if self.step==0:
self.get_random_direction()
self.step=6
else:
self.move()
self.step-=1

def random_fire(self):
r =randint(0,50)
if r==20: #or r == 20 or r==30 or r==40:
m=self.fire()
TankMain.enemy_missile_list.add(m)
else:
return
#我方炮彈
class Missile(BaseTtem):
width = 12
height = 12
def __init__(self,screem,tank):
super().__init__(screem)
self.tank=tank
self.direction = tank.direction #炮彈的方向有所發射的坦克決定
self.speed = 12 #炮彈的速度
self.images = {} # 炮彈的所有圖片,key為方向,value為圖片
self.images["L"] = pygame.image.load("images/tankL.jpg")
self.images["R"] = pygame.image.load("images/tankR.jpg")
self.images["U"] = pygame.image.load("images/tankU.jpg")
self.images["D"] = pygame.image.load("images/tankD.jpg")
self.image = self.images[self.direction] # 炮彈的圖片由方向決定
self.rect = self.image.get_rect()
self.rect.left = tank.rect.left + (tank.width - self.width) /2
self.rect.top = tank.rect.top + (tank.height - self.height) /2
self.live = True #炮彈是否消滅了
self.good=False

def move(self):
if self.live:#如果炮彈還存在
if self.direction=="L":
if self.rect.left>0:#判斷坦克是否還能移動
self.rect.left-=self.speed
else:
self.live=False
elif self.direction=="R":
if self.rect.right < TankMain.width:
self.rect.right+=self.speed
else:
self.live = False


elif self.direction=="D":
if self.rect.bottom < TankMain.height:
self.rect.top+=self.speed
else:
self.live = False
elif self.direction=="U":
if self.rect.top > 0:
self.rect.top-=self.speed
else:
self.live = False
#炮彈擊中坦克,第一種我方炮彈擊中敵方坦克,敵方炮彈擊中我方坦克
def hit_tank(self):
if self.good:#如果炮彈是我方的炮彈
hit_list=pygame.sprite.spritecollide(self,TankMain.enemy_list,False)
for e in hit_list:
e.live=False
TankMain.enemy_list.remove(e)#如果敵方坦克被擊中,則從列表中刪除敵方坦克
self.live=False
explode= Explode(self.screem,e.rect)#產生一個爆炸對象
TankMain.explode_lsit.append(explode)

#爆炸類
class Explode(BaseTtem):

def __init__(self,screen,rect):
super().__init__(screen)
self.live=True
self.images=[pygame.image.load("images/explode.jpg"),\
pygame.image.load("images/explode.jpg"), \
pygame.image.load("images/explode.jpg"), \
pygame.image.load("images/explode.jpg"), \
pygame.image.load("images/explode.jpg"),\
pygame.image.load("images/explode.jpg")]

self.step=0
self.rect=rect#爆炸的位置和發生爆炸前,炮彈碰到的坦克位置一樣。在構建爆炸的時候,把坦克的rect作為參數傳進來
#display方法在整個游戲運行過程中,循環調用,每次一定時間調用一次
def display(self):
if self.live:
if self.step==len(self.images):#最后一張爆炸圖片已經顯示
self.live=False
else:
self.image=self.images[self.step]
self.screem.blit(self.image,self.rect)
self.step+=1
else:
pass #刪除該對象

#游戲中的牆
class Wall(BaseTtem):
def __init__(self,screem,left,top,width,heigth):
super().__init__(screem)
self.rect=Rect(left,top,width,heigth)
self.color=(255,0,0)
def display(self):
self.screem.fill(self.color,self.rect)
#針對牆和坦克和炮彈的碰撞檢測
def hit_other(self):
if TankMain.my_tank:
is_hit =pygame.sprite.collide_rect(self,TankMain.my_tank)
if is_hit:
TankMain.my_tank.stop=True
game=TankMain()
game.startGame()


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM