这篇文章主要介绍了通过Python实现的简易的自动玩贪吃蛇游戏的小程序,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学一学
实现效果
先看看效果
这比我手动的快多了,而且是单机的,自动玩没惹骂我,哈哈 ,多人游戏整个自动玩会被骂死~
代码
没装软件的先安装一下软件,没装模块的安装一下pygame模块。
|
1
|
`pip install pygame`
|
导入模块
|
1
2
|
`import` `pygame,sys,time,random`
`from` `pygame.``locals` `import` `*`
|
定义颜色变量
|
`redColour` `=` `pygame.Color(``255``,``0``,``0``)`
`blackColour` `=` `pygame.Color(``0``,``0``,``0``)`
`whiteColour` `=` `pygame.Color(``255``,``255``,``255``)`
`greenColour` `=` `pygame.Color(``0``,``255``,``0``)`
`headColour` `=` `pygame.Color(``0``,``119``,``255``)`
|
在所有后续的除法中,为预防pygame输出出现偏差,必须取除数(//)而不是单纯除法(/)
程序界面
第0行,HEIGHT行,第0列,WIDTH列为围墙,所以实际大小是13*13
|
`IGHT` `=` `15`
`WIDTH` `=` `15`
`FIELD_SIZE` `=` `HEIGHT` `*` `WIDTH`
`# 蛇头位于snake数组的第一个元素`
`HEAD` `=` `0`
|
用数字代表不同的对象,因为运动时矩阵上每个格子会处理成到达食物的路径长度,因此这三个变量间需要有足够大的间隔(>HEIGHT*WIDTH)来互相区分,小写一般是坐标,大写代表常量。对于新手小白想更轻松的学好Python基础,Python爬虫,web开发、大数据,数据分析,人工智能等技术,这里给大家分享系统教学资源,架下我尉(同英): 2763177065 【教程/工具/方法/解疑】
|
`FOOD` `=` `0`
`UNDEFINED` `=` `(HEIGHT` `+` `1``)` `*` `(WIDTH` `+` `1``)`
`SNAKE` `=` `2` `*` `UNDEFINED`
|
snake是一维数组,对应元素直接加上以下值就表示向四个方向移动。
|
`LEFT` `=` `-``1`
`RIGHT` `=` `1`
`UP` `=` `-``WIDTH` `# 一维数组,所以需要整个宽度都加上才能表示上下移动。`
`DOWN` `=` `WIDTH`
|
错误码
|
1
|
`ERR` `=` `-``2333`
|
用一维数组来表示二维的东西,board表示蛇运动的矩形场地,初始化蛇头在(1,1)的地方,初始蛇长度为1。
|
`board` `=` `[``0``]` `*` `FIELD_SIZE` `#[0,0,0,……]`
`snake` `=` `[``0``]` `*` `(FIELD_SIZE``+``1``)`
`snake[HEAD]` `=` `1``*``WIDTH``+``1`
`snake_size` `=` `1`
|
与上面变量对应的临时变量,蛇试探性地移动时使用。
|
`tmpboard` `=` `[``0``]` `*` `FIELD_SIZE`
`tmpsnake` `=` `[``0``]` `*` `(FIELD_SIZE``+``1``)`
`tmpsnake[HEAD]` `=` `1``*``WIDTH``+``1`
`tmpsnake_size` `=` `1`
|
food:食物位置初始在(4, 7),best_move: 运动方向。
|
|
`food` `=` `4` `*` `WIDTH` `+` `7`
`best_move` `=` `ERR`
|
运动方向数组,游戏分数(蛇长)
|
|
`mov` `=` `[LEFT, RIGHT, UP, DOWN] `
`score` `=` `1`
|
检查一个cell有没有被蛇身覆盖,没有覆盖则为free,返回true 。
|
|
`def` `is_cell_free(idx, psize, psnake):`
`return` `not` `(idx` `in` `psnake[:psize])`
|
检查某个位置idx是否可向move方向运动
|
|
`def` `is_move_possible(idx, move):`
`flag` `=` `False`
`if` `move` `=``=` `LEFT:`
`#因为实际范围是13*13,[1,13]*[1,13],所以idx为1时不能往左跑,此时取余为1所以>1`
`flag` `=` `True` `if` `idx``%``WIDTH >` `1` `else` `False`
`elif` `move` `=``=` `RIGHT:`
`#这里的<WIDTH-2跟上面是一样的道理`
`flag` `=` `True` `if` `idx``%``WIDTH < (WIDTH``-``2``)` `else` `False`
`elif` `move` `