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

歡迎訪問 生活随笔!

生活随笔

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

python

10分钟教你用python打造贪吃蛇超详细教程

發(fā)布時間:2023/12/8 python 20 豆豆
生活随笔 收集整理的這篇文章主要介紹了 10分钟教你用python打造贪吃蛇超详细教程 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

更多精彩盡在微信公眾號【程序猿聲】

10分鐘教你用python打造貪吃蛇超詳細教程

在家閑著沒妹子約, 剛好最近又學了一下python,聽說pygame挺好玩的。今天就在家研究一下, 弄了個貪吃蛇出來。希望沒女朋友的大家喜歡~~~

先看程序效果:

01 整體框架

平臺:pycharm

關(guān)于pygame的安裝這里就不在贅述,大家自行上網(wǎng)找合適自己的版本的安裝即可。關(guān)于pygame模塊知識會穿插在下面代碼中介紹,用到什么就介紹什么。這里就不統(tǒng)一介紹了。

整個程序由于是調(diào)用了大量的pygame里面的庫函數(shù),所以也非常簡單(臥槽你這不是調(diào)包俠嘛)。也就200多行代碼。基于整體怎么設計的呢?看下面的圖:

由于程序沒有多么復雜,就直接用面向過程的思路寫了。畢竟這么小的程序沒必要整一大堆class來為難自己對吧。

程序整體代碼框架:

pycharm里面一堆波浪線也是很無奈。

02 main主函數(shù)-開始工作

此函數(shù)也非常簡單。主要承擔一些游戲窗口的初始化工作,以及調(diào)用相關(guān)函數(shù)運行游戲。代碼如下:

#主函數(shù) def main():pygame.init() # 模塊初始化snake_speed_clock = pygame.time.Clock() # 創(chuàng)建Pygame時鐘對象screen = pygame.display.set_mode((windows_width, windows_height)) #screen.fill(white)pygame.display.set_caption("Python 貪吃蛇小游戲") #設置標題show_start_info(screen) #歡迎信息while True:running_game(screen, snake_speed_clock)show_gameover_info(screen)

基于以上代碼,咱們來做幾點講解:

  • pygame.time.Clock()
    控制幀速率。pygame.time.Clock()會控制每個循環(huán)多長時間運行一次。這就好比,有個定時器在控制著時間進程,一到時間就告訴CPU:
    現(xiàn)在該開始循環(huán)了!
    現(xiàn)在該開始循環(huán)了!

    使用pygame時鐘之前,必須先創(chuàng)建Clock對象的一個實例,這與創(chuàng)建其他類的實例完全相同。Clock= Pygame.time.Clock()。然后在主循環(huán)體中,只需要告訴時鐘多久“提醒”一次———-也就是說,循環(huán)應該多長時間運行一次:clock.tick(60)。

    傳入clock.tick()的數(shù)不是一個毫秒數(shù)。這是每秒內(nèi)循環(huán)要運行的次數(shù),所以這個循環(huán)應當每秒運行60次,在這里我只是說應當運行,因為循環(huán)只能按計算機能夠保證的速度運行,每秒60個循環(huán)(或幀)時,每個循環(huán)需要1000/60=16.66ms(大約17ms)如果循環(huán)中的代碼運行時間超過17ms,在clock指出下一次循環(huán)時當前循環(huán)將無法完成。

    再說通俗一點,就是我們游戲的fps嘛。每秒多少幀這樣。至于后面在哪clock.tick(),下面會講。
    詳細可參考這篇文章:http://eyehere.net/2011/python-pygame-novice-professional-8/

  • pygame.display.set_mode((windows_width, windows_height))

    生成windows窗口,pygame.display.set_mode(resolution=(0,0),flags=0,depth=0)。返回的是一個surface對象(surface對象是用于表示圖像的圖像,只要指定尺寸,就可以利用),resolution可以控制生成windows窗口的大小,flags代表的是擴展選項,depath不推薦設置。

    flags標志位控制你想要什么樣的顯示屏,主要有下面幾個,這幾個量相當于是全局的常量,使用的時候可以from pygame.locals import *導入:

    • pygame.FULLSCREEN,控制全屏,0或者1來控制
    • pygame.HWSURFACE 控制是否進行硬件加速
    • pygame.RESIZABLE 控制窗口是否可以調(diào)節(jié)大小
  • screen.fill(white)
    pygame.surface.fill(color)。對surface對象填充某一種顏色,在這里表現(xiàn)為窗口背景顏色的填充。

以上講完,然后就是運行我們游戲三個函數(shù)了。

  • show_start_info(screen)
    顯示歡迎信息,最終效果表現(xiàn)為:

    當然,怎么實現(xiàn),待會說。

接著死循環(huán)。因為我們的游戲設置是,當GameOver以后,我們可以按任意鍵重新開始游戲,或者退出。因此最后不斷循環(huán)判斷用戶是否想重新開始游戲,就這樣而已。

  • 游戲主體running_game(screen, snake_speed_clock)
    貪吃蛇運行的主體函數(shù)。整個程序的精髓所在。

  • show_gameover_info(screen)
    貪吃蛇死了,顯示GameOver,表現(xiàn)為:


    怎么實現(xiàn),下面說。

03 show_start_info()歡迎進入游戲

先貼代碼,待會講解。

#開始信息顯示 def show_start_info(screen):font = pygame.font.Font('myfont.ttf', 40)tip = font.render('按任意鍵開始游戲~~~', True, (65, 105, 225))gamestart = pygame.image.load('gamestart.png')screen.blit(gamestart, (140, 30))screen.blit(tip, (240, 550))pygame.display.update()while True: #鍵盤監(jiān)聽事件for event in pygame.event.get(): # event handling loopif event.type == QUIT:terminate() #終止程序elif event.type == KEYDOWN:if (event.key == K_ESCAPE): #終止程序terminate() #終止程序else:return #結(jié)束此函數(shù), 開始游戲
  • 字體顯示
    先創(chuàng)建一個Font對象,用自己的字體。有了Font對象以后, 就可以用render方法來寫字了,然后通過blit方法blit到屏幕上。
  • 圖像加載
    用 pygame.image.load()加載圖像獲得對象,在用blit方法刷到屏幕上。做完以上事件以后,記得要update一下刷新一下屏幕。
  • 監(jiān)聽鍵盤
    按任意鍵繼續(xù)或者ESC退出……

04 running_game-讓我們開始游戲吧

running_game(screen, snake_speed_clock)是游戲主要功能,在這里給大家慢慢講解。先貼代碼:

#游戲運行主體 def running_game(screen,snake_speed_clock):startx = random.randint(3, map_width - 8) #開始位置starty = random.randint(3, map_height - 8)snake_coords = [{'x': startx, 'y': starty}, #初始貪吃蛇{'x': startx - 1, 'y': starty},{'x': startx - 2, 'y': starty}]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:break #蛇跪了. 游戲結(jié)束snake_is_eat_food(snake_coords, food) #判斷蛇是否吃到食物screen.fill(BG_COLOR)#draw_grid(screen)draw_snake(screen, snake_coords)draw_food(screen, food)draw_score(screen, len(snake_coords) - 3)pygame.display.update()snake_speed_clock.tick(snake_speed) #控制fps
  • 關(guān)于貪吃蛇
    這里我們采用一個元組存儲貪吃蛇身體各個部分的坐標(一條貪吃蛇不是由很多節(jié)組成的嘛)。最后再寫個方法根據(jù)元組坐標把貪吃蛇畫出來就行。
  • 關(guān)于食物
    同樣做法。存坐標,最后畫出來。
  • 關(guān)于移動
    監(jiān)聽鍵盤,根據(jù)用戶按鍵,用direction變量記錄移動方向。然后更新貪吃蛇元組里面的坐標(其實每次移動只用更新頭尾就行)。最后統(tǒng)一畫出來。移動做法具體是,我們把每次頭部移動的新坐標插入貪吃蛇元組,然后刪掉尾部一節(jié)(注意,刪除尾部我們放在了另外一個函數(shù)里做)。

    #移動貪吃蛇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)
  • 開始階段
    先把貪吃蛇和食物的坐標隨機生成,貪吃蛇一開始3節(jié)長,先設置向右移動。

  • 移動我們的貪吃蛇
    監(jiān)聽鍵盤,用戶按下鍵盤只是改變direction的值,再用move_snake(direction, snake_coords)函數(shù)更新貪吃蛇坐標。如果不按,那direction值一直不變,貪吃蛇就一直向前走。
  • 相關(guān)判斷
    要判斷貪吃蛇是否掛了,表現(xiàn)為:

    • 頭坐標超出地圖范圍
    • 頭坐標等于身體某節(jié)坐標

      #判斷蛇死了沒 def snake_is_alive(snake_coords):tag = Trueif 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 = False # 蛇碰到自己身體啦return tag

      判斷貪吃蛇是否吃到食物,表現(xiàn)為:

    • 頭坐標等于食物坐標,那么吃到食物。這時候注意,我們就不用刪尾部一節(jié)了,因為吃到食物變長了嘛。
    • 如果沒有吃到食物,那么是正常移動,刪掉尾部一節(jié)坐標。 #判斷貪吃蛇是否吃到食物 def snake_is_eat_food(snake_coords, food): #如果是列表或字典,那么函數(shù)內(nèi)修改參數(shù)內(nèi)容,就會影響到函數(shù)體外的對象。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] # 如果沒有吃到實物, 就向前移動, 那么尾部一格刪掉
  • 畫出我們的游戲
    最后調(diào)用相關(guān)函數(shù),講我們的地圖,貪吃蛇,食物等等統(tǒng)統(tǒng)畫出來。

05 draw_snake-畫出我們的貪吃蛇

直接看代碼:

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)

代碼很easy,主要是獲取相關(guān)坐標,最后調(diào)用pygame.draw.rect將身體各個部分畫出來即可。不過為了美觀,我們選擇再在里面畫一層不同顏色的,表現(xiàn)為:

06 draw_food-畫出我們的食物

#將食物畫出來 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)

更簡單的代碼了,獲取位置,畫矩形。

07 draw_score-畫出我們的成績

#畫成績 def draw_score(screen,score):font = pygame.font.Font('myfont.ttf', 30)scoreSurf = font.render('得分: %s' % score, True, Green)scoreRect = scoreSurf.get_rect()scoreRect.topleft = (windows_width - 120, 10)screen.blit(scoreSurf, scoreRect)

畫成績也比較簡單。獲得Font對象以后,render寫字,最后設置位置,在屏幕上blit出來。

08 完整代碼

整個程序大體如上,其他細枝末節(jié)直接看源代碼吧。

欲獲取代碼,請關(guān)注我們的微信公眾號【程序猿聲】,在后臺回復:python貪吃蛇。python和貪吃蛇之間不要有空格,不要有空格,不要有空格!!!即可獲取。

?

總結(jié)

以上是生活随笔為你收集整理的10分钟教你用python打造贪吃蛇超详细教程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

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