C ++ Snake Game Fruit: modifica le coordinate o genera nuovi oggetti?

2

Ho deciso di appoggiare SDL e creare un gioco Snake. Ho imparato a codificare la deposizione di un frutto, che il serpente mangia per allungarsi. Ogni volta che il serpente mangia il frutto, il frutto deve cambiare in una posizione casuale sullo schermo. Posso semplicemente cambiare le sue coordinate in nuove casuali, oppure posso distruggere il vecchio frutto oggetto (che è stato mangiato dal serpente) e farlo puntare a un nuovo oggetto con nuove coordinate. Qual è più efficiente? Ecco alcuni pseudo-codice, per riferimento:

Opzione 1:

if (snake_eats_fruit) fruit->changeCoordinates();

Opzione 2:

if (snake_eats_fruit) fruit = new Fruit(); // fruit's constructor sets random coordinates

Quindi dovrei mantenere lo stesso oggetto e cambiare le sue coordinate, o creare un puntatore a un nuovo oggetto con coordinate diverse? Grazie!

    
posta Archie Gertsman 01.07.2016 - 02:02
fonte

2 risposte

2

La prima opzione è probabilmente più veloce. Con la seconda hai, almeno, l'ulteriore compito di allocazione della memoria.

Comunque questo è un buon esempio di ottimizzazione prematura : le prestazioni non dovrebbero essere un problema per questo tipo di operazione.

Il serpente mangia un frutto solo occasionalmente. Tra due pasti ci sono molti altri (complessi) eventi che si verificano e l'azione di cambiare la posizione dei frutti è trascurabile.

Alcuni aspetti da considerare sono:

  • ho bisogno di un'allocazione esplicita della memoria? ( new Fruit() ).

    Può essere fonte di perdite di memoria / risorse e può essere più lento (ad es. Perché i programmatori C ++ dovrebbero ridurre al minimo l'uso di "nuovi" ? ).

    Se hai davvero bisogno dell'allocazione dinamica usa un puntatore intelligente

  • con la seconda opzione puoi facilmente creare un puntatore pendente

    Fruit *fruit = new Fruit();
    Fruit *fruit2 = fruit;
    
    // Snake eats fruit.
    delete fruit;
    fruit = new Fruit();
    
    // now fruit2 points to something which is not valid anymore
    
risposta data 01.07.2016 - 11:33
fonte
1

La prima opzione è molto meglio per tutti i motivi indicati da manlio. Inoltre, in questo caso puoi anche utilizzare il pattern Observer in modo che quando chiami

fruit->ChangeCoordinates();

puoi aumentare il punteggio all'interno di quel metodo. Solo un pensiero ...

    
risposta data 01.07.2016 - 12:23
fonte

Leggi altre domande sui tag