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

前言:创作背景-《坦克大战》是一款经典的平面射击游戏,最初由日本游戏公司南梦宫于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 = xself.y = yself.tank_image = tank_imageself.barrel_image = barrel_imageself.color = colorself.direction = 'UP'self.speed = 4self.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.speedif self.y < 0:self.y = 0elif self.direction == 'DOWN':self.y += self.speedif self.y > HEIGHT - TANK_SIZE:self.y = HEIGHT - TANK_SIZEelif self.direction == 'LEFT':self.x -= self.speedif self.x < 0:self.x = 0elif self.direction == 'RIGHT':self.x += self.speedif self.x > WIDTH - TANK_SIZE:self.x = WIDTH - TANK_SIZEdef 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 = xself.y = yself.dx = dxself.dy = dyself.color = colordef move(self):self.x += self.dxself.y += self.dydef 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 = Truewhile running:self.clock.tick(30)for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif 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 = Falseself.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.mzph.cn/diannao/64499.shtml

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

相关文章

多核并发编译引起的编译错误

编译某个模型的工程化代码&#xff0c;模型里有多个算子使用了tensorrt plugin方式实现的&#xff0c;编译时总是报插件相关的目标文件找不到: CMake Error at /opt/conda/share/cmake-3.22/Modules/FindCUDA/make2cmake.cmake:48 (file):file failed to open for reading (No…

【达梦数据库】Coredump文件生成与分析

目录 背景参考链接分析Coredump文件获取问题SQL1、查看Coredump文件生成路径2、使用gdb工具读取Coredump文件3、记录崩溃线程堆栈4、记录当前崩溃线程号5、使用dmrdc工具分析Coredump文件6、寻找线程号对应SQL7、重新执行SQL&#xff0c;复现问题 记录Coredump文件中所有线程的…

【爬虫一】python爬虫基础合集一

【爬虫一】python爬虫基础合集一 1. 网络请求了解1.1. 请求的类型1.2. 网络请求协议1.3. 网络请求过程简单图解1.4. 网络请求Headers(其中的关键字释义)&#xff1a;请求头、响应头 2. 网络爬虫的基本工作节点2.1. 了解简单网络请求获取响应数据的过程所涉及要点 1. 网络请求了…

基于SCUI的后台管理系统

一、SCUI Admin 官方地址&#xff1a;https://python-abc.xyz/scui-doc/ 高性能中后台前端解决方案&#xff0c;基于 Vue3、elementPlus 持续性的提供独家组件和丰富的业务模板帮助你快速搭建企业级中后台前端任务。 预览地址&#xff1a;https://python-abc.xyz/scui-doc/de…

vscode不同的项目使用不同的环境变量或编译环境

转载请标明出处&#xff1a;小帆的帆的博客 假如电脑中安装的两套C编译环境&#xff0c;想要切换编译环境时可以在操作系统的环境变量中调整顺序&#xff0c;然后排在前面的环境就会被使用。 这样做的弊端&#xff1a; 麻烦容易忘&#xff0c;忘了项目不报错就可能就不会发现…

知网研学 | 知网文献(CAJ+PDF)批量下载

知网文献&#xff08;CAJPDF&#xff09;批量下载 一、知网研学安装二、插件及脚本安装三、CAJ批量下载四、脚本下载及PDF批量下载浏览器取消拦截窗口 一、知网研学安装 批量下载知网文件&#xff0c;格式为es6文件&#xff0c;需使用知网研学软件打开&#xff0c;故需先安装该…

Mybatis-plus-Join--分页查询

数据表四张&#xff1a; user&#xff1a; id,username,create_time,update_time product&#xff1a; id,name,price,number(库存),create_time,update_times order&#xff1a; id,quantity,order_time(下单时间),update_time order_detail:id,product_id,order_id,quant…

Docker 容器中启用 SSH 服务

在 Docker 容器中运行 SSH 服务需要一些调整&#xff0c;因为 Docker 容器通常使用 init 系统而不是完整的 systemd。以下是配置 SSH 服务在 Docker Ubuntu 容器中运行的步骤&#xff1a; 1. 安装 SSH 服务 如果还未安装 OpenSSH&#xff0c;请先安装&#xff1a; apt update…

运输时间超声波流量计基本原理解析

通过从上游传感器向下游传感器发送超声波脉冲并再次返回来测量流体速度。这些信号沿流向和逆流向交替发射。由于信号在其中传播的流体正在流动&#xff0c;因此超声信号沿流向的传播时间比逆流向的传播时间短。测量由此产生的传输时间差 Δt&#xff0c;并允许流量计确定沿超声…

【大模型】大模型项目选择 RAGvs微调?

RAG 输入问题&#xff0c;在知识库匹配知识&#xff0c;构建提示词&#xff1a;基于{知识}回答{问题} 微调 用知识问答对重新训练大模型权重&#xff0c;输入问题到调整后的大模型 如何选择 如果业务要求较高&#xff0c;RAG和微调可以一起使用 1-动态数据 选择RAG 原因&a…

<mutex>注释 11:重新思考与猜测、补充锁的睡眠与唤醒机制,结合 linux0.11 操作系统代码的辅助(上)

&#xff08;46&#xff09;问题的起源&#xff1a; 因为上面的内核代码&#xff0c;我们编写多线程代码时&#xff0c;对手里的家伙事不那么自信。但我们知道&#xff0c;多线程在竞争锁时&#xff0c;若得不到锁&#xff0c;会进入睡眠&#xff0c;并会在被唤醒后重新尝试得…

flask_socketio 以继承 Namespace方式实现一个网页聊天应用

点击进入上一篇&#xff0c;可作为参考 实验环境 python 用的是3.11.11 其他环境可以通过这种方式一键安装&#xff1a; pip install flask3.1.0 Flask-SocketIO5.4.1 gevent-websocket0.10.1 -i https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple pip list 详情如下&am…

LOS/NLOS环境建模与三维TOA定位,MATLAB仿真程序,可自定义锚点数量和轨迹点长度

本代码的主要功能是建模 LOS&#xff08;视距&#xff09;和 NLOS&#xff08;非视距&#xff09;环境下的定位系统&#xff0c;估计目标的动态位置&#xff0c;三维空间 文章目录 运行结果源代码代码介绍 总结 运行结果 10个点的轨迹定位&#xff1a; 50个点的轨迹定位&#…

Centos创建共享文件夹拉取文件

1.打开VMware程序&#xff0c;鼠标右检你的虚拟机&#xff0c;打开设置 2.点击选项——共享文件夹——总是启用 点击添加&#xff0c;设置你想要共享的文件夹在pc上的路径&#xff08;我这里已经添加过了就不加了&#xff09; 注意不要中文&#xff0c;建议用share&#xff0c…

【一文了解】C#重点-委托1

本篇文章来学习一下C#的委托&#xff0c;委托是C#中的一个重要概念&#xff0c;它允许将方法作为参数传递给其他方法。C#中的委托类似于C或C中的函数指针&#xff0c;并且类型安全。 委托 1.委托的定义 委托&#xff08;delegate&#xff09;是方法的代理/代表&#xff0c;委托…

C++算法第十一天

本篇文章我们继续学习动态规划 目录 第一题 题目链接 题目解析 代码原理 代码编写 第二题 题目链接 题目解析 代码原理 代码编写 第三题 题目链接 题目解析 代码原理 代码编写 第四题 题目链接 题目解析 代码原理 代码编写 第五题 题目链接 题目解析 代…

【Linux】结构化命令:until命令

until命令与while命令相反&#xff0c;它要求指定一个返回非0退出状态码的测试命令。只要测试命令的退出状态码不为0&#xff0c;bash shell就会执行循环中列出的命令&#xff1b;一旦测试命令返回了退出状态码0&#xff0c;循环结束。 可以放入多个test command测试命令&…

[x86 ubuntu22.04]投影模式选择“只使用外部”,外部edp屏幕无背光

1 问题描述 CPU&#xff1a;G6900E OS&#xff1a;ubuntu22.04 Kernel&#xff1a;6.8.0-49-generic 系统下有两个一样的 edp 屏幕&#xff0c;投影模式选择“只使用外部”&#xff0c;内部 edp 屏幕灭&#xff0c;外部 edp 屏幕无背光。DP-1 是外部 edp 屏幕&#xff0c;eDP-1…

WPF 完美解决改变指示灯的颜色

WPF 完美解决改变指示灯的颜色 原有&#xff1a;自己再做WPF页面设计后发现直接去查找页面多个控件嵌套情况下找不到指示灯&#xff08;Button实现的&#xff0c;详细可以看这篇文章 这里&#xff09;&#xff0c;具体看看来如何实现 加粗样式思路&#xff1a;无论多级嵌套&a…

【ETCD】【实操篇(二)】如何从源码编译并在window上搭建etcd集群?

要在 Windows 上编译 etcd 及 etcdctl 工具&#xff0c;并使用 bat 脚本启动 etcd 集群&#xff0c;首先需要准备好开发环境并确保依赖项正确安装。下面是从 etcd 3.5 源码开始编译和启动 etcd 集群的详细步骤&#xff1a; 目录 1. 安装 Go 环境2. 获取 etcd 源码3. 编译 etcd…