亚洲综合原千岁中文字幕_国产精品99久久久久久久vr_无码人妻aⅴ一区二区三区浪潮_成人h动漫精品一区二区三

主頁 > 知識庫 > Python實現貪吃蛇小游戲(單人模式)

Python實現貪吃蛇小游戲(單人模式)

熱門標簽:鶴壁手機自動外呼系統違法嗎 沈陽防封電銷電話卡 企業微信地圖標注 地圖標注多個 銀川電話機器人電話 萊蕪電信外呼系統 B52系統電梯外呼顯示E7 高德地圖標注收入咋樣 怎么辦理400客服電話

簡單用py寫了一個貪吃蛇游戲,有單人、雙人模式,比較簡單,適合初學者練手。基本上每行重要的語句都有注釋,做了什么事一目了然

這里先介紹單人模式

一、游戲設計要點

1.游戲主體窗口(尺寸)、畫布(尺寸、位置)、按鈕(尺寸、位置)、文字(大小、顏色、位置)、圖像、背景音樂及相關響應函數(主要是鼠標移動及點擊的響應)的設計與合理排布
2.蛇與食物的類的屬性設計
3.蛇位置的更新(根據鍵盤輸入)、吃到食物加分的判定、食物的更新
4.蛇死亡的判定條件設計

二、主要模塊

1.pygame
2.sys
3.random

三、用到的類

1.Snake類,定義蛇頭蛇身元素的位置
2.Food類,定義食物元素的位置及單個元素的顏色

四、主要函數

1.new_food(),功能:生成一個不與蛇頭位置重合的食物并返回該食物對象

def new_food(head):
    while True:
        # 循環,不斷實例化new_food對象直到生成一個不與蛇頭重合的食物
        new_food = Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255)))
        # 若new_food和蛇頭重合則不創鍵
        if new_food.x != head.x and new_food.y != head.y:
            break
        else:
            continue
    return new_food

2.draw_snake()、draw_food()函數,功能:繪制蛇與食物的圖像,傳入參數為顏色和對象:

# 在窗體中繪制貪吃蛇
# 形參:一個是顏色另一個是實例化對象
def draw_snake(color, object):
    pygame.draw.circle(window, color, (object.x, object.y), 10)
    
# 在窗體中繪制食物
# 形參:實例化對象
def draw_food(food):
    pygame.draw.circle(window, food.color, (food.x, food.y), 10)

3.show_end函數,功能:顯示單人模式結束時的得分界面:

# 游戲結束時,單人模式顯示得分的窗體的設置
def show_end_single():
    while True:
        window.blit(init_background, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit_end()
        # 定義標題
        pygame.display.set_caption("貪吃蛇大冒險")
        # 定義提示文字
        font = pygame.font.SysFont("simHei", 40)
        fontsurf = font.render('游戲結束! 你的得分為: %s' % score, False, black)
        window.blit(fontsurf, (250, 100))
        button("返回主菜單", 370, 300, 200, 40, blue, brightred, into_game)
        button("退出游戲", 370, 470, 200, 40, red, brightred, exit_end)
        pygame.display.update()
        clock.tick(20)

4.exit_end()函數,功能:在初始界面和游戲結束顯示得分界面點擊右上角的"×"時,直接退出整個游戲:

def exit_end():
    pygame.quit()
    sys.exit()

5.start_game()函數,功能:實現單人正常模式:

def start_game():
    # 播放音樂
    pygame.mixer.music.play(-1)
    # 定義存分數的全局變量
    global score
    score = 0
    # 定義存放玩家鍵盤輸入運動方向的變量,初始為向右
    run_direction = "right"
    # 定義貪吃蛇運動方向的變量,初始為玩家鍵入方向
    run = run_direction
    # 實例化貪吃蛇和食物對象
    head = Snake(randint(0, 30) * 20, randint(0, 20) * 20)
    # 實例化蛇身長度為2個單位
    snake_body = [Snake(head.x, head.y + 20), Snake(head.x, head.y + 40)]
    # 實例化食物列表,列表隨著其中食物被吃掉應該不斷縮短
    food_list = [Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255)))]
    for i in range(1,24):
        food_list.append(Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255))))
    # 實例化單個食物,方便循環內生成單個新食物
    food = Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255)))
    while True:
        window.blit(background, (0,0))
        # 監聽玩家鍵盤輸入的運動方向值,并根據輸入轉為up、down、right或left,方便程序中調用
        # pygame.event.get()返回一個列表,存放本次game執行中程序遇到的一連串事件(按時間順序依次存放)
        for event in pygame.event.get():
            # pygame.QUIT事件是指用戶點擊窗口右上角的"×"
            if event.type == pygame.QUIT:
                # 顯示結果界面
                show_end()
            # 若事件類型是按下鍵盤,分↑ ↓ ← →四種情況討論
            elif event.type == pygame.KEYDOWN:
                # 若事件類型是按下鍵盤↑
                # key是鍵值,表示按下去的鍵值是什么
                if event.key == ord('w'):
                    run_direction = "up"
                # 若事件類型是按下鍵盤↓
                if event.key == ord('s'):
                    run_direction = "down"
                # 若事件類型是按下鍵盤←
                if event.key == ord('a'):
                    run_direction = "left"
                # 若事件類型是按下鍵盤→
                if event.key == ord('d'):
                    run_direction = "right"
        # 繪制初始化的25個食物圖像(24+1=25)
        # 隨著該列表中的食物被吃掉,列表應該不斷pop以清除已經被吃的事物
        for item in food_list:
            draw_food(item)
        # 繪制被貪吃蛇吃掉后新增的食物圖像
        draw_food(food)
        # 繪制蛇頭圖像
        draw_snake(black, head)
        # 繪制蛇身圖像
        for item in snake_body:
            draw_snake(blue, item)
        # 判斷貪吃蛇原運動方向(run)與玩家鍵盤輸入的運動方向(run_direction)是否違反正常運動情況
        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, Snake(head.x, head.y))
        # 根據玩家鍵入方向進行蛇頭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_flag = False
        # 遍歷存放貪吃蛇位姿的列表,從第1個開始,(第0個位蛇頭)
        for body in snake_body[1:]:
            # 如果蛇頭的xy和蛇身xy相等,則判定相撞,設置flag為ture
            if head.x == body.x and head.y == body.y:
                die_flag = True
        # 若蛇頭的xy在顯示窗體外,或flag為true,則顯示結束界面,并退出游戲
        if die_flag == True or head.x  0 or head.x > 960 or head.y  0 or head.y > 600:
            # 停止播放音樂
            pygame.mixer.music.stop()
            show_end()
        # die_snake(head, snake_body)
        # 判斷蛇頭和食物坐標,若相等,則加分,并生成新的食物
        # 定義標志,表明是否找到和蛇頭相等的事物
        global flag
        flag = 0
        # 如果蛇頭和食物重合
        for item in food_list:
            if head.x == item.x and head.y == item.y or head.x == food.x and head.y == food.y:
                flag = 1
                score += 1
                # 彈出被吃掉的這個食物
                food_list.pop(food_list.index(item))
                # 再產生一個食物
                food = new_food(head)
                # 把新食物插入food_list,下一次循環中會更新繪制食物全體
                food_list.append(food)
                break
        if flag == 0:
            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()
        # 通過幀率設置貪吃蛇速度
        clock.tick(8)

6.start_kgame()函數,功能:實現單人穿墻模式:

def start_kgame_single():
    # 播放音樂
    pygame.mixer.music.play(-1)
    global score
    score = 0
    # 定義存放玩家鍵盤輸入運動方向的變量,初始為向右
    run_direction = "right"
    # 定義貪吃蛇運動方向的變量,初始為玩家鍵入方向
    run = run_direction
    # 實例化蛇頭、蛇身、食物對象
    head = Snake(160, 160)
    # 實例化蛇身
    snake_body = [Snake(head.x, head.y + 20), Snake(head.x, head.y + 40), Snake(head.x, head.y + 60)]
    # 實例化食物列表,列表隨著其中食物被吃掉應該不斷縮短
    food_list = [Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255)))]
    for i in range(1,24):
        food_list.append(Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255))))
    # 實例化單個食物,方便循環內生成單個新食物
    food = Food(randint(0, 45) * 20, randint(0, 28) * 20, (randint(10, 255), randint(10, 255), randint(10, 255)))
    # 死循環,監聽鍵盤鍵值
    while True:
        window.blit(background, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                show_end_single()
            elif event.type == pygame.KEYDOWN:
                # 若事件類型是按下鍵盤w
                # key是鍵值,表示按下去的鍵值是什么
                if event.key == ord('w'):
                    run_direction = "up"
                # 若事件類型是按下鍵盤s
                if event.key == ord('s'):
                    run_direction = "down"
                # 若事件類型是按下鍵盤a
                if event.key == ord('a'):
                    run_direction = "left"
                # 若事件類型是按下鍵盤d
                if event.key == ord('d'):
                    run_direction = "right"
        # 繪制初始化的25個食物圖像(24+1=25)
        # 隨著該列表中的食物被吃掉,列表應該不斷pop以清除已經被吃的事物
        for item in food_list:
            draw_food(item)
        # 繪制被貪吃蛇吃掉后新增的食物圖像
        draw_food(food)
        # 繪制蛇頭圖像
        draw_snake(black, head)
        # 繪制蛇身圖像
        for item in snake_body:
            draw_snake(blue, item)
        # 判斷貪吃蛇原運動方向與玩家鍵盤輸入的運動方向是否違反正常運動情況
        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, Snake(head.x, head.y))
        # 根據玩家鍵入方向進行蛇頭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_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: 
            # 當蛇頭穿出窗體時有四種情況,分別討論
            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
        # 判斷蛇頭和食物坐標,若相等,則加分,并生成新的食物
        # 定義標志,表明是否找到和蛇頭相等的事物
        global flag
        flag = 0
        # 如果蛇頭和食物重合
        for item in food_list:
            if head.x == item.x and head.y == item.y or head.x == food.x and head.y == food.y:
                flag = 1
                score += 1
                # 彈出被吃掉的這個食物
                food_list.pop(food_list.index(item))
                # 再產生一個食物
                food = new_food(head)
                # 把新食物插入food_list,下一次循環中會更新繪制食物全體
                food_list.append(food)
                break
        # 若沒吃到食物則從蛇身pop一個元素以更新蛇位置
        if flag == 0:
            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()
        # 通過幀率設置貪吃蛇速度
        clock.tick(8)

7.button()函數,功能:實現按鈕樣式設計和響應鼠標操作:

def button(msg, x, y, w, h, ic, ac, action=None):
    # 獲取鼠標位置
    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))
    # 設置按鈕中的文字樣式和居中對齊
    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)

8.into_game()函數,功能:實現游戲初始界面,選擇模式:

def into_game():
    while True:
        window.blit(init_background, (0, 0))
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                exit_end()
        # 設置字體
        font = pygame.font.SysFont("simHei", 50)
        # 初始界面顯示文字
        fontsurf = font.render('歡迎來到貪吃蛇大冒險!', True, black)  # 文字
        fontrect = fontsurf.get_rect()
        fontrect.center = ((480), 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(20)

9.主函數,功能:初始化參數設定,進入游戲:

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)
    # 設計窗口
    window = pygame.display.set_mode((960, 600))
    # 定義標題
    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")
    # 創建時鐘
    clock = pygame.time.Clock()
    # 初始化,自檢所有模塊是否完整
    pygame.init()
    # 初始界面
    into_game()

注:其中的圖片、背景音樂需要自己找合適(尺寸要與窗口大小相適應)的,也可以參考我上傳的資源:貪吃蛇單人版源代碼+背景+音樂

附:Blog:雙人模式詳解

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • python貪吃蛇游戲代碼
  • Python寫的貪吃蛇游戲例子
  • 使用Python寫一個貪吃蛇游戲實例代碼
  • Python 實現 貪吃蛇大作戰 代碼分享
  • Python貪吃蛇游戲編寫代碼
  • 利用python實現簡易版的貪吃蛇游戲(面向python小白)
  • 教你一步步利用python實現貪吃蛇游戲
  • python實現貪吃蛇游戲
  • Python實現貪吃蛇小游戲(雙人模式)
  • 保姆級python教程寫個貪吃蛇大冒險

標簽:湘西 葫蘆島 呼倫貝爾 銀川 烏魯木齊 三亞 安慶 呼倫貝爾

巨人網絡通訊聲明:本文標題《Python實現貪吃蛇小游戲(單人模式)》,本文關鍵詞  Python,實現,貪吃,蛇,小游戲,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《Python實現貪吃蛇小游戲(單人模式)》相關的同類信息!
  • 本頁收集關于Python實現貪吃蛇小游戲(單人模式)的相關信息資訊供網民參考!
  • 推薦文章
    午夜欧美福利| 成人免费高清视频| 国产成人欧美一区二区三区的| 久久国产精品永久免费网站| 国产极品白嫩美女在线观看看| 欧美电影免费| 午夜在线影院| 国产视频一区二区在线播放| 久久国产精品只做精品| 亚洲第一视频在线播放| 九九九网站| 韩国毛片 免费| 国产综合成人观看在线| 日韩在线观看视频黄| 国产激情一区二区三区| 成人免费观看男女羞羞视频| 午夜欧美成人香蕉剧场| 精品国产三级a| 国产麻豆精品高清在线播放| 欧美夜夜骑 青草视频在线观看完整版 久久精品99无色码中文字幕 欧美日韩一区二区在线观看视频 欧美中文字幕在线视频 www.99精品 香蕉视频久久 | 国产不卡在线观看| 国产麻豆精品| 欧美a级片免费看| 91麻豆精品国产自产在线| 999久久狠狠免费精品| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 成人av在线播放| 欧美激情影院| 国产一区二区高清视频| 日韩中文字幕一区二区不卡| 久久99中文字幕久久| 亚洲 欧美 成人日韩| 亚洲www美色| 日日日夜夜操| 999精品影视在线观看| 美女免费精品视频在线观看| 可以免费看毛片的网站| 欧美另类videosbestsex高清| 成人免费观看男女羞羞视频| 99色视频在线观看| 国产一区二区精品久久91| 久久国产影院| 毛片的网站| 97视频免费在线观看| a级毛片免费全部播放| 四虎久久精品国产| 国产亚洲精品成人a在线| 国产91素人搭讪系列天堂| 国产精品免费久久| 国产国语对白一级毛片| 91麻豆精品国产自产在线 | 国产视频在线免费观看| 成人免费观看的视频黄页| 亚欧视频在线| 人人干人人插| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 国产麻豆精品hdvideoss| 91麻豆精品国产综合久久久| 人人干人人草| 亚洲天堂一区二区三区四区| 欧美a免费| 日韩中文字幕一区| 国产视频一区二区在线播放| 天天做日日干| 国产视频一区在线| 青青久久精品| 久久99欧美| 国产美女在线观看| 精品视频在线看| 黄色短视频网站| 精品国产三级a| 中文字幕97| 九九精品久久| 韩国毛片| 九九久久99| 青青久在线视频| 成人高清免费| 色综合久久天天综合绕观看| 成人影视在线观看| 天天色成人| 在线观看成人网 | a级毛片免费全部播放| 免费的黄视频| 国产美女在线观看| 亚洲www美色| 欧美1卡一卡二卡三新区| 国产极品精频在线观看| 欧美激情一区二区三区视频高清| 在线观看成人网| 欧美大片一区| 欧美一级视频高清片| 久久99中文字幕久久| 国产一区二区精品久久91| 91麻豆国产| 国产一区二区高清视频| 国产国语对白一级毛片| 高清一级毛片一本到免费观看| 二级特黄绝大片免费视频大片| 精品视频在线看| 四虎影视库国产精品一区| 国产综合91天堂亚洲国产| 国产一区二区精品| 亚洲天堂在线播放| 国产亚洲男人的天堂在线观看| 欧美a级大片| 国产精品自拍亚洲| 91麻豆精品国产高清在线| 久久久成人影院| 日本在线www| 你懂的日韩| 九九久久国产精品| 国产精品1024永久免费视频| 99久久精品国产免费| 九九精品影院| 国产一区二区高清视频| 国产视频一区二区三区四区 | 日韩专区亚洲综合久久| 成人免费观看的视频黄页| 四虎久久影院| 精品毛片视频| 四虎影视久久久| 免费国产一级特黄aa大片在线| 国产麻豆精品免费密入口| 99久久视频| 欧美1卡一卡二卡三新区| 久久精品欧美一区二区| 麻豆网站在线看| 日日夜人人澡人人澡人人看免| 国产网站麻豆精品视频| 精品国产亚洲人成在线| 精品视频在线观看免费| 欧美国产日韩精品| 欧美激情中文字幕一区二区| 韩国三级香港三级日本三级la| 成人影院久久久久久影院| 深夜做爰性大片中文| 亚欧成人乱码一区二区| 久久国产精品自线拍免费| 日本久久久久久久 97久久精品一区二区三区 狠狠色噜噜狠狠狠狠97 日日干综合 五月天婷婷在线观看高清 九色福利视频 | 日韩综合| 麻豆系列 在线视频| 日韩在线观看视频黄| 国产一区免费在线观看| 亚洲天堂免费观看| 国产91丝袜在线播放0| 久久久久久久网| 国产一区二区精品| 精品国产一区二区三区免费 | 91麻豆爱豆果冻天美星空| 日韩在线观看免费完整版视频| 可以免费看污视频的网站| 国产成人精品综合久久久| 精品视频在线看| 国产美女在线观看| 好男人天堂网 久久精品国产这里是免费 国产精品成人一区二区 男人天堂网2021 男人的天堂在线观看 丁香六月综合激情 | 久久99这里只有精品国产| 精品视频在线看| 亚洲女初尝黑人巨高清在线观看| 欧美1区| 成人影视在线观看| 精品视频一区二区| 国产高清视频免费| 国产视频久久久| 99久久视频| 免费毛片基地| 久草免费在线观看| 欧美a级大片| 一级女性全黄生活片免费| 亚洲精品影院| 精品视频一区二区三区免费| 欧美激情一区二区三区视频| 精品视频在线观看免费| 四虎影视精品永久免费网站 | 九九九网站| 成人av在线播放| 国产一区二区精品在线观看| 精品国产一区二区三区国产馆| 国产伦精品一区二区三区无广告 | 韩国毛片基地| 国产成人精品综合久久久| 欧美激情一区二区三区在线播放 | 四虎影视库国产精品一区| 亚欧成人毛片一区二区三区四区 | 国产视频久久久久| 日韩在线观看免费完整版视频| 欧美激情伊人| 日韩中文字幕一区二区不卡| a级毛片免费全部播放| 国产高清视频免费| 日本在线播放一区| 精品久久久久久中文字幕一区| 久久精品成人一区二区三区| 精品视频一区二区三区免费| 国产一区二区精品| 欧美激情影院| 精品国产一区二区三区免费 | 你懂的国产精品| 99久久精品国产高清一区二区| 精品毛片视频| 欧美电影免费|