日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

python貪吃蛇核心功能實現下_python

作者:jackwsd ? 更新時間: 2022-11-11 編程語言

緊接上回,已經完成了單獨的貪食蛇的控制,但是呢,居然沒有蘋果可以吃,所以,非常簡單的加入蘋果,同時呢,修改一下主程序中貪食蛇的創建,單獨編寫一個貪食蛇身體生成函數,這樣將來要做雙蛇也很簡單了。

#創建一條新的蛇
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

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

snake = create_new_snake()

創建新蘋果,蘋果不能出現在蛇的身體里,所以

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

在主程序中,主循環之前創建一個蘋果

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

因為蛇與蘋果之間有交互關系,如果蛇吃到蘋果,那么蛇的身體會增加一格,也就是此次循環不刪除列表的最后一個元素,所以定義了一格標志位。

在主循環中,與監測按鍵平級的地方,放入蛇與蘋果關系檢查。

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

無論??的那個部分碰到蘋果,都算遲到蘋果,也可以考慮只有舌頭碰到才算,這根據自己喜好吧。碰到蘋果后,蘋果消失,得分等等…

還需要修改刪除最后一個列表元素位置,同時因為蛇的身體會變長了,所以單純的碰到邊界游戲才結束,已經不夠了,我們還需要加入如果蛇頭碰到自己的身體,游戲還是要結束。

        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

如果不想結束的太突然,祭出萬年不變的結束動畫。

#游戲結束時特效
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)

把動畫放到程序中。即可欣賞結束動畫。因為結束動畫使用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

這個Kaiti.ttc字體是我從蘋果系統字體里導出到工程里的,目前發現如果想要顯示中文,這樣比較方便,pygame自帶的字體中,不知道那些可以正常顯示。

在循環中加入

display.blit(score_display, score_rect)

然后運行游戲

雖然簡陋,但是難看的貪食蛇完成了。我們還可以進一步增加難度,根據得分的增加,提高fps率,也就是提高了貪食蛇的移動速度。這個就不提了。還可以增加開始結束畫面,暫停功能,聲音,音效等等…

如果增加了這些,就不符合簡陋的定義了,所以就不增加了,本身這些也太簡單了…

原文鏈接:https://blog.csdn.net/jackwsd/article/details/126501681

欄目分類
最近更新