5

Hola estoy intentando hacer el juego snake. Esta es la primera parte del código.

El juego se ejecuta y no aparece ningún error, sin embargo no me deja mover la cabeza de la víbora ¿por qué puede ser?

Uso Mac y he leído que a algunos usuarios de Mac también les ocurre lo mismo pero no tengo idea que puede llegar a ser. Pensé que era un problema del IDE pero lo ejecute en varios y el problema tampoco se soluciono. Ahora estoy usando los cuadernos Jupyter o PyCharm.

import turtle
import pygame
import time
posponer = 0.075

frame  = turtle.Screen()
frame.title('Juego de la viborita')
frame.bgcolor('black')
frame.setup(width = 600, height = 600)
frame.tracer(0)

#Cabeza de serpiente

cabeza = turtle.Turtle()
cabeza.speed(0)
cabeza.shape('square')
cabeza.color('white')
cabeza.penup()
cabeza.goto(0,0)
cabeza.direction = 'stop'

#Funciones que van a cambiar de direccion

def arriba(): 
    cabeza.direccion = 'up'
def abajo():
    cabeza.direccion = 'down'
def izquierda():
    cabeza.direccion = 'left'
def derecha():
    cabeza.direccion = 'right'


#Funcion del movimiento
def mov():
    if cabeza.direction == 'up':
        y = cabeza.ycor()
        cabeza.sety(y + 20)

    if cabeza.direction == 'down':
        y = cabeza.ycor()
        cabeza.sety(y - 20)

    if cabeza.direction == 'left':
        y = cabeza.ycor()
        cabeza.setx(x + 20)

    if cabeza.direction == 'right':
        y = cabeza.ycor()
        cabeza.setx(x + 20)

#Teclado


frame.listen()
frame.onkeypress(arriba,'w')
frame.onkeypress(abajo,'s')
frame.onkeypress(izquierda,'a')
frame.onkeypress(derecha,'d')


#Creo un bucle que va a correr durante el juego
#Se llama bucle principal

while True:
    frame.update()
    mov()
    time.sleep(posponer)
FJSevilla
  • 55,603
  • 7
  • 35
  • 58

1 Answers1

3

Primero en las funciones arriba, abajo, izquierda y derecha asignas al atributo direccion mientras que mov monitoriza direction. Python permite agregar atributos a una instancia cuando quieras, si intentas asignar a un atributo que la instancia no tiene, simplemente lo crea. cabeza.direction siempre es "stop"...

Corregido lo anterior, los condicionales de mov para izquierda y derecha están mal. Debes obtener la posición en el eje x (cabeza.xcor()). Además, para el caso de l movimiento a la izquierda debes restar, no sumar.

Deberías usar if-elif y no if encadenados:


import turtle
import time


posponer = 0.075

frame = turtle.Screen()
frame.title('Juego de la viborita')
frame.bgcolor('black')
frame.setup(width=600, height=600)
frame.tracer(0)

# Cabeza de serpiente
cabeza = turtle.Turtle()
cabeza.speed(0)
cabeza.shape('square')
cabeza.color('white')
cabeza.penup()
cabeza.goto(0, 0)
cabeza.direccion = 'stop'


# Funciones que van a cambiar de direccion
def arriba():
    cabeza.direccion = 'up'


def abajo():
    cabeza.direccion = 'down'


def izquierda():
    cabeza.direccion = 'left'


def derecha():
    cabeza.direccion = 'right'


#  Funcion del movimiento
def mov():
    if cabeza.direccion == 'up':
        y = cabeza.ycor()
        cabeza.sety(y + 20)

    elif cabeza.direccion == 'down':
        y = cabeza.ycor()
        cabeza.sety(y - 20)

    elif cabeza.direccion == 'left':
        x = cabeza.xcor()
        cabeza.setx(x - 20)

    elif cabeza.direccion == 'right':
        x = cabeza.xcor()
        cabeza.setx(x + 20)


# Teclado
frame.listen()
frame.onkeypress(arriba, 'w')
frame.onkeypress(abajo, 's')
frame.onkeypress(izquierda, 'a')
frame.onkeypress(derecha, 'd')

# Creo un bucle que va a correr durante el juego
# Se llama bucle principal
while True:
    frame.update()
    mov()
    time.sleep(posponer)

introducir la descripción de la imagen aquí

FJSevilla
  • 55,603
  • 7
  • 35
  • 58