Como hago para que la nave no salga de la pantalla y como agregar un botón para jugar de nuevo

Hola buenas tengo un problemas y es con que no puedo hacer que la nave no salga de la pantalla y ademas de que no puedo agregar un botón para volver a jugar cuando pierde… Ayuda este es mi codigo:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

fondo = pilas.fondos.Galaxia()
nave = pilas.actores.Nave()

puntaje = pilas.actores.Puntaje(x=-300, y=200, color='blanco')

piedra = pilas.actores.Piedra()
piedra.x = 200
piedra.dx = pilas.azar(1, 2)/2.0
piedra.dy = pilas.azar(1, 2)/2.0


## Colision nave / piedra
def cuando_colisiona_con_la_nave():
    explosion = pilas.actores.Explosion()
    explosion.x = nave.x
    explosion.y = nave.y
    nave.eliminar()
    pilas.avisar("Juego perdido!")

    
pilas.colisiones.agregar('Nave', 'Piedra', cuando_colisiona_con_la_nave)


## Colision disparo
def cuando_colisiona_con_la_nave(disparo, piedra):
    explosion = pilas.actores.ExplosionDeHumo()
    explosion.x = piedra.x
    explosion.y = piedra.y
    disparo.eliminar()
    piedra.eliminar()
    puntaje.aumentar()
    
pilas.colisiones.agregar('Misil', 'Piedra', cuando_colisiona_con_la_nave)


def crear_piedra():
    piedra = pilas.actores.Piedra()
    piedra.x = 200
    piedra.dx = pilas.azar(1, 2)/2.0
    piedra.dy = pilas.azar(1, 2)/2.0
    piedra.y = 300


pilas.tareas.siempre(3, crear_piedra)

pilas.ejecutar()

Hola @Destroyer, con respecto a mantener la nave en pantalla me parece que lo más sencillo es usar esta sentencia:

nave.aprender("seMantieneEnPantalla")

Con esa linea, le estarías aplicando a la nave la habilidad de salir y reingresar automáticamente como hace pacman o los mismos asteroides en el juego. Es decir, si la nave sale por la derecha de la pantalla automáticamente va a reingresar por la izquierda.

Otra opción, es agregar una función para que la nave se mantenga en los límites de la pantalla pero que no pueda salir de ninguna manera:

def mantener_en_pantalla(t):
    if nave.arriba > pilas.alto() / 2:
            nave.arriba = pilas.alto() / 2
    if nave.abajo < -pilas.alto() / 2:
            nave.abajo = -pilas.alto() / 2
    if nave.derecha > pilas.ancho() /2:
            nave.derecha = pilas.ancho() /2
    if nave.izquierda < -pilas.ancho() /2:
            nave.izquierda = -pilas.ancho() /2
        
pilas.eventos.actualizar.conectar(mantener_en_pantalla)

Las dos opciones son válidas, depende de qué te gustaría que suceda cuando la nave está por salir de la pantalla.

Con respecto a tu otra consulta, cómo reiniciar el juego, lo ideal es que impletementes el juego en una escena separada, así vas a poder reiniciarla fácilmente. A grandes rasgos, para llevar el código de tu juego en una escena hay que crear una clase y poner todo el código dentro de esa clase.

Acá va el código completo de cómo me imagino que podrías implementarlo en tu juego, agregué un botón para reiniciar el juego que aparece una vez que la nave explota:

Código:

# coding: utf-8
import pilasengine

pilas = pilasengine.iniciar()

class Juego(pilasengine.escenas.Escena):
    
    def iniciar(self):
        self.juego_perdido = False
        fondo = pilas.fondos.Galaxia()
        nave = pilas.actores.Nave()
        self.nave = nave

        puntaje = pilas.actores.Puntaje(x=-300, y=200, color='blanco')
        self.puntaje = puntaje
        piedra = pilas.actores.Piedra()
        piedra.x = 200
        piedra.dx = pilas.azar(1, 2)/2.0
        piedra.dy = pilas.azar(1, 2)/2.0

        pilas.colisiones.agregar('Nave', 'Piedra', self.cuando_colisiona_con_la_nave)

        pilas.colisiones.agregar('Misil', 'Piedra', self.cuando_colisiona_disparo_con_piedra)
        pilas.tareas.siempre(3, self.crear_piedra)


    def actualizar(self):
        self.mantener_en_pantalla()
        
    ## Colision nave / piedra
    def cuando_colisiona_con_la_nave(self):
        explosion = self.pilas.actores.Explosion()
        explosion.x = self.nave.x
        explosion.y = self.nave.y
        self.nave.eliminar()
        self.pilas.avisar("Juego perdido!")
        self.crear_boton_reintentar()
        self.juego_perdido = True
        
    def crear_boton_reintentar(self):
        boton = pilas.interfaz.Boton("Reintentar")
        boton.conectar(pilas.escenas.Juego)

    ## Colision disparo
    def cuando_colisiona_disparo_con_piedra(self, disparo, piedra):
        explosion = self.pilas.actores.ExplosionDeHumo()
        explosion.x = piedra.x
        explosion.y = piedra.y
        disparo.eliminar()
        piedra.eliminar()
        self.puntaje.aumentar()

    def mantener_en_pantalla(self):
        alto = 250
        ancho = 320
        
        if self.nave.arriba > alto:
                self.nave.arriba = alto
        if self.nave.abajo < -alto:
                self.nave.abajo = -alto
        if self.nave.derecha > ancho:
                self.nave.derecha = ancho
        if self.nave.izquierda < -ancho:
                self.nave.izquierda = -ancho

    def crear_piedra(self):
        # Evita crear una piedra si el juego termino
        if self.juego_perdido:
            return
            
        piedra = self.pilas.actores.Piedra()
        piedra.x = 200
        piedra.dx = self.pilas.azar(1, 2)/2.0
        piedra.dy = self.pilas.azar(1, 2)/2.0
        piedra.y = 300

        
                
pilas.escenas.vincular(Juego)
pilas.escenas.Juego()

pilas.ejecutar()

Avisanos cualquier cosa!