录
- 实现效果
- 代码
实现效果
先看看效果
这比我手动的快多了,而且是单机的,自动玩没惹骂我,哈哈 ,多人游戏整个自动玩会被骂死~
代码
没装软件的先安装一下软件,没装模块的安装一下pygame模块。
pip install pygame
导入模块
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)来互相区分,小写一般是坐标,大写代表常量。
FOOD = 0
UNDEFINED = (HEIGHT + 1) * (WIDTH + 1)
SNAKE = 2 * UNDEFINED
snake是一维数组,对应元素直接加上以下值就表示向四个方向移动。
LEFT = -1
RIGHT = 1
UP = -WIDTH # 一维数组,所以需要整个宽度都加上才能表示上下移动。
DOWN = WIDTH
错误码
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 == UP:
#这里向上的判断画图很好理解,因为在[1,13]*[1,