10分钟教你写出 坦克大战【无敌版】

51cto/2023/12/3 1:52:30

导读

最近读到一位大佬的游戏文章之后,手痒难耐就想自己也写一个小游戏。苦于没有游戏素材在网上搜也都是付费的,我就随便写了一点点来给自己解解馋。😗 好了废话不多说我们现在先试一下游戏效果。不好玩也不要说出来,嘻嘻嘻。后面我们在慢慢的推出好玩的来。

代码和详解

主要部分

image.png
 

对坦克设定进行初始化

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

 

定义坦克类

[图片上传失败...(image-494b7e-1642390233061)]

 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_positionself.speed_top=1#敌人坦克速度self.speed_left = 1def update(self, *args):self.rect.top=self.rect.top+self.speed_topself.rect.left = self.rect.left + self.speed_leftif (self.rect.left < 0) or (self.rect.right > width):self.speed_left=-self.speed_leftif (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 = 5self.my_rotate=my_rotate# 子弹的发送初始位置self.rect.left = my_tank_rect.left + (my_tank_rect.right - my_tank_rect.left) / 2self.rect.right = self.rect.left + 12.5self.rect.top = my_tank_rect.top + (my_tank_rect.bottom - my_tank_rect.top) / 2self.rect.bottom = self.rect.top + 12.5self.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 = 0self.kill()if (self.rect.top < 0) or (self.rect.bottom > heiht):my_bullet = 0self.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:passbullet_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=90new_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 + 1if right_count == 1:my_rotate=-90new_tank_img = pygame.transform.rotate(tank_img, -90)left_count = top_count = bottom_count = 0elif event.key == pygame.K_UP:tank_rect = tank_rect.move(0, -tank_speed)top_count = top_count + 1if top_count == 1:my_rotate=0new_tank_img = pygame.transform.rotate(tank_img, 0)left_count = right_count = bottom_count = 0elif event.key == pygame.K_DOWN:tank_rect = tank_rect.move(0, tank_speed)bottom_count = bottom_count + 1if bottom_count == 1:my_rotate=180new_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+1text = 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)#设置每秒钟的刷新频率

 

播放MP3

[图片上传失败...(image-4ec892-1642390233061)]

这里用的使用非常方便的 playsound模块

def tanke_mp3():playsound('tanke.mp3')

好了今天的文章就介绍到这里了。

最后小编整理了给大家准备一份详细的学习资料、有Python基础语法学习、python高级编程、模块式开发之函数与函数进阶、而且里面的知识点是十分详细的,话术也是很简洁明了,不含任何广告信息,让你学习起来更加的方便,这份完整版的Python全套学习资料已经上传CSDN,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费】。喜欢的小伙伴,可以给我个三连,么么哒!

互联网公司职位招聘.png
ffed5c7d3266a582641a72c3ab9928d8.gif


http://www.ngui.cc/51cto/show-113.html

相关文章

Nginx反向代理中使用proxy_redirect重定向url

在使用Nginx做反向代理功能时,有时会出现重定向的url不是我们想要的url,这时候就可以使用proxy_redirect进行url重定向设置了。proxy_redirect功能比较强大,其作用是对发送给客户端的URL进行修改!!语法:proxy_redirect [ default|off|redirect replacement ];默认:proxy_…

FLINK-CDC之sql方式的应用(mysql篇)

1、mysql中创建表,注意,mysql要开启binlog,否则报错 CREATE TABLE `cdc_user` ( `id` BIGINT(11) NOT NULL, `name` VARCHAR(50) NULL DEFAULT NULL COLLATE utf8mb4_bin, `type` VARCHAR(50) NULL DEFAULT NULL COLLATE utf8mb4_bin, `desc` TEXT NULL DEF…

Golang:channel管道与goroutine协程

channel管道与goroutine协程 一.goroutine协程 一.概述 Go协程的特点 有独立的栈空间共享程序堆空间调度是由程序员(用户)控制协程是轻量级的线程 在go语言中&#xff0c;有一种模式叫做MPG,M表示内核线程&#xff0c;也可以称为一个工作线程,P代表执行一个go代码片段的基础…

17seqnet

摘要 人员搜索旨在共同解决人员检测和人员再识别(re-ID)问题。现有的工作已经设计了基于Faster R-CNN的端到端网络。但是&#xff0c;由于Faster R-CNN的并行结构&#xff0c;所提取的特征来自于区域提议网络产生的低质量提议&#xff0c;而不是检测到的高质量包围盒。人员搜索…

分治算法.

1. 分治算法介绍 分治法是一种很重要的算法。字面上的解释是“分而治之”&#xff0c;就是把一个复杂的问题分成两个或更多的相同或相似的子问题&#xff0c;再把子问题分成更小的子问题……直到最后子问题可以简单的直接求解&#xff0c;原问题的解即子问题的解的合并。这个技…

使用iconfont阿里多色矢量图标

一、问题与解决方法 问题&#xff1a;虽然unicode和font-class很好&#xff0c;但你会发现都不支持多色模式。 解决&#xff1a;引用方法名symbol来解决。 通过mini-program-iconfont-cli 把iconfont图标批量换成多个平台小程序的组件。不依赖字体&#xff0c;支持多色彩。 特…

java二维数组练习题

1、随机生成一个3位以上的整数&#xff0c;获取反转后的值 public static void main(String[] args) {Scanner input new Scanner(System.in);//随机生成一个3位以上的整数&#xff0c;获取反转后的值Random rand new Random();int randNum 100 rand.nextInt(33333333),co…

DBCO-PEG-NHS,二苯基环辛炔PEG琥珀酰亚胺酯,Dibenzocyclooctyne-PEG-NHS

中文名&#xff1a;二苯基环辛炔PEG琥珀酰亚胺酯&#xff0c;二苯基环辛炔聚乙二醇活性酯 英文名&#xff1a;DBCO-PEG-NHS, Dibenzocyclooctyne-PEG-NHS 分子量&#xff1a;400、600、1K、2K、3.4K、4K、5K、10K 取代率&#xff08;DBCO&#xff09;&#xff1a;90%以上 取…

TiDB:Raft与Multi Raft

Leader&#xff1a; 集群的管理者所有读写流量都是走LeaderLeader会周期性向follower发出心跳信息&#xff1b;并且会将写的数据以日志的方式传递给其他follower&#xff1b;当写入的数据成员过半&#xff0c;就认为写入成功&#xff1b; Follower&#xff1a; 被管理者对其他…

【设计模式4】建造者模式

介绍 建造者模式&#xff08;Builder Pattern&#xff09; 又叫生成器模式&#xff0c;是一种对象构建模式。它可以将复杂对象的建造过程抽象出来&#xff08;抽象类别&#xff09;&#xff0c;使这个抽象过程的不同实现方法可以构造出不同表现&#xff08;属性&#xff09;的…