Python-基于Pygame的小游戏(坦克大战-1.0(世界))(一)

news2024/12/18 12:12:10

前言:创作背景-《坦克大战》是一款经典的平面射击游戏,最初由日本游戏公司南梦宫于1985年在任天堂FC平台上推出。游戏的主题围绕坦克战斗,玩家的任务是保卫自己的基地,同时摧毁所有敌人的坦克。游戏中有多种地形和敌人类型,玩家可以通过获取道具来强化坦克和基地。此外,游戏还支持玩家自创关卡,增加了游戏的趣味性。游戏中,玩家通过键盘控制坦克的移动和射击,需要灵活应对敌人的攻击并操作自身坦克摧毁敌方坦克,以获得胜利。那么话不多说,本次编程我们就一起来重温这部童年经典游戏。

编程思路:本次编程我们将会用到pygame,random等库。

第一步:准备第三方库

pygame是Python的一个第三方库,它需要我们自行下载。

下载方法:在PyCharm终端中输入"pip install pygame",回车等待一段时间。

pip install pygame

第二步:准备游戏相关图片(包括敌我双方的坦克主体和炮管)

                                                               敌方坦克主体图片

敌方坦克炮管图片

我方坦克主体图片

                                                                     

                                                                我方坦克炮管图片

(需要的也可以私信我发哦)

接下来我们将图片放在python项目下。(如下红色圆圈标注所示)

第三步:完整游戏代码

#导入库
import pygame
import random

#初始化Pygame
pygame.init()

#设置窗口及相关设置
WIDTH = 800
HEIGHT = 600
WHITE = (255, 255, 255)
GREEN = (0, 255, 0)
RED = (255, 0, 0)
BLACK = (0, 0, 0)
TANK_SIZE = 30
BULLET_SPEED = 10

#图片加载函数
def load_image(path):
    return pygame.image.load(path).convert_alpha()

#坦克类
class Tank:
    def __init__(self, x, y, tank_image, barrel_image, color):
        self.x = x
        self.y = y
        self.tank_image = tank_image
        self.barrel_image = barrel_image
        self.color = color
        self.direction = 'UP'
        self.speed = 4
        self.bullets = []

    def draw(self, screen):
        screen.blit(self.tank_image, (self.x, self.y))
        if self.direction == 'UP':
            rotated_barrel = pygame.transform.rotate(self.barrel_image, -90)
            screen.blit(rotated_barrel, (self.x + TANK_SIZE / 2 - rotated_barrel.get_width() / 2+20, self.y - rotated_barrel.get_height()))
        elif self.direction == 'DOWN':
            rotated_barrel = pygame.transform.rotate(self.barrel_image, 90)
            screen.blit(rotated_barrel, (self.x + TANK_SIZE / 2 - rotated_barrel.get_width() / 2+20, self.y + TANK_SIZE+20))
        elif self.direction == 'LEFT':
            rotated_barrel = pygame.transform.rotate(self.barrel_image, 180)
            screen.blit(rotated_barrel, (self.x -rotated_barrel.get_height()-30, self.y + TANK_SIZE / 2 - rotated_barrel.get_width() / 2+30))
        else:
            rotated_barrel = pygame.transform.rotate(self.barrel_image, 0)
            screen.blit(rotated_barrel, (self.x + TANK_SIZE+30, self.y + TANK_SIZE / 2 - rotated_barrel.get_height() / 2+10))


    def move(self):
        if self.direction == 'UP':
            self.y -= self.speed
            if self.y < 0:
                self.y = 0
        elif self.direction == 'DOWN':
            self.y += self.speed
            if self.y > HEIGHT - TANK_SIZE:
                self.y = HEIGHT - TANK_SIZE
        elif self.direction == 'LEFT':
            self.x -= self.speed
            if self.x < 0:
                self.x = 0
        elif self.direction == 'RIGHT':
            self.x += self.speed
            if self.x > WIDTH - TANK_SIZE:
                self.x = WIDTH - TANK_SIZE

    def fire(self):
        if self.direction == 'UP':
            bullet = Bullet(self.x + TANK_SIZE / 2+20, self.y, 0, -BULLET_SPEED, self.color)
        elif self.direction == 'DOWN':
            bullet = Bullet(self.x + TANK_SIZE / 2+20, self.y + TANK_SIZE, 0, BULLET_SPEED, self.color)
        elif self.direction == 'LEFT':
            bullet = Bullet(self.x+30, self.y + TANK_SIZE / 2+10, -BULLET_SPEED, 0, self.color)
        else:
            bullet = Bullet(self.x + TANK_SIZE+30, self.y + TANK_SIZE / 2+10, BULLET_SPEED, 0, self.color)
        self.bullets.append(bullet)



#炮弹类
class Bullet:
    def __init__(self, x, y, dx, dy, color):
        self.x = x
        self.y = y
        self.dx = dx
        self.dy = dy
        self.color = color

    def move(self):
        self.x += self.dx
        self.y += self.dy

    def draw(self, screen):
        pygame.draw.circle(screen, self.color, (int(self.x), int(self.y)), 3)

#坦克加载类
class TankWar:
    def __init__(self):
        pygame.init()
        self.screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption('坦克大战-1.0(世界)')
        # 加载玩家坦克图片
        self.player_tank_image = load_image('tank_1.png')
        self.player_barrel_image = load_image('tank_barrel.png')
        self.player_tank = Tank(100, 100, self.player_tank_image, self.player_barrel_image, GREEN)
        self.enemy_tanks = []
        for _ in range(3):
            enemy_tank_image = load_image('enemy_1.png')
            enemy_barrel_image = load_image('enemy_barrel.png')
            x = random.randint(0, WIDTH - TANK_SIZE)
            y = random.randint(0, HEIGHT - TANK_SIZE)
            enemy_tank = Tank(x, y, enemy_tank_image, enemy_barrel_image, RED)
            self.enemy_tanks.append(enemy_tank)
        self.clock = pygame.time.Clock()

    def run(self):
        running = True
        while running:
            self.clock.tick(30)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    running = False
                elif event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_UP:
                        self.player_tank.direction = 'UP'
                        self.player_tank.move()
                    elif event.key == pygame.K_DOWN:
                        self.player_tank.direction = 'DOWN'
                        self.player_tank.move()
                    elif event.key == pygame.K_LEFT:
                        self.player_tank.direction = 'LEFT'
                        self.player_tank.move()
                    elif event.key == pygame.K_RIGHT:
                        self.player_tank.direction = 'RIGHT'
                        self.player_tank.move()
                    elif event.key == pygame.K_SPACE:
                        self.player_tank.fire()

            for enemy in self.enemy_tanks:
                # 随机改变敌方坦克方向
                if random.randint(0, 100) < 20:
                    directions = ['UP', 'DOWN', 'LEFT', 'RIGHT']
                    enemy.direction = random.choice(directions)
                enemy.move()
                if random.randint(0, 100) < 10:
                    enemy.fire()

            for bullet in self.player_tank.bullets:
                bullet.move()
                if bullet.x < 0 or bullet.x > WIDTH or bullet.y < 0 or bullet.y > HEIGHT:
                    self.player_tank.bullets.remove(bullet)
                else:
                    for enemy in self.enemy_tanks:
                        if enemy.x < bullet.x < enemy.x + TANK_SIZE and enemy.y < bullet.y < enemy.y + TANK_SIZE:
                            self.enemy_tanks.remove(enemy)

            for enemy in self.enemy_tanks:
                for bullet in enemy.bullets:
                    bullet.move()
                    if bullet.x < 0 or bullet.x > WIDTH or bullet.y < 0 or bullet.y > HEIGHT:
                        enemy.bullets.remove(bullet)
                    else:
                        if self.player_tank.x < bullet.x < self.player_tank.x + TANK_SIZE and self.player_tank.y < bullet.y < self.player_tank.y + TANK_SIZE:
                            running = False

            self.screen.fill(WHITE)
            self.player_tank.draw(self.screen)
            for enemy in self.enemy_tanks:
                enemy.draw(self.screen)
            for bullet in self.player_tank.bullets:
                bullet.draw(self.screen)
            for enemy in self.enemy_tanks:
                for bullet in enemy.bullets:
                    bullet.draw(self.screen)
            pygame.display.flip()

        pygame.quit()

#游戏主函数
if __name__ == '__main__':
    game = TankWar()
    game.run()

第四步:运行效果展示

第五步:玩法介绍

上,下,左,右键控制移动方向,空格键控制发射。

(后面我还会持续更新哦)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

认识漏洞-GIT泄露漏洞、APP敏感信息本地存储漏洞

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 [GIT泄露漏洞&#xff0c;你检查了吗&#xff1f;](https://mp.weixin.qq.com/s/I69Jsu8GfX9FJIhMVFe_fA)02 [APP客户端评估- 敏感信息本地存储]( https://mp.weixin.qq.com/s/IrTLZp_lslvGaD4Xhlk…

《Kali 系统中 Docker 镜像加速器安装指南:加速容器镜像拉取》

在 Kali 中配置 Docker 镜像加速器可以显著提高拉取 Docker 镜像的速度&#xff0c;以下是具体步骤&#xff1a; 一、获取镜像加速器地址 国内有许多云服务提供商提供镜像加速器服务&#xff0c;例如阿里云、腾讯云、网易云等。以阿里云为例&#xff0c;你需要先在阿里云容器镜…

allure报告环境搭建

1、allure下载新版.zip文件&#xff0c;解压 https://repo.maven.apache.org/maven2/io/qameta/allure/allure-commandline/ 2、解压后放到d盘文件里&#xff1a;、 3、环境变量配置bin文件和jre文件 4、虚拟环境里安装allure-pytest&#xff0c;cmd执行activate.bat,进入对应…

MVC基础——市场管理系统(四)

文章目录 项目地址六、EF CORE6.1 配置ef core环境6.2 code first6.2.1 创建Database context1. 添加navigation property2. 添加MarketContext上下文七、Authentication7.1 添加Identity7.2 Run DB migration for Identity7.3 使用Identity7.3.1 设置认证中间件7.3.2 设置权限…

33. Three.js案例-创建带阴影的球体与平面

33. Three.js案例-创建带阴影的球体与平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 场景的核心类。它负责将场景中的对象绘制到画布上。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersObject可选参数…

Scala—“==“和“equals“用法(附与Java对比)

Scala 字符串比较—""和"equals"用法 Scala 的 在 Scala 中&#xff0c; 是一个方法调用&#xff0c;实际上等价于调用 equals 方法。不仅适用于字符串&#xff0c;还可以用于任何类型&#xff0c;并且自动处理 null。 Demo&#xff1a; Java 的 在 J…

Qt WORD/PDF(一)使用 QtPdfium库实现 PDF 预览

文章目录 一、简介二、下载 QtPdfium三、加载 QtPdfium 动态库四、Demo 使用 关于QT Widget 其它文章请点击这里: QT Widget 姊妹篇: Qt WORD/PDF&#xff08;一&#xff09;使用 QtPdfium库实现 PDF 操作 Qt WORD/PDF&#xff08;二&#xff09;使用 QtPdfium库实现…

优选算法——链表

1. 链表常用技巧和操作总结 2. 两数相加 题目链接&#xff1a;2. 两数相加 - 力扣&#xff08;LeetCode&#xff09; 题目展示&#xff1a; 题目分析&#xff1a;本题给的是逆序&#xff0c;其实降低了难度&#xff0c;逆序刚好我们从第一位开始加&#xff0c;算法原理其实就…

[蓝桥杯 2019 国 B] 排列数

目录 前言 题解 思路 疑问 解答 前言 对于本篇文章是站在别人的基础之上来写的&#xff0c;对于这道题作为2019年国赛B组的最难的一题&#xff0c;他的难度肯定是不小的&#xff0c;这道题我再一开始接触的时候连思路都没有&#xff0c;也是看了两三遍别人发的题解&#x…

Spring Boot 3.x:自动配置类加载机制的变化

随着 Spring Boot 3.x 版本的发布&#xff0c;Spring Boot 引入了一些关键的变更。其中最重要的一项变更是 自动配置类的加载机制。在之前的版本中&#xff0c;Spring Boot 使用 spring.factories 文件来管理自动配置类的加载。然而&#xff0c;在 Spring Boot 3.x 中&#xff…

arXiv-2024 | NavAgent:基于多尺度城市街道视图融合的无人机视觉语言导航

作者&#xff1a;Youzhi Liu, Fanglong Yao*, Yuanchang Yue, Guangluan Xu, Xian Sun, Kun Fu 单位&#xff1a;中国科学院大学电子电气与通信工程学院&#xff0c;中国科学院空天信息创新研究院网络信息系统技术重点实验室 原文链接&#xff1a;NavAgent: Multi-scale Urba…

(三)PyQT5+QGIS+python使用经验——解决各版本不兼容问题

一、问题描述 基础环境&#xff1a;Windows10&#xff08;64&#xff09; PyCharm2024 QGIS 3.22。 目的&#xff1a;解决之前python版本多&#xff0c;pyqt5以及QT Designer交互使用存在环境变量冲突矛盾&#xff0c;以及QGIS安装时自带python、pyqt5等问题。 尤其是在QT …

【OpenCV计算机视觉】图像处理——平滑

本篇文章记录我学习【OpenCV】图像处理中关于“平滑”的知识点&#xff0c;希望我的分享对你有所帮助。 目录 一、什么是平滑处理 1、平滑的目的是什么&#xff1f; 2、常见的图像噪声 &#xff08;1&#xff09;椒盐噪声 ​编辑&#xff08;2&#xff09; 高斯噪声 &a…

秒优科技-供应链管理系统 login/doAction SQL注入漏洞复现

0x01 产品简介 秒优科技提供的供应链管理系统,即秒优SCM服装供应链管理系统,是一款专为服装电商企业设计的全方位解决方案。是集款式研发、订单管理、物料管理、生产管理、工艺管理、收发货管理、账单管理、报表管理于一体的服装电商供应链管理解决方案。它涵盖了从企划到开…

快速掌握源码部署Filebeat

文章目录 1. 裸金属安装1.1 压缩包方式安装1.2 yum方式安装 2. docker安装3. K8s安装 项目使用了Filebeat&#xff0c;现在需要运行在ARM架构的服务器上&#xff0c;但是Filebeat官方没有提供&#xff0c;需要自己编译一份 filebeat等组件的源码地址 https://github.com/elasti…

ST-Linker V2 烧录器详解说明文档

目录 ST-Linker v2烧录器介绍 STM8烧录口 STM32烧录接口 JTAG烧录接口 ​​​​​​​ ​​​​​​​ ​​​​​​​ 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 ST-Linker v2烧录器介绍 图片中是两种IC芯片的烧录器&#x…

同三维TL201H2S4 4+2机手术互动录播主机产品

同三维TL201H2S4 42机手术互动录播主机产品 录制点播、直播导播、互动、音频处理器、中控等多功能为一体 6路视频输入:4路SDI1路HDMI1(4K30)1路(3选1:HDMI2/2路VGA) 2路视频输出&#xff1a;1路HDMI1(4K30)1路&#xff08;2选1&#xff1a;VGA和HDMI2) 5路音频输入&#xf…

RabbitMQ实现网络分区

RabbitMQ实现网络分区 网络分区的判断应答时间范围判定方式日志方式命令查看监控页面提示API查看 模拟网络分区封禁端口封禁IP封禁网卡挂起恢复操作系统 网络分区的影响未配置镜像队列情况下已配置镜像队列情况下 处理网络分区手动处理恢复步骤挑选信任分区重启方式&#xff08…

一、LRU缓存

LRU缓存 1.LRU缓存介绍2.LRU缓存实现3.LRU缓存总结3.1 LRU 缓存的应用3.2 LRU 缓存的优缺点 1.LRU缓存介绍 LRU是Least Recently Used 的缩写&#xff0c;意为“最近最少使用”。它是一种常见的缓存淘汰策略&#xff0c;用于在缓存容量有限时&#xff0c;决定哪些数据需要被删…

【大前端vue:组件】鼠标上移 出现动画

【大前端vue&#xff1a;组件】鼠标上移 出现动画 <template><div class"view-introduction-culture"><div class"culture-wrapper"><h2 class"culture-title">鼠标上移&#xff1a;展示动画 显示出来</h2><di…