python3 pygame_利用python3 的pygame模块实现塔防游戏

2023-10-26

利用python3的pygame模块基本实现塔防游戏的基本功能,包括血量和分数显示,bgm,防御塔建造,防御塔攻击范围内的敌军,暂停和加速功能。由于实在没有素材,用的都是自己截图P的,所以美化不好。但基本保证功能,其中有一个BUG,但不影响游戏效果。

1.运行主类

"""主程序"""

from pygame.locals import *

from TowerDefend.enemy import *

from TowerDefend.towerposSet import *

from TowerDefend.tower import *

import pygame

def run():

"""运行函数"""

pygame.init()

size = width, height = 1200, 600

screen = pygame.display.set_mode(size)

background_img = pygame.image.load(r'image/background.png').convert_alpha()

background_img = pygame.transform.scale(background_img, (width, height))

# 创建分数和血量

health_count = 5

score_count = 0

score = pygame.font.Font('font/score_health.ttf', 30)

health = pygame.font.Font('font/score_health.ttf', 30)

# 创建背景音乐

bg_music = pygame.mixer.music

bg_music.load('media/bg.mp3')

bg_music.set_volume(2)

# 创建敌军类

enemies = pygame.sprite.Group()

ENEMY_NUM = 5

position = [[258, 600], [258, 670], [258, 740], [258, 810], [258, 880]]

for i in range(ENEMY_NUM):

enemies.add(Enemy(position[i]))

# 创建炮塔

towers = pygame.sprite.Group()

# 加载暂停键

pause_img = pygame.image.load('image/pause.png').convert_alpha()

pause_rect = pause_img.get_rect()

pause_rect.left, pause_rect.top = 1145, 0

# 加载血量和金币显示

health_money_img = pygame.image.load('image/health_money.png').convert_alpha()

health_money_rect = health_money_img.get_rect()

health_money_rect.left, health_money_rect.top = 0, 0

# 加载加速键

speed_img = pygame.image.load('image/speed.png').convert_alpha()

speed_rect = speed_img.get_rect()

speed_rect.left, speed_rect.top = 1090, 0

# 设置炮塔位置

towers_pos = pygame.sprite.Group()

position_list = [[225, 495], [264, 428], [312, 428], [362, 428], [410, 428], [460, 428], [508, 428], [561, 428],

[561, 373], [377, 373]]

for i in range(len(position_list)):

towers_pos.add(Position(position_list[i]))

# 设置循环条件

running = True

clock = pygame.time.Clock()

paused = False

# 播放音乐

if not bg_music.get_busy():

bg_music.play(-1)

while running:

clock.tick(100)

for event in pygame.event.get():

if event.type == QUIT:

running = False

if event.type == MOUSEBUTTONDOWN:

if event.button == 1:

if speed_rect.collidepoint(event.pos):

for each in enemies:

each.accelerate *= 2

if pause_rect.collidepoint(event.pos):

paused = not paused

for each in towers_pos:

if each.rect.collidepoint(event.pos):

tower = Tower([each.rect.left, each.rect.top])

towers.add(tower)

towers_pos.remove(each)

if not paused:

for enemy in enemies:

if enemy.active:

enemy.move()

else:

if enemy.rect.top <= 180:

health_count -= 1

if enemy.rect.top > 180:

score_count += 20

enemies.remove(enemy)

# 绘制界面设置

screen.blit(background_img, (0, 0))

screen.blit(health.render(str(health_count), True, (255, 255, 255)), (60, 0.3))

screen.blit(score.render(str(score_count), True, (255, 255, 255)), (130, 0.5))

screen.blit(health_money_img, health_money_rect)

screen.blit(pause_img, pause_rect)

screen.blit(speed_img, speed_rect)

# 绘制炮塔

for each in towers:

each.draw(screen, enemies)

each.hit(enemies)

# 绘制炮塔位置

towers_pos.draw(screen)

# 敌军若存活则绘制其和血量

for enemy in enemies:

if enemy.active:

screen.blit(enemy.img, enemy.rect)

enemy.drawhealth(screen)

pygame.display.flip()

pygame.quit()

if __name__ == "__main__":

run()

2.炮塔类

"""TOWER"""

import pygame

import math

class Tower(pygame.sprite.Sprite):

"""tower"""

def __init__(self, pos):

pygame.sprite.Sprite.__init__(self)

self.img0 = pygame.image.load('image/tower0.png')

self.img1 = pygame.image.load('image/tower1.png')

self.img2 = pygame.image.load('image/tower2.png')

self.rect = self.img0.get_rect()

self.rect.left, self.rect.top = pos

self.count = 1

def draw(self, screen, enemies):

"""绘制"""

if self.count > 90:

self.count = 1

if 1 <= self.count < 30:

screen.blit(self.img0, self.rect)

elif 30 <= self.count < 60:

screen.blit(self.img1, self.rect)

else:

screen.blit(self.img2, self.rect)

for enemy in enemies:

distance = math.sqrt(

math.pow((self.rect.left - enemy.rect.left), 2) + math.pow((self.rect.top - enemy.rect.top), 2))

if distance < 50 and enemy.active is True:

self.count += 1

def hit(self, enemies):

"""攻击"""

for enemy in enemies:

distance = math.sqrt(

math.pow((self.rect.left - enemy.rect.left), 2) + math.pow((self.rect.top - enemy.rect.top), 2))

if distance < 50:

enemy.health -= 1

if enemy.health == 0:

enemy.active = False

3.敌军类

import pygame

class Enemy(pygame.sprite.Sprite):

"""小兵类"""

def __init__(self, position):

pygame.sprite.Sprite.__init__(self)

self.img = pygame.image.load(r'image/enemy.png').convert_alpha()

self.rect = self.img.get_rect()

self.init_pos = position

self.rect.left, self.rect.top = self.init_pos

self.accelerate = 1

self.speed = [0, -self.accelerate]

self.active = True

self.health = 500

# 竖直

self.status = 'UP'

def move(self):

"""移动"""

self.rect = self.rect.move(self.speed)

if self.rect.top <= 448 and self.rect.left == 258:

self.rect.top = 448

self.status = 'R'

self.img = pygame.transform.rotate(self.img, 270)

self.speed = [self.accelerate, 0]

if self.rect.top == 448 and self.rect.left >= 597:

self.rect.left = 597

self.status = 'UP'

self.img = pygame.transform.rotate(self.img, 90)

self.speed = [0, -self.accelerate]

if 320 < self.rect.top <= 335 and self.rect.left == 597:

self.rect.top = 335

self.status = 'L'

self.img = pygame.transform.rotate(self.img, 90)

self.speed = [-self.accelerate, 0]

if self.rect.top == 335 and self.rect.left <= 370:

self.rect.left = 370

self.status = 'UP'

self.img = pygame.transform.rotate(self.img, 270)

self.speed = [0, -self.accelerate]

if self.rect.top <= 216 and self.rect.left == 370:

self.rect.top = 216

self.status = 'R'

self.img = pygame.transform.rotate(self.img, 270)

self.speed = [self.accelerate, 0]

if self.rect.top == 216 and 800 > self.rect.left >= 746:

self.rect.left = 746

self.status = 'DW'

self.img = pygame.transform.rotate(self.img, 270)

self.speed = [0, self.accelerate]

if self.rect.top >= 330 and self.rect.left == 746:

self.rect.top = 330

self.status = 'R'

self.img = pygame.transform.rotate(self.img, 90)

self.speed = [self.accelerate, 0]

if self.rect.top == 330 and self.rect.left >= 930:

self.rect.left = 930

self.status = 'UP'

self.img = pygame.transform.rotate(self.img, 90)

self.speed = [0, -self.accelerate]

if self.rect.top < 180:

self.active = False

def drawhealth(self, screen):

"""绘制血量"""

BLACK = (0, 0, 0)

RED = (255, 0, 0)

GREEN = (0, 255, 0)

health_percentage = float(self.health) / 500

if self.status == 'UP':

start = self.rect.left + 8

pygame.draw.line(screen, BLACK, (start, self.rect.top - 3),

(start + 32, self.rect.top - 3), 4)

if health_percentage > 0.5:

pygame.draw.line(screen, GREEN, (start, self.rect.top - 3),

(start + 32 * health_percentage, self.rect.top - 3), 4)

else:

pygame.draw.line(screen, RED, (start, self.rect.top - 3),

(start + 32 * health_percentage, self.rect.top - 3), 4)

elif self.status == 'DW':

start = self.rect.left + 8

pygame.draw.line(screen, BLACK, (start, self.rect.bottom + 3),

(start + 32, self.rect.bottom + 3), 4)

if health_percentage > 0.5:

pygame.draw.line(screen, GREEN, (start, self.rect.bottom + 3),

(start + 32 * health_percentage, self.rect.bottom + 3), 4)

else:

pygame.draw.line(screen, RED, (start, self.rect.bottom + 3),

(start + 32 * health_percentage, self.rect.bottom + 3), 4)

elif self.status == 'R':

start = self.rect.bottom - 8

pygame.draw.line(screen, BLACK, (self.rect.right + 3, start),

(self.rect.right + 3, start - 32), 4)

if health_percentage > 0.5:

pygame.draw.line(screen, GREEN, (self.rect.right + 3, start),

(self.rect.right + 3, start - 32 * health_percentage), 4)

else:

pygame.draw.line(screen, RED, (self.rect.right + 3, start),

(self.rect.right + 3, start - 32 * health_percentage), 4)

else:

start = self.rect.bottom - 8

pygame.draw.line(screen, BLACK, (self.rect.left - 3, start),

(self.rect.left - 3, start - 30), 4)

if health_percentage > 0.5:

pygame.draw.line(screen, GREEN, (self.rect.left - 3, start),

(self.rect.left - 3, start - 30 * health_percentage), 4)

else:

pygame.draw.line(screen, RED, (self.rect.left - 3, start),

(self.rect.left - 3, start - 30 * health_percentage), 4)

def reset(self):

"""reset the position"""

self.rect.left, self.rect.top = self.init_pos

4.炮塔建造位置类

"""初始化炮塔可占据的位置"""

import pygame

class Position(pygame.sprite.Sprite):

"""pos"""

def __init__(self, pos):

pygame.sprite.Sprite.__init__(self)

self.image = pygame.image.load('image/pt.png')

self.rect = self.image.get_rect()

self.rect.left, self.rect.top = pos

5.说明

本游戏通过鼠标左键点击炮塔可以建造的位置俩建造炮塔。

6.效果图

可以看到图确实不好看,但美术功底不够,所以不怎么好看。当然需要素材的也可以给你。

本文标题: 利用python3 的pygame模块实现塔防游戏

本文地址: http://www.cppcns.com/jiaoben/python/296153.html

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

python3 pygame_利用python3 的pygame模块实现塔防游戏 的相关文章

  • 彻底解决电脑自动更新问题

    是不是隔几天电脑关机 重启的时候那会出现更新后再关机或者更新后再重启 没有立刻关机或重启是不是很烦 去设置那里的更新只能是短暂的暂停更新七天而已 这种方法没什么用的 治表不治本 只能推迟而已 如果windows推送一下小升级七天后你又得更新
  • 什么是JWT?(细致讲解)

    什么是JWT 转自 java技术爱好者 链接 https www zhihu com question 485758060 answer 2257869896 来源 知乎 起源 需要了解一门技术 首先从为什么产生开始说起是最好的 JWT 主
  • 状态设计模式

    目录 前言 状态机原理 状态机的实现方式一 分支逻辑法 状态机实现方式二 查表法 状态机实现方式三 状态模式 总结 参考资料 前言 在实际的软件开发中 状态模式并不是很常见 但是在能够用到的场景里 可以发挥比较大的作用 状态模式一般用来实现
  • HTTPSHandler & SSL Error

    我在服务器ubuntu中 尝试使用pip3 但是出现下面的报错 ImportError cannot import name HTTPSHandler 通过查询资料 发现报错的原因是 该pip3 5中没有安装好openssl 我尝试在pyt
  • python的安装过程

    python的安装 进入官网 点击进入官方链接 点击官方后 进入该页面 可以英译中 点击 Downloads即下载 选择适合自己的系统 windows系统即选择windows 苹果系统即选择macOS 进入下载页面后 选择python的版本
  • 2023面试自动化测试面试题【含答案】

    1 你做了几年的测试 自动化测试 说一下 selenium 的原理是什么 我做了五年的测试 1年的自动化测试 selenium 它是用 http 协议来连接 webdriver 客户端可以使用 Java 或者 Python 各种编程语言来实
  • flask中的Flask、request、render_temple、redirect和url_for

    学flask也有一个多星期了 对这个web框架也有了一点的了解 梳理一些基础的知识点 还是小白一只 代码写得比较low 若文章有错误的地方欢迎大佬随时指正 代码中被注释掉的代码是关于预防csrf 无视即可 主程序脚本 1 from flas
  • 01.Vuepress2.x 创建自己的技术文档站

    目录 一 简介 二 安装 三 配置 四 启动 五 效果图 六 编译 一 简介 Vuepress2 x 英文官网 Vuepress2 x 中文官网 二 安装 参考 步骤1 新建一个文件夹 如 Doc2 0 步骤2 进入文件夹目录 新建 pac
  • Anaconda对python环境管理常用命令

    创建环境 n 为指定环境名称 python 未指定python的版本 conda create n env name python 3 6 删除环境 conda remove n env name all 删除环境的包 conda remo
  • LordOfTheRoot_1.0.1靶机入侵

    LordOfTheRoot 1 0 1靶机入侵 1 环境搭建 下载地址 https www vulnhub com entry lord of the root 101 129 下载后用 VMware 或者 VirtualBox 打开 并配
  • ocr文字识别环境部署

    一 Linux环境下部署1 环境要求操作系统 CenterOS7 主要软件环境 python3 9X64 opencv4 5 5 PaddleOCR2 5 paddlepaddle2 2 1 python运行环境建议3 6 3 91 环境安
  • 初级学习01

    打开cmd的方式 1 管理员方式进行 2 Win R 输入cmd 3 在任意文件夹下面 shift 鼠标右键 4 资源管理器的地址栏前 cmd路径 常用的Dos命令 1 盘符切换 C D F 2 查看当前目录下的所有文件 dir 3 切换目
  • ionic2 打包android包时报'C:\Users\Administrator\AppData\Local\Android\sdk' does not exist.

    写在前面 为了能及时的将自己踩到的前端坑 包括ionic angular ReactNative 小程序 APICloud 分享给大家 以后会逐渐将文章转移到微信公众号 前端e家 front e family 可直接扫码关注 公众号会不定期
  • 解析@EnableWebMvc 、WebMvcConfigurationSupport和WebMvcConfigurationAdapter

    在spring boot spring mvc 的项目中 有些时候我们需要自己配置一些项目的设置 就会涉及到这三个 那么 他们之间有什么关系呢 首先 EnableWebMvc WebMvcConfigurationSupport 使用了 E
  • 设置button的边框颜色和宽度

    UIButton button UIButton buttonWithType UIButtonTypeCustom button frame CGRectMake 100 100 100 100 button layer cornerRa
  • Flutter图片选择 image_picker(官方)插件使用详解

    Flutter图片选择 image picker 官方 插件使用详解 IOS自测 image picker GitHub最新版本查看 https github com flutter plugins 下滑找到image picker可以看到
  • apipost-一键压测

    apipost新功能可实现一键压测 接口压测实践 使用场景 对指定接口进行性能测试 实现方式 为实现高性能的并发需求 使用自研的压测引擎 可以实现一万以上并发 项目已经开源 github地址 https github com Apipost
  • STM32 GPIO: pull up, pull down, no pull

    gpio 有3种状态 上拉 下拉 不拉 首先 确定GPIO口的输入和输出 当GPIO处于output模式 一般选择no pull 引脚能够正确地输出目标值 当GPIO处于input模式 需要根据默认的输入值来确定配置模式 如果默认输入的值为
  • C语言小游戏——推箱子(一次性版本)

    目录 思路 1 游戏的开始和地图设定 2 地图场景设置和人物的四项移动 3 分析人物的移动 4 判断结束条件 思路 l 分析 编写代码实现 控制游戏角色 在地图上 避开障碍物 将箱子推到目标点 游戏元素 角色 控制移动 地图 游戏场所 空地

随机推荐

  • JavaScript 的初识

    JavaScript 是 Web 的编程语言 是一种轻量级的编程语言 是可插入 HTML 页面的编程代码 插入 HTML 页面后 可由所有的现代浏览器执行 且JavaScript 非常容易学 文章目录 一 认识JavaScript 二 Ja
  • Git基本命令使用

    Git基本命令使用 分支操作 显示所有本地分支 git branch 显示所有远程分支 git branch r 新建一个分支 git branch branch name 切换到指定的分支 git checkout b branch na
  • Spring框架——IOC和AOP以及DI

    一 IOC原理 1 控制反转 IOC 将创建管理对象的工作交给容器来做 在容器初始化 或在某个时间节点 通过反射机制创建好对象 在使用时直接从容器中获取 控制反转 将对象的控制权反过来交给容器管理 依赖注入 DI 将对象依赖写入配置文件 在
  • Python实现基本Socket服务端与客户端通信

    该文章使用 python 实现基本的 socket 服务端与客户端通信 分步详解与完整代码都有 按需所求即可 一 服务端代码 1 引入自带的socket模块 并创建一个socket实例 服务端需要使用 bind 将该实例绑定到指定域名与端口
  • WDK李宏毅学习笔记第十二周01_ELMO,BERT,GPT

    ELMO BERT GPT 文章目录 ELMO BERT GPT 摘要 1 Contextualized Word Embedding 2 Embeddings from Language Model ELMO 3 Bidirectiona
  • 入门PyTorch的学习路线指南

    PyTorch是目前最受欢迎的深度学习框架之一 它具有易于使用 灵活性强 支持动态图等优点 因此备受研究者和工程师的青睐 如果你想学习PyTorch 下面是一个入门PyTorch的学习路线 学习基础知识 学习Python编程语言 PyTor
  • GD32F450 通过i2c 总线上写指令,从机mcp3421 没有应答信号ACK

    没有ACK的原因 mcp3421地址配置错了 丝印型号是CB5R 地址应该是001 而不是默认的000 MCP3421 ADC单通道模数转换器 中文规格书下载链接 https bbs elecfans com jishu 2245219 1
  • 内部类全面了解

    格式 public class A类 修饰符 class B类 注意点 1 内部类可以直接访问外部类成员 包括私有 2 外部类要访问内部类成员必须要创建对象根据内部类在类中定义的位置 分为 1 在类的成员位置 成员内部类 2 在类的局部位置
  • thymeleaf 常用标签

    1 spring boot 集成 thymeleaf 在pom xml 文件中添加
  • Unity 3D网页游戏 Demo 展示

    2011 年 网页 3D 这一网游开发新趋势逐渐浮出水面 Unity 作为浏览器及移动设备 3D 引擎领域的佼佼者 在国内开始崭露头角 我们团队也完成了首款 Unity Demo 的第一个版本 Demo 通过角色选择 地图漫游 副本战斗 庄
  • hadoop错误记录

    今天弄了一下hadoop 我好大杂烩啊 没办法 被逼的 记录几个错误 1 Name node is in safe mode 这是因为在分布式文件系统启动的时候 开始的时候会有安全模式 当分布式文件系统处于安全模式的情况下 文件系统中的内容
  • 技术、产业、人才三管齐下,数字人民币渐行渐近

    摘要 产业动态 Roxe与Fairexpay达成战略合作 拓展印度汇款业务 自治区级区块链 桂链 发布启动并全面接入 星火 链网 云南省区块链和数字科技标准化技术委员会获批成立 福建省高校首个产教融合区块链联合实验室揭牌 国网电商公司创新探
  • JS背景网页樱花特效

    js绘制网页樱花飘落背景 放入底部可用 在网上也有很多这样案例 js 放于底部 推荐下面这种写法 当然还有一种 小唯美 1
  • Android的服务Service

    Android学了太久了 都忘了 复习下四大组件之一的Service 介绍 Android的Service是一种在后台执行长时间运行操作的组件 它可以在没有用户界面的情况下执行任务 并且可以与应用程序的其他组件进行通信 Service通常用
  • openwrt python_Openwrt python,openwrt上使用Python

    需要安装libffi python mini python libffi以及python mini需要安装在python之前 wget c http downloads openwrt org cn backfire 10 03 1 brc
  • fedora上编译运行C文件

    include
  • 达梦管理工具连接远程达梦数据库报6001错误,但是disql可以连接

    问题 使用达梦客户端工具访问服务连接 总是报6001错误 已排除如下问题 1 服务器防火墙限制 2 达梦数据库服务没启动 可以使用 disql testuser 123456 192 168 1 22 5236命令连接 3 最大会话限制 数
  • MyBatis 中的插件如何实现

    MyBatis 是一款优秀的 Java 持久层框架 它提供了许多方便开发的功能 其中包括插件 插件可以用于修改 MyBatis 的默认行为 增强其功能 在 MyBatis 中 我们可以使用 Interceptor 接口和 Intercept
  • 海森矩阵(Hessian matrix)

    转自 http hi baidu com imheaventian item c8591b19907bd816e2f98612 在数学中 海森矩阵 Hessian matrix 或 Hessian 是一个自变量为向量的实值函数的二阶偏导数组
  • python3 pygame_利用python3 的pygame模块实现塔防游戏

    利用python3的pygame模块基本实现塔防游戏的基本功能 包括血量和分数显示 bgm 防御塔建造 防御塔攻击范围内的敌军 暂停和加速功能 由于实在没有素材 用的都是自己截图P的 所以美化不好 但基本保证功能 其中有一个BUG 但不影响