<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          用Python寫了一個(gè)貪吃蛇大冒險(xiǎn)小游戲

          共 16726字,需瀏覽 34分鐘

           ·

          2021-05-15 09:04

          點(diǎn)擊上方Python知識(shí)圈設(shè)為星標(biāo)

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

          閱讀文本大概需要 5 分鐘


          來(lái)源:blog.csdn.net/weixin_45087775



          一、游戲簡(jiǎn)介

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

          (1)游戲開始后,通過(guò)鍵盤上下左右鍵控制貪吃蛇移動(dòng)尋找食物;
          (2)貪吃蛇每吃一個(gè)食物,身長(zhǎng)會(huì)增加一個(gè)單位;
          (3)在正常模式中,貪吃蛇如果碰到墻面或咬到自身,則游戲失敗;
          (4)在可穿墻模式中,貪吃蛇可以穿過(guò)墻面,但咬到自身后,游戲失敗。

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

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

          三、編譯語(yǔ)言以及用到的庫(kù)文件描述

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

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

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

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

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

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

          4.1 游戲整體設(shè)計(jì)

          1. 定義貪吃蛇對(duì)象,包括蛇頭和蛇身兩個(gè)部分,蛇頭單獨(dú)設(shè)置,蛇身使用列表來(lái)存儲(chǔ);

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

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

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

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

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


          4.2 主要函數(shù)解析


          4.2.1 new_food()函數(shù)

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


          4.2.2 start_game()函數(shù)

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


          4.2.3 die_snake()函數(shù)

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


          4.2.4 start_kgame()函數(shù)

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


          4.2.5 through_snake()函數(shù)

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


          4.2.6 show_end()函數(shù)

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


          4.2.7 into_game()函數(shù)

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


          4.2.8 button()函數(shù)

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


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

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


          六、游戲運(yùn)行測(cè)試(截圖)

          1. 游戲初始選擇界面

          2. 正常模式運(yùn)行界面

          3. 可穿墻模式運(yùn)行界面

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


          七、游戲完整代碼

          import sysimport timeimport pygamefrom random import *# Position類,通過(guò)其構(gòu)造函數(shù),設(shè)置x和yclass Position(object):    def __init__(self, x, y):        self.x = x        self.y = y# 生成隨機(jī)的食物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)# 初始界面和游戲中點(diǎn)差退出游戲時(shí)def exit_end():    pygame.quit()    quit()# 游戲結(jié)束時(shí),顯示得分的窗體的設(shè)置def show_end():    # 設(shè)計(jì)窗口    # 定義窗口大小    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("貪吃蛇大冒險(xiǎn)")    # 定義背景圖片    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時(shí)判定貪吃蛇碰到自己,死亡    die_flag = False    # 遍歷存放貪吃蛇位姿的列表,從第1個(gè)開始,(第0個(gè)位蛇頭)    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))    # 定義存放玩家鍵盤輸入運(yùn)動(dòng)方向的變量,初始為向右    run_direction = "right"    # 定義貪吃蛇運(yùn)動(dòng)方向的變量,初始為玩家鍵入方向    run = run_direction    # 實(shí)例化蛇頭、蛇身、食物對(duì)象    head = Position(160, 160)    # 初始化蛇身長(zhǎng)度為3個(gè)單位    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)聽玩家鍵盤輸入的運(yùn)動(dòng)方向值,并根據(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)        # 判斷貪吃蛇原運(yùn)動(dòng)方向與玩家鍵盤輸入的運(yùn)動(dòng)方向是否違反正常運(yùn)動(dòng)情況        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ù)玩家鍵入方向進(jìn)行蛇頭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()        # 通過(guò)幀率設(shè)置貪吃蛇速度        clock.tick(8)# 可穿墻模式死亡設(shè)置# head:蛇頭,snake_body:蛇身def through_snake(head, snake_body):    # 定義標(biāo)志位    die_flag = False    # 遍歷,蛇頭碰到蛇身時(shí),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í)        # 四種穿墻情況,分別設(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    # 實(shí)例化蛇頭、蛇身、食物對(duì)象    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)        # 判斷貪吃蛇原運(yùn)動(dòng)方向與玩家鍵盤輸入的運(yùn)動(dòng)方向是否違反正常運(yùn)動(dòng)情況        if run == "up" and not run_direction == "down":  # 若運(yùn)動(dòng)方向?yàn)橄蛏希婕逸斎脒\(yùn)動(dòng)方向向下,則違背貪吃蛇正常運(yùn)動(dòng)情況            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ù)玩家鍵入方向進(jìn)行蛇頭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        # 穿墻實(shí)現(xiàn)        through_snake(head, snake_body)        # 判斷是否加分和隨機(jī)生成新的食物        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()        # 通過(guò)幀率設(shè)置貪吃蛇速度        clock.tick(8)# 監(jiān)聽函數(shù),監(jiān)聽鍵盤輸入# msg: 按鈕信息,x: 按鈕的x軸,y: 按鈕的y軸,w: 按鈕的寬,h: 按鈕的高,ic: 按鈕初始顏色,ac: 按鈕按下顏色,action: 按鈕按下的動(dòng)作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è)置按鈕中的文字樣式和居中對(duì)齊    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('歡迎來(lái)到貪吃蛇大冒險(xiǎn)!', 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è)計(jì)窗口    # 定義窗口大小    width = 960    height = 600    window = pygame.display.set_mode((width, height))    # 定義標(biāo)題    pygame.display.set_caption("貪吃蛇大冒險(xiǎn)")    # 定義背景圖片    init_background = pygame.image.load("image/init_bgimg.jpg")    background = pygame.image.load("image/bgimg.jpg")    # 背景音樂(lè)    pygame.mixer.init()    pygame.mixer.music.load("background.mp3")    pygame.mixer.music.play(-1)    # 創(chuàng)建時(shí)鐘    clock = pygame.time.Clock()    # 初始化    pygame.init()    # 初始界面    into_game()


          八、總結(jié)

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

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

          提取碼: kt3a

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

          pk哥個(gè)人微信


          添加pk哥個(gè)人微信即送Python資料


          Python知識(shí)點(diǎn)100題的PDF

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


          記得備注:“100題”

             
                  



          往期推薦
          01

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

          02

          永久白嫖!新發(fā)現(xiàn)的外賣漏洞!!請(qǐng)低調(diào)使用

          03

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


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

          我就知道你“在看”

          瀏覽 32
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  国产一级理论片 | 青娱乐福利视频 | 欧美操逼一级 | 免费操| 涩涩大香蕉 |