Python+Pygame实现简单的射击小游戏

纸上星河
纸上星河
发布时间:2026-10-15 | 4人浏览过
原创

本文介绍如何使用Python和Pygame库开发一款简单的射击小游戏《无敌狙击手》。文章涵盖了从环境配置、素材准备到核心代码实现及运行效果展示的全过程,适合零基础开发者学习游戏编程基础。

前言

大家好!这里是栗子,我们又见面了。

什么样的游戏最能吸引玩家?

毫无疑问,射击游戏始终占据着重要地位。无论是曾经火爆的手游《刺激战场》,还是现在的《和平精英》,都证明了这一品类的持久魅力。作为一名早期玩家,我深知射击游戏结合丰富地图和多样体验所带来的乐趣。

在射击游戏中,玩家通过瞄准并击杀敌人,能够获得即时且强烈的成就感反馈。这种游戏类型自诞生以来,便在游戏界占据了一席之地。

今天的游戏代码灵感正源于此。为了保持简约风格,即便作为程序员的我感到些许压力,也要尽力呈现一个精简版的制作。

本期推荐一款基于Python代码实现的“射击游戏”——《无敌狙击手》。这是一个简约版的射击游戏,来看看你是否喜欢这款代码实现的效果?

这是一个非常适合零基础开发者入门的游戏案例,非常简单易懂。

游戏玩法:点击鼠标左键对准移动的靶子,射中后根据距离计算得分。射中最中间的位置可获得+3分。

一、运行环境

1)环境安装

需要Python3、Pycharm,部分Pygame自带模块无需额外展示。

第三方库安装命令:pip install pygame

或使用镜像源安装:pip install -i https://pypi.douban.com/simple/ +模块名

2)素材(图片、音乐等)

二、代码展示

主程序

import pygame,os,random
from pygame.locals import *
from pygame.sprite import *
def load_image(name):
    fullname=os.path.join(os.path.join(os.path.split(os.path.abspath(__file__))[0],"filedata"),name)
    image=pygame.image.load(fullname)
    return image
def load_sound(name):
    fullname=os.path.join(os.path.join(os.path.split(os.path.abspath(__file__))[0],"filedata"),name)
    sound=pygame.mixer.Sound(fullname)
    return sound
WIDTH=700
HEIGHT=600
class Explosion(Sprite):
    def __init__(self,screen,posrect):
        super(Explosion,self).__init__()
        self.screen=screen
        self.posrect=posrect
        self.image=load_image("explosion.png")
        self.rect=self.image.get_rect()
        self.rect=self.posrect
        self.rates=0
    def update(self):
        self.rates+=1
        if self.rates>=40:
            self.kill()
class Enemy(Sprite):
    def __init__(self,screen):
        super(Enemy,self).__init__()
        self.screen=screen
        self.screenrect=self.screen.get_rect()
        self.image=load_image("eatingfood.png")
        self.rect=self.image.get_rect()
        self.rect.center=(random.uniform(50,WIDTH-50),
                          random.uniform(50,HEIGHT-50))
        self.xspeed=random.uniform(1,2)
        self.yspeed=random.uniform(1,2)
        if random.choice([True,False]):
            self.xspeed=-self.xspeed
        if random.choice([True,False]):
            self.yspeed=-self.yspeed
    def update(self):
        self.rect.centerx+=self.xspeed
        self.rect.centery+=self.yspeed
        if self.rect.top>self.screenrect.height or self.rect.bottom<0:
            self.kill()
        elif self.rect.left>self.screenrect.width or self.rect.right<0:
            self.kill()
def initmain():
    pygame.init()
    screen=pygame.display.set_mode((WIDTH,HEIGHT))
    pygame.display.set_caption("")
    gameFont=pygame.font.SysFont("宋体",26,True)
    rates=0
    score=0
    fpstime=pygame.time.Clock()
    cursor=load_image("aimcursor.png")
    cursorrect=cursor.get_rect()
    pygame.mouse.set_visible(False)
    enemys=Group()
    explosions=Group()
    sou=load_sound("sou.mp3")
    duang=load_sound("duang.mp3")
    while True:
        fpstime.tick(70)
        screen.fill((128,128,128))
        screen.blit(gameFont.render("Score: "+str(score),True,(0,0,0)),(2,2))
        rates+=1
        enemys.draw(screen)
        enemys.update()
        explosions.draw(screen)
        explosions.update()
        if rates%25==0:
            enemys.add(Enemy(screen))
        cursorrect.center=pygame.mouse.get_pos()
        screen.blit(cursor,cursorrect)
        for event in pygame.event.get():
            if event.type==QUIT:
                pygame.quit()
                __import__("sys").exit()
            elif event.type==MOUSEBUTTONDOWN and event.button==1:
                cld=[]
                for sf in enemys:
                    if sf.rect.collidepoint(event.pos):
                        sf.kill()
                        score+=int(abs(sf.xspeed)+abs(sf.yspeed))
                        explosions.add(Explosion(screen,sf.rect.center))
                        cld.append(True)
                    else:
                        cld.append(False)
                if not any(cld):
                    sou.play()
                else:
                    duang.play()
        pygame.display.flip()
if __name__=="__main__":
    initmain()

三、效果展示

此处仅展示静态截图,动态效果未能通过视频完全呈现,建议大家下载代码亲自体验。

1)游戏界面

2)击中效果

3)+3分

关于Python+Pygame实现简单射击小游戏的介绍到此结束。如需了解更多Python和Pygame射击游戏相关内容,请搜索本站往期文章或继续浏览后续文章。希望大家多多支持本站!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表