Python学习之小游戏--坦克大作战

今天跟视频学习了Python实现坦克大作战小游戏,挺有意思的,一起来玩吧~

按空格发射子弹,上下左右键实现移动,ESC键无限复活。

import pygame,time,random
from pygame.sprite import Sprite
SCREEN_WIDTH=800
SCREEN_HEIGHT=500
BG_color=pygame.Color(45,45,48)
TEXT_COLOR=pygame.Color(0,255,0)

class BaseItem(Sprite):
    def __init__(self,color,width,height):
        pygame.sprite.Sprite.__init__(self)

class MainGame():
    window=None
    my_tank=None
    enemyTankList=[]
    enemyTankCount=5
    myBulletList=[]
    enemyBulletList=[]
    explodeList=[]
    wallList=[]
    def __init__(self):
        pass
    #开始游戏
    def startGame(self):
        pygame.display.init()
        MainGame.window=pygame.display.set_mode([SCREEN_WIDTH,SCREEN_HEIGHT])
        #MainGame.my_tank=Tank(350,250)
        self.createMytank()
        self.createEnemyTank()
        self.createWall()
        pygame.display.set_caption('坦克大作战')
        while True:
            time.sleep(0.02)
            MainGame.window.fill(BG_color)
            self.getEvent()
            MainGame.window.blit(self.getTextSuface('敌方坦克数量%d'%len(MainGame.enemyTankList)),(10,10))
            if MainGame.my_tank and MainGame.my_tank.live:
                MainGame.my_tank.displayTank()
            else:
               del MainGame.my_tank
               MainGame.my_tank=None
            self.blitEnemyTank()
            self.blitMyBullet()
            self.blitenemyBullet()
            self.blitExplode()
            self.blitWall()
            if MainGame.my_tank and MainGame.my_tank.live:
                if not  MainGame.my_tank.stop:
                    MainGame.my_tank.move()
                    MainGame.my_tank.hitWall()
                    MainGame.my_tank.myTank_hit_enemyTank()
            pygame.display.update()
    def blitWall(self):
        for wall in MainGame.wallList:
            if wall.live:
                wall.displayWall()
            else:
                MainGame.wallList.remove(wall)
    def createWall(self):
        for i in range(5):
            wall=Wall(i*170,220)
            MainGame.wallList.append(wall)
    def createMytank(self):
        MainGame.my_tank = MyTank(400, 250)
    def createEnemyTank(self):
        top=100
        for i in range(MainGame.enemyTankCount):
            left=random.randint(0,600)
            speed=random.randint(1,4)
            enemy=EnemyTank(left,top,speed)
            MainGame.enemyTankList.append(enemy)
    def blitExplode(self):
        for explode in MainGame.explodeList:
            if explode.live:
                explode.displayExplode()
            else:
                MainGame.explodeList.remove(explode)
    def blitEnemyTank(self):
        for enemyTank in MainGame.enemyTankList:
            if enemyTank.live:
                enemyTank.displayTank()
                enemyTank.randMove()
                enemyTank.hitWall()
                if MainGame.my_tank and MainGame.my_tank.live:
                    enemyTank.enemyTank_hit_myTank()
                enemyBullet = enemyTank.shot()
                if enemyBullet:
                    MainGame.enemyBulletList.append(enemyBullet)
            else:
                MainGame.enemyTankList.remove(enemyTank)
    def blitMyBullet(self):
        for myBullet in MainGame.myBulletList:
            if myBullet.live:
                myBullet.displayBullet()
                myBullet.move()
                myBullet.myBullet_hit_enemyTank()
                myBullet.hitWall()
            else:
                MainGame.myBulletList.remove(myBullet)
    def blitenemyBullet(self):
        for enemyBullet in MainGame.enemyBulletList:
            if enemyBullet.live:
                enemyBullet.displayBullet()
                enemyBullet.move()
                enemyBullet.enemyBullet_hit_myTank()
                enemyBullet.hitWall()
            else:
                MainGame.enemyBulletList.remove(enemyBullet)
    def endGame(self):
        print('谢谢您的使用!')
        pygame.quit()
    #左上角文字绘制
    def getTextSuface(self,text):
        pygame.font.init()
        font=pygame.font.SysFont('kaiti',18)
        textSurface=font.render(text,True,TEXT_COLOR)
        return textSurface
    #获取事件
    def getEvent(self):
        eventList=pygame.event.get()
        for event in eventList:
            if event.type==pygame.QUIT:
                #退出
                self.endGame()
            if event.type==pygame.KEYDOWN:
                if not MainGame.my_tank:
                    if event.key==pygame.K_ESCAPE:
                        self.createMytank()
                if MainGame.my_tank and MainGame.my_tank.live:
                    if event.key == pygame.K_LEFT:
                        MainGame.my_tank.direction = 'L'
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print('向左移')
                    elif event.key == pygame.K_RIGHT:
                        MainGame.my_tank.direction = 'R'
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print('向右移')
                    elif event.key == pygame.K_UP:
                        MainGame.my_tank.direction = 'U'
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print('向上移')
                    elif event.key == pygame.K_DOWN:
                        MainGame.my_tank.direction = 'D'
                        MainGame.my_tank.stop = False
                        # MainGame.my_tank.move()
                        print('向下移')
                    elif event.key == pygame.K_SPACE:
                        print('发射子弹')
                        if len(MainGame.myBulletList) <= 3:
                            myBullet = Bullet(MainGame.my_tank)
                            MainGame.myBulletList.append(myBullet)
            #松开方向键停止
            if event.type==pygame.KEYUP:
                if event.key==pygame.K_UP or event.key==pygame.K_DOWN or event.key==pygame.K_RIGHT or event.key==pygame.K_LEFT:
                    if MainGame.my_tank and MainGame.my_tank.live:
                        MainGame.my_tank.stop=True

class Tank(BaseItem):
    def __init__(self,left,top):
        self.images={
            'U':pygame.image.load('TANK/img/p1tankU.gif'),
            'D': pygame.image.load('TANK/img/p1tankD.gif'),
            'L': pygame.image.load('TANK/img/p1tankL.gif'),
            'R': pygame.image.load('TANK/img/p1tankR.gif'),
        }
        self.direction='U'
        self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.speed=5
        self.stop=True
        self.live=True
        self.oldLeft=self.rect.left
        self.oldTop = self.rect.top

    def move(self):
        self.oldLeft= self.rect.left
        self.oldTop = self.rect.top
        if self.direction=='L':
            if self.rect.left >0:
                self.rect.left -= self.speed
        elif self.direction=='U':
            if self.rect.top > 0:
                self.rect.top -= self.speed
        elif self.direction=='D':
            if self.rect.top+self.rect.height < SCREEN_HEIGHT:
                self.rect.top +=self.speed
        elif self.direction == 'R':
            if self.rect.left+self.rect.height < SCREEN_WIDTH:
                self.rect.left += self.speed
    def shot(self):
        return Buttle(self)
    def stay(self):
        self.rect.left=self.oldLeft
        self.rect.top=self.oldTop
    def hitWall(self):
        for wall in MainGame.wallList:
            if pygame.sprite.collide_rect(self,wall):
                self.stay()
    def displayTank(self):
        self.image=self.images[self.direction]
        MainGame.window.blit(self.image,self.rect)
class MyTank(Tank):
    def __init__(self,left,top):
        super(MyTank,self).__init__(left,top)
    def myTank_hit_enemyTank(self):
        for enemyTank in MainGame.enemyTankList:
            if pygame.sprite.collide_rect(self,enemyTank):
                self.stay()
class EnemyTank(Tank):
    def __init__(self,left,top,speed):
        super(EnemyTank,self).__init__(left,top)
        self.images={
            'U':pygame.image.load('TANK/img/enemy1U.gif'),
            'D':pygame.image.load('TANK/img/enemy1D.gif'),
            'L':pygame.image.load('TANK/img/enemy1L.gif'),
            'R':pygame.image.load('TANK/img/enemy1R.gif')
        }
        #敌方坦克,方向随机
        self.direction=self.randDirection()
        self.image=self.images[self.direction]
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.speed=speed
        self.flag=True
        self.step=20
    def enemyTank_hit_myTank(self):
        if pygame.sprite.collide_rect(self,MainGame.my_tank):
            self.stay()
    def randDirection(self):
        num=random.randint(1,4)
        if num == 1:
            return 'U'
        elif num ==2:
            return 'D'
        elif num ==3:
            return 'L'
        elif num ==4:
            return 'R'
    #敌方坦克随机移动
    def randMove(self):
        if self.step <=0:
            self.direction=self.randDirection()
            self.step=60
        else:
            self.move()
            self.step -=1
    def shot(self):
        num=random.randint(1,100)
        if num < 5:
            return Bullet(self)
class Bullet(BaseItem):
    def __init__(self,tank):
        self.image=pygame.image.load('TANK/img/enemymissile.gif')
        self.direction=tank.direction
        self.rect=self.image.get_rect()
        if self.direction == 'U':
            self.rect.left=tank.rect.left+tank.rect.width/2-self.rect.width/2
            self.rect.top=tank.rect.top-self.rect.height
        elif self.direction == 'D':
            self.rect.left = tank.rect.left + tank.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top + tank.rect.height
        elif self.direction == 'L':
            self.rect.left = tank.rect.left - tank.rect.width / 2 - self.rect.width / 2
            self.rect.top = tank.rect.top + tank.rect.width/2 -self.rect.width/2
        elif self.direction == 'R':
            self.rect.left = tank.rect.left + tank.rect.width
            self.rect.top = tank.rect.top + self.rect.width/2-self.rect.width/2
        self.speed=6
        self.live=True

    def move(self):
        if self.direction=='U':
            if self.rect.top >0:
                self.rect.top-=self.speed
            else:
                self.live=False
        elif self.direction=='R':
            if self.rect.left +self.rect.width <SCREEN_WIDTH:
                self.rect.left +=self.speed
            else:
                self.live=False
        elif self.direction =='L':
            if self.rect.left >0:
                self.rect.left -=self.speed
            else:
                self.live=False
        elif self.direction=='D':
            if self.rect.top +self.rect.height <SCREEN_HEIGHT:
                self.rect.top +=self.speed
            else:
                self.live=False
    def hitWall(self):
        for wall in MainGame.wallList:
            if pygame.sprite.collide_rect(self,wall):
                self.live=False
                wall.hp-=1
                if wall.hp<=0:
                    wall.live=False

    def displayBullet(self):
        MainGame.window.blit(self.image,self.rect)
    def myBullet_hit_enemyTank(self):
        for enemyTank in MainGame.enemyTankList:
            if pygame.sprite.collide_rect(enemyTank,self):
                enemyTank.live=False
                self.live=False
                explode=Explode(enemyTank)
                MainGame.explodeList.append(explode)
    def enemyBullet_hit_myTank(self):
        if MainGame.my_tank and MainGame.my_tank.live:
            if pygame.sprite.collide_rect(MainGame.my_tank, self):
                explode = Explode(MainGame.my_tank)
                MainGame.explodeList.append(explode)
                self.live = False
                MainGame.my_tank.live = False


class Wall():
    def __init__(self,left,top):
        self.image=pygame.image.load('TANK/img/steels.gif')
        self.rect=self.image.get_rect()
        self.rect.left=left
        self.rect.top=top
        self.live=True
        self.hp=3
    def displayWall(self):
        MainGame.window.blit(self.image,self.rect)
class Explode():
    def __init__(self,tank):
        self.rect=tank.rect
        self.images=[
            pygame.image.load('TANK/img/blast0.gif'),
            pygame.image.load('TANK/img/blast1.gif'),
            pygame.image.load('TANK/img/blast2.gif'),
            pygame.image.load('TANK/img/blast3.gif'),
            pygame.image.load('TANK/img/blast4.gif'),
        ]
        self.step=0
        self.image=self.images[self.step]
        self.live=True
    def displayExplode(self):
        if self.step<len(self.images):
            self.image=self.images[self.step]
            self.step+=1
            MainGame.window.blit(self.image,self.rect)
        else:
            self.live=False
            self.step=0
if __name__=='__main__':
    MainGame().startGame()

详细资料提取:

链接:https://pan.baidu.com/s/1RN_f9WZkviudE6UlaLeUWQ?pwd=539e 
提取码:539e 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/771594.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何改善提示词,让 GPT-4 更高效准确地把视频内容整体转换成文章?

&#xff08;注&#xff1a;本文为小报童精选文章。已订阅小报童或加入知识星球「玉树芝兰」用户请勿重复付费&#xff09; 让我们来讨论一下大语言模型应用中的一个重要原则 ——「欲速则不达」。 作为一个自认为懒惰的人&#xff0c;我一直有一个愿望&#xff1a;完成视频制作…

typescript2-类的类型

/* 输出 吃饭 游泳 */ []( )继承与多态------------------------------------------------------------------------1. 子类继承父类特征子类 extends 父类2. 当需要父类参数传递时&#xff0c;用子类也可以&#xff0c;这就是多态/* 继承&#xff1a;子类继承父类 多态…

集团型企业组织架构复杂,业务线多,如何进行高效费用管控?

企业管理中流行这样一句话&#xff1a;“企业转型&#xff0c;财务先行”。对集团型企业而言&#xff0c;当今的发展形势下&#xff0c;通过财务战略全面转型、最终撬动企业价值提升&#xff0c;是一件难而正确的事情。 集团企业具有经营规模大、产业链多、分支机构多、地域跨度…

容器部署rabbitmq集群迁移

1、场景&#xff1a; 因业务需要&#xff0c;要求把rabbitmq-A集群上的数据迁移到rabbitmq-B集群上&#xff0c;rabbitmq的数据包括元数据&#xff08;RabbitMQ用户、vhost、队列、交换和绑定&#xff09;和消息数据&#xff0c;而消息数据存储在单独的消息存储库中。 2、迁移要…

中国算力网络市场发展分析

中国算力网络市场发展现状 算力涵盖计算、内存、存储等全方位能力&#xff0c;广泛分布于网络边缘、云计算中心、联网设备及转发节点。随着数字化技术革新&#xff0c;算力与网络正深度融合&#xff0c;推动“算网一体化”的演进。这一新型基础设施日渐凸显其重要性&#xff0c…

番外篇 | YOLOv8改进之即插即用全维度动态卷积ODConv + 更换Neck网络为GFPN

前言:Hello大家好,我是小哥谈。本文所做出的改进是在YOLOv8中引入即插即用全维度动态卷积ODConv和更换Neck网络为GFPN,希望大家学习之后能够有所收获~!🌈 目录 🚀1.基础概念 🚀2.网络结构 🚀3.添加步骤 🚀4.改进方法 🍀🍀步骤1:block.py文件修改…

Kamailio-Web管理页面Siremis的安装与部署

siremis 是针对于 Kamailio 的web管理接口&#xff0c;使用PHP书写&#xff0c;更新至2020年&#xff0c;相对不是太新但是是官方友链的 以下就采用 Ubuntu 22.04Siremis 5.8.0apache http server 2.4php7.0 如有疑问请参看官方指南 以下开始介绍操作步骤 安装apache2.4 we…

一文读懂什么是“GPU算力”

在数字化转型的浪潮中&#xff0c;各行业对算力的需求日益激增&#xff0c;GPU&#xff08;图形处理单元&#xff09;算力作为推动科技进步的重要力量&#xff0c;正逐步从传统的图形渲染领域扩展到人工智能、大数据分析、高性能计算等多个前沿领域。通过本文&#xff0c;深入剖…

亮相2024世界人工智能大会,扫描全能王AIGC“黑科技”助力敦煌遗书数字化修复

7月4日&#xff0c;2024年世界人工智能大会&#xff08;简称“大会”&#xff09;在上海举行。这次这场科技与创新的盛会上&#xff0c;一张古朴、典雅的卷轴吸引了众人的目光。这张被修复的卷轴脱胎于敦煌遗书系列古籍&#xff0c;在被机器拍摄扫描后&#xff0c;卷轴上脏污、…

Airflow: 大数据调度工具详解

欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;欢迎订阅相关专栏&#xff1a; 欢迎关注微信公众号&#xff1a;野老杂谈 ⭐️ 全网最全IT互联网公司面试宝典&#xff1a;收集整理全网各大IT互联网公司技术、项目、HR面试真题. ⭐️ AIGC时代的创新与未来&a…

SalesForce集成案例-获取联系人信息

SalesForce本身比较复杂&#xff0c;涉及的东西比较多&#xff0c;下面以使用REST API接口为例&#xff0c;介绍与SalesForce集成的过程&#xff0c;集成案例&#xff1a;获取联系人信息。 首先需要注册一个免费的开发者帐号&#xff0c;具有完全操作SalesForce的权限。 1、注…

Echarts中的热力图和漏斗图(在Vue中使用热力图和漏斗图)

热力图 (Heatmap) Echarts的热力图用于展示两个维度数据矩阵中的值分布情况。它通过在平面上划分成多个矩形区域&#xff0c;并用不同的颜色填充这些区域来表示数据的大小或强度。颜色渐变从浅到深通常映射着数值从小到大&#xff0c;从而直观展示数据的集中程度和分布模式。热…

STM32工业自动化控制系统教程

目录 引言环境准备工业自动化控制系统基础代码实现&#xff1a;实现工业自动化控制系统 4.1 数据采集模块 4.2 数据处理与分析 4.3 控制系统实现 4.4 用户界面与数据可视化应用场景&#xff1a;工业自动化与优化问题解决方案与优化收尾与总结 1. 引言 工业自动化控制系统利用…

INFINI Console 使用介绍

上次在《INFINI Easysearch尝鲜Hands on》中我们部署了两个节点的Easysearch&#xff0c;并且也设置了Console对集群进行监控。那么今天我们再来介绍下INFINI Console的使用。 INFINI Console 仪表盘功能介绍 INFINI Console 是一个功能强大的数据管理和分析平台&#xff0c;…

JBoss JMXInvokerServlet 反序列化漏洞

漏洞原理&#xff1a; 这是经典的JBoss反序列化漏洞&#xff0c;JBoss在/invoker/JMXInvokerServlet请求中读取了用户传入的对象&#xff0c;然后我们利用Apache Commons Collections中的Gadget执行任意代码。 影响版本&#xff1a; JBoss Enterprise Application Platform 6…

实时数仓Hologres OLAP场景核心能力介绍

作者&#xff1a;赵红梅 Hologres PD OLAP典型应用场景与痛点 首先介绍典型的OLAP场景以及在这些场景上的核心痛点&#xff0c;OLAP典型应用场景很多&#xff0c;总结有四类&#xff1a;第一类是BI报表分析类&#xff0c;例如BI报表&#xff0c;实时大屏&#xff0c;数据中台等…

Java项目:基于SSM框架实现的班主任助理管理系统【ssm+B/S架构+源码+数据库+开题报告+毕业论文】

一、项目简介 本项目是一套基于SSM框架实现的班主任助理管理系统 包含&#xff1a;项目源码、数据库脚本等&#xff0c;该项目附带全部源码可作为毕设使用。 项目都经过严格调试&#xff0c;eclipse或者idea 确保可以运行&#xff01; 该系统功能完善、界面美观、操作简单、功…

iOS App 测试环境升级,遇到的问题以及解决方法

iOS App 测试环境升级&#xff0c;遇到的问题以及解决方法 Mac 实体机升级到 Sonima 14.5 Xcode 升级到 15.3 问题1&#xff1a; Xcode 编译 WebDriverAgent 失败 尝试下载 最新版本的WDA 源码编译&#xff0c;可以编译成功。 问题2&#xff1a;具体坐标直接点击的代码都会报错…

【UML用户指南】-28-对体系结构建模-部署

目录 1、名称 2、节点与制品 2.1、结点与制品相同&#xff1a; 2.2、不同 3、组织结点 4、连接 5、常用建模技术 5.1、对处理器和设备建模 5.2、对制品的分布建模 正如制品一样&#xff0c;结点存在于物质世界中&#xff0c;在对系统的物理方面建模中它是一个重要构造…

关键词感知检索

背景介绍 关键词检索及其局限 在信息检索领域&#xff0c;“传统”方式是通过关键词进行信息检索&#xff0c;其大致过程为&#xff1a; 对原始语料&#xff08;如网页&#xff09;进行关键词抽取。 建立关键词和原始语料的映射关系&#xff0c;常见的方法有倒排索引、TF-ID…