100行python代碼,輕鬆完成貪吃蛇小遊戲,回憶殺

貪食蛇 Python 小遊戲 體育 芒果教你學編程 2019-05-28

大家小時候都玩過貪吃蛇吧?小編小時候可喜歡拿爸媽的手機玩了,厲害著呢!今天,小編就來用100行代碼實現一個簡易版的貪吃蛇。在網上,貪吃蛇教程蠻多的,但要安裝蠻多庫的,而且也不夠清晰,今天的代碼比較短,而且理解起來或者說你更改起來要簡單一些。最終會實現效果如下:

100行python代碼,輕鬆完成貪吃蛇小遊戲,回憶殺

需要其他小遊戲源碼,私信小編“Python”自動回覆獲取方式

基本準備

首先,我們需要安裝pygame庫,小編通過pip install pygame,很快就安裝好了。在完成貪吃蛇小遊戲的時候,我們需要知道整個遊戲分為四部分:

  1. 遊戲顯示:遊戲界面、結束界面
  2. 貪吃蛇:頭部、身體、食物判斷、死亡判斷
  3. 樹莓:隨機生成
  4. 按鍵控制:上、下、左、右

遊戲顯示

首先,我們來初始化pygame,定義顏色、遊戲界面的窗口大小、標題和圖標等。

1# 初始化pygame

2pygame.init()

3fpsClock = pygame.time.Clock()

4# 創建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)

遊戲結束界面,我們會顯示“Game Over!”和該局遊戲所得分數,相關代碼如下:

1# 定義gameOver函數

2def gameOver(playSurface,score):

3 gameOverFont = pygame.font.SysFont('arial.ttf',54) #遊戲結束字體和大小

4 gameOverSurf = gameOverFont.render('Game Over!', True, greyColour) #遊戲結束內容顯示

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的小方塊,每個方塊代表一個單位,蛇的長度用單位來表示,同時我們採用列表的形式存儲蛇的身體。同時,我們都知道,樹莓的位置是隨機的。所以,我們需要讓樹莓出現的位置是遊戲界面中的隨機位置,同時,每吃到一顆樹莓,就需要重新生成一顆新的樹莓,並且得分加1。相關初始化設置如下:

1snakePosition = [100,100] #貪吃蛇 蛇頭的位置

2snakeSegments = [[100,100]] #貪吃蛇 蛇的身體,初始為一個單位

3raspberryPosition = [300,300] #樹莓的初始位置

4raspberrySpawned = 1 #樹莓的個數為1

5direction = 'right' #初始方向為右

6changeDirection = direction

7score = 0 #初始得分

如何控制貪吃蛇的運動軌跡呢,那麼就需要按鍵控制了。我們通過鍵盤的↑↓←→和WSAD來控制,如果想直接退出遊戲,則可以通過Esc鍵。這裡需要強調的是,貪吃蛇裡面是不能反方向運動,因此,我們需要進一步的增加限制條件:

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

方向設置好了,那麼貪吃蛇蛇身變換怎麼做啊?很簡單,我們只需要根據方向變換一下座標即可。

1# 根據方向移動蛇頭的座標

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))

需要其他小遊戲源碼,私信小編“Python”自動回覆獲取方式

貪吃蛇遊戲裡面最重要的就是食物判斷和死亡判斷。首先是食物判斷,我們通過鍵盤按鍵來決定貪吃蛇的走向,以便它能吃到樹莓。如何判斷貪吃蛇有沒有吃到樹莓呢?很簡單,如果貪吃蛇蛇頭的位置和樹莓的位置重合了,也就是相同,那麼貪吃蛇就吃到樹莓了,否則沒有。同時,一旦發生了樹莓被吃的情況,立刻重新隨機生成一個新的樹莓。相關代碼如下:

1# 判斷是否吃掉了樹莓

2if snakePosition[0] == raspberryPosition[0] and snakePosition[1] == raspberryPosition[1]:

3 raspberrySpawned = 0

4 else:

5 snakeSegments.pop() #若沒有吃掉樹莓,需將最後一單位的蛇身提出列表,此處和蛇身移動時位置變換有關

6# 如果吃掉樹莓,則重新生成樹莓

7if raspberrySpawned == 0:

8 x = random.randrange(1,30) #和遊戲界面大小相關

9 y = random.randrange(1,23)

10 raspberryPosition = [int(x*20),int(y*20)]

11 raspberrySpawned = 1

12 score += 1

死亡判斷則分為兩類情況,一是觸碰到了遊戲界面的邊界,二是貪吃蛇觸碰到了自己的身體。一旦發生死亡,則觸發gameover。

1# 判斷是否死亡

2if snakePosition[0] > 600 or snakePosition[0] < 0: #若超過左右邊界,觸發gameover

3 gameOver(playSurface,score)

4if snakePosition[1] > 460 or snakePosition[1] < 0: #若超過上下邊界,觸發gameover

5 gameOver(playSurface,score)

6for snakeBody in snakeSegments[1:]: #若觸碰到自己的身體,觸發gameover

7 if snakePosition[0] == snakeBody[0] and snakePosition[1] == snakeBody[1]:

8 gameOver(playSurface,score)

貪吃蛇運動和吃掉樹莓的過程中,遊戲界面需要不斷更新。同時,我們設置了遊戲速度。

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 # 創建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 #樹莓的個數為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 # 根據方向移動蛇頭的座標

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”自動回覆獲取方式

相關推薦

推薦中...