用python做小游戏——以射击游戏为例

这篇具有很好参考价值的文章主要介绍了用python做小游戏——以射击游戏为例。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

本博客使用了Pygame库来创建游戏窗口和处理游戏逻辑。

目录

一、代码的详细解释:

创建游戏窗口:

蜜蜂的定义与循环出现:

显示蜜蜂和处理碰撞:

定义射击器:

子弹的定义与处理碰撞:

计算两点间距离的函数:

播放背景音乐:

主游戏循环:

二、完整代码展示:

三、视频演示:

四、Gitee仓库地址


一、代码的详细解释:  

创建游戏窗口:
screen = pygame.display.set_mode((WIDTH, HEIGHT))
pygame.display.set_caption("Bee")

创建了一个名为"Bee"的游戏窗口,窗口的大小由WIDTHHEIGHT变量决定。

蜜蜂的定义与循环出现:
class Enemy():
    # 构造函数
    def __init__(self):
        self.img = pygame.image.load('bee.png')
        self.x = random.randint(200, 600)
        self.y = random.randint(50, 250)
        self.step = random.randint(2, 6)

    # 重置蜜蜂位置
    def reset(self):
        self.x = random.randint(200, 600)
        self.y = random.randint(50, 200)

enemies = []
for i in range(number_of_bee):
    enemies.append(Enemy())

定义了一个名为Enemy的类,每个蜜蜂对象有图像、x坐标、y坐标和步长。蜜蜂的循环出现在enemies列表中,初始位置随机。

显示蜜蜂和处理碰撞:
def show_bee():
    for e in enemies:
        screen.blit(e.img, (e.x, e.y))
        e.x += e.step
        if e.x > 736 or e.x < 0:
            e.step *= -1
            e.y += 40
            if e.y >= 450:
                over, over_rect = init_item('game over.jpg', 0, 0)
                txt_restart, txt_restart_rect = show_text("Restart", 300, 300, 32)
                screen.blit(over, over_rect)  ##显示gameover图片
                screen.blit(txt_restart, txt_restart_rect)
                quit()

这个函数用于显示蜜蜂,并在蜜蜂到达窗口边缘时,让其改变方向并向下移动。如果蜜蜂的y坐标超过了450,则游戏结束,显示"game over"图片和"Restart"文字,然后退出游戏。

定义射击器:
play_x = 400
play_y = 500
shoot, shoot_rect = init_item('fighter.png', play_x, play_y)
playerstep = 0

定义了射击器的初始位置,并加载了射击器的图像。

子弹的定义与处理碰撞:
class bullet():
    def __init__(self):
        self.img = pygame.image.load('bullet1.png')
        self.x = play_x
        self.y = play_y + 10
        self.step = 10  # 子弹移动的速度

    def hit(self):
        for e in enemies:
            if distance(self.x, self.y, e.x, e.y) < 30:
                bullets.remove(self)
                e.reset()

bullets = []

def show_bullets():
    for b in bullets:
        screen.blit(b.img, (b.x, b.y))
        b.hit()
        b.y -= b.step
        if b.y < 0:
            bullets.remove(b)

这段代码定义了bullet类,每个子弹对象有图像、x坐标、y坐标和速度。在子弹的hit()方法中,检查子弹与蜜蜂是否碰撞,若是,则移除该子弹并重新生成蜜蜂。show_bullets()函数用于显示子弹,并在子弹超出窗口时移除它们。

计算两点间距离的函数:
def distance(bx, by, ex, ey):
    a = bx - ex
    b = by - ey
    return math.sqrt(a * a + b * b)

这个函数用于计算两点之间的距离,其中bxby表示子弹的坐标,exey表示蜜蜂的坐标。

播放背景音乐:
pygame.mixer.music.load('背景音乐.mp3')  # 导入音乐
pygame.mixer.music.play(loops=-1)  # 循环播放

这段代码加载名为"背景音乐.mp3"的音乐,并设置为循环播放。

主游戏循环:
clock = pygame.time.Clock()  ##用来设定窗口的刷新频率
while True:
    clock.tick(60)  ##每秒执行60次
    screen.fill((0, 0, 0))

    for event in pygame.event.get():
        if event.type == pygame.QUIT:
            exit()
        if event.type == pygame.KEYDOWN:
            if event.key == pygame.K_RIGHT:
                playerstep = 5
            elif event.key == pygame.K_LEFT:
                playerstep = -5
            elif event.key == pygame.K_SPACE:
                bullets.append(bullet())

        if event.type == pygame.KEYUP:
            playerstep = 0
    screen.blit(shoot, (play_x, play_y))
    play_x += playerstep
    if play_x > 736:
        play_x = 736
    if play_x < 0:
        play_x = 0
    show_bee()
    show_bullets()
    pygame.display.flip()

这是游戏的主循环,游戏会在每次循环中执行以下步骤:

最后,游戏会在主循环中不断重复执行以上步骤,实现了蜜蜂的循环出现、射击器的控制以及子弹和蜜蜂之间的碰撞检测。

  • 设置窗口刷新频率为60帧。
  • 填充窗口背景为黑色。
  • 处理事件,包括按键事件和退出事件。
  • 根据按键事件移动射击器的位置,如果按下空格键,则添加一个新的子弹对象到bullets列表。
  • 显示射击器的图像,根据按键事件移动射击器的位置,使其在窗口内左右移动,并限制其不超出窗口边界。
  • 调用show_bee()函数,显示蜜蜂,并处理蜜蜂与窗口边界的碰撞,以及蜜蜂与子弹的碰撞。
  • 调用show_bullets()函数,显示子弹,并处理子弹与窗口边界的碰撞,以及子弹与蜜蜂的碰撞。
  • 使用pygame.display.flip()方法更新整个游戏窗口。

    二、完整代码展示:

    import pygame
    import sys
    import random
    import math
    
    WIDTH = 800
    HEIGHT = 600
    
    
    def pygame_1():
        global event, e
        pygame.init()
        screen = pygame.display.set_mode((WIDTH, HEIGHT))
        pygame.display.set_caption("Bee")
        ##蜜蜂:
        number_of_bee = 6
        ##显示分数
        txt_score, txt_score_rect = show_text("Score:0", 40, 20, 20)
        score = 0
    
        ##蜜蜂的循环出现
        class Enemy():
            def __init__(self):
                self.img = pygame.image.load('bee.png')
                self.x = random.randint(200, 600)
                self.y = random.randint(50, 250)
                self.step = random.randint(2, 6)
    
            def reset(self):
                self.x = random.randint(200, 600)
                self.y = random.randint(50, 200)
    
        enemies = []
        for i in range(number_of_bee):
            enemies.append(Enemy())
    
        def show_bee():
            for e in enemies:
                screen.blit(e.img, (e.x, e.y))
                e.x += e.step
                if e.x > 736 or e.x < 0:
                    e.step *= -1
                    e.y += 40
                    if e.y >= 450:
                        over, over_rect = init_item('game over.jpg', 0, 0)
                        txt_restart, txt_restart_rect = show_text("Restart", 300, 300, 32)
                        screen.blit(over, over_rect)  ##显示gameover图片
                        screen.blit(txt_restart, txt_restart_rect)
                        quit()
    
    
        ##射击器
        play_x = 400
        play_y = 500
        shoot, shoot_rect = init_item('fighter.png', play_x, play_y)
        playerstep = 0
    
        ##子弹
        class bullet():
            def __init__(self):
                self.img = pygame.image.load('bullet1.png')
                self.x = play_x
                self.y = play_y + 10
                self.step = 10  # 子弹移动的速度
    
            def hit(self):
                for e in enemies:
                    if distance(self.x, self.y, e.x, e.y) < 30:
                        bullets.remove(self)
                        e.reset()
    
    
        bullets = []
    
        def show_bullets():
            for b in bullets:
                screen.blit(b.img, (b.x, b.y))
                b.hit()
                b.y -= b.step
                if b.y < 0:
                    bullets.remove(b)
    
        def distance(bx, by, ex, ey):
            a = bx - ex
            b = by - ey
            return math.sqrt(a * a + b * b)
    
        pygame.mixer.music.load('背景音乐.mp3')  # 导入音乐
        pygame.mixer.music.play(loops=-1)  # 循环播放
        clock = pygame.time.Clock()  ##用来设定窗口的刷新频率
        while True:
            clock.tick(60)  ##每秒执行60次
            screen.fill((0, 0, 0))
    
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_RIGHT:
                        playerstep = 5
                    elif event.key == pygame.K_LEFT:
                        playerstep = -5
                    elif event.key == pygame.K_SPACE:
                        bullets.append(bullet())
    
                if event.type == pygame.KEYUP:
                    playerstep = 0
            screen.blit(shoot, (play_x, play_y))
            play_x += playerstep
            if play_x > 736:
                play_x = 736
            if play_x < 0:
                play_x = 0
            show_bee()
            show_bullets()
            pygame.display.flip()
    
    
    def init_item(img_path, pos_x, pos_y):
        ##显示图片
        item = pygame.image.load(img_path)
        item_rect = pygame.Rect((pos_x, pos_y, 0, 0))
        item_rect.size = item.get_size()
        return item, item_rect
    
    
    def show_text(txt, pos_x, pos_y, fontsize=12):
        ##设定显示文本信息
        font = pygame.font.Font(None, fontsize)
        text = font.render(txt, True, (255, 0, 0))
        text_rect = text.get_rect()
        text_rect.centerx = pos_x
        text_rect.centery = pos_y
        return text, text_rect
    
    
    if __name__ == "__main__":
        pygame_1()
    

    三、视频演示:  

    用python做小游戏——以射击游戏为例子文章来源地址https://www.toymoban.com/news/detail-719301.html

    四、Gitee仓库地址

  • Jiamei Fu/PythonWork - 码云 - 开源中国 (gitee.com)

到了这里,关于用python做小游戏——以射击游戏为例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • [游戏开发][Unity] TPS射击游戏相机实现

    [游戏开发][Unity] TPS射击游戏相机实现

    滑屏控制 角色的横向旋转 相机的纵向旋转(区别于横向旋转) 相机贴墙拉近(不能穿墙) 相机观察旋转(角色不转相机转用于观察四周) 开火按钮和旋转屏幕功能共存(边开枪边转向瞄准) 市面上的TPS射击游戏基本上有两种实现射击瞄准 方案一:以枪口射击方向为基准,相机跟着人

    2024年02月16日
    浏览(19)
  • 【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)

    【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(一)(附源码)

    参考原视频链接 【视频】:https://space.bilibili.com/641773200 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入 近几年 俯视角射击游戏 随着《挺进地牢》等双摇杆射击游戏的火热再次出现在玩家的视野中,这类游戏通常都有种类繁多的 武器

    2024年02月12日
    浏览(11)
  • 【用unity实现100个游戏之1】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(二)(附源码)

    参考原视频链接 : 【视频】:https://space.bilibili.com/641773200 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月07日
    浏览(14)
  • unity制作FPS射击游戏

    unity制作FPS射击游戏

    角色动作方面包括行走、奔跑、跳跃、武器切换、弹夹更换、武器展示、弹壳抛出效果、射击效果、全自动与半自动射击效果、瞄准效果、后坐力效果、弹痕效果等多种动作。 非玩家角色(NPC)具备多个动画状态,包括固定路径巡逻、行走、奔跑、寻路攻击等多种行为。 太

    2024年02月08日
    浏览(16)
  • 【Unity实战】制作类元气骑士、挺进地牢——俯视角射击游戏多种射击效果(二)

    参考原视频链接 : 【视频】:https://space.bilibili.com/641773200 注意 :本文为学习笔记记录,推荐支持原作者,去看原视频自己手敲代码理解更加深入

    2024年02月12日
    浏览(17)
  • 使用团结引擎开发Unity 3D射击游戏

    使用团结引擎开发Unity 3D射击游戏

           本案例是初级案例,意在引导想使用unity的初级开发者能较快的入门,体验unity开发的方便性和简易性能。       本次我们将使用团结引擎进行开发,帮助想体验团结引擎的入门开发者进行较快的环境熟悉。      本游戏是一个俯视角度的射击游戏。主角始终位于屏幕

    2024年01月19日
    浏览(48)
  • 关于ue4 射击游戏架构设计

    传统mmo的服务器架构 网关---游戏逻辑服---游戏db服 网关--- 游戏逻辑服---关系服务器master 其结构简单,方便维护,但是在应对射击游戏时候暴露出很大的缺陷 但是随着大dau产品的像和平精英等游戏问世 腾讯主要的服务器是基于tbus4j,基于共享内存+ socket的数据交互,该框架的

    2024年02月02日
    浏览(19)
  • Unity游戏源码分享-Unity手游射击横版游戏

    Unity游戏源码分享-Unity手游射击横版游戏

    Unity游戏源码分享-Unity手游射击横版游戏   战斗场景 项目地址: https://download.csdn.net/download/Highning0007/88050256

    2024年02月16日
    浏览(14)
  • WTN6170-8S语音芯片:射击游戏机新时代,CS音效射击体验引领者

    在射击游戏机的刺激世界中,唯创知音的WTN6170-8S语音芯片,作为声音提示播放IC,为射击游戏机带来了更智能、更富有战斗感的音效体验,引领玩家进入一个崭新的射击游戏时代。 射击游戏机启动时,WTN6170-8S语音芯片通过战场音效,如爆炸声、射击声等,迅速拉近玩家与虚

    2024年02月05日
    浏览(21)
  • Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2

    Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2

    Unity游戏源码分享-射击游戏Low Poly FPS Pack 3.2 项目地址:https://download.csdn.net/download/Highning0007/88057717    

    2024年02月16日
    浏览(21)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包