简易版python坦克大战(熟悉python语法)

 我做了一个导航站(域名是挂路灯的全拼gualudeng.com),里面精选了各种影视,动漫,黑科技,实用工具,搞笑有趣的站点,动动大家可爱的小手,点进来看看吧,良心站点。

#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()

  • 6
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值