• python编写小游戏之三入最最简陋简单贪食蛇编写2


    紧接上回,已经完成了单独的贪食蛇的控制,但是呢,居然没有苹果可以吃,所以,非常简单的加入苹果,同时呢,修改一下主程序中贪食蛇的创建,单独编写一个贪食蛇身体生成函数,这样将来要做双蛇也很简单了。

    #创建一条新的蛇
    def create_new_snake():
    
        snake_body = []
        snake_x = random.randint(5, rows - 5)
        snake_y = random.randint(5, columns - 5)
        snake_body.append([snake_x, snake_y])
        snake_body.append([snake_x, snake_y + 1])
        snake_body.append([snake_x, snake_y + 2])
        return snake_body
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    把主程序中所有生成新蛇的地方换成

    snake = create_new_snake()
    
    • 1

    创建新苹果,苹果不能出现在蛇的身体里,所以

    def create_new_apple(snake_body):
    
        apple_in_game = False
        while not apple_in_game:
            apple_x = random.randint(0, rows - 1)
            apple_y = random.randint(0, columns - 1)
            # print(apple_x, apple_y)
            if (apple_x, apple_y) not in snake_body:
                new_apple = pygame.image.load('apple.png')
    
                new_apple = pygame.transform.scale(new_apple, (tile_size - 2, tile_size - 2))
    
                apple_x_location = apple_y * tile_size + x_margin/2
                apple_y_location = apple_x * tile_size + y_margin/2
    
                display.blit(new_apple, (apple_x_location, apple_y_location))
                apple_in_game = True
        return new_apple, (apple_x, apple_y), apple_x_location, apple_y_location
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    在主程序中,主循环之前创建一个苹果

    if __name__ == '__main__':
        pygame.init()
        snake = create_new_snake()
        # 未按下按键时,默认的初识移动方向
        direction = directions[random.randint(0, 3)]
    
        # 创建一个小苹果
        apple, apple_location, apple_left, apple_top = create_new_apple(snake)
        # 吃到苹果标志
        apple_was_eaten = False
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    因为蛇与苹果之间有交互关系,如果蛇吃到苹果,那么蛇的身体会增加一格,也就是此次循环不删除列表的最后一个元素,所以定义了一格标志位

    在主循环中,与监测按键平级的地方,放入蛇与苹果关系检查。

            if apple_location in snake:
                apple, apple_location, apple_left, apple_top = create_new_apple(snake)
                apple_was_eaten = True
                my_score += 1
    
    • 1
    • 2
    • 3
    • 4

    无论🐍的那个部分碰到苹果,都算迟到苹果,也可以考虑只有舌头碰到才算,这根据自己喜好吧。碰到苹果后,苹果消失,得分等等…

    还需要修改删除最后一个列表元素位置,同时因为蛇的身体会变长了,所以单纯的碰到边界游戏才结束,已经不够了,我们还需要加入如果蛇头碰到自己的身体,游戏还是要结束。

            if snake[0] in snake[1:]:
                snake = create_new_snake()
                #print(snake)
            elif is_right_direction(snake, new_body_location[0], new_body_location[1]):
                snake.insert(0, new_body_location)
                if not apple_was_eaten:
                    del snake[-1]
                else:
                    apple_was_eaten = False
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    如果不想结束的太突然,祭出万年不变的结束动画。

    #游戏结束时特效
    def game_over_animation(color=white, animation_speed=50):
        orig_surf = display.copy()
        flash_surf = pygame.Surface(display.get_size())
        flash_surf = flash_surf.convert_alpha()
        r, g, b = color
        for i in range(3):
            for start, end, step in ((0, 255, 1), (255, 0, -1)):
                for alpha in range(start, end, animation_speed * step):
                    # 先铺一层新的界面,包含老界面所有内容
                    display.blit(orig_surf, (0, 0))
                    # flash界面填充颜色,开始很淡,越来越浓,然后越来越淡
                    flash_surf.fill((r, g, b, alpha))
                    # 把flash界面加载到display中
                    display.blit(flash_surf, (0, 0))
                    # draw_game_board(maze)
                    # 刷新看效果
                    pygame.display.update()
                    fps_clock.tick(fps)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19

    把动画放到程序中。即可欣赏结束动画。因为结束动画使用alpha时用到了颜色的RGB三色,这里需要把while的定义改为三色(255, 255, 255),而不是’white’。

    还可以加入得分系统。

    def make_score():
        score = pygame.font.Font('Kaiti.ttc', 20)
        score_surf = score.render('得分: %d' % my_score, True, text_color, bg_color)
        score_rect = score_surf.get_rect()
        score_rect.topleft = (screen_width-100, y_margin/8)
        return score_surf, score_rect
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    这个Kaiti.ttc字体是我从苹果系统字体里导出到工程里的,目前发现如果想要显示中文,这样比较方便,pygame自带的字体中,不知道那些可以正常显示。

    在循环中加入

    display.blit(score_display, score_rect)

    然后运行游戏

    请添加图片描述

    虽然简陋,但是难看的贪食蛇完成了。我们还可以进一步增加难度,根据得分的增加,提高fps率,也就是提高了贪食蛇的移动速度。这个就不提了。还可以增加开始结束画面,暂停功能,声音,音效等等…

    如果增加了这些,就不符合简陋的定义了,所以就不增加了,本身这些也太简单了…

  • 相关阅读:
    整洁架构能有多整洁?
    如何快速掌握Git这一篇就够了!
    SpringCloud Alibaba - Sentinel 限流规则(案例 + JMeter 测试分析)
    RT-Thread 中断管理(学习一)
    golang gin ShouldBindUri数据绑定: `uri:“id“ binding:“required,uuid“`
    2023年终总结:拉帮结伙,拼搏探索新机遇
    十.EtherCAT开发之microchip MCU D51+ LAN9253 的开发COE应用(SPI directly 模式)
    7天入门python系列之爬取热门小说项目实战,互联网的东西怎么算白嫖呢
    【Java筑基】IO流基础之常见工具流和进程通信
    测试的意义并不是能找到全部的缺陷
  • 原文地址:https://blog.csdn.net/jackwsd/article/details/126501681