#coding=utf-8 import pygame import threading import random from time import sleep from pygame.locals import *from sys import exit import math pygame.init() #定义一个坦克类 class Tank(): gun = 25 #炮筒长度 good_r = 30 #坦克半径 bad_r = 20 speed1 = 20#度 def __init__(self,x,y,attr,screen): #坦克的坐标半径以及好坏,程序组面板 self.speed=int(random.uniform(1,3)) self.x=x self.y=y self.attr=attr self.screen=screen def paint(self): #画坦克. global good_r , bad_r if self.attr==False: pygame.draw.circle(self.screen,[0,0,0],[self.x,self.y],self.bad_r,0) pygame.draw.line (self.screen,(0,0,0),(self.x,self.y+self.bad_r),(self.x,self.y+self.bad_r+self.gun)) else: pygame.draw.circle(self.screen,[255,0,0],[self.x,self.y],self.good_r,0) pygame.draw.line (self.screen,(255,0,0),(self.x,self.y-self.good_r),(self.x,self.y-self.good_r-self.gun)) def fire(self): global gun,good_r,bad_r m = missile(self.x,self.y,self.bad_r,self.gun,self.attr,self.screen) return m def move(self): #控制敌人坦克移动 self.y+=self.speed def myMove(self,event,missiles):#控制自己坦克移动响应键盘监控。 global speed1 if event.type == KEYDOWN: if event.key == K_RIGHT: self.x += self.speed1 if event.key == K_LEFT: self.x -= self.speed1 if event.key == K_DOWN: missiles.append(self.fire()) if event.type == QUIT: sys.exit() ##################################################### #定义子弹类 class missile(): r1=4 #定义子弹的半径。 speed = 4 def __init__(self,x,y,r,gun,attr,screen): self.screen=screen self.attr=attr if attr==True: self.x=x self.y=y-r-gun else: self.x=x self.y=y+r+gun def paint(self): #画子弹 global r1 if self.attr == False: pygame.draw.circle(self.screen,[0,0,0],[self.x,self.y],self.r1,0) else: pygame.draw.circle(self.screen,[255,0,0],[self.x,self.y],self.r1,0) def move(self):#定义子弹的移动。 global speed if self.attr==True: self.y-=self.speed else: self.y+=self.speed ##################################################### #全局变量。 SWIDTH = 800 #设置窗口的长宽 SHIGHT = 800 screen = pygame.display.set_mode([SHIGHT,SWIDTH],0,8) #创建窗口。 tanks=[]#创建坦克池。 Threads = [] #创建线程池 missiles = [] #创建子弹池。 Mytank = Tank(400,760,True,screen)#创建坦克 total=0#游戏成功的记录数 success = 10#打死10个坦克过关。 ###################################################### def main(): #主函数 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles,Mytank tanks.append(Mytank) creatThread() ###################################################### def paint(): global SWIDTH,SHIGHT,screen,tanks,Threads,missiles,Mytank while True: jianKong()#添加监控。 checkCollsion()#添加碰撞检测。 screen.fill([255,255,255])#这一句话放在前面。 pygame.display.set_caption("TankWar") for t in tanks:#画坦克 t.paint() for m in missiles:#画子弹 m.paint() pygame.display.update() sleep(0.0001) ##################################################### def fire(): #敌机发射子弹的线程 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles while(True): for t in tanks: if(t.attr==False): missiles.append(t.fire()) sleep(2) #一秒发射一颗子弹。 ##################################################### def jianKong(): global Mytank,missiles for event in pygame.event.get(): Mytank.myMove(event,missiles) ##################################################### def move(): #定义敌机和炸弹移动的线程。 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles while True: checkOut()#检查出界 for t in tanks: if t.attr==False: t.move() for m in missiles: m.move() sleep(0.01) ##################################################### def createTank():#产生坦克的线程。 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles x=0 while True: for i in range(1,6): x1=int(random.uniform(30,SWIDTH/5-30))+x y=int(random.uniform(-200,0)) t=Tank(x1,y,False,screen) tanks.append(t) x=int(SWIDTH/5+x) x=0 sleep(8) #################################################### def checkOut():#检查子弹和坦克是否出界。 for t in tanks: if t.y>=SHIGHT+t.bad_r: tanks.remove(t) for m in missiles: if m.y >= SHIGHT+m.r1: missiles.remove(m) ################################################# def gameOver(attr):#游戏结束的时候调用。 if attr==False: exit("你已经死亡") else: exit("过关了") ################################################### def checkCollsion():#碰撞检测。 global total,success,missiles,tanks for m in missiles: if m.attr == False: s =int(math.sqrt((Mytank.x-m.x)*(Mytank.x-m.x)+(Mytank.y-m.y)*(Mytank.y-m.y))) if s<=m.r1+Mytank.good_r: missiles.remove(m) gameOver(False) if m.attr == True: for t in tanks: s =int(math.sqrt((t.x-m.x)*(t.x-m.x)+(t.y-m.y)*(t.y-m.y))) if s<=t.bad_r+m.r1: missiles.remove(m) tanks.remove(t) if total==success: gameOver(True) total+=1 ################################################### def creatThread(): #创建绑定和开始线程。 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles Threads.append(threading.Thread(target=paint)) #这里的逗号要注意。 Threads.append(threading.Thread(target=fire)) #这里的逗号要注意。 Threads.append(threading.Thread(target=createTank)) #这里的逗号要注意。 Threads.append(threading.Thread(target=move)) #这里的逗号要注意。 for t in Threads: #启动线程 t.setDaemon(True) t.start() t.join() if __name__ == "__main__": main()
下面是坦克类
#coding=utf-8 import pygame import threading import random from time import sleep from pygame.locals import * from sys import exit import math pygame.init() #定义一个坦克类 class Tank(): gun = 25 #炮筒长度 good_r = 30 #坦克半径 bad_r = 20 speed1 = 20#度 def __init__(self,x,y,attr,screen): #坦克的坐标半径以及好坏,程序组面板 self.speed=int(random.uniform(1,3)) self.x=x self.y=y self.attr=attr self.screen=screen def paint(self): #画坦克. global good_r , bad_r if self.attr==False: pygame.draw.circle(self.screen,[0,0,0],[self.x,self.y],self.bad_r,0) pygame.draw.line (self.screen,(0,0,0),(self.x,self.y+self.bad_r),(self.x,self.y+self.bad_r+self.gun)) else: pygame.draw.circle(self.screen,[255,0,0],[self.x,self.y],self.good_r,0) pygame.draw.line (self.screen,(255,0,0),(self.x,self.y-self.good_r), (self.x,self.y-self.good_r-self.gun)) def fire(self): global gun,good_r,bad_r m = missile(self.x,self.y,self.bad_r,self.gun,self.attr,self.screen) return m def move(self): #控制敌人坦克移动 self.y+=self.speed def myMove(self,event,missiles):#控制自己坦克移动响应键盘监控。 global speed1 if event.type == KEYDOWN: if event.key == K_RIGHT: self.x += self.speed1 if event.key == K_LEFT: self.x -= self.speed1 if event.key == K_DOWN: missiles.append(self.fire()) if event.type == QUIT: sys.exit() ##################################################### #定义子弹类 class missile(): r1=4 #定义子弹的半径。 speed = 4 def __init__(self,x,y,r,gun,attr,screen): self.screen=screen self.attr=attr if attr==True: self.x=x self.y=y-r-gun else: self.x=x self.y=y+r+gun def paint(self): #画子弹 global r1 if self.attr == False: pygame.draw.circle(self.screen,[0,0,0],[self.x,self.y],self.r1,0) else: pygame.draw.circle(self.screen,[255,0,0],[self.x,self.y],self.r1,0) def move(self):#定义子弹的移动。 global speed if self.attr==True: self.y-=self.speed else: self.y+=self.speed ##################################################### #全局变量。 SWIDTH = 800 #设置窗口的长宽 SHIGHT = 800 screen = pygame.display.set_mode([SHIGHT,SWIDTH],0,8) #创建窗口。 tanks=[]#创建坦克池。 missiles = [] #创建子弹池。 Mytank = Tank(400,760,True,screen)#创建坦克 total=0#游戏成功的记录数 success = 10#打死10个坦克过关。 ###################################################### def main(): #主函数 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles,Mytank tanks.append(Mytank) while True: createTank() paint() fire() jianKong() checkCollsion()#添加碰撞检测。 checkOut() move() sleep(0.01) ###################################################### def paint(): global SWIDTH,SHIGHT,screen,tanks,Threads,missiles,Mytank screen.fill([255,255,255])#这一句话放在前面。 pygame.display.set_caption("TankWar") for t in tanks:#画坦克 t.paint() for m in missiles:#画子弹 m.paint() pygame.display.update() ##################################################### def fire(): #敌机发射子弹的线程 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles if random.uniform(1,300) ==float(5) or random.randint(1,300)== 10: #添加随机数改变产生速率###重点。。。。。。。 for t in tanks: if(t.attr==False): missiles.append(t.fire()) ##################################################### def jianKong(): global Mytank,missiles for event in pygame.event.get(): Mytank.myMove(event,missiles) ##################################################### def move(): #定义敌机和炸弹移动的线程。 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles checkOut()#检查出界 for t in tanks: if t.attr==False: t.move() for m in missiles: m.move() ##################################################### def createTank():#产生坦克的线程。 global SWIDTH,SHIGHT,screen,tanks,Threads,missiles x=0 if random.uniform(1,300) ==float(5) or random.randint(1,300)== 10: #添加随机数改变产生速率###重点。。。。。。。 for i in range(1,6): x1=int(random.uniform(30,SWIDTH/5-30))+x y=int(random.uniform(-200,0)) t=Tank(x1,y,False,screen) tanks.append(t) x=int(SWIDTH/5+x) #################################################### def checkOut():#检查子弹和坦克是否出界。 for t in tanks: if t.y>=SHIGHT+t.bad_r: tanks.remove(t) for m in missiles: if m.y >= SHIGHT+m.r1: missiles.remove(m) ################################################# def gameOver(attr):#游戏结束的时候调用。 if attr==False: exit("你已经死亡") else: exit("过关了") ################################################### def checkCollsion():#碰撞检测。 global total,success,missiles,tanks for m in missiles: if m.attr == False: s =int(math.sqrt((Mytank.x-m.x)*(Mytank.x-m.x)+(Mytank.y-m.y)*(Mytank.y-m.y))) if s<=m.r1+Mytank.good_r: missiles.remove(m) gameOver(False) if m.attr == True: for t in tanks: s =int(math.sqrt((t.x-m.x)*(t.x-m.x)+(t.y-m.y)*(t.y-m.y))) if s<=t.bad_r+m.r1: missiles.remove(m) tanks.remove(t) if total==success: gameOver(True) total+=1 ################################################### if __name__ == "__main__": #当单独运行次文件的时候调用,方便调试 main()