1. <strong id="7actg"></strong>
    2. <table id="7actg"></table>

    3. <address id="7actg"></address>
      <address id="7actg"></address>
      1. <object id="7actg"><tt id="7actg"></tt></object>

        用Python寫了一個貪吃蛇大冒險小游戲

        共 16726字,需瀏覽 34分鐘

         ·

        2021-05-15 09:04

        點擊上方Python知識圈,設(shè)為星標(biāo)

        回復(fù)100獲取100題PDF

        閱讀文本大概需要 5 分鐘


        來源:blog.csdn.net/weixin_45087775



        一、游戲簡介

        1.1 游戲操作及游戲規(guī)則

        (1)游戲開始后,通過鍵盤上下左右鍵控制貪吃蛇移動尋找食物;
        (2)貪吃蛇每吃一個食物,身長會增加一個單位;
        (3)在正常模式中,貪吃蛇如果碰到墻面或咬到自身,則游戲失?。?br style="outline: 0px;">(4)在可穿墻模式中,貪吃蛇可以穿過墻面,但咬到自身后,游戲失敗。

        二、游戲總體設(shè)計

        2.1 游戲總體設(shè)計框架圖

        三、編譯語言以及用到的庫文件描述

        3.1 Python語言
        Python是一種跨平臺的計算機程序設(shè)計語言。是一種面向?qū)ο蟮膭討B(tài)類型語言,最初被設(shè)計用于編寫自動化腳本(shell),Python語言具有非常簡潔且清晰的語法特點,隨著版本的不斷更新和語言新功能的添加,越來越多被用于獨立的、大型項目的開發(fā)。目前,基于Python語言的相關(guān)技術(shù)正在飛速發(fā)展,用戶數(shù)量急劇增大,相關(guān)的資源越來越多。

        3.2 pygame庫
        Pygame是跨平臺Pyth,Pygame 作者是 Pete Shinners, 協(xié)議為 GNU Lesser General Public License。Pygame包含圖像、聲音。建立在SDL基礎(chǔ)上,允許實時電子游戲研發(fā)而無需被低級語言(如機器語言和匯編語言)束縛。基于這樣一個設(shè)想,所有需要的游戲功能和理念(主要是圖像方面)都完全簡化為游戲邏輯本身,所有的資源結(jié)構(gòu)都可以由高級語言提供,如Python。

        3.3 random庫
        Random是產(chǎn)生隨機數(shù)的庫,即隨機數(shù)發(fā)生器,random產(chǎn)生的是偽隨機數(shù)或者說是用一種復(fù)雜的方法計算得到的序列值,因此每次運算時需要一個不同的種子值。種子值不同,得到的序列值也不同。

        3.4 time庫
        time庫是Python中處理時間的標(biāo)準(zhǔn)庫,用于計算機時間的表達,提供獲取系統(tǒng)時間并格式化輸出功能,提供系統(tǒng)級精確計時功能,也可用于程序性能分析。

        3.5 sys庫
        sys.exit([ arg ])用于程序的退出,sys.exit(n) 退出程序,正常退出時exit(0)。這是通過引發(fā)SystemExit 異常來實現(xiàn)的,因此遵循finally語句的子句所指定的清理操作try ,并且可以攔截外層的退出嘗試??蛇x參數(shù)arg可以是一個整數(shù),給出退出狀態(tài)(默認(rèn)為零)或其他類型的對象。如果它是整數(shù),則零被認(rèn)為是“成功終止”,并且任何非零值等視為“異常終止”。

        四、游戲設(shè)計與實現(xiàn)

        4.1 游戲整體設(shè)計

        1. 定義貪吃蛇對象,包括蛇頭和蛇身兩個部分,蛇頭單獨設(shè)置,蛇身使用列表來存儲;

        2. 定義食物對象,包括食物對象的初始化、隨機顏色和隨機位置的設(shè)置;

        3. 定義初始化界面,在該界面中設(shè)置文本為“正常模式”、“可穿墻模式”和“退出”的三個按鈕供玩家選擇;

        4. 定義正常模式,包括游戲窗口顯示、主循環(huán)和判斷貪吃蛇死亡的設(shè)置;

        5. 定義可穿墻模式,包括游戲窗口顯示、主循環(huán)和判斷貪吃蛇死亡的設(shè)置;

        6. 定義游戲結(jié)束窗口,包括窗口顯示和最后得分顯示的設(shè)置。


        4.2 主要函數(shù)解析


        4.2.1 new_food()函數(shù)

        食物對象初始化函數(shù),傳入形參為貪吃蛇蛇頭坐標(biāo)。當(dāng)貪吃蛇吃掉食物后,通過該函數(shù)生成新的食物。通過傳入形參判斷新生成的食物坐標(biāo)是否與蛇頭坐標(biāo)相同,若相同則重新生成新的坐標(biāo)。


        4.2.2 start_game()函數(shù)

        正常模式的主循環(huán)函數(shù),通過該函數(shù)進行正常模式下貪吃蛇和食物的初始化、玩家控制貪吃蛇運動、蛇頭和蛇身的判斷更新和得分統(tǒng)計實現(xiàn)。


        4.2.3 die_snake()函數(shù)

        正常模式下貪吃蛇死亡判斷函數(shù),傳入形參為貪吃蛇蛇頭和蛇身坐標(biāo)數(shù)據(jù)。在該函數(shù)中設(shè)置布爾型變量die_flag,若死亡設(shè)置為Ture并返回,沒有死亡為False。通過遍歷蛇身存儲列表,判斷蛇身坐標(biāo)是否與蛇頭坐標(biāo)相同,若相同則判定貪吃蛇咬到自身,死亡。同時,判斷貪吃蛇是否撞墻,及判斷蛇頭的x和y坐標(biāo)是否窗體的寬高,若超過則死亡。


        4.2.4 start_kgame()函數(shù)

        可穿墻模式的主循環(huán)函數(shù),通過該函數(shù)進行可穿墻模式下貪吃蛇和食物的初始化、玩家控制貪吃蛇運動、蛇頭和蛇身的判斷更新和得分統(tǒng)計實現(xiàn)。


        4.2.5 through_snake()函數(shù)

        可穿墻模式下貪吃蛇死亡判斷函數(shù),傳入形參為貪吃蛇蛇頭和蛇身坐標(biāo)數(shù)據(jù)。在該函數(shù)中設(shè)置布爾型變量die_flag,若死亡設(shè)置為Ture并返回,沒有死亡為False。通過遍歷蛇身存儲列表,判斷蛇身坐標(biāo)是否與蛇頭坐標(biāo)相同,若相同則判定貪吃蛇咬到自身,死亡。


        4.2.6 show_end()函數(shù)

        游戲結(jié)束時,結(jié)束界面設(shè)置函數(shù)。在該函數(shù)中進行結(jié)束界面窗體的初始化,在窗體中顯示玩家的最終得分,并在改函數(shù)中調(diào)用pygame庫quit方法,使該庫停止工作。


        4.2.7 into_game()函數(shù)

        游戲初始界面實現(xiàn)函數(shù),在該函數(shù)中進行游戲初始界面窗體的初始化。在該界面窗體中設(shè)置文本為“正常模式”、“可穿墻模式”和“退出”的三個點擊按鈕,通過設(shè)置循環(huán),調(diào)用button函數(shù)(詳細見6.2.8)監(jiān)聽玩家的點擊。


        4.2.8 button()函數(shù)

        游戲初始界面按鈕監(jiān)聽函數(shù),在該函數(shù)中實現(xiàn)對玩家鼠標(biāo)點擊事件和鍵盤輸入事件的監(jiān)聽。并根據(jù)玩家選擇,運行按鈕對應(yīng)的觸發(fā)函數(shù)。即點擊“正常模式”按鈕,運行正常模式的主循環(huán)函數(shù),以此類推。


        五、運行模塊代碼結(jié)構(gòu)

        在運行模塊,進行pygame庫的初始化、設(shè)置游戲背景音樂、顯示窗口各個參數(shù)的設(shè)置以及游戲初始界面的顯示設(shè)置,具體結(jié)果代碼如下圖:


        六、游戲運行測試(截圖)

        1. 游戲初始選擇界面

        2. 正常模式運行界面

        3. 可穿墻模式運行界面

        4. 游戲結(jié)束界面


        七、游戲完整代碼

        import sysimport timeimport pygamefrom random import *# Position類,通過其構(gòu)造函數(shù),設(shè)置x和yclass Position(object):    def __init__(self, x, y):        self.x = x        self.y = y# 生成隨機的食物def new_food(head):    while True:        new_food = Position(randint(0, 48) * 20, randint(0, 29) * 20)        # 判斷新生成的事物是否和貪吃蛇蛇頭重合,重合則不創(chuàng)鍵        if new_food.x != head.x and new_food.y != head.y:            break        else:            continue    return new_food# 繪制,在窗體中繪制貪吃蛇、食物# color:顏色,position: 坐標(biāo)def rect(color, position):    pygame.draw.circle(window, color, (position.x, position.y), 10)# 初始界面和游戲中點差退出游戲時def exit_end():    pygame.quit()    quit()# 游戲結(jié)束時,顯示得分的窗體的設(shè)置def show_end():    # 設(shè)計窗口    # 定義窗口大小    small_window = pygame.display.set_mode((960, 600))    init_background = pygame.image.load("image/init_bgimg.jpg")    small_window.blit(init_background, (0, 0))    # 定義標(biāo)題    pygame.display.set_caption("貪吃蛇大冒險")    # 定義背景圖片    font = pygame.font.SysFont("simHei", 40)    fontsurf = font.render('游戲結(jié)束! 你的得分為: %s' % score, False, black)    small_window.blit(fontsurf, (250, 200))    pygame.display.update()    time.sleep(2)    pygame.quit()    sys.exit()# 正常模式死亡設(shè)置# head: 蛇頭, snake_body:蛇身def die_snake(head, snake_body):    # 定義標(biāo)志物,默認(rèn)為false,true時判定貪吃蛇碰到自己,死亡    die_flag = False    # 遍歷存放貪吃蛇位姿的列表,從第1個開始,(第0個位蛇頭)    for body in snake_body[1:]:        # 如果蛇頭的xy和蛇身xy相等,則判定相撞,設(shè)置flag為ture        if head.x == body.x and head.y == body.y:            die_flag = True    # 若蛇頭的xy在顯示窗體外,或flag為true,則顯示結(jié)束界面,并退出游戲    if head.x < 0 or head.x > 960 or head.y < 0 or head.y > 600 or die_flag:        pygame.mixer.music.stop()        show_end()# 正常模式主體設(shè)置def start_game():    # 定義存分?jǐn)?shù)的全局變量    global score    global color    color = (randint(10, 255), randint(10, 255), randint(10, 255))    # 定義存放玩家鍵盤輸入運動方向的變量,初始為向右    run_direction = "right"    # 定義貪吃蛇運動方向的變量,初始為玩家鍵入方向    run = run_direction    # 實例化蛇頭、蛇身、食物對象    head = Position(160, 160)    # 初始化蛇身長度為3個單位    snake_body = [Position(head.x, head.y + 20), Position(head.x, head.y + 40), Position(head.x, head.y + 60)]    # 初始化食物位置    food = Position(300, 300)    # 死循環(huán)    while True:        window.blit(background, (0,0))        # 監(jiān)聽玩家鍵盤輸入的運動方向值,并根據(jù)輸入轉(zhuǎn)為up、down、right或left,方便程序中調(diào)用        for event in pygame.event.get():            if event.type == pygame.QUIT:                show_end()            elif event.type == pygame.KEYDOWN:                if event.key == pygame.K_UP:                    run_direction = "up"                elif event.key == pygame.K_RIGHT:                    run_direction = "right"                elif event.key == pygame.K_LEFT:                    run_direction = "left"                elif event.key == pygame.K_DOWN:                    run_direction = "down"        # 食物        rect(color, food)        # 蛇頭        rect(black, head)        # 蛇身        for pos in snake_body:            rect(white, pos)        # 判斷貪吃蛇原運動方向與玩家鍵盤輸入的運動方向是否違反正常運動情況        if run == "up" and not run_direction == "down":            run = run_direction        elif run == "down" and not run_direction == "up":            run = run_direction        elif run == "left" and not run_direction == "right":            run = run_direction        elif run == "right" and not run_direction == "left":            run = run_direction        # 插入蛇頭位置到蛇身列表中        snake_body.insert(0, Position(head.x, head.y))        # 根據(jù)玩家鍵入方向進行蛇頭xy的更新        if run == "up":            head.y -= 20        elif run == "down":            head.y += 20        elif run == "left":            head.x -= 20        elif run == "right":            head.x += 20        # 判斷是否死亡        die_snake(head, snake_body)        # 判斷蛇頭和食物坐標(biāo),若相等,則加分,并生成新的食物        if head.x == food.x and head.y == food.y:            score += 1            food = new_food(head)            color = (randint(10, 255), randint(10, 255), randint(10, 255))        else:            snake_body.pop()        font = pygame.font.SysFont("simHei", 25)        mode_title = font.render('正常模式', False, grey)        socre_title = font.render('得分: %s' % score, False, grey)        window.blit(mode_title, (50, 30))        window.blit(socre_title, (50, 65))        # 繪制更新        pygame.display.update()        # 通過幀率設(shè)置貪吃蛇速度        clock.tick(8)# 可穿墻模式死亡設(shè)置# head:蛇頭,snake_body:蛇身def through_snake(head, snake_body):    # 定義標(biāo)志位    die_flag = False    # 遍歷,蛇頭碰到蛇身時,flag為true退出游戲    for body in snake_body[1:]:        if head.x == body.x and head.y == body.y:            die_flag = True    if die_flag:        pygame.mixer.music.stop()        show_end()    else:  # 當(dāng)蛇頭的xy出窗體時        # 四種穿墻情況,分別設(shè)置        if head.x < 0:            head.x = 960        if head.x > 960:            head.x = 0        if head.y < 0:            head.y = 600        if head.y > 600:            head.y = 0# 穿墻模式主體設(shè)置def start_kgame():    global score    global color    color = (randint(10, 255), randint(10, 255), randint(10, 255))    # 定義蛇初始方向    run_direction = "up"    run = run_direction    # 實例化蛇頭、蛇身、食物對象    head = Position(160, 160)    # 三格    snake_body = [Position(head.x, head.y + 20), Position(head.x, head.y + 40), Position(head.x, head.y + 60)]    # 初始化事物位置    food = Position(300, 300)    # 死循環(huán),監(jiān)聽鍵盤鍵值    while True:        window.blit(background, (0, 0))        for event in pygame.event.get():            if event.type == pygame.QUIT:                show_end()            elif event.type == pygame.KEYDOWN:                if event.key == pygame.K_UP:                    run_direction = "up"                elif event.key == pygame.K_RIGHT:                    run_direction = "right"                elif event.key == pygame.K_LEFT:                    run_direction = "left"                elif event.key == pygame.K_DOWN:                    run_direction = "down"        # 食物        rect(color, food)        # 蛇頭        rect(black, head)        # 蛇身        for pos in snake_body:            rect(white, pos)        # 判斷貪吃蛇原運動方向與玩家鍵盤輸入的運動方向是否違反正常運動情況        if run == "up" and not run_direction == "down":  # 若運動方向為向上,玩家輸入運動方向向下,則違背貪吃蛇正常運動情況            run = run_direction        elif run == "down" and not run_direction == "up":            run = run_direction        elif run == "left" and not run_direction == "right":            run = run_direction        elif run == "right" and not run_direction == "left":            run = run_direction        # 插入蛇頭位置到蛇身列表中        snake_body.insert(0, Position(head.x, head.y))        # 根據(jù)玩家鍵入方向進行蛇頭xy的更新        if run == "up":            head.y -= 20        elif run == "down":            head.y += 20        elif run == "left":            head.x -= 20        elif run == "right":            head.x += 20        # 穿墻實現(xiàn)        through_snake(head, snake_body)        # 判斷是否加分和隨機生成新的食物        if head.x == food.x and head.y == food.y:            score += 1            food = new_food(head)            color = (randint(10, 255), randint(10, 255), randint(10, 255))        else:            snake_body.pop()        font = pygame.font.SysFont("simHei", 25)        mode_title = font.render('穿墻模式', False, grey)        socre_title = font.render('得分: %s' % score, False, grey)        window.blit(mode_title, (50, 30))        window.blit(socre_title, (50, 65))        # 繪制更新        pygame.display.update()        # 通過幀率設(shè)置貪吃蛇速度        clock.tick(8)# 監(jiān)聽函數(shù),監(jiān)聽鍵盤輸入# msg: 按鈕信息,x: 按鈕的x軸,y: 按鈕的y軸,w: 按鈕的寬,h: 按鈕的高,ic: 按鈕初始顏色,ac: 按鈕按下顏色,action: 按鈕按下的動作def button(msg, x, y, w, h, ic, ac, action=None):    # 獲取鼠標(biāo)位置    mouse = pygame.mouse.get_pos()    # 獲取鍵盤輸入    click = pygame.mouse.get_pressed()    if x + w > mouse[0] > x and y + h > mouse[1] > y:        pygame.draw.rect(window, ac, (x, y, w, h))        if click[0] == 1 and action != None:            action()    else:        pygame.draw.rect(window, ic, (x, y, w, h))    # 設(shè)置按鈕中的文字樣式和居中對齊    font = pygame.font.SysFont('simHei', 20)    smallfont = font.render(msg, True, white)    smallrect = smallfont.get_rect()    smallrect.center = ((x + (w / 2)), (y + (h / 2)))    window.blit(smallfont, smallrect)# 游戲初始界面,選擇模式def into_game():    into = True    while into:        window.blit(init_background, (0, 0))        for event in pygame.event.get():            if event.type == pygame.QUIT:                exit_end()        # 設(shè)置字體        font = pygame.font.SysFont("simHei", 50)        # 初始界面顯示文字        fontsurf = font.render('歡迎來到貪吃蛇大冒險!', True, black)  # 文字        fontrect = fontsurf.get_rect()        fontrect.center = ((width / 2), 200)        window.blit(fontsurf, fontrect)        button("正常模式", 370, 370, 200, 40, blue, brightred, start_game)        button("可穿墻模式", 370, 420, 200, 40, violte, brightred, start_kgame)        button("退出", 370, 470, 200, 40, red,brightred, exit_end)        pygame.display.update()        clock.tick(15)if __name__ == '__main__':    # 定義畫布顏色    white = (255, 255, 255)    red = (200, 0, 0)    green = (0, 128, 0)    blue = (0, 202, 254)    violte = (194, 8, 234)    brightred = (255, 0, 0)    brightgreen = (0, 255, 0)    black = (0, 0, 0)    grey = (129, 131, 129)    score = 0    # 設(shè)計窗口    # 定義窗口大小    width = 960    height = 600    window = pygame.display.set_mode((width, height))    # 定義標(biāo)題    pygame.display.set_caption("貪吃蛇大冒險")    # 定義背景圖片    init_background = pygame.image.load("image/init_bgimg.jpg")    background = pygame.image.load("image/bgimg.jpg")    # 背景音樂    pygame.mixer.init()    pygame.mixer.music.load("background.mp3")    pygame.mixer.music.play(-1)    # 創(chuàng)建時鐘    clock = pygame.time.Clock()    # 初始化    pygame.init()    # 初始界面    into_game()


        八、總結(jié)

        這是一個簡單的Python小游戲,具體代碼已貼在博客上。然后相關(guān)的技術(shù)文檔、背景音樂、字體、代碼等我也壓縮上傳到了百度云,大家自行下載即可~

        百度云鏈接:https://pan.baidu.com/s/1V0EINJ_81hHPwDynsiA1VA

        提取碼: kt3a

        PS:我自己建了一個每天可領(lǐng)外賣優(yōu)惠券的號,經(jīng)常領(lǐng)到15元的無門檻券,不花冤枉錢~
        加微信送《Python知識點100題PDF》

        pk哥個人微信


        添加pk哥個人微信即送Python資料


        Python知識點100題的PDF

        Python相關(guān)的電子書10本


        記得備注:“100題”

           
                



        往期推薦
        01

        公眾號所有文章匯總導(dǎo)航(2-10更新)

        02

        永久白嫖!新發(fā)現(xiàn)的外賣漏洞?。≌埖驼{(diào)使用

        03

        求你了,別再用 pip 那烏龜?shù)乃俣热グ惭b庫了!


        點擊閱讀原文查看pk哥原創(chuàng)視頻

        我就知道你“在看”

        瀏覽 32
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        評論
        圖片
        表情
        推薦
        點贊
        評論
        收藏
        分享

        手機掃一掃分享

        分享
        舉報
        1. <strong id="7actg"></strong>
        2. <table id="7actg"></table>

        3. <address id="7actg"></address>
          <address id="7actg"></address>
          1. <object id="7actg"><tt id="7actg"></tt></object>
            欧美日韩国产一区二区在线观看 | 无码av毛片一区二区三区性色 | 另类罕见稀奇videos | 午夜国产福利 | 久久国产成人免费视频 | 国户精品久久久久久久久久久久 | 免费无码国产在线观看 | 91人妻人人澡人人爽 | 豆花视频在线视频 | 亚洲日韩在线一级视频观看 |