• Pygame游戏小狼吃羊


    一、技术点:

    动画精灵、全屏模式、碰撞检测、音效播放、边界判断

    游戏说明:

    1、屏幕上出现10只小羊,速度随机。

    2、键盘上下左右控制小狼运动,当小狼碰到小羊时,小羊消失。

    代码如下:

    # -*- coding: utf-8 -*-d
    import pygame
    import sys
    from random import *
    
    
    # 小羊类 生成小羊对象
    class Lamb(pygame.sprite.Sprite):
        def __init__(self, image, position, speed, bg_size):
            # 初始化动画精灵
            pygame.sprite.Sprite.__init__(self)
            # 加载传进来的图片
            self.image = pygame.image.load(image)
            self.rect = self.image.get_rect()
            # 定义随机位置
            self.rect.left, self.rect.top = position
            # 运动速度
            self.speed = speed
            # 屏幕大小
            self.width, self.height = bg_size[0], bg_size[1]
            # 生成半径,检测碰撞
            self.radius = self.rect.width / 2
    
        # 运动边界判断
        def move(self):
            self.rect = self.rect.move(self.speed)
    
            if self.rect.right < 0:
                self.rect.left = self.width
    
            elif self.rect.left > self.
                self.rect.right = 0
    
            elif self.rect.bottom < 0:
                self.rect.top = self.height
    
            elif self.rect.top > self.height:
                self.rect.bottom = 0
    
    
    def main():
        pygame.init()
        lamb_image = "Lamb.png"
        lang_image = "lang.png"
        BG_image = "BG1366.png"
        BG_image1 = "BG1920.png"
        end_image = "end1.png"
        # 想添加文字的, 不料弄不出来。显示的是框框
        pygame.font.init()
        font = pygame.font.Font(None, 30)
        str1 = "一个人坐在房间,拨动琴弦,这是我为你写找的歌啊。歌曲结束,时间停止。
     望着窗外灯火辉煌,空荡寂静的房间就只剩表针滴答.
                时间仿佛在这一刻静止,思绪乱了,脑海里你的样子渐渐模糊. 电影就这样散场了吗..... 最简单的旋律,最朴实的歌词,最真挚的爱 "
        num = 0
        line_h = font.get_linesize()
        # 加载播放背景音乐
        pygame.mixer_music.load("bg.ogg")
        pygame.mixer_music.set_volume(0.2)
        pygame.mixer_music.play()
        # 加载羊叫声
        lamb_music = pygame.mixer.Sound("lamb.wav")
        lamb_music.set_volume(0.2)
        # 加载结束音乐
        end_music = pygame.mixer.Sound("end.wav")
        end_music.set_volume(0.2)
    
        bigf11 = True
        running = True
        oldbg_size = width, height = 800, 600
        newbg_size = oldbg_size
        screen = pygame.display.set_mode(oldbg_size)
        pygame.display.set_caption("狼爱上羊")
    
        # 生成小狼对象,初始速度为0,60 和 78 是小样的宽高
        speed = [0, 0]
        position = randint(0, width - 60), randint(0, height - 78)
        lang = Lamb(lang_image, position, speed, oldbg_size)
    
        # 生成5个小羊对象,加入列表lambs中
        lambs = []
        # 生成新的组,用于碰撞检测
        group = pygame.sprite.Group()
        for i in range(10):
            # 随机产生位置 85 和 100 是小样的宽高
            speed = [randint(-4, 4), randint(-4, 4)]
            position = randint(0, width - 85), randint(0, height - 100)
            lamb = Lamb(lamb_image, position, speed, oldbg_size)
            # 如果小羊刚出生就碰上了狼,那么重新定义狼的位置
            while pygame.sprite.spritecollide(lang, group, False, pygame.sprite.collide_circle):
                lang.rect.left, lang.rect.top = randint(0, width - 60), randint(0, height - 78)
            lambs.append(lamb)
            group.add(lamb)
    
        # 背景图
        background = pygame.image.load(BG_image)
        # 结束图
        endimg = pygame.image.load(end_image)
    
        while running:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    # 按F11开启全屏
                    if event.key == pygame.K_F11:
                        bigf11 = not bigf11
                        # 获取电脑分辨率
                        newsize = width, height = pygame.display.list_modes()[1][0], pygame.display.list_modes()[1][1]
                        if bigf11:
                            screen = pygame.display.set_mode(newsize)
                            newbg_size = [width, height]
                            # 修改小羊的屏幕大小
                            for each in lambs:
                                each.width, each.height = newbg_size[0], newbg_size[1]
                            # 修改小狼的屏幕大小
                            lang.width, lang.height = newbg_size[0], newbg_size[1]
                            if width == 1920:
                                background = pygame.image.load(BG_image1)
                        else:
                            screen = pygame.display.set_mode(oldbg_size)
                            # 修改小羊的屏幕大小
                            for each in lambs:
                                each.width, each.height = oldbg_size[0], oldbg_size[1]
                            # 修改小狼的屏幕大小
                            lang.width, lang.height = oldbg_size[0], oldbg_size[1]
    
                    # 小狼运动
                    if event.key == pygame.K_UP:
                        lang.speed = [0, -4]
                        lang.move()
                    if event.key == pygame.K_DOWN:
                        lang.speed = [0, 4]
                        lang.move()
                    if event.key == pygame.K_RIGHT:
                        lang.speed = [4, 0]
                        lang.move()
                    if event.key == pygame.K_LEFT:
                        lang.speed = [-4, 0]
                        lang.move()
    
            # 填充背景
            screen.blit(background, (0, 0))
            # 将小羊显示出来
            for each in group:
                each.move()
                screen.blit(each.image, each.rect)
            # 将小狼显示出来
            screen.blit(lang.image, lang.rect)
            # 碰撞检测, 如果小狼和小羊碰撞,则删除小羊
            if pygame.sprite.spritecollide(lang, group, True, pygame.sprite.collide_circle):
                lamb_music.play()
                if len(group) <= 0:
                    end_music.play()
    
            # 游戏结束
            if len(group) <= 0:
                screen.blit(background, (0, 0))
                screen.blit(endimg, (0, 0))
                # screen.blit(font.render(str1, True, (0, 0, 0)), (0, 0))
            # 更新页面
            pygame.display.flip()
            # 设置延迟
            pygame.time.delay(10)
    
    
    if __name__ == '__main__':
        main()
    

    效果如下:

    image

    资料链接:

    链接:https://pan.baidu.com/s/1jTyx1Lz_I9W6UilByeQLXg
    提取码:ucs6

    本来结束时想显示文字的,那个font弄不出来了,下次学会了再弄。


    读书和健身总有一个在路上

  • 相关阅读:
    修改 MySQL 的 sql_mode 模式方法
    PHP 实现 Redis 连接池
    【转载】php解决高并发问题
    PHP 7 不适用函数:password_hash
    PDO 防止 SQL 注入示例
    记录一次 header 参数格式引发的错误
    Laravel 框架数据库查询构造器中 when 的易犯错误
    PHP 7.3.4 安装 Redis 4.0(Windows系统)
    汇编语言全梳理(精简版)
    Anaconda安装和使用
  • 原文地址:https://www.cnblogs.com/Renqy/p/12855725.html
Copyright © 2020-2023  润新知