bat贪吃蛇游戏代码_100行python代码,轻松完成贪吃蛇小游戏
來源:DataGo數(shù)據(jù)狗? ?鏈接:
https://mp.weixin.qq.com/s/fDcr1SfcbynLzHye7Q7VOg
大家小時候都玩過貪吃蛇吧?小編小時候可喜歡拿爸媽的手機玩了,厲害著呢!今天,小編就來用100行代碼實現(xiàn)一個簡易版的貪吃蛇。在網(wǎng)上,貪吃蛇教程蠻多的,但要安裝蠻多庫的,而且也不夠清晰,今天的代碼比較短,而且理解起來或者說你更改起來要簡單一些。最終會實現(xiàn)效果如下:
基本準(zhǔn)備
首先,我們需要安裝pygame庫,小編通過pip install pygame,很快就安裝好了。在完成貪吃蛇小游戲的時候,我們需要知道整個游戲分為四部分:
游戲顯示:游戲界面、結(jié)束界面
貪吃蛇:頭部、身體、食物判斷、死亡判斷
樹莓:隨機生成
按鍵控制:上、下、左、右
游戲顯示
首先,我們來初始化pygame,定義顏色、游戲界面的窗口大小、標(biāo)題和圖標(biāo)等。
1#?初始化pygame2pygame.init()
3fpsClock?=?pygame.time.Clock()
4#?創(chuàng)建pygame顯示層
5playSurface?=?pygame.display.set_mode((600,460))#窗口大小
6pygame.display.set_caption('Snake?Game')#窗口名稱
7#?定義顏色變量
8redColour?=?pygame.Color(255,0,0)
9blackColour?=?pygame.Color(0,0,0)
10whiteColour?=?pygame.Color(255,255,255)
11greyColour?=?pygame.Color(150,150,150)
游戲結(jié)束界面,我們會顯示“Game Over!”和該局游戲所得分?jǐn)?shù),相關(guān)代碼如下:
1#?定義gameOver函數(shù)2def?gameOver(playSurface,score):
3????gameOverFont?=?pygame.font.SysFont('arial.ttf',54)?#游戲結(jié)束字體和大小
4????gameOverSurf?=?gameOverFont.render('Game?Over!',?True,?greyColour)?#游戲結(jié)束內(nèi)容顯示
5????gameOverRect?=?gameOverSurf.get_rect()
6????gameOverRect.midtop?=?(300,?10)?#顯示位置
7????playSurface.blit(gameOverSurf,?gameOverRect)
8????scoreFont?=?pygame.font.SysFont('arial.ttf',54)?#得分情況顯示
9????scoreSurf?=?scoreFont.render('Score:'+str(score),?True,?greyColour)
10????scoreRect?=?scoreSurf.get_rect()
11????scoreRect.midtop?=?(300,?50)
12????playSurface.blit(scoreSurf,?scoreRect)
13????pygame.display.flip()?#刷新顯示界面
14????time.sleep(5)?#休眠五秒鐘自動退出界面
15????pygame.quit()
16????sys.exit()
貪吃蛇和樹莓
我們需要將整個界面看成許多20*20的小方塊,每個方塊代表一個單位,蛇的長度用單位來表示,同時我們采用列表的形式存儲蛇的身體。同時,我們都知道,樹莓的位置是隨機的。所以,我們需要讓樹莓出現(xiàn)的位置是游戲界面中的隨機位置,同時,每吃到一顆樹莓,就需要重新生成一顆新的樹莓,并且得分加1。相關(guān)初始化設(shè)置如下:
1snakePosition?=?[100,100]?#貪吃蛇?蛇頭的位置2snakeSegments?=?[[100,100]]?#貪吃蛇?蛇的身體,初始為一個單位
3raspberryPosition?=?[300,300]?#樹莓的初始位置
4raspberrySpawned?=?1?#樹莓的個數(shù)為1
5direction?=?'right'?#初始方向為右
6changeDirection?=?direction
7score?=?0?#初始得分
如何控制貪吃蛇的運動軌跡呢,那么就需要按鍵控制了。我們通過鍵盤的↑↓←→和WSAD來控制,如果想直接退出游戲,則可以通過Esc鍵。這里需要強調(diào)的是,貪吃蛇里面是不能反方向運動,因此,我們需要進一步的增加限制條件:
1#?檢測例如按鍵等pygame事件2for?event?in?pygame.event.get():
3????if?event.type?==?QUIT:
4????????pygame.quit()
5????????sys.exit()
6????elif?event.type?==?KEYDOWN:
7????????#?判斷鍵盤事件
8????????if?event.key?==?K_RIGHT?or?event.key?==?ord('d'):
9????????????changeDirection?=?'right'
10????????if?event.key?==?K_LEFT?or?event.key?==?ord('a'):
11????????????changeDirection?=?'left'
12????????if?event.key?==?K_UP?or?event.key?==?ord('w'):
13????????????changeDirection?=?'up'
14????????if?event.key?==?K_DOWN?or?event.key?==?ord('s'):
15????????????changeDirection?=?'down'
16????????if?event.key?==?K_ESCAPE:
17????????????pygame.event.post(pygame.event.Event(QUIT))
18#?判斷是否輸入了反方向
19if?changeDirection?==?'right'?and?not?direction?==?'left':
20????direction?=?changeDirection
21if?changeDirection?==?'left'?and?not?direction?==?'right':
22????direction?=?changeDirection
23if?changeDirection?==?'up'?and?not?direction?==?'down':
24????direction?=?changeDirection
25if?changeDirection?==?'down'?and?not?direction?==?'up':
26????direction?=?changeDirection
方向設(shè)置好了,那么貪吃蛇蛇身變換怎么做啊?很簡單,我們只需要根據(jù)方向變換一下坐標(biāo)即可。
1#?根據(jù)方向移動蛇頭的坐標(biāo)2if?direction?==?'right':
3????snakePosition[0]?+=?20
4if?direction?==?'left':
5????snakePosition[0]?-=?20
6if?direction?==?'up':
7????snakePosition[1]?-=?20
8if?direction?==?'down':
9????snakePosition[1]?+=?20
10#?增加蛇的長度
11snakeSegments.insert(0,list(snakePosition))
貪吃蛇游戲里面最重要的就是食物判斷和死亡判斷。首先是食物判斷,我們通過鍵盤按鍵來決定貪吃蛇的走向,以便它能吃到樹莓。如何判斷貪吃蛇有沒有吃到樹莓呢?很簡單,如果貪吃蛇蛇頭的位置和樹莓的位置重合了,也就是相同,那么貪吃蛇就吃到樹莓了,否則沒有。同時,一旦發(fā)生了樹莓被吃的情況,立刻重新隨機生成一個新的樹莓。相關(guān)代碼如下:
1#?判斷是否吃掉了樹莓2if?snakePosition[0]?==?raspberryPosition[0]?and?snakePosition[1]?==?raspberryPosition[1]:
3????raspberrySpawned?=?0
4?else:
5????snakeSegments.pop()?#若沒有吃掉樹莓,需將最后一單位的蛇身提出列表,此處和蛇身移動時位置變換有關(guān)
6#?如果吃掉樹莓,則重新生成樹莓
7if?raspberrySpawned?==?0:
8????x?=?random.randrange(1,30)?#和游戲界面大小相關(guān)
9????y?=?random.randrange(1,23)
10????raspberryPosition?=?[int(x*20),int(y*20)]
11????raspberrySpawned?=?1
12????score?+=?1
死亡判斷則分為兩類情況,一是觸碰到了游戲界面的邊界,二是貪吃蛇觸碰到了自己的身體。一旦發(fā)生死亡,則觸發(fā)gameover。
1#?判斷是否死亡2if?snakePosition[0]?>?600?or?snakePosition[0]?0:?#若超過左右邊界,觸發(fā)gameover
3????gameOver(playSurface,score)
4if?snakePosition[1]?>?460?or?snakePosition[1]?0:?#若超過上下邊界,觸發(fā)gameover
5????gameOver(playSurface,score)
6for?snakeBody?in?snakeSegments[1:]:?#若觸碰到自己的身體,觸發(fā)gameover
7????if?snakePosition[0]?==?snakeBody[0]?and?snakePosition[1]?==?snakeBody[1]:
8????????gameOver(playSurface,score)
貪吃蛇運動和吃掉樹莓的過程中,游戲界面需要不斷更新。同時,我們設(shè)置了游戲速度。
1#?繪制pygame顯示層2playSurface.fill(blackColour) #蛇身為白色
3for?position?in?snakeSegments:
4????pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))
5????pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0],?raspberryPosition[1],20,20))
6
7#?刷新pygame顯示層
8pygame.display.flip()
9#?控制游戲速度
10fpsClock.tick(5)
至此,我們就能完成一個貪吃蛇小游戲了。趕緊去實驗一下吧!
完整的代碼如下:
?1import?pygame,sys,time,random?2from?pygame.locals?import?*
?3#?定義顏色變量
?4redColour?=?pygame.Color(255,0,0)
?5blackColour?=?pygame.Color(0,0,0)
?6whiteColour?=?pygame.Color(255,255,255)
?7greyColour?=?pygame.Color(150,150,150)
?8def?gameOver(playSurface,score):
?9????gameOverFont?=?pygame.font.SysFont('arial.ttf',54)
10????gameOverSurf?=?gameOverFont.render('Game?Over!',?True,?greyColour)
11????gameOverRect?=?gameOverSurf.get_rect()
12????gameOverRect.midtop?=?(300,?10)
13????playSurface.blit(gameOverSurf,?gameOverRect)
14????scoreFont?=?pygame.font.SysFont('arial.ttf',54)
15????scoreSurf?=?scoreFont.render('Score:'+str(score),?True,?greyColour)
16????scoreRect?=?scoreSurf.get_rect()
17????scoreRect.midtop?=?(300,?50)
18????playSurface.blit(scoreSurf,?scoreRect)
19????pygame.display.flip()
20????time.sleep(5)
21????pygame.quit()
22????sys.exit()
23def?main():
24????#?初始化pygame
25????pygame.init()
26????fpsClock?=?pygame.time.Clock()
27????#?創(chuàng)建pygame顯示層
28????playSurface?=?pygame.display.set_mode((600,460))
29????pygame.display.set_caption('Snake?Game')
30????#?初始化變量
31????snakePosition?=?[100,100]?#貪吃蛇?蛇頭的位置
32????snakeSegments?=?[[100,100]]?#貪吃蛇?蛇的身體,初始為一個單位
33????raspberryPosition?=?[300,300]?#樹莓的初始位置
34????raspberrySpawned?=?1?#樹莓的個數(shù)為1
35????direction?=?'right'?#初始方向為右
36????changeDirection?=?direction
37????score?=?0?#初始得分
38????while?True:
39????????#?檢測例如按鍵等pygame事件
40????????for?event?in?pygame.event.get():
41????????????if?event.type?==?QUIT:
42????????????????pygame.quit()
43????????????????sys.exit()
44????????????elif?event.type?==?KEYDOWN:
45????????????????#?判斷鍵盤事件
46????????????????if?event.key?==?K_RIGHT?or?event.key?==?ord('d'):
47????????????????????changeDirection?=?'right'
48????????????????if?event.key?==?K_LEFT?or?event.key?==?ord('a'):
49????????????????????changeDirection?=?'left'
50????????????????if?event.key?==?K_UP?or?event.key?==?ord('w'):
51????????????????????changeDirection?=?'up'
52????????????????if?event.key?==?K_DOWN?or?event.key?==?ord('s'):
53????????????????????changeDirection?=?'down'
54????????????????if?event.key?==?K_ESCAPE:
55????????????????????pygame.event.post(pygame.event.Event(QUIT))
56????????#?判斷是否輸入了反方向
57????????if?changeDirection?==?'right'?and?not?direction?==?'left':
58????????????direction?=?changeDirection
59????????if?changeDirection?==?'left'?and?not?direction?==?'right':
60????????????direction?=?changeDirection
61????????if?changeDirection?==?'up'?and?not?direction?==?'down':
62????????????direction?=?changeDirection
63????????if?changeDirection?==?'down'?and?not?direction?==?'up':
64????????????direction?=?changeDirection
65????????#?根據(jù)方向移動蛇頭的坐標(biāo)
66????????if?direction?==?'right':
67????????????snakePosition[0]?+=?20
68????????if?direction?==?'left':
69????????????snakePosition[0]?-=?20
70????????if?direction?==?'up':
71????????????snakePosition[1]?-=?20
72????????if?direction?==?'down':
73????????????snakePosition[1]?+=?20
74????????#?增加蛇的長度
75????????snakeSegments.insert(0,list(snakePosition))
76????????#?判斷是否吃掉了樹莓
77????????if?snakePosition[0]?==?raspberryPosition[0]?and?snakePosition[1]?==?raspberryPosition[1]:
78????????????raspberrySpawned?=?0
79????????else:
80????????????snakeSegments.pop()
81????????#?如果吃掉樹莓,則重新生成樹莓
82????????if?raspberrySpawned?==?0:
83????????????x?=?random.randrange(1,30)
84????????????y?=?random.randrange(1,23)
85????????????raspberryPosition?=?[int(x*20),int(y*20)]
86????????????raspberrySpawned?=?1
87????????????score?+=?1
88????????#?繪制pygame顯示層
89????????playSurface.fill(blackColour)
90????????for?position?in?snakeSegments:
91????????????pygame.draw.rect(playSurface,whiteColour,Rect(position[0],position[1],20,20))
92????????????pygame.draw.rect(playSurface,redColour,Rect(raspberryPosition[0],?raspberryPosition[1],20,20))
93????????#?刷新pygame顯示層
94????????pygame.display.flip()
95????????#?判斷是否死亡
96????????if?snakePosition[0]?>?600?or?snakePosition[0]?0:
97????????????gameOver(playSurface,score)
98????????if?snakePosition[1]?>?460?or?snakePosition[1]?0:
99????????????gameOver(playSurface,score)
100????????for?snakeBody?in?snakeSegments[1:]:
101????????????if?snakePosition[0]?==?snakeBody[0]?and?snakePosition[1]?==?snakeBody[1]:
102????????????????gameOver(playSurface,score)
103????????#?控制游戲速度
104????????fpsClock.tick(5)
105
106if?__name__?==?"__main__":
107????main()
python爬蟲人工智能大數(shù)據(jù)公眾號
總結(jié)
以上是生活随笔為你收集整理的bat贪吃蛇游戏代码_100行python代码,轻松完成贪吃蛇小游戏的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 人耳识别代码_语音识别之——音频特征fb
- 下一篇: apollo 配置中心_Apollo配置