日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

Python实现贪吃蛇大作战

發(fā)布時(shí)間:2023/12/24 python 38 coder
生活随笔 收集整理的這篇文章主要介紹了 Python实现贪吃蛇大作战 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

貪吃蛇

初始版本

初始版本,只存在基本數(shù)據(jù)結(jié)構(gòu)——雙向隊(duì)列。

游戲思路

貪吃蛇通過(guò)不斷得吃食物來(lái)增長(zhǎng)自身,如果貪吃蛇碰到邊界或者自身則游戲失敗。

食物是綠色矩形來(lái)模擬,坐標(biāo)為隨機(jī)數(shù)生成,定義一個(gè)蛇長(zhǎng)變量,判斷蛇頭坐標(biāo)和食物坐標(biāo)是否接近,如果蛇頭接近食物,蛇長(zhǎng)增加一個(gè)單位。

蛇結(jié)構(gòu)體通過(guò)雙向隊(duì)列實(shí)現(xiàn)蛇的移動(dòng)和增長(zhǎng)。用pygame相應(yīng)庫(kù)函數(shù)讀取鍵盤事件,每次事件發(fā)生都對(duì)應(yīng)蛇頭的相應(yīng)方向,例如按鍵盤下鍵貪吃蛇向下走。蛇的移動(dòng)是通過(guò)在隊(duì)頭添加一個(gè)新的坐標(biāo),然后刪掉隊(duì)尾元素實(shí)現(xiàn)的。隊(duì)列的長(zhǎng)度始終為蛇長(zhǎng)變量的值。

得分變量為蛇長(zhǎng)變量減去一個(gè)單位,初始化的時(shí)候蛇長(zhǎng)就為1個(gè)單位長(zhǎng)度,故而需要減1。

完整代碼

import pygame
import random

pygame.init()

# 以RGB的形式定義顏色
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# 設(shè)置窗體大小
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('貪吃蛇 KevenDuan1.0')

# 創(chuàng)建clock對(duì)象
clock = pygame.time.Clock()

# 蛇的寬度
snake_block = 15
# 蛇的速度
snake_speed = 15

# 從系統(tǒng)庫(kù)里獲取字體
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)

def Your_score(score):
    value = score_font.render("Score: " + str(score), True, yellow)
    # 在主surface里添加字體surface
    dis.blit(value, [0, 0])

def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])

def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width // 2 - 180, dis_height // 2])

def gameLoop():
    game_over = False
    game_close = False

    x1 = dis_width / 2
    y1 = dis_height / 2

    x1_change = 0
    y1_change = 0

    # 存放蛇的身體
    snake_List = []
    # 蛇的長(zhǎng)度
    Length_of_snake = 1

    # 食物坐標(biāo)隨機(jī)生成
    foodx = round(random.randrange(snake_block, dis_width - snake_block, snake_block))
    foody = round(random.randrange(snake_block, dis_height - snake_block, snake_block))
    print(foodx, foody)

    while not game_over:
        while game_close == True:
            dis.fill(blue)
            message("Game over, press p again or q quit!", red)
            Your_score(Length_of_snake - 1)
            # 修改得分
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_p:
                        gameLoop()

        # 獲取事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP or event.key == pygame.K_w:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
                    y1_change = snake_block
                    x1_change = 0

        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            # 判斷為游戲失敗
            game_close = True

        x1 += x1_change
        y1 += y1_change

        dis.fill(blue)
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        # 貪吃蛇的移動(dòng)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]

        # 判斷是否咬到自身
        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True

        # 畫蛇出來(lái)
        our_snake(snake_block, snake_List)
        Your_score(Length_of_snake - 1)

        # 更新畫面
        pygame.display.update()

        # 判斷蛇是否遲到食物
        if foodx - 10 <= x1 <= foodx + 10 and foody - 10 <= y1 <= foody + 10:
            foodx = round(random.randrange(snake_block, dis_width - snake_block, snake_block))
            foody = round(random.randrange(snake_block, dis_height - snake_block, snake_block))
            # print(foodx, foody)
            Length_of_snake += 1

        # 調(diào)節(jié)幀率來(lái)控制蛇的速度
        clock.tick(snake_speed)

    pygame.quit()
    quit()

gameLoop()

代碼講解

使用的pygamerandom兩個(gè)庫(kù)。Pygame是一種流行的Python游戲開(kāi)發(fā)庫(kù),它提供了許多功能,使開(kāi)發(fā)人員可以輕松創(chuàng)建2D游戲。它具有良好的跨平臺(tái)支持,可以在多個(gè)操作系統(tǒng)上運(yùn)行。random庫(kù)是用來(lái)獲取隨機(jī)數(shù)的,后面使用其獲取食物的隨機(jī)坐標(biāo)。

import pygame
import random

初始化一些后期用到的參數(shù),以及初始化pygame,創(chuàng)建clock時(shí)鐘對(duì)象。

# 初始化pygame
pygame.init()
# 以RGB的形式定義顏色
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# 設(shè)置窗體大小
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
# 設(shè)置窗體的名稱
pygame.display.set_caption('貪吃蛇 KevenDuan1.0')

# 創(chuàng)建clock對(duì)象
clock = pygame.time.Clock()

# 蛇的寬度
snake_block = 15
# 蛇的速度
snake_speed = 15

# 從系統(tǒng)庫(kù)里獲取字體
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)

定義得分函數(shù),實(shí)際上就是在畫面中添加字體。

def Your_score(score):
    value = score_font.render("Score: " + str(score), True, yellow)
    # 在主surface里添加字體surface
    dis.blit(value, [0, 0])

定義蛇體函數(shù),實(shí)際上就是遍歷蛇身隊(duì)列,依次在畫面中畫出矩形。

def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])

定義文本函數(shù),實(shí)際上就是在畫面中顯示文字。

def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width // 2 - 180, dis_height // 2])

兩個(gè)循環(huán)結(jié)構(gòu)一個(gè)判斷游戲是否結(jié)束一個(gè)判斷游戲是否需要退出。

    while not game_over:
        while game_close == True:
            dis.fill(blue)
            message("Game over, press p again or q quit!", red)
            Your_score(Length_of_snake - 1)
            # 修改得分
            pygame.display.update()

            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_p:
                        gameLoop()

獲取鍵盤事件改變蛇頭方向

# 獲取事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP or event.key == pygame.K_w:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
                    y1_change = snake_block
                    x1_change = 0

蛇的移動(dòng)是通過(guò)在隊(duì)頭添加一個(gè)新的坐標(biāo),然后刪掉隊(duì)尾元素實(shí)現(xiàn)的。隊(duì)列的長(zhǎng)度始終為蛇長(zhǎng)變量的值。

		x1 += x1_change
        y1 += y1_change

        dis.fill(blue)
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        # 貪吃蛇的移動(dòng)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]

        # 判斷是否咬到自身
        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True

        # 畫蛇出來(lái)
        our_snake(snake_block, snake_List)
        Your_score(Length_of_snake - 1)

        # 更新畫面
        pygame.display.update()

判斷蛇頭是否吃到食物,設(shè)置一定的范圍,防止出現(xiàn)永遠(yuǎn)吃不到的bug

# 判斷蛇是否吃到食物
        if foodx - 10 <= x1 <= foodx + 10 and foody - 10 <= y1 <= foody + 10:
            foodx = round(random.randrange(snake_block, dis_width - snake_block, snake_block))
            foody = round(random.randrange(snake_block, dis_height - snake_block, snake_block))
            # print(foodx, foody)
            Length_of_snake += 1

增加菜單功能

通過(guò)查閱資料,發(fā)現(xiàn)pygame_menu提供了比較完善的游戲菜單功能。我通過(guò)pip下載后,查閱了官方樣例代碼,這個(gè)菜單確實(shí)是比較精美的,正是我所需要給游戲添加的東西。

import pygame
import pygame_menu

pygame.init()

surface = pygame.display.set_mode((600, 400))

def set_difficulty(value, difficulty):
    # Do the job here !
    print(1)
    pass

def start_the_game():
    # Do the job here !
    pass

menu = pygame_menu.Menu('Welcome', 600, 400,
                       theme=pygame_menu.themes.THEME_BLUE)

menu.add.text_input('Name :', default='kevenduan')
menu.add.selector('Difficulty :', [('Hard', 1), ('Easy', 2)], onchange=set_difficulty)
menu.add.button('Play', start_the_game)
menu.add.button('Quit', pygame_menu.events.EXIT)
menu.mainloop(surface)

最終版本


新功能

最終版本添加了游戲界面菜單,有查詢得分記錄的功能,以及可以選擇兩個(gè)難度。

查詢分?jǐn)?shù)通過(guò)列表記錄后,通過(guò)排序來(lái)顯示得分前5的分?jǐn)?shù)。

難度的控制是由蛇的速度來(lái)控制,由于咬到自身就游戲失敗有點(diǎn)坑,在這里刪除了。

完整代碼

import pygame
import random
import pygame_menu

score = [0, 0, 0, 0, 0]
pygame.init()
# 以RGB的形式定義顏色
white = (255, 255, 255)
yellow = (255, 255, 102)
black = (0, 0, 0)
red = (213, 50, 80)
green = (0, 255, 0)
blue = (50, 153, 213)

# 設(shè)置窗體大小
dis_width = 800
dis_height = 600
dis = pygame.display.set_mode((dis_width, dis_height))
pygame.display.set_caption('Snakes KevenDuan 1.0')

# 創(chuàng)建clock對(duì)象
clock = pygame.time.Clock()

# 蛇的寬度
snake_block = 15
# 蛇的速度
snake_speed = 15

# 從系統(tǒng)庫(kù)里獲取字體
font_style = pygame.font.SysFont("bahnschrift", 25)
score_font = pygame.font.SysFont("comicsansms", 35)

def Your_score(score):
    value = score_font.render("Score: " + str(score), True, yellow)
    # 在主surface里添加字體surface
    dis.blit(value, [0, 0])

def our_snake(snake_block, snake_list):
    for x in snake_list:
        pygame.draw.rect(dis, black, [x[0], x[1], snake_block, snake_block])

def message(msg, color):
    mesg = font_style.render(msg, True, color)
    dis.blit(mesg, [dis_width // 2 - 150, dis_height // 2])

def gameLoop():
    game_over = False
    game_close = False

    x1 = dis_width / 2
    y1 = dis_height / 2

    x1_change = 0
    y1_change = 0

    # 存放蛇的身體
    snake_List = []
    # 蛇的長(zhǎng)度
    Length_of_snake = 1

    # 食物坐標(biāo)隨機(jī)生成
    foodx = round(random.randrange(snake_block, dis_width - snake_block, snake_block))
    foody = round(random.randrange(snake_block, dis_height - snake_block, snake_block))
    print(foodx, foody)

    while not game_over:
        while game_close == True:
            dis.fill(blue)
            score.append(Length_of_snake - 1)
            message(f"Game Over! your score is {Length_of_snake - 1}", red)
            Your_score(Length_of_snake - 1)
            # 修改得分
            pygame.display.update()
            pygame.time.wait(2000)
            # 顯示出菜單
            menu.mainloop(dis)

        # 獲取事件
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT or event.key == pygame.K_a:
                    x1_change = -snake_block
                    y1_change = 0
                elif event.key == pygame.K_RIGHT or event.key == pygame.K_d:
                    x1_change = snake_block
                    y1_change = 0
                elif event.key == pygame.K_UP or event.key == pygame.K_w:
                    y1_change = -snake_block
                    x1_change = 0
                elif event.key == pygame.K_DOWN or event.key == pygame.K_s:
                    y1_change = snake_block
                    x1_change = 0

        if x1 >= dis_width or x1 < 0 or y1 >= dis_height or y1 < 0:
            # 判斷為游戲失敗
            game_close = True

        x1 += x1_change
        y1 += y1_change

        dis.fill(blue)
        pygame.draw.rect(dis, green, [foodx, foody, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(x1)
        snake_Head.append(y1)
        snake_List.append(snake_Head)
        # 貪吃蛇的移動(dòng)
        if len(snake_List) > Length_of_snake:
            del snake_List[0]

        # 判斷是否咬到自身
        # for x in snake_List[:-1]:
        #     if x == snake_Head:
        #         game_close = True

        # 畫蛇出來(lái)
        our_snake(snake_block, snake_List)
        Your_score(Length_of_snake - 1)

        # 更新畫面
        pygame.display.update()

        # 判斷蛇是否吃到食物
        if foodx - 10 <= x1 <= foodx + 10 and foody - 10 <= y1 <= foody + 10:
            foodx = round(random.randrange(snake_block, dis_width - snake_block, snake_block))
            foody = round(random.randrange(snake_block, dis_height - snake_block, snake_block))
            # print(foodx, foody)
            Length_of_snake += 1

        # 調(diào)節(jié)幀率來(lái)控制蛇的速度
        clock.tick(snake_speed)

    pygame.quit()
    quit()



def set_difficulty(value, difficulty):
    # Do the job here !
    global snake_speed
    if snake_speed == 15: snake_speed = 30
    else: snake_speed = 15

def start_the_game():
    # Do the job here !
    gameLoop()

def rank():
    # flag = True
    while True:
        dis.fill(blue)
        score.sort()
        print(score)
        mesg1 = font_style.render(f"Your highest score is {score[-1]}", True, yellow)
        dis.blit(mesg1, [dis_width // 2 - 150, dis_height // 2 - 30])
        mesg2 = font_style.render(f"Ranking of scores:{score[-1:-6:-1]}", True, yellow)
        dis.blit(mesg2, [dis_width // 2 - 190, dis_height // 2 + 10])

        pygame.display.update()
        pygame.time.wait(3000)
        menu.mainloop(dis)
        # menu.add.button('Quit', pygame_menu.events.EXIT)
        # for event in pygame.event.get():
        #     if event.type == pygame.QUIT:
        #         flag = True

menu = pygame_menu.Menu('Welcome to my game', 800, 600,
                       theme=pygame_menu.themes.THEME_BLUE)

menu.add.text_input('Author :', default='KevenDuan')
menu.add.selector('Difficulty :', [('Easy', 1), ('Hard', 2)], onchange=set_difficulty)
menu.add.button('Yours socres', rank)
menu.add.button('Play', start_the_game)
menu.add.button('Quit', pygame_menu.events.EXIT)
menu.mainloop(dis)

總結(jié)

以上是生活随笔為你收集整理的Python实现贪吃蛇大作战的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。