今天清华学长亲自手写一个 坦克大战无敌版 小白也能写出来

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版!

小白学习Unity 3D做经典游戏坦克大战日常

python实现双人版坦克大战游戏,我敢打赌现在00后都没玩过

坦克大战1.0版

清华名师用30小时讲解Python教程,整整400多集,拿走不谢

坦克大战1.0版项目实战