AI自动寻路贪吃蛇(未完结)

创建main.py、snake.py、pathfinding.py三个文件,位于同一个目录下

main.py代码如下

from snake import *
from turtle import *
from random import *
from pathfinding import GameGraph, pathfinding
setup(420, 420)
title('贪吃蛇')
hideturtle()
tracer(False)
game_graph = GameGraph(snake.copy(), (food_x, food_y), {'xmin': -200, 'xmax': 180, 'ymin': -190, 'ymax': 190})
move()
done()

snake.py代码如下:

from turtle import *
from random import *
from pathfinding import GameGraph, pathfinding

def square(x, y, size, sq_color):
    '''绘制小正方形, 代表一格'''
    penup()
    goto(x, y)
    color(sq_color)
    pendown()

    begin_fill()
    for i in range(4):
        forward(size)
        left(90)
    end_fill()

def frame():
    '''绘制边框'''
    for i in range(-210, 200, 10):
        square(i, -200, 10, 'gray')
        square(i, 200, 10, 'gray')
    for i in range(-200, 200, 10):
        square(-210, i, 10, 'gray')
        square(190, i, 10, 'gray')

def change(direction):
    '''改变蛇的运动方向'''
    global aim_x, aim_y
    x, y = direction
    if x != -aim_x or y != -aim_y:     
        aim_x = x
        aim_y = y

def inside(head_x, head_y):
    '''判断蛇是否在边框内'''
    if -210 < head_x < 190 and -200 < head_y < 200:
        return True
    else:
        return False

all_food = []                  # 所有食物的位置
for x in range(-200, 190, 10):
    for y in range(-190, 200, 10):
        all_food.append((x, y))

def new_food():
    '''随机生成食物位置'''
    food = all_food.copy()
    for i in snake:            # 去掉蛇所在的位置
        food.remove(i)
    new_food_x, new_food_y = food.pop(randint(0, len(food) - 1))
    return new_food_x, new_food_y

snake = [(0, 0)]               # 蛇的起始位置
food_x, food_y = new_food()    # 食物的起始位置
aim_x, aim_y = 0, 0            # 蛇的起始方向

def move():
    global food_x, food_y

    change(pathfinding(game_graph))
    head_move_x = snake[-1][0] + aim_x
    head_move_y = snake[-1][1] + aim_y

    # 判断是否撞到边框或者撞到自己
    if not inside(head_move_x, head_move_y) or [head_move_x, head_move_y] in snake:
        square(head_move_x, head_move_y, 10, 'red')
        update()
        print('得分: ', len(snake))
        return
    
    snake.append((head_move_x, head_move_y))

    # 判断是否吃到食物以及是否胜利
    if head_move_x == food_x and head_move_y == food_y:
        if(len(snake) == len(all_food)):
            print('YOU WIN!')
            return
        else:
            food_x, food_y = new_food()
            game_graph.set_food((food_x, food_y))
    else:
        snake.pop(0)

    clear()
    game_graph.set_snake(snake)
    # 绘制边框, 蛇和食物
    frame()
    for body in snake:
        square(body[0], body[1], 10, 'black')
    square(food_x, food_y, 10, 'green')
    update()

    ontimer(move)
game_graph = GameGraph(snake.copy(), (food_x, food_y), {'xmin': -200, 'xmax': 180, 'ymin': -190, 'ymax': 190})

pathfinding.py代码如下

class GameGraph:
    def __init__(self,snake,food,frame):
        self.snake = snake
        self.food = food
        self.frame = frame
    def set_food(self,food):
        self.food = food
    def set_snake(self,snake):
        self.snake = snake
'''
def findtail(snake):   #判断是否能找到尾巴
    close_list=[]
    for s in snake:
        close_list.append(s)
    if (abs(snake[-1][0]-snake[0][0])==10 and snake[-1][1]==snake[0][1])or(abs(snake[-1][1]-snake[0][1])==10 and snake[-1][0]==snake[0][0]):
        return True
    else:
        if snake[-1][0]!=snake[0][0]:
            if snake[-1][0]>snake[0][0]:
                if (snake[-1][0]+10,snake[-1][1])in close_list:
                    
                snake.append((snake[-1][0]+10,snake[-1][1]))
                snake.pop(0)
'''
def pathfinding(game_graph):   #返回蛇头接下来前进的方向
    close_list=[]
    start = game_graph.snake[-1]
    food = game_graph.food
    for s in game_graph.snake:
        close_list.append(s)
    if food[0]!= start [0]:
        if food[0]>start[0]:
            direction = (10,0)
        else:
            direction = (-10,0)
    else:
        if food[1]!=start[1]:
            if food[1]>start[1]:
                direction = (0,10)
            else:
                direction = (0,-10)
    head_move_x = start[0] + direction[0]
    head_move_y = start[1] + direction[1]
    next_snakehead=(head_move_x,head_move_y)
    if next_snakehead in close_list:
        if direction == (10,0) or direction == (-10,0):
            if head_move_y==200:
                direction = (0,-10)
            if head_move_y==-200:
                direction = (0,10)
            else:
                direction = (0,10)
        else:
            if head_move_x==190:
                direction = (-10,0)
            if head_move_x==-210:
                direction = (10,0)
            else:
                direction = (10,0)
    return direction

本代码仅供测试,还未实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值