admin 管理员组

文章数量: 1184232


2024年3月1日发(作者:dropdownlist控件的默认事件)

游戏贪吃蛇python编程代码

基本准备

首先,我们需要安装pygame库,小编通过pip install pygame,很快就安装好了。在完成贪吃蛇小游戏的时候,我们需要知道整个游戏分为四部分:

游戏显示:游戏界面、结束界面

贪吃蛇:头部、身体、食物判断、死亡判断

树莓:随机生成

按键控制:上、下、左、右

游戏显示

首先,我们来初始化pygame,定义颜色、游戏界面的窗口大小、标题和图标等。

1# 初始化pygame

()

3fpsClock = ()

4# 创建pygame显示层

5playSurface = _mode((600,460))#窗口大小

_caption('Snake Game')#窗口名称

7# 定义颜色变量

8redColour = (255,0,0)

9blackColour = (0,0,0)

10whiteColour = (255,255,255)

11greyColour = (150,150,150)

游戏结束界面,我们会显示“Game Over!”和该局游戏所得分数,相关代码如下:

1# 定义gameOver函数

2def gameOver(playSurface,score):

3 gameOverFont = t('',54) #游戏结束字体和大小

4 gameOverSurf = ('Game Over!', True, greyColour) #游戏结束内容显示

5 gameOverRect = _rect()

6 = (300, 10) #显示位置

7 (gameOverSurf, gameOverRect)

8 scoreFont = t('',54) #得分情况显示

9 scoreSurf = ('Score:'+str(score), True, greyColour)

10 scoreRect = _rect()

11 = (300, 50)

12 (scoreSurf, scoreRect)

13 () #刷新显示界面

14 (5) #休眠五秒钟自动退出界面

15 ()

16 ()

贪吃蛇和树莓

我们需要将整个界面看成许多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 ():

3 if == QUIT:

4 ()

5 ()

6 elif == KEYDOWN:

7 # 判断键盘事件

8 if == K_RIGHT or == ord('d'):

9 changeDirection = 'right'

10 if == K_LEFT or == ord('a'):

11 changeDirection = 'left'

12 if == K_UP or == ord('w'):

13 changeDirection = 'up'

14 if == K_DOWN or == ord('s'):

15 changeDirection = 'down'

16 if == K_ESCAPE:

17 ((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# 增加蛇的长度

(0,list(snakePosition))

贪吃蛇游戏里面最重要的就是食物判断和死亡判断。首先是食物判断,我们通过键盘按键来决定贪吃蛇的走向,以便它能吃到树莓。如何判断贪吃蛇有没有吃到树莓呢?很简单,如果贪吃蛇蛇头的位置和树莓的位置重合了,也就是相同,那么贪吃蛇就吃到树莓了,否则没有。同时,一旦发生了树莓被吃的情况,立刻重新随机生成一个新的树莓。相关代码如下:

1# 判断是否吃掉了树莓

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

3 raspberrySpawned = 0

4 else:

5 () #若没有吃掉树莓,需将最后一单位的蛇身提出列表,此处和蛇身移动时位置变换有关

6# 如果吃掉树莓,则重新生成树莓

7if raspberrySpawned == 0:

8 x = nge(1,30) #和游戏界面大小相关

9 y = nge(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显示层

(blackColour) #蛇身为白色

3for position in snakeSegments:

4 (playSurface,whiteColour,Rect(position[0],position[1],20,20))

5 (playSurface,redColour,Rect(raspberryPosition[0],

raspberryPosition[1],20,20))

6

7# 刷新pygame显示层

()

9# 控制游戏速度

(5)

至此,我们就能完成一个贪吃蛇小游戏了。赶紧去实验一下吧!

完整的代码如下:

1import pygame,sys,time,random

2from import *

3# 定义颜色变量

4redColour = (255,0,0)

5blackColour = (0,0,0)

6whiteColour = (255,255,255)

7greyColour = (150,150,150)

8def gameOver(playSurface,score):

9 gameOverFont = t('',54)

10 gameOverSurf = ('Game Over!', True, greyColour)

11 gameOverRect = _rect()

12 = (300, 10)

13 (gameOverSurf, gameOverRect)

14 scoreFont = t('',54)

15 scoreSurf = ('Score:'+str(score), True, greyColour)

16 scoreRect = _rect()

17 = (300, 50)

18 (scoreSurf, scoreRect)

19 ()

20 (5)

21 ()

22 ()

23def main():

24 # 初始化pygame

25 ()

26 fpsClock = ()

27 # 创建pygame显示层

28 playSurface = _mode((600,460))

29 _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 ():

41 if == QUIT:

42 ()

43 ()

44 elif == KEYDOWN:

45 # 判断键盘事件

46 if == K_RIGHT or == ord('d'):

47 changeDirection = 'right'

48 if == K_LEFT or == ord('a'):

49 changeDirection = 'left'

50 if == K_UP or == ord('w'):

51 changeDirection = 'up'

52 if == K_DOWN or == ord('s'):

53 changeDirection = 'down'

54 if == K_ESCAPE:

55 ((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 (0,list(snakePosition))

76 # 判断是否吃掉了树莓

77 if snakePosition[0] == raspberryPosition[0] and snakePosition[1] ==

raspberryPosition[1]:

78 raspberrySpawned = 0

79 else:

80 ()

81 # 如果吃掉树莓,则重新生成树莓

82 if raspberrySpawned == 0:

83 x = nge(1,30)

84 y = nge(1,23)

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

86 raspberrySpawned = 1

87 score += 1

88 # 绘制pygame显示层

89 (blackColour)

90 for position in snakeSegments:

91 (playSurface,whiteColour,Rect(position[0],position[1],20,20))

92 (playSurface,redColour,Rect(raspberryPosition[0],

raspberryPosition[1],20,20))

93 # 刷新pygame显示层

94 ()

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

105

106if __name__ == "__main__":

107 main()


本文标签: 游戏 树莓 判断 界面 需要