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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

【编程6】贪吃蛇游戏(python+pygame)

發布時間:2025/3/19 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【编程6】贪吃蛇游戏(python+pygame) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

效果圖~新鮮出爐

  • 開始界面
  • 游戲中
  • 結束界面

一、pygame模塊概覽

模塊名稱功能
pygame.cdrom訪問光驅
pygame.cursors加載光標
pygame.display訪問顯示設備
pygame.draw繪制形狀、線和點
pygame.event管理事件
pygame.font使用字體
pygame.image加載和存儲圖片
pygame.joystick使用游戲手柄或類似的東西
pygame.key讀取鍵盤按鍵
pygame.mixer聲音
pygame.mouse鼠標
pygame.movie播放視頻
pygame.music播放音頻
pygame.overlay訪問高級視頻疊加
pygame目前學習的
pygame.rect管理矩形區域
pygame.sndarray操作聲音數據
pygame.sprite操作移動圖像
pygame.surface管理圖像和屏幕
pygame.surfarray管理點陣圖像數據
pygame.time管理時間和幀信息
pygame.transform縮放和移動圖像

二、核心代碼

思路

  • 首頁面:會涉及圖片和文字提示的顯示,進入(任意鍵)或退出(ESC)游戲;
  • 游戲頁面:主要涉及食物的創建繪制,蛇的移動和顯示,蛇是否吃到食物或者是否撞到邊界或自身,再者就是音效的實現(背景音樂+gameover音效);
  • 結束頁面:會涉及圖片和文字提示的顯示,重來(任意鍵)或退出(ESC)游戲。
  • 核心代碼

    • 主函數
    def main():pygame.init()# 創建Pygame時鐘對象,控制每個循環多長時間運行一次。# 例如:snake_speed_clock(60)代表每秒內循環要運行的 60 次# 每秒60個循環(或幀)時,每個循環需要1000/60=16.66ms(大約17ms)如果循環中的代碼運行時間超過17ms,# 在clock指出下一次循環時當前循環將無法完成。snake_speed_clock = pygame.time.Clock()screen = pygame.display.set_mode((windows_width, windows_height))screen.fill(white)pygame.display.set_caption("貪吃蛇~")show_start_info(screen)while True:music()running_game(screen, snake_speed_clock)show_end_info(screen)
    • 游戲運行代碼
    def running_game(screen,snake_speed_clock):start_x = random.randint(3, map_width - 8) #開始位置start_y = random.randint(3, map_height - 8)snake_coords = [{'x': start_x, 'y': start_y}, #初始貪吃蛇{'x': start_x - 1, 'y': start_y},{'x': start_x - 2, 'y': start_y}]direction = RIGHT # 開始時向右移動food = get_random_location() #實物隨機位置while True:for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN:if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:direction = LEFTelif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:direction = RIGHTelif (event.key == K_UP or event.key == K_w) and direction != DOWN:direction = UPelif (event.key == K_DOWN or event.key == K_s) and direction != UP:direction = DOWNelif event.key == K_ESCAPE:terminate()move_snake(direction, snake_coords) #移動蛇ret = snake_is_alive(snake_coords)if not ret:gameover_music()break #蛇死了. 游戲結束snake_is_eat_food(snake_coords, food) #判斷蛇是否吃到食物screen.fill(BG_COLOR)draw_snake(screen, snake_coords)draw_food(screen, food)show_score(screen, len(snake_coords) - 3)pygame.display.update()snake_speed_clock.tick(snake_speed) #控制fps
    • 食物繪制
    def draw_food(screen, food):x = food['x'] * cell_sizey = food['y'] * cell_sizeappleRect = pygame.Rect(x, y, cell_size, cell_size)pygame.draw.rect(screen, red, appleRect)
    • 貪吃蛇繪制
    def draw_snake(screen, snake_coords):for coord in snake_coords:x = coord['x'] * cell_sizey = coord['y'] * cell_sizewormSegmentRect = pygame.Rect(x,y,cell_size,cell_size)pygame.draw.rect(screen, dark_blue, wormSegmentRect)wormInnerSegmentRect = pygame.Rect(x+4,y+4,cell_size - 8, cell_size - 8)pygame.draw.rect(screen, blue, wormInnerSegmentRect)
    • 移動貪吃蛇
    def move_snake(direction, snake_coords):if direction == UP:newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] - 1}elif direction == DOWN:newHead = {'x':snake_coords[HEAD]['x'], 'y':snake_coords[HEAD]['y'] + 1}elif direction == LEFT:newHead = {'x':snake_coords[HEAD]['x'] - 1, 'y':snake_coords[HEAD]['y']}elif direction == RIGHT:newHead = {'x':snake_coords[HEAD]['x'] + 1, 'y':snake_coords[HEAD]['y']}snake_coords.insert(0, newHead)
    • 判斷蛇死沒有死
    def snake_is_alive(snake_coords):tag = True# 頭坐標超出地圖范圍if(snake_coords[HEAD]['x'] == -1 \or snake_coords[HEAD]['x'] == map_width \or snake_coords[HEAD]['y'] == -1 \or snake_coords[HEAD]['y'] == map_height):tag = False# 頭坐標等于身體某節坐標for snake_body in snake_coords[1:]:if snake_body['x'] == snake_coords[HEAD]['x'] and snake_body['y'] == snake_coords[HEAD]['y']:tag = Falsereturn tag
    • 判斷蛇是否吃到食物
    def snake_is_eat_food(snake_coords, food):if(snake_coords[HEAD]['x'] == food['x'] and snake_coords[HEAD]['y'] == food['y']):## 重新生成食物food['x'] = random.randint(0, map_width - 1)food['y'] = random.randint(0, map_height - 1)else:# 如果沒有吃到實物, 就向前移動, 那么尾部一格刪掉del snake_coords[-1]
    • 隨機生成食物
    def get_random_location():return {'x':random.randint(0, map_width - 1),'y':random.randint(0, map_height - 1)}
    • 開始信息顯示
    def show_start_info(screen):# 創建Font字體對象,使用render方法寫字font = pygame.font.Font("simsun.ttc", 40)tip = font.render('按任意鍵開始游戲', True,(65,105,255))# 加載圖片gamestart = pygame.image.load('startlogo.jpg').convert()# 通過blit方法輸出在屏幕上screen.blit(gamestart,(140, 30))screen.blit(tip,(240, 550))## 刷新屏幕pygame.display.update()while True: # 監聽鍵盤for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN: # 任意鍵按下returnif (event.key == K_ESCAPE): # 若為ESC,則終止程序terminate()else:return
    • 聲音設置
    def music():pygame.mixer.init()pygame.mixer.music.load('111.mp3')pygame.mixer.music.play(1, 0)def gameover_music():pygame.mixer.init()pygame.mixer.music.load('gameover.mp3')pygame.mixer.music.play(1,0)
    • 結束信息顯示
    def show_end_info(screen):font = pygame.font.Font("simsun.ttc", 40)tip = font.render("按ESC退出游戲,按任意鍵重新開始游戲",True,(65,105,255))# gamestart = pygame.image.load('gameover.png')# screen.blit(gamestart,(60, 0))screen.blit(tip,(80, 300))pygame.display.update()while True:for event in pygame.event.get():if event.type == QUIT:terminate()elif event.type == KEYDOWN:if event.key == K_ESCAPE:terminate()else:return
    • 成績信息顯示
    def show_score(screen, score):font = pygame.font.Font("simsun.ttc", 30)scoreSurf = font.render("得分:%s" % score, True, green)scoreRect = scoreSurf.get_rect()scoreRect.topleft = (windows_width - 120, 10)screen.blit(scoreSurf,scoreRect)
    • 程序終止
    def terminate():pygame.quit()sys.exit()

    總結

    以上是生活随笔為你收集整理的【编程6】贪吃蛇游戏(python+pygame)的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。