本文介绍了如何解决蛇壁隐形传送的错误的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在做蛇游戏,但遇到一个错误,我不知道该怎么解决,我想使蛇能传送到槽壁上,当蛇与墙壁相撞时,它会以相反的速度传送到另一条壁上位置和位置,就像经典游戏一样,但是使用我的代码,当蛇靠近墙壁时,它会复制到对面的墙壁上,但是它甚至还没有发现碰撞

I'm doing a snake game and I got a bug I can't figure out how to solve, I want to make my snake teleport trough walls, when the snake colllides with a wall it teleports to another with the opposite speed and position, like the classic game, but with my code when the snake gets near the wall it duplicates to the opposite wall, but it was supposed to not even detect collision yet

重要的事情:在网格中,蛇在墙的侧面,像这样

important thing: in the grid the snake is on the side of the wall, like this

SSSS
WWWW

而不是这样:

SSSS
NNNN
WWWW

当S代表蛇时,W代表墙壁,而N则不代表任何东西.

when S represents the snake, W represents the wall and N represents nothing.

完整代码

import pygame, random, os, sys
from pygame.locals import *
pygame.init()
screen = pygame.display.set_mode((1020, 585))
pygame.display.set_caption('2snakes!')

#files location
current_path = os.path.dirname(__file__)
data_path = os.path.join(current_path, 'data')
icon = pygame.image.load(os.path.join(data_path, 'icon.png'))
press_any = pygame.image.load(os.path.join(data_path, 'press_any.png'))
pygame.display.set_icon(icon)


#collission
def collision(c1,c2):
    return (c1[0] == c2[0]) and (c1[1] == c2[1])

#game over
def gameOverBlue():
    print("blue")
    main()
def gameOverRed():
    print("red")
    main()
fps = 15
def main():
#variables
    direction = 'RIGHT'
    direction2 = 'RIGHT'
    change_to = direction
    change2_to = direction2


    #snake
    size = 15
    s_posx = 60
    s_posy = 60
    snake = [(s_posx + size * 2, s_posy),(s_posx + size, s_posy),(s_posx, s_posy)]
    s_skin = pygame.Surface((size, size))
    s_skin.fill((82,128,208))

    #snake2
    size2 = 15
    s2_posx = 390
    s2_posy = 390
    snake2 = [(s2_posx + size2 * 2, s2_posy),(s2_posx + size2, s2_posy),(s2_posx, s2_posy)]
    s2_skin = pygame.Surface((size2, size2))
    s2_skin.fill((208,128,82))

    #apple
    apple = pygame.Surface((size, size))
    apple_pos = ((random.randint(0, 67)) * 15, (random.randint(0, 38)) * 15)
#endregion
    while True:
        pygame.time.Clock().tick(fps)
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()



        #input
            elif event.type == pygame.KEYDOWN:
                #snake
                if event.key == ord('w'):
                    change_to = 'UP'
                if event.key == ord('s'):
                    change_to = 'DOWN'
                if event.key == ord('a'):
                    change_to = 'LEFT'
                if event.key == ord('d'):
                    change_to = 'RIGHT'

                #snake2
                if event.key == pygame.K_UP:
                    change2_to = 'UP'
                if event.key == pygame.K_DOWN:
                    change2_to = 'DOWN'
                if event.key == pygame.K_LEFT:
                    change2_to = 'LEFT'
                if event.key == pygame.K_RIGHT:
                    change2_to = 'RIGHT'

                #quit game
                if event.key == pygame.K_ESCAPE:
                    pygame.quit()
                    sys.quit()

    #smoot snake movement
            #snake
        if change_to == 'UP' and direction != 'DOWN':
            direction = 'UP'
        if change_to == 'DOWN' and direction != 'UP':
            direction = 'DOWN'
        if change_to == 'LEFT' and direction != 'RIGHT':
            direction = 'LEFT'
        if change_to == 'RIGHT' and direction != 'LEFT':
            direction = 'RIGHT'

            #snake2
        if change2_to == 'UP' and direction2 != 'DOWN':
            direction2 = 'UP'
        if change2_to == 'DOWN' and direction2 != 'UP':
            direction2 = 'DOWN'
        if change2_to == 'LEFT' and direction2 != 'RIGHT':
            direction2 = 'LEFT'
        if change2_to == 'RIGHT' and direction2 != 'LEFT':
            direction2 = 'RIGHT'

    #movement
        #snake
        new_pos = None
        if direction == 'DOWN':
            new_pos = (snake[0][0], snake[0][1] + size)
        if direction == 'UP':
            new_pos = (snake[0][0], snake[0][1] - size)
        if direction == 'LEFT':
            new_pos = (snake[0][0] - size, snake[0][1])
        if direction == 'RIGHT':
            new_pos = (snake[0][0] + size, snake[0][1])
        if new_pos:
            snake = [new_pos] + snake
            del snake[-1]

        #snake2
        new_pos2 = None
        if direction2 == 'DOWN':
            new_pos2 = (snake2[0][0], snake2[0][1] + size2)
        if direction2 == 'UP':
            new_pos2 = (snake2[0][0], snake2[0][1] - size2)
        if direction2 == 'LEFT':
            new_pos2 = (snake2[0][0] - size2, snake2[0][1])
        if direction2 == 'RIGHT':
            new_pos2 = (snake2[0][0] + size2, snake2[0][1])
        if new_pos2:
            snake2 = [new_pos2] + snake2
            del snake2[-1]

    #apple collision
        #snake
        if collision(snake[0], apple_pos):
            snake.append((-20,-20))
            size = 15
            s_skin = pygame.Surface((size, size))
            s_skin.fill((82,128,208))
            apple_pos = ((random.randint(0, 32)) * 15, (random.randint(0, 19)) * 15)
        #snake2
        if collision(snake2[0], apple_pos):
            snake2.append((-20,-20))

            apple_pos = ((random.randint(0, 67)) * 15, (random.randint(0, 38)) * 15)

    #wall collisison
        #snake
        _pos = None
        if snake[0][0] == 15:
            _pos = (990, snake[0][1])
        elif snake[0][1] == 15:
            _pos = (snake[0][0], 555)
        elif snake[0][0] == 990:
            _pos = (15, snake[0][1])
        elif snake[0][1] == 555:
            _pos = (snake[0][0], 15)
        if _pos:
            snake = [_pos] + snake
            del snake[-1]
        #snake2
        _pos2 = None
        if snake2[0][0] == 15:
            _pos2 = (1005, snake2[0][1])
        elif snake2[0][1] == 0:
            _pos2 = (snake2[0][0], 570)
        elif snake2[0][0] == 1005:
            _pos2 = (0, snake2[0][1])
        elif snake2[0][1] == 570:
            _pos2 = (snake2[0][0], 0)
        if _pos2:
            snake2 = [_pos2] + snake2
            del snake2[-1]

    #self collisison
        #snake
        if snake[0] in snake[1:]:
            print("self collision")
            gameOverBlue()
        #snake2
        if snake2[0] in snake2[1:]:
            print("self collision")
            gameOverRed()
        #snakes colliding with each other
        if snake2[0] == snake[0]:
            print("head to head collisions")
        if snake[0] in snake2:
            gameOverRed()
        if snake2[0] in snake:
            gameOverBlue()

    #rendering
        apple.fill((255,0,0))
        screen.fill((10,10,10))
        screen.blit(apple,apple_pos)
        for pos in snake:
            screen.blit(s_skin,pos)
        for pos2 in snake2:
            screen.blit(s2_skin,pos2)
        pygame.display.update()

while True:
        pygame.time.Clock().tick(fps)
        for event in pygame.event.get():
            if event.type == QUIT:
                pygame.quit()

        #input
            elif event.type == pygame.KEYDOWN:
                main()
        screen.blit(press_any, (0,0))
        pygame.display.update()

红点是食物/苹果

推荐答案

您要实现一个传送器.因此,一旦蛇越过在窗口边缘上方,您就必须将其传送到另一侧.窗口的大小为1020x585.如果 x == -15 y == -15 x == 1020 y,则蛇不在窗口外== 585 因此,您必须进行以下传送:

You want to implement a teleporter. Therefore, once the snake is over the edge of the window, you will have to teleport to the other side. The size of your window is 1020x585. The snake is out of the window if x == -15, y == -15, x == 1020 or y == 585 Hence you have to do the following teleportations:

  • 如果 x = 1020 传送到 x = 0
  • 如果 x = -15 传送到 x = 1005
  • 如果 y = 585 传送到 y = 0
  • 如果 y = -15 传送到 y = 570
  • if x = 1020 teleport to x = 0
  • if x = -15 teleport to x = 1005
  • if y = 585 teleport to y = 0
  • if y = -15 teleport to y = 570
_pos = None
if snake[0][0] == -15:
    _pos = (1005, snake[0][1])
elif snake[0][1] == -15:
    _pos = (snake[0][0], 570)
elif snake[0][0] == 1020:
    _pos = (0, snake[0][1])
elif snake[0][1] == 585:
    _pos = (snake[0][0], 0)
if _pos:
    snake = [_pos] + snake
    del snake[-1]

这篇关于如何解决蛇壁隐形传送的错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-31 10:34