今天清华学长亲自手写一个 坦克大战无敌版 小白也能写出来
Posted 编程界的小胖子
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了今天清华学长亲自手写一个 坦克大战无敌版 小白也能写出来相关的知识,希望对你有一定的参考价值。
最近读到一位大佬的游戏文章之后,手痒难耐就想自己也写一个小游戏。苦于没有游戏素材在网上搜也都是付费的,我就随便写了一点点来给自己解解馋。:* 好了废话不多说我们现在先试一下游戏效果。不好玩也不要说出来,嘻嘻嘻。后面我们在慢慢的推出好玩的来。
代码和详解
主要部分
对python多线程还不理解的大佬可以看看我的这篇文章,包教包会有需要的私信我,给你开后门
源码加详解
.
对坦克设定进行初始化
pygame.init()#初始化
size=(width,heiht)=(800,600)
screen=pygame.display.set_mode(size)#设置窗口
pygame.display.set_caption("坦克大战")#设置窗口名称
fps=30#刷新频率
fpsclock=pygame.time.Clock()#定义时钟
color_back=(0,0,0)#设置背景颜色
my_tank_speed=[4,4]#坦克水平,垂直速度
tank_img=pygame.image.load("tanke.bmp")#装载图片
bullet_img=pygame.image.load("zidan.bmp")#装载图片
new_tank_img=tank_img#new是使用的坦克,后面会旋转
tank_rect=tank_img.get_rect()#图片外围矩形框
tank_rect.topleft=[400,300]#坦克的初始位置
left_count=right_count=top_count=bottom_count=0#子弹发射按键计数
my_rotate=0#存当前方向
my_bullet=0#子弹数量
my_value=0;#得分
#写文字
font=pygame.font.Font(None,32)
text=font.render("value:"+str(my_value),True,(255,0,0))
text_rect=text.get_rect()
text_rect.left=10#文字位置
text_rect.top=10
复制代码
定义坦克类
class Tank(pygame.sprite.Sprite):#敌方坦克精灵
def __init__(self,filename,initial_position):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.image.load(filename)
self.rect=self.image.get_rect()
self.rect.topleft=initial_position
self.speed_top=1#敌人坦克速度
self.speed_left = 1
def update(self, *args):
self.rect.top=self.rect.top+self.speed_top
self.rect.left = self.rect.left + self.speed_left
if (self.rect.left < 0) or (self.rect.right > width):
self.speed_left=-self.speed_left
if (self.rect.top < 0) or (self.rect.bottom > heiht):
self.speed_top = -self.speed_top
复制代码
定义子弹类
class bullet(pygame.sprite.Sprite):#子弹精灵
def __init__(self,filename,my_tank_rect,my_rotate):
pygame.sprite.Sprite.__init__(self)
self.image=pygame.image.load(filename)
self.rect=self.image.get_rect()
self.speed_top=5#子弹速度
self.speed_left = 5
self.my_rotate=my_rotate
# 子弹的发送初始位置
self.rect.left = my_tank_rect.left + (my_tank_rect.right - my_tank_rect.left) / 2
self.rect.right = self.rect.left + 12.5
self.rect.top = my_tank_rect.top + (my_tank_rect.bottom - my_tank_rect.top) / 2
self.rect.bottom = self.rect.top + 12.5
self.speed=[0,0]
def update(self, *args):
pass
# 子弹自动移动控制
speed_size=self.speed_top
# 计算子弹的速度方向
if self.my_rotate == 0:
self.speed = [0, -speed_size]
elif self.my_rotate == 180 :
self.speed = [0, speed_size]
elif self.my_rotate == 90 :
self.speed = [-speed_size, 0]
elif self.my_rotate == -90 :
self.speed = [speed_size, 0]
#子弹移动
self.rect.top = self.rect.top + self.speed[1]
self.rect.left = self.rect.left + self.speed[0] # 矩形框移动
#子弹边界条件判断
if (self.rect.left < 0) or (self.rect.right > width):
my_bullet = 0
self.kill()
if (self.rect.top < 0) or (self.rect.bottom > heiht):
my_bullet = 0
self.kill()
复制代码
剩下的就是主程序了
while True:
for event in pygame.event.get():#接收事件
if event.type==QUIT:#判断退出事件
pygame.quit()#退出
sys.exit()
#放在for循环里面,值进行按键的一次动作判断
if event.type == pygame.KEYUP:
# 发射子弹
if event.key == pygame.K_SPACE:
pass
bullet_sprite1 = bullet("zidan.bmp", tank_rect, my_rotate)
bullet_group.add(bullet_sprite1) # 添加子弹
my_bullet = my_bullet + 1
#键盘移动控制,放在for循环外边,可以连续检测按键按下的状态
tank_speed=my_tank_speed[0]
if event.type==pygame.KEYDOWN:
if event.key==pygame.K_LEFT:
tank_rect = tank_rect.move(-tank_speed,0)
left_count=left_count+1#记录left按键次数
if left_count==1:#如果是第一次按下,就转动图形
my_rotate=90
new_tank_img=pygame.transform.rotate(tank_img,90)#转动图形
right_count=top_count=bottom_count=0#其余清零
elif event.key==pygame.K_RIGHT:
tank_rect = tank_rect.move(tank_speed, 0)
right_count = right_count + 1
if right_count == 1:
my_rotate=-90
new_tank_img = pygame.transform.rotate(tank_img, -90)
left_count = top_count = bottom_count = 0
elif event.key == pygame.K_UP:
tank_rect = tank_rect.move(0, -tank_speed)
top_count = top_count + 1
if top_count == 1:
my_rotate=0
new_tank_img = pygame.transform.rotate(tank_img, 0)
left_count = right_count = bottom_count = 0
elif event.key == pygame.K_DOWN:
tank_rect = tank_rect.move(0, tank_speed)
bottom_count = bottom_count + 1
if bottom_count == 1:
my_rotate=180
new_tank_img = pygame.transform.rotate(tank_img, 180)
left_count = right_count = top_count = 0
#控制边界条件
if tank_rect.left<0:
tank_rect =tank_rect.move(1,0)
elif tank_rect.right>width:
tank_rect =tank_rect.move(-1, 0)
elif tank_rect.top<0:
tank_rect =tank_rect.move(0, 1)
elif tank_rect.bottom>heiht:
tank_rect =tank_rect.move(0, -1)
#子弹碰撞监测
if pygame.sprite.groupcollide(bullet_group,tank_group,True,True):
#得分值
my_value=my_value+1
text = font.render("value:" + str(my_value), True, (255, 0, 0))
print("value:",my_value)
#子弹数统计
my_bullet = len(bullet_group)
print("bullet:",my_bullet)
#添加坦克
if len(tank_group)==0:
retank1 = Tank('tanke2.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])
retank2 = Tank('tanke3.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])
retank3 = Tank('tanke4.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])
retank4 = Tank('tanke5.bmp', [np.random.random_integers(80,600), np.random.random_integers(80,600)])
tank_group.add(retank1)
tank_group.add(retank2)
tank_group.add(retank3)
tank_group.add(retank4)
#屏幕的刷新控制
screen.fill(color_back)#窗口背景为黑色,图形都放这个后面,否则会被覆盖
screen.blit(new_tank_img,tank_rect)#填充矩形框
screen.blit(text,text_rect)#添加文字
#更新精灵组
tank_group.update()#更新敌方坦克精灵组
tank_group.draw(screen)#绘图
bullet_group.update()#更新子弹精灵组
bullet_group.draw(screen)
pygame.display.update()#刷新窗口
fpsclock.tick(fps)#设置每秒钟的刷新频率
复制代码
最后还有相关python资料分享哦~
① 2000多本Python电子书(主流和经典的书籍应该都有了)
② Python标准库资料(最全中文版)
③ 项目源码(四五十个有趣且经典的练手项目及源码)
④ Python基础入门、爬虫、web开发、大数据分析方面的视频(适合小白学习)
⑤ Python学习路线图(告别不入流的学习)
需要相关资料的可以通过扫一扫
以上是关于今天清华学长亲自手写一个 坦克大战无敌版 小白也能写出来的主要内容,如果未能解决你的问题,请参考以下文章
☀️Unity ❀ 小游戏 ☀️| 带你重回童年的经典系列——坦克大战3D版!
python实现双人版坦克大战游戏,我敢打赌现在00后都没玩过