如何检查某项内容是否在列表中多个项目的范围内?

问题描述

import pygame
display_width = 600
display_height = 600
snake_List = [[120.0,180.0],[120.0,240.0],300.0],360.0],[180.0,[240.0,[300.0,420.0],420.0]]
food_placed = False
snake_block_size = 60

def Food(snake_List,food_placed,foodX,foodY):
    while food_placed == False:
        foodX = round(random.randrange(0,display_width))
        foodY = round(random.randrange(0,display_height))
        food_pos = [foodX,foodY]
        if food_pos in snake_List:
            food_placed = False
        else:
            food_placed = True

我正在制作一个蛇游戏,但食物生成有问题,因为它生成在蛇身上。我想出的解决方案不起作用,因为如果它恰好在被绘制的蛇的位置产生,它就不会在蛇中产生。 所以我需要它来检查它是否在 60 块范围内。

def Food(snake_List,foodY):
    foodX = round(random.randrange(0,display_width))
    foodY = round(random.randrange(0,display_height))
    food_pos = [foodX,foodY]
    if food_pos[1] + 60  < snake_List[0::2] and food_pos[2] + 60 < snake_List[1::2]:
        food_placed = False
    elif food_pos[1] - 60  > snake_List[1::2] and food_pos[1] - 60 > snake_List[0::2]:
        food_placed = False
    else:
        food_placed = True

这是我尝试的解决方案,但它说“'int'和'list'的实例之间不支持'

解决方法

将蛇转换为 pygame.Rect 对象列表:

snake_block_size = 60
snake_List = [[120.0,180.0],[120.0,240.0],300.0],360.0],[180.0,[240.0,[300.0,420.0],420.0]]
snake_rect_list = [pygame.Rect(x,y,snake_block_size,snake_block_size) for x,y in snake_List]

使用collidelist检查脚是否与蛇相交。见collidelist

测试矩形是否与矩形序列中的任何一个发生碰撞。返回找到的第一个碰撞的索引。如果未发现冲突,则返回索引 -1。

函数Food

def Food(snake_List):
    
    foodX = round(random.randrange(0,display_width))
    foodY = round(random.randrange(0,display_height))
    fodd_size = 60

    food_rect = pygame.Rect(foodX,foodY,fodd_size,fodd_size)
    snake_rect_list = [pygame.Rect(x,snake_block_size)
        for x,y in snake_List]

    if food_rect.collidelist(snake_rect_list) >= 0:
        return None 

    return foodX,foodY

请注意,Python 没有输入输出参数的概念。因此,您必须返回函数的结果。使用函数如下:

food_pos = Food(snake_List)
while food_pos == None:
    food_pos = Food(snake_List)

foodX,foodY = food_pos