首页 > 编程语言 >Python-基于Pygame的小游戏(天空之战)(一)

Python-基于Pygame的小游戏(天空之战)(一)

时间:2024-12-19 21:02:20浏览次数:6  
标签:Python self plane 小游戏 Pygame image screen rect pygame

前言:不久前接触了Python的游戏制作的相关第三方库,于是学习了pygame的相关内容,想制作一款基于pygame的小游戏。因为还不太熟悉游戏制作和pygame,部分内容我参考了《Python-从入门到精通》这本书。那么好,话不多说,我们直接进入今天的Python学习之旅-制作基于Pygame的小游戏(天空之战)。

一:准备游戏相关图片

制作pygame小游戏天空之战时,我们需要事先准备好相关的图片(如自己的战机,敌机,子弹等),最好是png或jpg格式。我这里用的是Windows自带的"画图"功能来制作自己的战机,敌机,子弹等图片,大家可以自行制作(需要我的原图片的话私信我发也行)。(如下所示)

敌机图片

战机图片

子弹图片

制作好图片好后我们将图片放在python项目下。(如下圆圈标注所示)

二:完整代码展示

import pygame
import sys
import random


pygame.init()
screen_width = 800
screen_height = 600
screen = pygame.display.set_mode((screen_width, screen_height))
pygame.display.set_caption("飞机大战")
clock = pygame.time.Clock()

player_plane_image = pygame.image.load('airplane.png').convert_alpha()
enemy_plane_image = pygame.image.load('enemy.png').convert_alpha()
bullet_image = pygame.image.load('bullet.png').convert_alpha()

BLACK = (0, 0, 0)


class PlayerPlane(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = player_plane_image
        self.rect = self.image.get_rect()
        self.rect.centerx = screen_width // 2
        self.rect.bottom = screen_height - 10
        self.speed_x = 0
        self.speed_y = 0
        self.bullets = pygame.sprite.Group()

    def update(self):
        self.rect.x += self.speed_x
        self.rect.y += self.speed_y
        if self.rect.right > screen_width:
            self.rect.right = screen_width
        if self.rect.left < 0:
            self.rect.left = 0
        if self.rect.bottom > screen_height:
            self.rect.bottom = screen_height
        if self.rect.top < 0:
            self.rect.top = 0
        self.bullets.update()

    def shoot(self):
        bullet = Bullet(self.rect.centerx, self.rect.top)
        self.bullets.add(bullet)


class EnemyPlane(pygame.sprite.Sprite):
    def __init__(self):
        pygame.sprite.Sprite.__init__(self)
        self.image = enemy_plane_image
        self.rect = self.image.get_rect()
        self.rect.x = random.randint(0, screen_width - self.rect.width)
        self.rect.y = random.randint(-100, -40)
        self.speed_y = random.randint(1, 3)

    def update(self):
        self.rect.y += self.speed_y
        if self.rect.top > screen_height:
            self.rect.x = random.randint(0, screen_width - self.rect.width)
            self.rect.y = random.randint(-100, -40)


class Bullet(pygame.sprite.Sprite):
    def __init__(self, x, y):
        pygame.sprite.Sprite.__init__(self)
        self.image = bullet_image
        self.rect = self.image.get_rect()
        self.rect.centerx = x
        self.rect.bottom = y
        self.speed_y = -5

    def update(self):
        self.rect.y += self.speed_y
        if self.rect.bottom < 0:
            self.kill()


player_plane = PlayerPlane()
enemy_planes = pygame.sprite.Group()
for i in range(5):
    enemy_plane = EnemyPlane()
    enemy_planes.add(enemy_plane)

score = 0
font = pygame.font.Font(None, 36)

while True:
    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            pygame.quit()
            sys.exit()
        elif event.type == pygame.KEYDOWN:
            if event.key == pygame.K_LEFT:
                player_plane.speed_x = -3
            elif event.key == pygame.K_RIGHT:
                player_plane.speed_x = 3
            elif event.key == pygame.K_UP:
                player_plane.speed_y = -3
            elif event.key == pygame.K_DOWN:
                player_plane.speed_y = 3
            elif event.key == pygame.K_SPACE:
                player_plane.shoot()
        elif event.type == pygame.KEYUP:
            if event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:
                player_plane.speed_x = 0
            elif event.key == pygame.K_UP or event.key == pygame.K_DOWN:
                player_plane.speed_y = 0

    player_plane.update()
    enemy_planes.update()

    # 碰撞检测
    hits = pygame.sprite.groupcollide(enemy_planes, player_plane.bullets, True, True)
    for hit in hits:
        score += 1
        enemy_plane = EnemyPlane()
        enemy_planes.add(enemy_plane)

    screen.fill(BLACK)
    screen.blit(player_plane.image, player_plane.rect)
    enemy_planes.draw(screen)
    player_plane.bullets.draw(screen)

    # 显示得分
    text = font.render("Score: " + str(score), 1, (255, 255, 255))
    screen.blit(text, (10, 10))

    pygame.display.update()
    clock.tick(60)

三:运行效果展示

四:玩法介绍

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

(后续我还会更新哦)

标签:Python,self,plane,小游戏,Pygame,image,screen,rect,pygame
From: https://blog.csdn.net/2401_83954530/article/details/144495323

相关文章

  • 一些python后端开发
    ngrokngrok提供免费的服务器,并且提供内网穿透功能,可以把内网某个端口反向代理到某个公网地址,需要注册获取tokennginxnginx相比ngrok,可以反向代理多个服务器,并且实现负载均衡等策略nginx安装cd/usr/local/src/wgethttp://nginx.org/download/nginx-1.6.2.tar.gztarzxvfn......
  • 225Python大学生社团管理系统(Pycharm Flask Django Vue mysql)
    文章目录项目介绍和开发技术介绍具体实现截图开发技术开发与测试:设计思路系统测试可行性分析核心代码部分展示文章目录/写作提纲参考源码/演示视频获取方式项目介绍和开发技术介绍对于网站的前台设计,要保证主界面的整洁有序,能够抓住人的眼球,不会产生视觉疲劳,更重要......
  • python毕设 高校研招信息共享系统程序+论文
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校研招信息共享系统的研究,现有研究多以特定的技术框架实现为主,如基于Java相关技术的研究较多,专门针对Python技术实现高校研招信......
  • 本地大模型构建系列(一):5、python调用ollama本地大模型(Windows 10)
    第一步,安装Python依赖包:WIN+R,打开CMD,输入:pipinstallollama也可以使用镜像pipinstallollama-ihttps://pypi.tuna.tsinghua.edu.cn/simple第二步,启动ollama后,开始调用Ollama接口,以调用“qwen2.5:3b”为例启动大模型“qwen2.5:3b”:Win+R调出运行框,输入cmd,在cmd中输......
  • python当中的with关键字
    python当中的with关键字Python中with关键字的作用with关键字在Python中用于上下文管理。它简化了资源的获取和释放,特别是文件操作、数据库连接或网络套接字等资源。使用with语句时,可以确保在执行代码块时,资源会得到适当的管理和清理,即使在出现异常的情况下,也能保证资......
  • 深入浅出之python基础知识
    #!/usr/bin/python#-*-coding:UTF-8-*-forletterin'Python':#第一个实例ifletter=='h':breakprint'当前字母:',lettervar=10#第二个实例whilevar>0:print'......
  • 基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架) 图像识别与分类 前
    基于vgg16和efficientnet卷积神经网络的天气识别系统(pytorch框架)前端界面:flask+python,UI界面:pyqt5+python这是一个完整项目,包括代码,数据集,模型训练记录,前端界面,ui界面,各种指标图:包括准确率,精确率,召回率,F1值,损失曲线,准确率曲线等卷积模型采用vgg16模型或efficien......
  • 修改python jsonpickle源码, 实现不序列化对象私有成员(2)
    在前一篇文章中,通过修改源码来实现对象的私有成员不被序列化的功能.但是不够灵活,于是我又修改了一版,能够自定义过滤函数.实现起来不是很难,要点如下:#pickler.py的_flatten_obj_instance函数self._current_obj=obj#记录正在处理的对象returnself._flatten_dict......
  • Python绘制七段数码管字母:从理论到实践
    在现代电子显示技术中,七段数码管是一种广泛应用的显示器件,常用于显示数字、字母和一些特殊符号。其基本原理是通过控制七个发光段(a,b,c,d,e,f,g)的亮灭来形成不同的显示内容。本文将详细介绍如何使用Python绘制七段数码管显示字母的过程,从基本原理、设计思路到代码实现,提供完......
  • python渗透开发工具脚本之判断域名是否存在CDN 结合真实IP 组合代码逻辑 nslookup 三
    目录什么是CDN为什么要判断域名是否开启CDNCDN如何判断是否开启web工具判断win自带工具pinglinuxdig信息收集真实IP收集nslookup三种玩法判断CDNnslookupcmd中的nslookuppython中的nslookup ---基础玩法python实现自动化判断返回数据判断是否存在CDN基础实......