python贪吃蛇游戏代码 Python实现自动玩贪吃蛇( 三 )

虚拟地运行一次,然后在调用处检查这次运行可否可行,可行才真实运行 。
虚拟运行吃到食物后,得到虚拟下蛇在board的位置 。
def virtual_shortest_move():global snake, board, snake_size, tmpsnake, tmpboard, tmpsnake_size, foodtmpsnake_size = snake_sizetmpsnake = snake[:] # 如果直接tmpsnake=snake,则两者指向同一处内存tmpboard = board[:] # board中已经是各位置到达食物的路径长度了,不用再计算board_reset(tmpsnake, tmpsnake_size, tmpboard)food_eated = Falsewhile not food_eated:board_BFS(food, tmpsnake, tmpboard)move = choose_shortest_safe_move(tmpsnake, tmpboard)shift_array(tmpsnake, tmpsnake_size)tmpsnake[HEAD]= move # 在蛇头前加入一个新的位置# 如果新加入的蛇头的位置正好是食物的位置# 则长度加1,重置board,食物那个位置变为蛇的一部分(SNAKE)if tmpsnake[HEAD] == food:tmpsnake_size= 1board_reset(tmpsnake, tmpsnake_size, tmpboard) # 虚拟运行后,蛇在board的位置tmpboard[food] = SNAKEfood_eated = Trueelse: # 如果蛇头不是食物的位置,则新加入的位置为蛇头,最后一个变为空格tmpboard[tmpsnake[HEAD]] = SNAKEtmpboard[tmpsnake[tmpsnake_size]] = UNDEFINED如果蛇与食物间有路径,则调用本函数 。
def find_safe_way():global snake, boardsafe_move = ERR# 虚拟地运行一次,因为已经确保蛇与食物间有路径,所以执行有效# 运行后得到虚拟下蛇在board中的位置,即tmpboardvirtual_shortest_move() # 该函数唯一调用处if is_tail_inside(): # 如果虚拟运行后,蛇头蛇尾间有通路,则选最短路运行(1步)return choose_shortest_safe_move(snake, board)safe_move = follow_tail() # 否则虚拟地follow_tail 1步,如果可以做到,返回truereturn safe_move初始化pygame 模块
pygame.init()定义一个变量用来控制游戏速度
fpsClock = pygame.time.Clock()创建pygame显示层
playSurface = pygame.display.set_mode((270,270))pygame.display.set_caption('贪吃蛇')绘制pygame显示层
playSurface.fill(blackColour)初始化食物
pygame.draw.rect(playSurface,redColour,Rect(18*(food//WIDTH), 18*(food%WIDTH),18,18))while True:for event in pygame.event.get():#循环监听键盘和退出事件if event.type == QUIT:#如果点了关闭print(score)#游戏结束后打印分数pygame.quit()sys.exit()elif event.type == KEYDOWN:#如果esc键被按下if event.key==K_ESCAPE:print(score)#游戏结束后打印分数pygame.quit()sys.exit()# 刷新pygame显示层pygame.display.flip()#画围墙,255,255,0是黄色,边框是36是因为,pygame矩形是以边为初始,向四周填充边框pygame.draw.rect(playSurface,(255,255,0),Rect(0,0,270,270),36)# 重置距离board_reset(snake, snake_size, board)# 如果蛇可以吃到食物,board_BFS返回true# 并且board中除了蛇身(=SNAKE),其它的元素值表示从该点运动到食物的最短路径长if board_BFS(food, snake, board): best_move= find_safe_way() # find_safe_way的唯一调用处else:best_move = follow_tail()if best_move == ERR:best_move = any_possible_move()# 上面一次思考,只得出一个方向,运行一步if best_move != ERR: make_move(best_move)else:print(score)#游戏结束后打印分数break# 控制游戏速度fpsClock.tick(20)#20看上去速度正好