国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

python貪吃蛇游戲代碼詳解,python貪吃蛇最簡(jiǎn)單代碼

這篇具有很好參考價(jià)值的文章主要介紹了python貪吃蛇游戲代碼詳解,python貪吃蛇最簡(jiǎn)單代碼。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

大家好,給大家分享一下python貪吃蛇游戲代碼詳解外加中文,很多人還不知道這一點(diǎn)。下面詳細(xì)解釋一下?,F(xiàn)在讓我們來(lái)看看!

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

01 整體框架

平臺(tái):pycharm

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

整個(gè)程序由于是調(diào)用了大量的pygame里面的庫(kù)函數(shù),所以也非常簡(jiǎn)單(臥槽你這不是調(diào)包俠嘛)。也就200多行代碼?;谡w怎么設(shè)計(jì)的呢?看下面的圖:

想要學(xué)習(xí)Python?Python學(xué)習(xí)交流群:1136201545滿足你的需求,資料都已經(jīng)上傳群文件,可以自行下載!

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

由于程序沒(méi)有多么復(fù)雜,就直接用面向過(guò)程的思路寫了。畢竟這么小的程序沒(méi)必要整一大堆class來(lái)為難自己對(duì)吧。

程序整體代碼框架:

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

pycharm里面一堆波浪線也是很無(wú)奈。

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

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

 1#主函數(shù)
 2def?main():
 3????pygame.init()?#?模塊初始化
 4????snake_speed_clock?=?pygame.time.Clock()?#?創(chuàng)建Pygame時(shí)鐘對(duì)象
 5????screen?=?pygame.display.set_mode((windows_width,?windows_height))?#
 6????screen.fill(white)
 7
 8????pygame.display.set_caption("Python?貪吃蛇小游戲")?#設(shè)置標(biāo)題
 9????show_start_info(screen)???????????????#歡迎信息
10????while?True:
11????????running_game(screen,?snake_speed_clock)
12????????show_gameover_info(screen)

基于以上代碼,咱們來(lái)做幾點(diǎn)講解:

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

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

    傳入clock.tick()的數(shù)不是一個(gè)毫秒數(shù)。這是每秒內(nèi)循環(huán)要運(yùn)行的次數(shù),所以這個(gè)循環(huán)應(yīng)當(dāng)每秒運(yùn)行60次,在這里我只是說(shuō)應(yīng)當(dāng)運(yùn)行,因?yàn)檠h(huán)只能按計(jì)算機(jī)能夠保證的速度運(yùn)行,每秒60個(gè)循環(huán)(或幀)時(shí),每個(gè)循環(huán)需要1000/60=16.66ms(大約17ms)如果循環(huán)中的代碼運(yùn)行時(shí)間超過(guò)17ms,在clock指出下一次循環(huán)時(shí)當(dāng)前循環(huán)將無(wú)法完成。

    再說(shuō)通俗一點(diǎn),就是我們游戲的fps嘛。每秒多少幀這樣。至于后面在哪clock.tick(),下面會(huì)講。
    詳細(xì)可參考這篇文章: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)。返回的是一個(gè)surface對(duì)象(surface對(duì)象是用于表示圖像的圖像,只要指定尺寸,就可以利用),resolution可以控制生成windows窗口的大小,flags代表的是擴(kuò)展選項(xiàng),depath不推薦設(shè)置。

    flags標(biāo)志位控制你想要什么樣的顯示屏,主要有下面幾個(gè),這幾個(gè)量相當(dāng)于是全局的常量,使用的時(shí)候可以from pygame.locals import *導(dǎo)入:

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

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

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

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

當(dāng)然,怎么實(shí)現(xiàn),待會(huì)說(shuō)。

接著死循環(huán)。因?yàn)槲覀兊挠螒蛟O(shè)置是,當(dāng)GameOver以后,我們可以按任意鍵重新開始游戲,或者退出。因此最后不斷循環(huán)判斷用戶是否想重新開始游戲,就這樣而已。

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

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

    python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能怎么實(shí)現(xiàn),下面說(shuō)。
03 show_start_info()歡迎進(jìn)入游戲

先貼代碼,待會(huì)講解。

 1#開始信息顯示
 2def show_start_info(screen):
 3    font = pygame.font.Font('myfont.ttf', 40)
 4    tip = font.render('按任意鍵開始游戲~~~', True, (65, 105, 225))
 5    gamestart = pygame.image.load('gamestart.png')
 6    screen.blit(gamestart, (140, 30))
 7    screen.blit(tip, (240, 550))
 8    pygame.display.update()
 9
10    while True:  #鍵盤監(jiān)聽事件
11        for event in pygame.event.get():  # event handling loop
12            if event.type == QUIT:
13                terminate()     #終止程序
14            elif event.type == KEYDOWN:
15                if (event.key == K_ESCAPE):  #終止程序
16                    terminate() #終止程序
17                else:
18                    return #結(jié)束此函數(shù), 開始游戲
  • 字體顯示
    先創(chuàng)建一個(gè)Font對(duì)象,用自己的字體。有了Font對(duì)象以后, 就可以用render方法來(lái)寫字了,然后通過(guò)blit方法blit到屏幕上。
  • 圖像加載
    用 pygame.image.load()加載圖像獲得對(duì)象,在用blit方法刷到屏幕上。做完以上事件以后,記得要update一下刷新一下屏幕。
  • 監(jiān)聽鍵盤
    按任意鍵繼續(xù)或者ESC退出……
04 running_game-讓我們開始游戲吧

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

 1#游戲運(yùn)行主體
 2def running_game(screen,snake_speed_clock):
 3    startx = random.randint(3, map_width - 8) #開始位置
 4    starty = random.randint(3, map_height - 8)
 5    snake_coords = [{'x': startx, 'y': starty},  #初始貪吃蛇
 6                  {'x': startx - 1, 'y': starty},
 7                  {'x': startx - 2, 'y': starty}]
 8
 9    direction = RIGHT       #  開始時(shí)向右移動(dòng)
10
11    food = get_random_location()     #實(shí)物隨機(jī)位置
12
13    while True:
14        for event in pygame.event.get():
15            if event.type == QUIT:
16                terminate()
17            elif event.type == KEYDOWN:
18                if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
19                    direction = LEFT
20                elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
21                    direction = RIGHT
22                elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
23                    direction = UP
24                elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
25                    direction = DOWN
26                elif event.key == K_ESCAPE:
27                    terminate()
28
29        move_snake(direction, snake_coords) #移動(dòng)蛇
30
31        ret = snake_is_alive(snake_coords)
32        if not ret:
33            break #蛇跪了. 游戲結(jié)束
34        snake_is_eat_food(snake_coords, food) #判斷蛇是否吃到食物
35
36        screen.fill(BG_COLOR)
37        #draw_grid(screen)
38        draw_snake(screen, snake_coords)
39        draw_food(screen, food)
40        draw_score(screen, len(snake_coords) - 3)
41        pygame.display.update()
42        snake_speed_clock.tick(snake_speed) #控制fps
  • 關(guān)于貪吃蛇
    這里我們采用一個(gè)元組存儲(chǔ)貪吃蛇身體各個(gè)部分的坐標(biāo)(一條貪吃蛇不是由很多節(jié)組成的嘛)。最后再寫個(gè)方法根據(jù)元組坐標(biāo)把貪吃蛇畫出來(lái)就行。

  • 關(guān)于食物
    同樣做法。存坐標(biāo),最后畫出來(lái)。

  • 關(guān)于移動(dòng)
    監(jiān)聽鍵盤,根據(jù)用戶按鍵,用direction變量記錄移動(dòng)方向。然后更新貪吃蛇元組里面的坐標(biāo)(其實(shí)每次移動(dòng)只用更新頭尾就行)。最后統(tǒng)一畫出來(lái)。移動(dòng)做法具體是,我們把每次頭部移動(dòng)的新坐標(biāo)插入貪吃蛇元組,然后刪掉尾部一節(jié)(注意,刪除尾部我們放在了另外一個(gè)函數(shù)里做)。

  •  1#移動(dòng)貪吃蛇
     2def?move_snake(direction,?snake_coords):
     3????if?direction?==?UP:
     4????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?-?1}
     5????elif?direction?==?DOWN:
     6????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?+?1}
     7????elif?direction?==?LEFT:
     8????????newHead?=?{'x':?snake_coords[HEAD]['x']?-?1,?'y':?snake_coords[HEAD]['y']}
     9????elif?direction?==?RIGHT:
    10????????newHead?=?{'x':?snake_coords[HEAD]['x']?+?1,?'y':?snake_coords[HEAD]['y']}
    11????snake_coords.insert(0,?newHead)
    
  • 開始階段
    先把貪吃蛇和食物的坐標(biāo)隨機(jī)生成,貪吃蛇一開始3節(jié)長(zhǎng),先設(shè)置向右移動(dòng)。

  • 移動(dòng)我們的貪吃蛇
    監(jiān)聽鍵盤,用戶按下鍵盤只是改變direction的值,再用move_snake(direction, snake_coords)函數(shù)更新貪吃蛇坐標(biāo)。如果不按,那direction值一直不變,貪吃蛇就一直向前走。

  • 相關(guān)判斷
    要判斷貪吃蛇是否掛了,表現(xiàn)為:

    • 頭坐標(biāo)超出地圖范圍
    • 頭坐標(biāo)等于身體某節(jié)坐標(biāo)
     1????#判斷蛇死了沒(méi)
     2def?snake_is_alive(snake_coords):
     3????tag?=?True
     4????if?snake_coords[HEAD]['x']?==?-1?or?snake_coords[HEAD]['x']?==?map_width?or?snake_coords[HEAD]['y']?==?-1?or?\
     5????????????snake_coords[HEAD]['y']?==?map_height:
     6????????tag?=?False?#?蛇碰壁啦
     7????for?snake_body?in?snake_coords[1:]:
     8????????if?snake_body['x']?==?snake_coords[HEAD]['x']?and?snake_body['y']?==?snake_coords[HEAD]['y']:
     9????????????tag?=?False?#?蛇碰到自己身體啦
    10????return?tag
    

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

    • 頭坐標(biāo)等于食物坐標(biāo),那么吃到食物。這時(shí)候注意,我們就不用刪尾部一節(jié)了,因?yàn)槌缘绞澄镒冮L(zhǎng)了嘛。
    • 如果沒(méi)有吃到食物,那么是正常移動(dòng),刪掉尾部一節(jié)坐標(biāo)。
    1????#判斷貪吃蛇是否吃到食物
    2def?snake_is_eat_food(snake_coords,?food):??#如果是列表或字典,那么函數(shù)內(nèi)修改參數(shù)內(nèi)容,就會(huì)影響到函數(shù)體外的對(duì)象。
    3????if?snake_coords[HEAD]['x']?==?food['x']?and?snake_coords[HEAD]['y']?==?food['y']:
    4????????food['x']?=?random.randint(0,?map_width?-?1)
    5????????food['y']?=?random.randint(0,?map_height?-?1)?#?實(shí)物位置重新設(shè)置
    6????else:
    7????????del?snake_coords[-1]??#?如果沒(méi)有吃到實(shí)物,?就向前移動(dòng),?那么尾部一格刪掉
    
  • 畫出我們的游戲
    最后調(diào)用相關(guān)函數(shù),講我們的地圖,貪吃蛇,食物等等統(tǒng)統(tǒng)畫出來(lái)。

05 draw_snake-畫出我們的貪吃蛇

直接看代碼:

1def?draw_snake(screen,?snake_coords):
2????for?coord?in?snake_coords:
3????????x?=?coord['x']?*?cell_size
4????????y?=?coord['y']?*?cell_size
5????????wormSegmentRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
6????????pygame.draw.rect(screen,?dark_blue,?wormSegmentRect)
7????????wormInnerSegmentRect?=?pygame.Rect(????????????????#蛇身子里面的第二層亮藍(lán)色色
8????????????x?+?4,?y?+?4,?cell_size?-?8,?cell_size?-?8)
9????????pygame.draw.rect(screen,?blue,?wormInnerSegmentRect)

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

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

06 draw_food-畫出我們的食物
1#將食物畫出來(lái)
2def?draw_food(screen,?food):
3????x?=?food['x']?*?cell_size
4????y?=?food['y']?*?cell_size
5????appleRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
6????pygame.draw.rect(screen,?Red,?appleRect)

更簡(jiǎn)單的代碼了,獲取位置,畫矩形。

07 draw_score-畫出我們的成績(jī)
1#畫成績(jī)
2def?draw_score(screen,score):
3????font?=?pygame.font.Font('myfont.ttf',?30)
4????scoreSurf?=?font.render('得分:?%s'?%?score,?True,?Green)
5????scoreRect?=?scoreSurf.get_rect()
6????scoreRect.topleft?=?(windows_width?-?120,?10)
7????screen.blit(scoreSurf,?scoreRect)

畫成績(jī)也比較簡(jiǎn)單。獲得Font對(duì)象以后,render寫字,最后設(shè)置位置,在屏幕上blit出來(lái)。

08 完整代碼

整個(gè)程序大體如上,其他細(xì)枝末節(jié)直接看源代碼吧。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-854346.html

  1##?導(dǎo)入相關(guān)模塊
  2import?random
  3import?pygame
  4import?sys
  5
  6from?pygame.locals?import?*
  7
  8
  9snake_speed?=?15?#貪吃蛇的速度
 10windows_width?=?800
 11windows_height?=?600?#游戲窗口的大小
 12cell_size?=?20???????#貪吃蛇身體方塊大小,注意身體大小必須能被窗口長(zhǎng)寬整除
 13
 14'''?#初始化區(qū)
 15由于我們的貪吃蛇是有大小尺寸的,?因此地圖的實(shí)際尺寸是相對(duì)于貪吃蛇的大小尺寸而言的
 16'''
 17map_width?=?int(windows_width?/?cell_size)
 18map_height?=?int(windows_height?/?cell_size)
 19
 20#?顏色定義
 21white?=?(255,?255,?255)
 22black?=?(0,?0,?0)
 23gray?=?(230,?230,?230)
 24dark_gray?=?(40,?40,?40)
 25DARKGreen?=?(0,?155,?0)
 26Green?=?(0,?255,?0)
 27Red?=?(255,?0,?0)
 28blue?=?(0,?0,?255)
 29dark_blue?=(0,0,?139)
 30
 31
 32BG_COLOR?=?black?#游戲背景顏色
 33
 34#?定義方向
 35UP?=?1
 36DOWN?=?2
 37LEFT?=?3
 38RIGHT?=?4
 39
 40HEAD?=?0?#貪吃蛇頭部下標(biāo)
 41
 42#主函數(shù)
 43def?main():
 44????pygame.init()?#?模塊初始化
 45????snake_speed_clock?=?pygame.time.Clock()?#?創(chuàng)建Pygame時(shí)鐘對(duì)象
 46????screen?=?pygame.display.set_mode((windows_width,?windows_height))?#
 47????screen.fill(white)
 48
 49????pygame.display.set_caption("Python?貪吃蛇小游戲")?#設(shè)置標(biāo)題
 50????show_start_info(screen)???????????????#歡迎信息
 51????while?True:
 52????????running_game(screen,?snake_speed_clock)
 53????????show_gameover_info(screen)
 54
 55
 56#游戲運(yùn)行主體
 57def?running_game(screen,snake_speed_clock):
 58????startx?=?random.randint(3,?map_width?-?8)?#開始位置
 59????starty?=?random.randint(3,?map_height?-?8)
 60????snake_coords?=?[{'x':?startx,?'y':?starty},??#初始貪吃蛇
 61??????????????????{'x':?startx?-?1,?'y':?starty},
 62??????????????????{'x':?startx?-?2,?'y':?starty}]
 63
 64????direction?=?RIGHT???????#??開始時(shí)向右移動(dòng)
 65
 66????food?=?get_random_location()?????#實(shí)物隨機(jī)位置
 67
 68????while?True:
 69????????for?event?in?pygame.event.get():
 70????????????if?event.type?==?QUIT:
 71????????????????terminate()
 72????????????elif?event.type?==?KEYDOWN:
 73????????????????if?(event.key?==?K_LEFT?or?event.key?==?K_a)?and?direction?!=?RIGHT:
 74????????????????????direction?=?LEFT
 75????????????????elif?(event.key?==?K_RIGHT?or?event.key?==?K_d)?and?direction?!=?LEFT:
 76????????????????????direction?=?RIGHT
 77????????????????elif?(event.key?==?K_UP?or?event.key?==?K_w)?and?direction?!=?DOWN:
 78????????????????????direction?=?UP
 79????????????????elif?(event.key?==?K_DOWN?or?event.key?==?K_s)?and?direction?!=?UP:
 80????????????????????direction?=?DOWN
 81????????????????elif?event.key?==?K_ESCAPE:
 82????????????????????terminate()
 83
 84????????move_snake(direction,?snake_coords)?#移動(dòng)蛇
 85
 86????????ret?=?snake_is_alive(snake_coords)
 87????????if?not?ret:
 88????????????break?#蛇跪了.?游戲結(jié)束
 89????????snake_is_eat_food(snake_coords,?food)?#判斷蛇是否吃到食物
 90
 91????????screen.fill(BG_COLOR)
 92????????#draw_grid(screen)
 93????????draw_snake(screen,?snake_coords)
 94????????draw_food(screen,?food)
 95????????draw_score(screen,?len(snake_coords)?-?3)
 96????????pygame.display.update()
 97????????snake_speed_clock.tick(snake_speed)?#控制fps
 98#將食物畫出來(lái)
 99def?draw_food(screen,?food):
100????x?=?food['x']?*?cell_size
101????y?=?food['y']?*?cell_size
102????appleRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
103????pygame.draw.rect(screen,?Red,?appleRect)
104#將貪吃蛇畫出來(lái)
105def?draw_snake(screen,?snake_coords):
106????for?coord?in?snake_coords:
107????????x?=?coord['x']?*?cell_size
108????????y?=?coord['y']?*?cell_size
109????????wormSegmentRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
110????????pygame.draw.rect(screen,?dark_blue,?wormSegmentRect)
111????????wormInnerSegmentRect?=?pygame.Rect(????????????????#蛇身子里面的第二層亮綠色
112????????????x?+?4,?y?+?4,?cell_size?-?8,?cell_size?-?8)
113????????pygame.draw.rect(screen,?blue,?wormInnerSegmentRect)
114#畫網(wǎng)格(可選)
115def?draw_grid(screen):
116????for?x?in?range(0,?windows_width,?cell_size):??#?draw?水平?lines
117????????pygame.draw.line(screen,?dark_gray,?(x,?0),?(x,?windows_height))
118????for?y?in?range(0,?windows_height,?cell_size):??#?draw?垂直?lines
119????????pygame.draw.line(screen,?dark_gray,?(0,?y),?(windows_width,?y))
120#移動(dòng)貪吃蛇
121def?move_snake(direction,?snake_coords):
122????if?direction?==?UP:
123????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?-?1}
124????elif?direction?==?DOWN:
125????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?+?1}
126????elif?direction?==?LEFT:
127????????newHead?=?{'x':?snake_coords[HEAD]['x']?-?1,?'y':?snake_coords[HEAD]['y']}
128????elif?direction?==?RIGHT:
129????????newHead?=?{'x':?snake_coords[HEAD]['x']?+?1,?'y':?snake_coords[HEAD]['y']}
130
131????snake_coords.insert(0,?newHead)
132#判斷蛇死了沒(méi)
133def?snake_is_alive(snake_coords):
134????tag?=?True
135????if?snake_coords[HEAD]['x']?==?-1?or?snake_coords[HEAD]['x']?==?map_width?or?snake_coords[HEAD]['y']?==?-1?or?\
136????????????snake_coords[HEAD]['y']?==?map_height:
137????????tag?=?False?#?蛇碰壁啦
138????for?snake_body?in?snake_coords[1:]:
139????????if?snake_body['x']?==?snake_coords[HEAD]['x']?and?snake_body['y']?==?snake_coords[HEAD]['y']:
140????????????tag?=?False?#?蛇碰到自己身體啦
141????return?tag
142#判斷貪吃蛇是否吃到食物
143def?snake_is_eat_food(snake_coords,?food):??#如果是列表或字典,那么函數(shù)內(nèi)修改參數(shù)內(nèi)容,就會(huì)影響到函數(shù)體外的對(duì)象。
144????if?snake_coords[HEAD]['x']?==?food['x']?and?snake_coords[HEAD]['y']?==?food['y']:
145????????food['x']?=?random.randint(0,?map_width?-?1)
146????????food['y']?=?random.randint(0,?map_height?-?1)?#?實(shí)物位置重新設(shè)置
147????else:
148????????del?snake_coords[-1]??#?如果沒(méi)有吃到實(shí)物,?就向前移動(dòng),?那么尾部一格刪掉
149#食物隨機(jī)生成
150def?get_random_location():
151????return?{'x':?random.randint(0,?map_width?-?1),?'y':?random.randint(0,?map_height?-?1)}
152#開始信息顯示
153def?show_start_info(screen):
154????font?=?pygame.font.Font('myfont.ttf',?40)
155????tip?=?font.render('按任意鍵開始游戲~~~',?True,?(65,?105,?225))
156????gamestart?=?pygame.image.load('gamestart.png')
157????screen.blit(gamestart,?(140,?30))
158????screen.blit(tip,?(240,?550))
159????pygame.display.update()
160
161????while?True:??#鍵盤監(jiān)聽事件
162????????for?event?in?pygame.event.get():??#?event?handling?loop
163????????????if?event.type?==?QUIT:
164????????????????terminate()?????#終止程序
165????????????elif?event.type?==?KEYDOWN:
166????????????????if?(event.key?==?K_ESCAPE):??#終止程序
167????????????????????terminate()?#終止程序
168????????????????else:
169????????????????????return?#結(jié)束此函數(shù),?開始游戲
170#游戲結(jié)束信息顯示
171def?show_gameover_info(screen):
172????font?=?pygame.font.Font('myfont.ttf',?40)
173????tip?=?font.render('按Q或者ESC退出游戲,?按任意鍵重新開始游戲~',?True,?(65,?105,?225))
174????gamestart?=?pygame.image.load('gameover.png')
175????screen.blit(gamestart,?(60,?0))
176????screen.blit(tip,?(80,?300))
177????pygame.display.update()
178
179????while?True:??#鍵盤監(jiān)聽事件
180????????for?event?in?pygame.event.get():??#?event?handling?loop
181????????????if?event.type?==?QUIT:
182????????????????terminate()?????#終止程序
183????????????elif?event.type?==?KEYDOWN:
184????????????????if?event.key?==?K_ESCAPE?or?event.key?==?K_q:??#終止程序
185????????????????????terminate()?#終止程序
186????????????????else:
187????????????????????return?#結(jié)束此函數(shù),?重新開始游戲
188#畫成績(jī)
189def?draw_score(screen,score):
190????font?=?pygame.font.Font('myfont.ttf',?30)
191????scoreSurf?=?font.render('得分:?%s'?%?score,?True,?Green)
192????scoreRect?=?scoreSurf.get_rect()
193????scoreRect.topleft?=?(windows_width?-?120,?10)
194????screen.blit(scoreSurf,?scoreRect)
195#程序終止
196def?terminate():
197????pygame.quit()
198????sys.exit()
199
200
201main()

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

01 整體框架

平臺(tái):pycharm

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

整個(gè)程序由于是調(diào)用了大量的pygame里面的庫(kù)函數(shù),所以也非常簡(jiǎn)單(臥槽你這不是調(diào)包俠嘛)。也就200多行代碼?;谡w怎么設(shè)計(jì)的呢?看下面的圖:

想要學(xué)習(xí)Python?Python學(xué)習(xí)交流群:1136201545滿足你的需求,資料都已經(jīng)上傳群文件,可以自行下載!

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

由于程序沒(méi)有多么復(fù)雜,就直接用面向過(guò)程的思路寫了。畢竟這么小的程序沒(méi)必要整一大堆class來(lái)為難自己對(duì)吧。

程序整體代碼框架:

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

pycharm里面一堆波浪線也是很無(wú)奈。

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

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

 1#主函數(shù)
 2def?main():
 3????pygame.init()?#?模塊初始化
 4????snake_speed_clock?=?pygame.time.Clock()?#?創(chuàng)建Pygame時(shí)鐘對(duì)象
 5????screen?=?pygame.display.set_mode((windows_width,?windows_height))?#
 6????screen.fill(white)
 7
 8????pygame.display.set_caption("Python?貪吃蛇小游戲")?#設(shè)置標(biāo)題
 9????show_start_info(screen)???????????????#歡迎信息
10????while?True:
11????????running_game(screen,?snake_speed_clock)
12????????show_gameover_info(screen)

基于以上代碼,咱們來(lái)做幾點(diǎn)講解:

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

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

    傳入clock.tick()的數(shù)不是一個(gè)毫秒數(shù)。這是每秒內(nèi)循環(huán)要運(yùn)行的次數(shù),所以這個(gè)循環(huán)應(yīng)當(dāng)每秒運(yùn)行60次,在這里我只是說(shuō)應(yīng)當(dāng)運(yùn)行,因?yàn)檠h(huán)只能按計(jì)算機(jī)能夠保證的速度運(yùn)行,每秒60個(gè)循環(huán)(或幀)時(shí),每個(gè)循環(huán)需要1000/60=16.66ms(大約17ms)如果循環(huán)中的代碼運(yùn)行時(shí)間超過(guò)17ms,在clock指出下一次循環(huán)時(shí)當(dāng)前循環(huán)將無(wú)法完成。

    再說(shuō)通俗一點(diǎn),就是我們游戲的fps嘛。每秒多少幀這樣。至于后面在哪clock.tick(),下面會(huì)講。
    詳細(xì)可參考這篇文章: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)。返回的是一個(gè)surface對(duì)象(surface對(duì)象是用于表示圖像的圖像,只要指定尺寸,就可以利用),resolution可以控制生成windows窗口的大小,flags代表的是擴(kuò)展選項(xiàng),depath不推薦設(shè)置。

    flags標(biāo)志位控制你想要什么樣的顯示屏,主要有下面幾個(gè),這幾個(gè)量相當(dāng)于是全局的常量,使用的時(shí)候可以from pygame.locals import *導(dǎo)入:

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

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

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

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

當(dāng)然,怎么實(shí)現(xiàn),待會(huì)說(shuō)。

接著死循環(huán)。因?yàn)槲覀兊挠螒蛟O(shè)置是,當(dāng)GameOver以后,我們可以按任意鍵重新開始游戲,或者退出。因此最后不斷循環(huán)判斷用戶是否想重新開始游戲,就這樣而已。

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

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

    python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能怎么實(shí)現(xiàn),下面說(shuō)。
03 show_start_info()歡迎進(jìn)入游戲

先貼代碼,待會(huì)講解。

 1#開始信息顯示
 2def show_start_info(screen):
 3    font = pygame.font.Font('myfont.ttf', 40)
 4    tip = font.render('按任意鍵開始游戲~~~', True, (65, 105, 225))
 5    gamestart = pygame.image.load('gamestart.png')
 6    screen.blit(gamestart, (140, 30))
 7    screen.blit(tip, (240, 550))
 8    pygame.display.update()
 9
10    while True:  #鍵盤監(jiān)聽事件
11        for event in pygame.event.get():  # event handling loop
12            if event.type == QUIT:
13                terminate()     #終止程序
14            elif event.type == KEYDOWN:
15                if (event.key == K_ESCAPE):  #終止程序
16                    terminate() #終止程序
17                else:
18                    return #結(jié)束此函數(shù), 開始游戲
  • 字體顯示
    先創(chuàng)建一個(gè)Font對(duì)象,用自己的字體。有了Font對(duì)象以后, 就可以用render方法來(lái)寫字了,然后通過(guò)blit方法blit到屏幕上。
  • 圖像加載
    用 pygame.image.load()加載圖像獲得對(duì)象,在用blit方法刷到屏幕上。做完以上事件以后,記得要update一下刷新一下屏幕。
  • 監(jiān)聽鍵盤
    按任意鍵繼續(xù)或者ESC退出……
04 running_game-讓我們開始游戲吧

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

 1#游戲運(yùn)行主體
 2def running_game(screen,snake_speed_clock):
 3    startx = random.randint(3, map_width - 8) #開始位置
 4    starty = random.randint(3, map_height - 8)
 5    snake_coords = [{'x': startx, 'y': starty},  #初始貪吃蛇
 6                  {'x': startx - 1, 'y': starty},
 7                  {'x': startx - 2, 'y': starty}]
 8
 9    direction = RIGHT       #  開始時(shí)向右移動(dòng)
10
11    food = get_random_location()     #實(shí)物隨機(jī)位置
12
13    while True:
14        for event in pygame.event.get():
15            if event.type == QUIT:
16                terminate()
17            elif event.type == KEYDOWN:
18                if (event.key == K_LEFT or event.key == K_a) and direction != RIGHT:
19                    direction = LEFT
20                elif (event.key == K_RIGHT or event.key == K_d) and direction != LEFT:
21                    direction = RIGHT
22                elif (event.key == K_UP or event.key == K_w) and direction != DOWN:
23                    direction = UP
24                elif (event.key == K_DOWN or event.key == K_s) and direction != UP:
25                    direction = DOWN
26                elif event.key == K_ESCAPE:
27                    terminate()
28
29        move_snake(direction, snake_coords) #移動(dòng)蛇
30
31        ret = snake_is_alive(snake_coords)
32        if not ret:
33            break #蛇跪了. 游戲結(jié)束
34        snake_is_eat_food(snake_coords, food) #判斷蛇是否吃到食物
35
36        screen.fill(BG_COLOR)
37        #draw_grid(screen)
38        draw_snake(screen, snake_coords)
39        draw_food(screen, food)
40        draw_score(screen, len(snake_coords) - 3)
41        pygame.display.update()
42        snake_speed_clock.tick(snake_speed) #控制fps
  • 關(guān)于貪吃蛇
    這里我們采用一個(gè)元組存儲(chǔ)貪吃蛇身體各個(gè)部分的坐標(biāo)(一條貪吃蛇不是由很多節(jié)組成的嘛)。最后再寫個(gè)方法根據(jù)元組坐標(biāo)把貪吃蛇畫出來(lái)就行。

  • 關(guān)于食物
    同樣做法。存坐標(biāo),最后畫出來(lái)。

  • 關(guān)于移動(dòng)
    監(jiān)聽鍵盤,根據(jù)用戶按鍵,用direction變量記錄移動(dòng)方向。然后更新貪吃蛇元組里面的坐標(biāo)(其實(shí)每次移動(dòng)只用更新頭尾就行)。最后統(tǒng)一畫出來(lái)。移動(dòng)做法具體是,我們把每次頭部移動(dòng)的新坐標(biāo)插入貪吃蛇元組,然后刪掉尾部一節(jié)(注意,刪除尾部我們放在了另外一個(gè)函數(shù)里做)。

  •  1#移動(dòng)貪吃蛇
     2def?move_snake(direction,?snake_coords):
     3????if?direction?==?UP:
     4????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?-?1}
     5????elif?direction?==?DOWN:
     6????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?+?1}
     7????elif?direction?==?LEFT:
     8????????newHead?=?{'x':?snake_coords[HEAD]['x']?-?1,?'y':?snake_coords[HEAD]['y']}
     9????elif?direction?==?RIGHT:
    10????????newHead?=?{'x':?snake_coords[HEAD]['x']?+?1,?'y':?snake_coords[HEAD]['y']}
    11????snake_coords.insert(0,?newHead)
    
  • 開始階段
    先把貪吃蛇和食物的坐標(biāo)隨機(jī)生成,貪吃蛇一開始3節(jié)長(zhǎng),先設(shè)置向右移動(dòng)。

  • 移動(dòng)我們的貪吃蛇
    監(jiān)聽鍵盤,用戶按下鍵盤只是改變direction的值,再用move_snake(direction, snake_coords)函數(shù)更新貪吃蛇坐標(biāo)。如果不按,那direction值一直不變,貪吃蛇就一直向前走。

  • 相關(guān)判斷
    要判斷貪吃蛇是否掛了,表現(xiàn)為:

    • 頭坐標(biāo)超出地圖范圍
    • 頭坐標(biāo)等于身體某節(jié)坐標(biāo)
     1????#判斷蛇死了沒(méi)
     2def?snake_is_alive(snake_coords):
     3????tag?=?True
     4????if?snake_coords[HEAD]['x']?==?-1?or?snake_coords[HEAD]['x']?==?map_width?or?snake_coords[HEAD]['y']?==?-1?or?\
     5????????????snake_coords[HEAD]['y']?==?map_height:
     6????????tag?=?False?#?蛇碰壁啦
     7????for?snake_body?in?snake_coords[1:]:
     8????????if?snake_body['x']?==?snake_coords[HEAD]['x']?and?snake_body['y']?==?snake_coords[HEAD]['y']:
     9????????????tag?=?False?#?蛇碰到自己身體啦
    10????return?tag
    

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

    • 頭坐標(biāo)等于食物坐標(biāo),那么吃到食物。這時(shí)候注意,我們就不用刪尾部一節(jié)了,因?yàn)槌缘绞澄镒冮L(zhǎng)了嘛。
    • 如果沒(méi)有吃到食物,那么是正常移動(dòng),刪掉尾部一節(jié)坐標(biāo)。
    1????#判斷貪吃蛇是否吃到食物
    2def?snake_is_eat_food(snake_coords,?food):??#如果是列表或字典,那么函數(shù)內(nèi)修改參數(shù)內(nèi)容,就會(huì)影響到函數(shù)體外的對(duì)象。
    3????if?snake_coords[HEAD]['x']?==?food['x']?and?snake_coords[HEAD]['y']?==?food['y']:
    4????????food['x']?=?random.randint(0,?map_width?-?1)
    5????????food['y']?=?random.randint(0,?map_height?-?1)?#?實(shí)物位置重新設(shè)置
    6????else:
    7????????del?snake_coords[-1]??#?如果沒(méi)有吃到實(shí)物,?就向前移動(dòng),?那么尾部一格刪掉
    
  • 畫出我們的游戲
    最后調(diào)用相關(guān)函數(shù),講我們的地圖,貪吃蛇,食物等等統(tǒng)統(tǒng)畫出來(lái)。

05 draw_snake-畫出我們的貪吃蛇

直接看代碼:

1def?draw_snake(screen,?snake_coords):
2????for?coord?in?snake_coords:
3????????x?=?coord['x']?*?cell_size
4????????y?=?coord['y']?*?cell_size
5????????wormSegmentRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
6????????pygame.draw.rect(screen,?dark_blue,?wormSegmentRect)
7????????wormInnerSegmentRect?=?pygame.Rect(????????????????#蛇身子里面的第二層亮藍(lán)色色
8????????????x?+?4,?y?+?4,?cell_size?-?8,?cell_size?-?8)
9????????pygame.draw.rect(screen,?blue,?wormInnerSegmentRect)

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

python貪吃蛇游戲代碼詳解外加中文,pygame,python,人工智能

06 draw_food-畫出我們的食物
1#將食物畫出來(lái)
2def?draw_food(screen,?food):
3????x?=?food['x']?*?cell_size
4????y?=?food['y']?*?cell_size
5????appleRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
6????pygame.draw.rect(screen,?Red,?appleRect)

更簡(jiǎn)單的代碼了,獲取位置,畫矩形。

07 draw_score-畫出我們的成績(jī)
1#畫成績(jī)
2def?draw_score(screen,score):
3????font?=?pygame.font.Font('myfont.ttf',?30)
4????scoreSurf?=?font.render('得分:?%s'?%?score,?True,?Green)
5????scoreRect?=?scoreSurf.get_rect()
6????scoreRect.topleft?=?(windows_width?-?120,?10)
7????screen.blit(scoreSurf,?scoreRect)

畫成績(jī)也比較簡(jiǎn)單。獲得Font對(duì)象以后,render寫字,最后設(shè)置位置,在屏幕上blit出來(lái)。

08 完整代碼

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

  1##?導(dǎo)入相關(guān)模塊
  2import?random
  3import?pygame
  4import?sys
  5
  6from?pygame.locals?import?*
  7
  8
  9snake_speed?=?15?#貪吃蛇的速度
 10windows_width?=?800
 11windows_height?=?600?#游戲窗口的大小
 12cell_size?=?20???????#貪吃蛇身體方塊大小,注意身體大小必須能被窗口長(zhǎng)寬整除
 13
 14'''?#初始化區(qū)
 15由于我們的貪吃蛇是有大小尺寸的,?因此地圖的實(shí)際尺寸是相對(duì)于貪吃蛇的大小尺寸而言的
 16'''
 17map_width?=?int(windows_width?/?cell_size)
 18map_height?=?int(windows_height?/?cell_size)
 19
 20#?顏色定義
 21white?=?(255,?255,?255)
 22black?=?(0,?0,?0)
 23gray?=?(230,?230,?230)
 24dark_gray?=?(40,?40,?40)
 25DARKGreen?=?(0,?155,?0)
 26Green?=?(0,?255,?0)
 27Red?=?(255,?0,?0)
 28blue?=?(0,?0,?255)
 29dark_blue?=(0,0,?139)
 30
 31
 32BG_COLOR?=?black?#游戲背景顏色
 33
 34#?定義方向
 35UP?=?1
 36DOWN?=?2
 37LEFT?=?3
 38RIGHT?=?4
 39
 40HEAD?=?0?#貪吃蛇頭部下標(biāo)
 41
 42#主函數(shù)
 43def?main():
 44????pygame.init()?#?模塊初始化
 45????snake_speed_clock?=?pygame.time.Clock()?#?創(chuàng)建Pygame時(shí)鐘對(duì)象
 46????screen?=?pygame.display.set_mode((windows_width,?windows_height))?#
 47????screen.fill(white)
 48
 49????pygame.display.set_caption("Python?貪吃蛇小游戲")?#設(shè)置標(biāo)題
 50????show_start_info(screen)???????????????#歡迎信息
 51????while?True:
 52????????running_game(screen,?snake_speed_clock)
 53????????show_gameover_info(screen)
 54
 55
 56#游戲運(yùn)行主體
 57def?running_game(screen,snake_speed_clock):
 58????startx?=?random.randint(3,?map_width?-?8)?#開始位置
 59????starty?=?random.randint(3,?map_height?-?8)
 60????snake_coords?=?[{'x':?startx,?'y':?starty},??#初始貪吃蛇
 61??????????????????{'x':?startx?-?1,?'y':?starty},
 62??????????????????{'x':?startx?-?2,?'y':?starty}]
 63
 64????direction?=?RIGHT???????#??開始時(shí)向右移動(dòng)
 65
 66????food?=?get_random_location()?????#實(shí)物隨機(jī)位置
 67
 68????while?True:
 69????????for?event?in?pygame.event.get():
 70????????????if?event.type?==?QUIT:
 71????????????????terminate()
 72????????????elif?event.type?==?KEYDOWN:
 73????????????????if?(event.key?==?K_LEFT?or?event.key?==?K_a)?and?direction?!=?RIGHT:
 74????????????????????direction?=?LEFT
 75????????????????elif?(event.key?==?K_RIGHT?or?event.key?==?K_d)?and?direction?!=?LEFT:
 76????????????????????direction?=?RIGHT
 77????????????????elif?(event.key?==?K_UP?or?event.key?==?K_w)?and?direction?!=?DOWN:
 78????????????????????direction?=?UP
 79????????????????elif?(event.key?==?K_DOWN?or?event.key?==?K_s)?and?direction?!=?UP:
 80????????????????????direction?=?DOWN
 81????????????????elif?event.key?==?K_ESCAPE:
 82????????????????????terminate()
 83
 84????????move_snake(direction,?snake_coords)?#移動(dòng)蛇
 85
 86????????ret?=?snake_is_alive(snake_coords)
 87????????if?not?ret:
 88????????????break?#蛇跪了.?游戲結(jié)束
 89????????snake_is_eat_food(snake_coords,?food)?#判斷蛇是否吃到食物
 90
 91????????screen.fill(BG_COLOR)
 92????????#draw_grid(screen)
 93????????draw_snake(screen,?snake_coords)
 94????????draw_food(screen,?food)
 95????????draw_score(screen,?len(snake_coords)?-?3)
 96????????pygame.display.update()
 97????????snake_speed_clock.tick(snake_speed)?#控制fps
 98#將食物畫出來(lái)
 99def?draw_food(screen,?food):
100????x?=?food['x']?*?cell_size
101????y?=?food['y']?*?cell_size
102????appleRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
103????pygame.draw.rect(screen,?Red,?appleRect)
104#將貪吃蛇畫出來(lái)
105def?draw_snake(screen,?snake_coords):
106????for?coord?in?snake_coords:
107????????x?=?coord['x']?*?cell_size
108????????y?=?coord['y']?*?cell_size
109????????wormSegmentRect?=?pygame.Rect(x,?y,?cell_size,?cell_size)
110????????pygame.draw.rect(screen,?dark_blue,?wormSegmentRect)
111????????wormInnerSegmentRect?=?pygame.Rect(????????????????#蛇身子里面的第二層亮綠色
112????????????x?+?4,?y?+?4,?cell_size?-?8,?cell_size?-?8)
113????????pygame.draw.rect(screen,?blue,?wormInnerSegmentRect)
114#畫網(wǎng)格(可選)
115def?draw_grid(screen):
116????for?x?in?range(0,?windows_width,?cell_size):??#?draw?水平?lines
117????????pygame.draw.line(screen,?dark_gray,?(x,?0),?(x,?windows_height))
118????for?y?in?range(0,?windows_height,?cell_size):??#?draw?垂直?lines
119????????pygame.draw.line(screen,?dark_gray,?(0,?y),?(windows_width,?y))
120#移動(dòng)貪吃蛇
121def?move_snake(direction,?snake_coords):
122????if?direction?==?UP:
123????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?-?1}
124????elif?direction?==?DOWN:
125????????newHead?=?{'x':?snake_coords[HEAD]['x'],?'y':?snake_coords[HEAD]['y']?+?1}
126????elif?direction?==?LEFT:
127????????newHead?=?{'x':?snake_coords[HEAD]['x']?-?1,?'y':?snake_coords[HEAD]['y']}
128????elif?direction?==?RIGHT:
129????????newHead?=?{'x':?snake_coords[HEAD]['x']?+?1,?'y':?snake_coords[HEAD]['y']}
130
131????snake_coords.insert(0,?newHead)
132#判斷蛇死了沒(méi)
133def?snake_is_alive(snake_coords):
134????tag?=?True
135????if?snake_coords[HEAD]['x']?==?-1?or?snake_coords[HEAD]['x']?==?map_width?or?snake_coords[HEAD]['y']?==?-1?or?\
136????????????snake_coords[HEAD]['y']?==?map_height:
137????????tag?=?False?#?蛇碰壁啦
138????for?snake_body?in?snake_coords[1:]:
139????????if?snake_body['x']?==?snake_coords[HEAD]['x']?and?snake_body['y']?==?snake_coords[HEAD]['y']:
140????????????tag?=?False?#?蛇碰到自己身體啦
141????return?tag
142#判斷貪吃蛇是否吃到食物
143def?snake_is_eat_food(snake_coords,?food):??#如果是列表或字典,那么函數(shù)內(nèi)修改參數(shù)內(nèi)容,就會(huì)影響到函數(shù)體外的對(duì)象。
144????if?snake_coords[HEAD]['x']?==?food['x']?and?snake_coords[HEAD]['y']?==?food['y']:
145????????food['x']?=?random.randint(0,?map_width?-?1)
146????????food['y']?=?random.randint(0,?map_height?-?1)?#?實(shí)物位置重新設(shè)置
147????else:
148????????del?snake_coords[-1]??#?如果沒(méi)有吃到實(shí)物,?就向前移動(dòng),?那么尾部一格刪掉
149#食物隨機(jī)生成
150def?get_random_location():
151????return?{'x':?random.randint(0,?map_width?-?1),?'y':?random.randint(0,?map_height?-?1)}
152#開始信息顯示
153def?show_start_info(screen):
154????font?=?pygame.font.Font('myfont.ttf',?40)
155????tip?=?font.render('按任意鍵開始游戲~~~',?True,?(65,?105,?225))
156????gamestart?=?pygame.image.load('gamestart.png')
157????screen.blit(gamestart,?(140,?30))
158????screen.blit(tip,?(240,?550))
159????pygame.display.update()
160
161????while?True:??#鍵盤監(jiān)聽事件
162????????for?event?in?pygame.event.get():??#?event?handling?loop
163????????????if?event.type?==?QUIT:
164????????????????terminate()?????#終止程序
165????????????elif?event.type?==?KEYDOWN:
166????????????????if?(event.key?==?K_ESCAPE):??#終止程序
167????????????????????terminate()?#終止程序
168????????????????else:
169????????????????????return?#結(jié)束此函數(shù),?開始游戲
170#游戲結(jié)束信息顯示
171def?show_gameover_info(screen):
172????font?=?pygame.font.Font('myfont.ttf',?40)
173????tip?=?font.render('按Q或者ESC退出游戲,?按任意鍵重新開始游戲~',?True,?(65,?105,?225))
174????gamestart?=?pygame.image.load('gameover.png')
175????screen.blit(gamestart,?(60,?0))
176????screen.blit(tip,?(80,?300))
177????pygame.display.update()
178
179????while?True:??#鍵盤監(jiān)聽事件
180????????for?event?in?pygame.event.get():??#?event?handling?loop
181????????????if?event.type?==?QUIT:
182????????????????terminate()?????#終止程序
183????????????elif?event.type?==?KEYDOWN:
184????????????????if?event.key?==?K_ESCAPE?or?event.key?==?K_q:??#終止程序
185????????????????????terminate()?#終止程序
186????????????????else:
187????????????????????return?#結(jié)束此函數(shù),?重新開始游戲
188#畫成績(jī)
189def?draw_score(screen,score):
190????font?=?pygame.font.Font('myfont.ttf',?30)
191????scoreSurf?=?font.render('得分:?%s'?%?score,?True,?Green)
192????scoreRect?=?scoreSurf.get_rect()
193????scoreRect.topleft?=?(windows_width?-?120,?10)
194????screen.blit(scoreSurf,?scoreRect)
195#程序終止
196def?terminate():
197????pygame.quit()
198????sys.exit()
199
200
201main()

到了這里,關(guān)于python貪吃蛇游戲代碼詳解,python貪吃蛇最簡(jiǎn)單代碼的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • wasm+pygbag讓你在網(wǎng)頁(yè)上也能運(yùn)行Python代碼:【貪吃蛇游戲】

    wasm+pygbag讓你在網(wǎng)頁(yè)上也能運(yùn)行Python代碼:【貪吃蛇游戲】

    最近小伙伴告訴我一種新的方法,可以使用wasm來(lái)使瀏覽器網(wǎng)頁(yè)能夠運(yùn)行Python代碼。這一下子激起了我的興趣,因?yàn)檫@意味著用戶無(wú)需安裝Python環(huán)境就能直接運(yùn)行我的demo,這真是太方便了。所以,我們的主要目標(biāo)今天就是讓網(wǎng)頁(yè)能夠直接運(yùn)行我的貪吃蛇游戲。貪吃蛇游戲其實(shí)

    2024年02月03日
    瀏覽(23)
  • python超簡(jiǎn)單小游戲代碼,python最簡(jiǎn)單游戲代碼

    python超簡(jiǎn)單小游戲代碼,python最簡(jiǎn)單游戲代碼

    這篇文章主要介紹了python游戲編程入門游戲代碼,具有一定借鑒價(jià)值,需要的朋友可以參考下。希望大家閱讀完這篇文章后大有收獲,下面讓小編帶著大家一起了解一下。 Source code download: 本文相關(guān)源碼 大家好,小編來(lái)為大家解答以下問(wèn)題,python超簡(jiǎn)單小游戲代碼,python簡(jiǎn)單

    2024年02月22日
    瀏覽(22)
  • python超簡(jiǎn)單小游戲代碼,python簡(jiǎn)單小游戲代碼

    python超簡(jiǎn)單小游戲代碼,python簡(jiǎn)單小游戲代碼

    大家好,小編來(lái)為大家解答以下問(wèn)題,python超簡(jiǎn)單小游戲代碼,python簡(jiǎn)單小游戲代碼,今天讓我們一起來(lái)看看吧! 大家好,我是辣條。 今天給大家?guī)?lái)30個(gè)py小游戲,一定要收藏! 目錄 有手就行 1、吃金幣 2、打乒乓 3、滑雪 4、并夕夕版飛機(jī)大戰(zhàn) 5、打地鼠 簡(jiǎn)簡(jiǎn)單單 6、小恐

    2024年03月14日
    瀏覽(102)
  • python簡(jiǎn)單小游戲代碼100行,python最簡(jiǎn)單游戲代碼

    python簡(jiǎn)單小游戲代碼100行,python最簡(jiǎn)單游戲代碼

    大家好,小編來(lái)為大家解答以下問(wèn)題,python游戲代碼大全可復(fù)制,python簡(jiǎn)單小游戲代碼100行,現(xiàn)在讓我們一起來(lái)看看吧! 大家小時(shí)候都玩過(guò)貪吃蛇吧?小編小時(shí)候可喜歡拿爸媽的手機(jī)玩了,厲害著呢!今天,小編就來(lái)用100行代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的貪吃蛇。 在網(wǎng)上,貪吃蛇教

    2024年02月02日
    瀏覽(19)
  • 使用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的貪吃蛇小游戲

    使用Java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的貪吃蛇小游戲

    基于java實(shí)現(xiàn)貪吃蛇小游戲,主要通過(guò)繪制不同的圖片并以一定速度一幀一幀地在窗體上進(jìn)行展示。 開發(fā)工具:eclipse java工具包:jdk1.8 代碼地址:https://gitee.com/jay_musu/games-and-tools.git 創(chuàng)建一個(gè)新的項(xiàng)目,并命名。創(chuàng)建一個(gè)名為images的文件夾用來(lái)存放游戲相關(guān)圖片。然后再在項(xiàng)

    2024年02月11日
    瀏覽(28)
  • python簡(jiǎn)單小游戲代碼10行,python超簡(jiǎn)單小游戲代碼

    python簡(jiǎn)單小游戲代碼10行,python超簡(jiǎn)單小游戲代碼

    大家好,小編為大家解答python編寫的入門簡(jiǎn)單小游戲代碼大全的問(wèn)題。很多人還不知道python編寫的入門簡(jiǎn)單小游戲代碼,現(xiàn)在讓我們一起來(lái)看看吧! 玩法:上下控制起跳躲避 玩法:三個(gè)相連就能消除 玩法:童年經(jīng)典,普通模式?jīng)]啥意思,小時(shí)候我們都是玩加速的。 玩法:童

    2024年02月08日
    瀏覽(21)
  • python簡(jiǎn)單小游戲代碼200行,python簡(jiǎn)單的小游戲代碼

    python簡(jiǎn)單小游戲代碼200行,python簡(jiǎn)單的小游戲代碼

    大家好,小編為大家解答python簡(jiǎn)單小游戲代碼200行的問(wèn)題。很多人還不知道python簡(jiǎn)單的小游戲代碼,現(xiàn)在讓我們一起來(lái)看看吧! 貪吃蛇游戲是有史以來(lái)最受歡迎的街機(jī)游戲之一。在這個(gè)游戲中,玩家的主要目標(biāo)是在不撞墻或不撞墻的情況下抓住最大數(shù)量的水果python基礎(chǔ)知識(shí)點(diǎn)

    2024年02月02日
    瀏覽(24)
  • python簡(jiǎn)單小游戲代碼100行,python超簡(jiǎn)單小游戲代碼

    python簡(jiǎn)單小游戲代碼100行,python超簡(jiǎn)單小游戲代碼

    大家好,小編為大家解答python簡(jiǎn)單小游戲代碼100行的問(wèn)題。很多人還不知道python超簡(jiǎn)單小游戲代碼,現(xiàn)在讓我們一起來(lái)看看吧! Source code download: 本文相關(guān)源碼 大家好,小編來(lái)為大家解答以下問(wèn)題,一些簡(jiǎn)單好玩的python編程游戲,python編寫的入門簡(jiǎn)單小游戲,今天讓我們一起

    2024年01月19日
    瀏覽(28)
  • python簡(jiǎn)單小游戲代碼100行,簡(jiǎn)單的python小游戲代碼

    python簡(jiǎn)單小游戲代碼100行,簡(jiǎn)單的python小游戲代碼

    大家好,給大家分享一下python簡(jiǎn)單小游戲代碼100行,很多人還不知道這一點(diǎn)。下面詳細(xì)解釋一下?,F(xiàn)在讓我們來(lái)看看! Source code download: 本文相關(guān)源碼 大家小時(shí)候都玩過(guò)貪吃蛇吧?小編小時(shí)候可喜歡拿爸媽的手機(jī)玩了,厲害著呢!今天,小編就來(lái)用100行代碼實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的

    2024年04月14日
    瀏覽(30)
  • python簡(jiǎn)單小游戲代碼10行,簡(jiǎn)單的python小游戲代碼

    python簡(jiǎn)單小游戲代碼10行,簡(jiǎn)單的python小游戲代碼

    本篇文章給大家談?wù)刾ython簡(jiǎn)單小游戲代碼200行,以及python簡(jiǎn)單小游戲代碼20行,希望對(duì)各位有所幫助,不要忘了收藏本站喔。 大家好,小編來(lái)為大家解答以下問(wèn)題,python編程一個(gè)最簡(jiǎn)單游戲代碼,python編程游戲代碼大全,今天讓我們一起來(lái)看看吧! 大家好,我是辣條。 今天

    2024年01月22日
    瀏覽(33)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包