Python小游戏丨陪柯南一起玩贪吃蛇(PyGame)

技术

点击蓝字丨关注我们

写在前面

本期小编用python制作了一个贪吃蛇小游戏送给大家~(文末免费领取完整代码哦)

准备开始

本期内容: 基于pygame的贪吃蛇小游戏

实验环境:

  • python3.11及以上
  • pycharm
  • pygame

安装pygame的命令:


        
            

          pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame
        
      
PyGame入门

pygame是一个开源的Python模块,专门用于编写电子游戏。它使用简单、功能强大,因此非常适合初学者入门。pygame的主要特点包括图像、声音、键盘、鼠标等多种交互功能的支持,以及快速的游戏开发和部署。

首先,pygame具有丰富的图像处理功能。它可以加载和显示各种图像文件,如位图、矢量图等。同时,它还支持图像的缩放、翻转、旋转、剪切等操作,方便开发者对图像进行各种处理。

其次,pygame还提供了强大的声音处理功能。它可以播放各种音频文件,如MP3、WAV等,并支持音量、音调等参数的控制。开发者可以轻松地为游戏添加背景音乐、音效、语音等。

此外,pygame还支持键盘和鼠标的交互。开发者可以通过监听键盘事件来响应玩家的按键操作,实现游戏中角色的移动、攻击等功能。同时,鼠标事件的支持也使得开发者可以处理鼠标点击、移动等操作,为游戏增加更多的交互性。

pygame还具有快速的游戏开发和部署能力。它提供了简单易用的API,开发者只需使用少量的代码就可以实现复杂的游戏功能。此外,pygame可以在多个平台上运行,包括Windows、MacOS、Linux等,使得游戏的部署非常方便。

总之,pygame是一个功能强大且易于学习的游戏开发模块。它提供了丰富的图像、声音、键盘、鼠标等交互功能的支持,同时还具有快速的游戏开发和部署能力。无论是初学者还是有一定编程经验的开发者,都可以使用pygame来编写自己的电子游戏。

贪吃蛇

背景图片

picture.image kenan.jpg

完整程序


          
import pygame
          
import sys
          
import random
          

          
# 游戏窗口大小
          
game_width = 666
          
game_height = 666
          

          

          
# 蛇类
          
# 点以25为单位
          
class Snake(object):
          
    # 初始化各种需要的属性 [开始时默认向右/身体块x5]
          
    def __init__(self):
          
        self.dirction = pygame.K_RIGHT
          
        self.body = []
          
        for x in range(5):
          
            self.addnode()
          

          
    # 无论何时 都在前端增加蛇块
          
    def addnode(self):
          
        left,top = (0,0)
          
        if self.body:
          
            left,top = (self.body[0].left,self.body[0].top)
          
        node = pygame.Rect(left,top,25,25)
          
        if self.dirction == pygame.K_LEFT:
          
            node.left -= 25
          
        elif self.dirction == pygame.K_RIGHT:
          
            node.left += 25
          
        elif self.dirction == pygame.K_UP:
          
            node.top -= 25
          
        elif self.dirction == pygame.K_DOWN:
          
            node.top += 25
          
        self.body.insert(0,node)
          

          
    # 删除最后一个块
          
    def delnode(self):
          
        self.body.pop()
          

          
    # 死亡判断
          
    def isdead(self):
          
        # 撞墙
          
        if self.body[0].x  not in range(game_width):
          
            return True
          
        if self.body[0].y  not in range(game_height):
          
            return True
          
        # 撞自己
          
        if self.body[0] in self.body[1:]:
          
            return True
          
        return False
          

          
    # 移动!
          
    def move(self):
          
        self.addnode()
          
        self.delnode()
          

          
    # 改变方向 但是左右、上下不能被逆向改变
          
    def changedirection(self,curkey):
          
        LR = [pygame.K_LEFT,pygame.K_RIGHT]
          
        UD = [pygame.K_UP,pygame.K_DOWN]
          
        if curkey in LR+UD:
          
            if (curkey in LR) and (self.dirction in LR):
          
                return
          
            if (curkey in UD) and (self.dirction in UD):
          
                return
          
            self.dirction = curkey
          

          

          

          
class Food:
          
    def __init__(self):
          
        self.rect = pygame.Rect(-25,0,25,25)
          

          
    def remove(self):
          
        self.rect.x=-25
          

          
    def set(self):
          
        if self.rect.x == -25:
          
            allpos = []
          
            # 不靠墙太近 25 ~ game_width-25 之间
          
            for pos in range(25,game_width-25,25):
          
                allpos.append(pos)
          
            self.rect.left = random.choice(allpos)
          
            self.rect.top  = random.choice(allpos)
          

          

          
def show_text(screen, pos, text, color, font_bold = False, font_size = 60, font_italic = False):   
          
    #获取系统字体,并设置文字大小  
          
    cur_font = pygame.font.SysFont("宋体", font_size)  
          
    #设置是否加粗属性  
          
    cur_font.set_bold(font_bold)  
          
    #设置是否斜体属性  
          
    cur_font.set_italic(font_italic)  
          
    #设置文字内容  
          
    text_fmt = cur_font.render(text, 1, color)  
          
    #绘制文字  
          
    screen.blit(text_fmt, pos)
          

          

          
def main():
          
    pygame.init()
          
    screen_size = (game_width,game_height)
          
    screen = pygame.display.set_mode(screen_size)
          
    pygame.display.set_caption('贪吃蛇')
          
    clock = pygame.time.Clock()
          
    scores = 0
          
    isdead = False
          
    image = pygame.image.load("kenan.jpg")
          
    img = pygame.transform.scale(image, (game_width,game_width))
          

          
    # 蛇/食物
          
    snake = Snake()
          
    food = Food()
          

          
    while True:
          
        for event in pygame.event.get():
          
            if event.type == pygame.QUIT:
          
                sys.exit()
          
            if event.type == pygame.KEYDOWN:
          
                snake.changedirection(event.key)
          
                # 死后按space重新
          
                if event.key == pygame.K_SPACE and isdead:
          
                    return main()
          

          
        screen.fill((255,255,255))
          
        screen.blit(img,(0,0))
          

          
        # 画蛇身 / 每一步+1分
          
        if not isdead:
          
            scores+=1
          
            snake.move()
          
        for rect in snake.body:
          
            pygame.draw.rect(screen,"pink",rect,0)
          

          

          
        # 食物处理 / 吃到+50分
          
        # 当食物rect与蛇头重合,吃掉 -> Snake增加一个Node
          
        if food.rect == snake.body[0]:
          
            scores+=50
          
            food.remove()
          
            snake.addnode()
          

          
        # 食物投递
          
        food.set()
          
        pygame.draw.rect(screen,"yellow",food.rect,0)
          

          
        # 显示分数文字
          
        show_text(screen,(44,44),'Scores: '+str(scores),"black")
          

          
        # 显示死亡文字
          
        isdead = snake.isdead()
          
        if isdead:
          
            show_text(screen,(135,300),'Game failed!',"red",False,100)
          
            show_text(screen,(222,600),'Press space to try again...',"black",False,50)
          

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

          

          
if __name__ == '__main__':
          
    main()
      

程序分析

这段代码是一个简单的贪吃蛇游戏的实现。下面对代码进行分析: 首先,代码导入了pygame、sys和random模块。pygame模块用于游戏的开发,sys模块用于退出游戏,random模块用于生成随机数。

接下来定义了游戏窗口的大小,宽度为666,高度为666。然后定义了蛇类和食物类。

蛇类包括了蛇的方向、身体块的列表等属性和方法。初始化时默认向右移动,并生成初始的蛇身体块。addnode方法在蛇的头部添加一个新的身体块,delnode方法删除最后一个身体块,isdead方法判断蛇是否死亡,move方法控制蛇的移动,changedirection方法改变蛇的方向。蛇的方向只能在左右或上下之间改变,不能逆向改变。

食物类包括了食物的矩形对象和相关的方法。set方法用于随机生成食物的位置,remove方法将食物移出游戏界面。

接下来定义了一个show_text函数,用于在屏幕上显示文字。

main函数是游戏的主循环。首先初始化pygame和屏幕,设置窗口标题和帧率。然后定义了一些游戏所需要的变量,如分数、是否死亡等。

然后创建了一个蛇对象和食物对象。

进入主循环,处理各种事件。如果用户按下了退出按钮,则退出游戏。如果用户按下了其他键,则改变蛇的方向。如果用户按下了空格键,并且游戏结束,重新开始游戏。

接下来进行游戏的绘制。首先清空屏幕,然后绘制背景图像。然后绘制蛇的身体和食物。

接着显示分数和死亡文字,如果蛇死亡,则显示游戏失败的字样和重新开始的提示。

最后更新屏幕,并控制游戏的帧率。通过判断是否在__main__函数中运行来调用主函数开始游戏。

总之,这段代码实现了一个简单的贪吃蛇游戏。它使用pygame模块进行游戏的开发,包括绘制图像、处理事件等功能。通过控制蛇的方向和吃食物来增加分数,判断蛇是否死亡并重新开始游戏。这是一个适合初学者入门的pygame示例代码。

运行结果

picture.image 贪吃蛇

下载代码

公众号对话框回复" python104 "并输入提取码" 3lzq "即可免费领取完整代码哦~

注意事项

如遇到问题"no module named pygame ",请在终端输入"pip install -i https://pypi.tuna.tsinghua.edu.cn/simple pygame",等待pygame库安装完成后再运行程序哦

picture.image picture.image picture.image

写在后面

我是一只有趣的兔子,感谢你的喜欢!

0
0
0
0
关于作者
关于作者

文章

0

获赞

0

收藏

0

相关资源
边缘云打通大模型物理世界
《火山引擎边缘智能,打通大模型的物理世界》 张俊钦 | 火山引擎边缘智能资深研发工程师
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论