【问题标题】:How to stop random ranges spawning in certain areas that vary?如何阻止在某些不同区域产生随机范围?
【发布时间】:2020-12-23 16:22:29
【问题描述】:

我正在使用 pygame 为学校挑战制作蛇,它功能强大且工作正常,但我遇到的问题是,有时当蛇吃掉食物时,新食物会在蛇的尾巴内产卵。我不确定如何更改它的原因是因为它生成食物随机放置的方式是在网格上使用随机范围,而且我不知道无论如何要从这个范围中排除蛇尾/如果它重新生成它它确实在那里产生。这是使用 random.randrange 的根本问题,还是在保留大部分代码的同时有一个简单的修复。 下面高亮代码前两行

foodX = round(random.randrange(0,display_width-snake_block)/snake_block)*snake_block
foodY = round(random.randrange(0,display_height-snake_block)/snake_block)*snake_block

import pygame
import time
import random

pygame.init()

display_width = 600
display_height = 600
display = pygame.display.set_mode((display_width,display_height))
pygame.display.set_caption("Snake")

pureblue = (0,0,255)
purered = (255,0,0)
puregreen = (0,255,0)
red = (125,25,25)
green = (25,125,25)
white = (255,255,255)
black = (1,1,1)
grey = (20,20,20)
darkgrey = (15,15,15)


clock = pygame.time.Clock()

snake_block = 30
snake_speed = 10

font_style = pygame.font.SysFont(None, 50)

def user_snake(snake_block, snake_List):
    for x in snake_List:
        pygame.draw.rect(display,green,[x[0],x[1], snake_block, snake_block])

def drawGrid(surf):
    blockSize = snake_block
    surf.fill(grey)
    for x in range(display_width):
        for y in range(display_height):
            rect = pygame.Rect(x*blockSize, y*blockSize,blockSize, blockSize)
            pygame.draw.rect(surf,darkgrey, rect, 1)
grid_surf = pygame.Surface(display.get_size())
drawGrid(grid_surf)

def message(msg, colour):
    text = font_style.render(msg, True, colour)
    display.blit(text, [0, display_height/4])

def SnakeGameLoop():
    game_over = False
    game_close = False
    X = display_width/2
    Y = display_height/2

    X_change = 0
    Y_change = 0
    
    snake_List = []
    Length_of_snake = 1

    foodX = round(random.randrange(0,display_width-snake_block)/snake_block)*snake_block
    foodY = round(random.randrange(0,display_height-snake_block)/snake_block)*snake_block

    while not game_over:
        while game_close == True:
            message("You Lost! Press Q-Quit or C-Play Again", purered)
            pygame.display.update()
 
            for event in pygame.event.get():
                if event.type == pygame.KEYDOWN:
                    if event.key == pygame.K_q:
                        game_over = True
                        game_close = False
                    if event.key == pygame.K_c:
                        SnakeGameLoop()
        for event in pygame.event.get():
            if event.type == pygame.QUIT:
                game_over = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_LEFT:
                    X_change = -snake_block
                    Y_change = 0
                elif event.key == pygame.K_RIGHT:
                    X_change = snake_block
                    Y_change = 0
                elif event.key == pygame.K_UP:
                    X_change = 0
                    Y_change = -snake_block
                elif event.key == pygame.K_DOWN:
                    X_change = 0
                    Y_change = snake_block

                if event.key == pygame.K_a:
                    X_change = -snake_block
                    Y_change = 0
                elif event.key == pygame.K_d:
                    X_change = snake_block
                    Y_change = 0
                elif event.key == pygame.K_w:
                    X_change = 0
                    Y_change = -snake_block
                elif event.key == pygame.K_s:
                    X_change = 0
                    Y_change = snake_block

        if X >= display_width or X < 0 or Y >= display_height or Y < 0:
            game_close = True

        X += X_change
        Y += Y_change
        display.blit(grid_surf, (0,0))
        pygame.draw.rect(display, red, [foodX, foodY, snake_block, snake_block])
        snake_Head = []
        snake_Head.append(X)
        snake_Head.append(Y)
        snake_List.append(snake_Head)

        if len(snake_List) > Length_of_snake:
            del snake_List[0]

        for x in snake_List[:-1]:
            if x == snake_Head:
                game_close = True

        user_snake(snake_block,snake_List)

        pygame.display.update()

        if X == foodX and Y == foodY:
            foodX = round(random.randrange(0, display_width - snake_block) / snake_block) * snake_block
            foodY = round(random.randrange(0, display_height - snake_block) / snake_block) * snake_block
            Length_of_snake += 1

        clock.tick(snake_speed)


    pygame.quit()
    quit()
SnakeGameLoop()

【问题讨论】:

    标签: python random pygame


    【解决方案1】:

    有多种方法可以解决这个问题。一种简单的方法是简单地生成坐标,检查它们是否与蛇碰撞并在没有碰撞时循环。虽然简单,但当您的蛇在屏幕上占用大量空间并且可能需要多次迭代才能放置每个新项目时,这可能会非常低效。

    另一种方法是生成随机坐标,如果它们与蛇碰撞,请检查该随机点周围最近的可用方格。这可能涉及更多,但应该更有效。可能会发生您的蛇占用大量压缩空间的情况(例如,您绕了一小圈),这也可能会使这种情况变得有点慢。

    一种有趣的方法可能是将这两种方法结合起来:生成随机坐标,如果方格被占用,则在最大 n 方距离处检查最近的可用方格,如果这不起作用,则生成新坐标。然而,这可能有点过头了。

    【讨论】:

    • 你也可以取所有坐标的集合和蛇当前占据的所有坐标的集合之间的差。然后,从该差异中选择一个坐标。
    • 谢谢你我明白我怎么能暗示第一个,但是你怎么能做第二个。我的第一个想法是对 X/Y 值 +1,但我不确定这是否有效
    猜你喜欢
    • 2013-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-31
    • 1970-01-01
    • 2020-05-09
    • 1970-01-01
    相关资源
    最近更新 更多