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弄不出来了,下次学会了再弄。


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

原文地址:https://www.cnblogs.com/Renqy/p/12855725.html