IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> ?三十分钟?小白写了一个坦克大战无敌版(找素材又花了半个小时/尴尬) -> 正文阅读

[Python知识库]?三十分钟?小白写了一个坦克大战无敌版(找素材又花了半个小时/尴尬)

?导读

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

python手撸坦克大战,小白二十分钟完成

?代码和详解

?主要部分

在这里插入图片描述
对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)#设置每秒钟的刷新频率

.

?播放MP3

在这里插入图片描述

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

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

?最终要的事

有什么问题大家可以私信我,另外给大家推荐几个不错的专栏

📣小白练手专栏,适合刚入手的新人欢迎订阅编程小白进阶

📣python有趣练手项目里面包括了像《机器人尬聊》《恶搞程序》这样的有趣文章,可以让你快乐学python练手项目专栏

📣另外想学JavaWeb进厂的同学可以看看这个专栏:传送们

📣这是个面试和考研的算法练习我们一起加油上岸之路

在这里插入图片描述
点赞关注不迷路。

  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-09-04 17:28:29  更:2021-09-04 17:28:35 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 12:57:13-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码