美文网首页
【python 游戏】闲的无聊?那就和博主一起来滑雪吧~

【python 游戏】闲的无聊?那就和博主一起来滑雪吧~

作者: 颜狗一只 | 来源:发表于2022-10-13 19:34 被阅读0次

    前言

    嗨喽~大家好呀,这里是魔王呐 !

    滑雪运动(特别是现代竞技滑雪)发展到当今,项目不断在增多,领域不断在扩展。

    世界比赛正规的大项目分为:高山滑雪、北欧滑雪(Nordic Skiing,越野滑雪、跳台滑雪)、自由式滑雪、冬季两项滑雪、雪上滑板滑雪等。

    纯竞技滑雪具有鲜明的竞争性、专项性,相关条件要求严格,非一般人所能具备和适应。

    旅游滑雪是出于娱乐、健身的目的,受人为因素制约程度很轻,男女老幼均可在雪场上轻松、愉快地滑行,饱享滑雪运动的无穷乐趣。

    而近年疫情限制行动半径,只能在附近寻找乐趣,于是今天我就来分享一下滑雪代码~

    所需素材

    字体

    图片

    音乐

    配置文件

    '''导入模块'''

    import os
    

    '''FPS'''

    FPS = 40
    

    '''游戏屏幕大小'''

    SCREENSIZE = (640, 640)
    

    '''图片路径'''

    SKIER_IMAGE_PATHS = [
        os.path.join(os.getcwd(), 'resources/images/skier_forward.png'),
        os.path.join(os.getcwd(), 'resources/images/skier_right1.png'),
        os.path.join(os.getcwd(), 'resources/images/skier_right2.png'),
        os.path.join(os.getcwd(), 'resources/images/skier_left2.png'),
        os.path.join(os.getcwd(), 'resources/images/skier_left1.png'),
        os.path.join(os.getcwd(), 'resources/images/skier_fall.png')
    ]
    OBSTACLE_PATHS = {
        'tree': os.path.join(os.getcwd(), 'resources/images/tree.png'),
        'flag': os.path.join(os.getcwd(), 'resources/images/flag.png')
    }
    

    '''背景音乐路径'''

    BGMPATH = os.path.join(os.getcwd(), 'resources/music/bgm.mp3')
    

    '''字体路径'''

    FONTPATH = os.path.join(os.getcwd(), 'resources/font/FZSTK.TTF')
    

    运行文件

    '''导入模块'''

    import sys
    import cfg
    import pygame
    import random
    

    '''滑雪者类'''

    class SkierClass(pygame.sprite.Sprite):
        def __init__(self):
            pygame.sprite.Sprite.__init__(self)
            # 滑雪者的朝向(-2到2)
            self.direction = 0
            self.imagepaths = cfg.SKIER_IMAGE_PATHS[:-1]
            self.image = pygame.image.load(self.imagepaths[self.direction])
            self.rect = self.image.get_rect()
            self.rect.center = [320, 100]
            self.speed = [self.direction, 6-abs(self.direction)*2]
    

    '''改变滑雪者的朝向. 负数为向左,正数为向右,0为向前'''

        def turn(self, num):
            self.direction += num
            self.direction = max(-2, self.direction)
            self.direction = min(2, self.direction)
            center = self.rect.center
            self.image = pygame.image.load(self.imagepaths[self.direction])
            self.rect = self.image.get_rect()
            self.rect.center = center
            self.speed = [self.direction, 6-abs(self.direction)*2]
            return self.speed
    

    '''移动滑雪者'''

        def move(self):
            self.rect.centerx += self.speed[0]
            self.rect.centerx = max(20, self.rect.centerx)
            self.rect.centerx = min(620, self.rect.centerx)
    

    '''设置为摔倒状态'''

        def setFall(self):
            self.image = pygame.image.load(cfg.SKIER_IMAGE_PATHS[-1])
    

    '''设置为站立状态'''

        def setForward(self):
            self.direction = 0
            self.image = pygame.image.load(self.imagepaths[self.direction])
    

    '''
    Function:障碍物类

    Input:

    • img_path: 障碍物图片路径

    • location: 障碍物位置

    • attribute: 障碍物类别属性

    '''

    class ObstacleClass(pygame.sprite.Sprite):
        def __init__(self, img_path, location, attribute):
            pygame.sprite.Sprite.__init__(self)
            self.img_path = img_path
            self.image = pygame.image.load(self.img_path)
            self.location = location
            self.rect = self.image.get_rect()
            self.rect.center = self.location
            self.attribute = attribute
            self.passed = False
    

    '''移动'''

    def move(self, num):
        self.rect.centery = self.location[1] - num
    

    '''创建障碍物'''

    def createObstacles(s, e, num=10):
        obstacles = pygame.sprite.Group()
        locations = []
        for i in range(num):
            row = random.randint(s, e)
            col = random.randint(0, 9)
            location  = [col*64+20, row*64+20]
            if location not in locations:
                locations.append(location)
                attribute = random.choice(list(cfg.OBSTACLE_PATHS.keys()))
                img_path = cfg.OBSTACLE_PATHS[attribute]
                obstacle = ObstacleClass(img_path, location, attribute)
                obstacles.add(obstacle)
        return obstacles
    

    '''合并障碍物'''

    def AddObstacles(obstacles0, obstacles1):
        obstacles = pygame.sprite.Group()
        for obstacle in obstacles0:
            obstacles.add(obstacle)
        for obstacle in obstacles1:
            obstacles.add(obstacle)
        return obstacles
    

    '''显示游戏开始界面'''

    def ShowStartInterface(screen, screensize):
        screen.fill((255, 255, 255))
        tfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//5)
        cfont = pygame.font.Font(cfg.FONTPATH, screensize[0]//20)
        title = tfont.render(u'滑雪游戏', True, (255, 0, 0))
        content = cfont.render(u'按任意键开始游戏', True, (0, 0, 255))
        trect = title.get_rect()
        trect.midtop = (screensize[0]/2, screensize[1]/5)
        crect = content.get_rect()
        crect.midtop = (screensize[0]/2, screensize[1]/2)
        screen.blit(title, trect)
        screen.blit(content, crect)
        while True:
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                elif event.type == pygame.KEYDOWN:
                    return
            pygame.display.update()
    

    '''显示分数'''

    def showScore(screen, score, pos=(10, 10)):
        font = pygame.font.Font(cfg.FONTPATH, 30)
        score_text = font.render("Score: %s" % score, True, (0, 0, 0))
        screen.blit(score_text, pos)
    

    '''更新当前帧的游戏画面'''

    def updateFrame(screen, obstacles, skier, score):
        screen.fill((255, 255, 255))
        obstacles.draw(screen)
        screen.blit(skier.image, skier.rect)
        showScore(screen, score)
        pygame.display.update()
    

    主程序

    def main():
        # 游戏初始化
        pygame.init()
        pygame.mixer.init()
        pygame.mixer.music.load(cfg.BGMPATH)
        pygame.mixer.music.set_volume(0.4)
        pygame.mixer.music.play(-1)
        # 设置屏幕
        screen = pygame.display.set_mode(cfg.SCREENSIZE)
        pygame.display.set_caption('滑雪游戏 ')
        # 游戏开始界面
        ShowStartInterface(screen, cfg.SCREENSIZE)
        # 实例化游戏精灵
        # --滑雪者
        skier = SkierClass()
        # --创建障碍物
        obstacles0 = createObstacles(20, 29)
        obstacles1 = createObstacles(10, 19)
        obstaclesflag = 0
        obstacles = AddObstacles(obstacles0, obstacles1)
        # 游戏clock
        clock = pygame.time.Clock()
        # 记录滑雪的距离
        distance = 0
        # 记录当前的分数
        score = 0
        # 记录当前的速度
        speed = [0, 6]
        # 游戏主循环
        while True:
            # --事件捕获
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.quit()
                    sys.exit()
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                        speed = skier.turn(-1)
                    elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                        speed = skier.turn(1)
            # --更新当前游戏帧的数据
            skier.move()
            distance += speed[1]
            if distance >= 640 and obstaclesflag == 0:
                obstaclesflag = 1
                obstacles0 = createObstacles(20, 29)
                obstacles = AddObstacles(obstacles0, obstacles1)
            if distance >= 1280 and obstaclesflag == 1:
                obstaclesflag = 0
                distance -= 1280
                for obstacle in obstacles0:
                    obstacle.location[1] = obstacle.location[1] - 1280
                obstacles1 = createObstacles(10, 19)
                obstacles = AddObstacles(obstacles0, obstacles1)
            for obstacle in obstacles:
                obstacle.move(distance)
            # --碰撞检测
            hitted_obstacles = pygame.sprite.spritecollide(skier, obstacles, False)
            if hitted_obstacles:
                if hitted_obstacles[0].attribute == "tree" and not hitted_obstacles[0].passed:
                    score -= 50
                    skier.setFall()
                    updateFrame(screen, obstacles, skier, score)
                    pygame.time.delay(1000)
                    skier.setForward()
                    speed = [0, 6]
                    hitted_obstacles[0].passed = True
                elif hitted_obstacles[0].attribute == "flag" and not hitted_obstacles[0].passed:
                    score += 10
                    obstacles.remove(hitted_obstacles[0])
            # --更新屏幕
            updateFrame(screen, obstacles, skier, score)
            clock.tick(cfg.FPS)
    
    
    '''run'''
    if __name__ == '__main__':
        main()
    

    效果

    尾语

    读书多了,容颜自然改变,许多时候,

    自己可能以为许多看过的书籍都成了过眼云烟,不复记忆,其实他们仍是潜在的。

    在气质里,在谈吐上,在胸襟的无涯,当然也可能显露在生活和文字里。

    ——三毛《送你一匹马》

    本文章到这里就结束啦~感兴趣的小伙伴可以复制代码去试试哦 😝

    相关文章

      网友评论

          本文标题:【python 游戏】闲的无聊?那就和博主一起来滑雪吧~

          本文链接:https://www.haomeiwen.com/subject/zlnfzrtx.html