大家好,給大家分享一下python貪吃蛇游戲代碼詳解外加中文,很多人還不知道這一點(diǎn)。下面詳細(xì)解釋一下?,F(xiàn)在讓我們來(lái)看看!
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)上傳群文件,可以自行下載!
由于程序沒(méi)有多么復(fù)雜,就直接用面向過(guò)程的思路寫了。畢竟這么小的程序沒(méi)必要整一大堆class來(lái)為難自己對(duì)吧。
程序整體代碼框架:
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)為:
當(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)為:怎么實(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)為:
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)。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-854346.html
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()
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)上傳群文件,可以自行下載!
由于程序沒(méi)有多么復(fù)雜,就直接用面向過(guò)程的思路寫了。畢竟這么小的程序沒(méi)必要整一大堆class來(lái)為難自己對(duì)吧。
程序整體代碼框架:
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)為:
當(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)為:怎么實(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)為:
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)!