Angry Birds è deterministico?

Mentre cercavo di get 3 stelle su livelli più complessi (quelli con molte entity framework; distruttibili) ho notato che anche dopo aver giocato allo stesso livello più di 50 volte, facendo sempre la stessa cosa, non ho mai visto lo stesso risultato finale. Qualcosa va sempre diversamente.

Lo stesso input produce sempre lo stesso risultato o c'è un fattore random?

L' algorithm è deterministico, ma è discutibile che il risultato complessivo del lancio di un uccello sia effettivamente non deterministico perché si basa su input (straordinariamente sensibili) dell'utente.

Per testare l'algorithm e l'effetto che l'input dell'utente ha su di esso, ho usato la seguente procedura:

  • Carica la versione di Chrome di Angry Birds
  • Caricare il livello 1-1
  • Riport il mouse a una coordinata XY specifica. (Questo era oltre il punto di "full draw" per l'uccello.)
  • Rilascia l'uccello e attendi che il gioco raggiunga uno stato stazionario.

Per misurare la mia coordinata XY, ho aperto una window di Chrome in background e l'ho spostata in questa pagina . Ho allineato le due windows in modo che potessi vedere le posizioni X e Y del mouse mentre ancora riuscivo a far accadere qualcosa quando ho rilasciato l'uccello. Ho allineato il mio cursore del mouse con l'angolo in basso a sinistra della scatola attorno a questi due numbers, e poi rilasciato. Ho notato la posizione del mio cursore del mouse (dato che lo schermo si aggiorna solo quando il mouse non viene rilasciato e il cursore si trova su quella window) e poi ha notato il punteggio risultante in Angry Birds. Se si riscontrano problemi con il posizionamento esatto del mouse, è ansible provare un'opzione di accessibilità offerta dal sistema operativo, ad esempio, Mouse Key su Windows.

Ho ottenuto lo stesso punteggio, purché il mio cursore si trovasse nello stesso punto in cui si trovava nelle iterazioni precedenti.

Prima di creare un rig di prova avanzato che mi permettesse di misurare la posizione del mio cursore sul pixel, ho eseguito questo esperimento circa 10 volte, usando un punto di riferimento nell'image di background del gioco. Ho ottenuto punteggi sparando il primo uccello che variava tra 8.000 e 11.000 punti. Usando la strategia di test avanzata, se fossi fuori da un singolo pixel, potrei aspettarmi differenze di punteggio tra i 150 e i 500 punti.

Noterò che il cursore si trova oltre il bordo dell'area di gioco , al di fuori della window del browser, ben oltre la distanza massima che l'uccello può ritrarre, e ho notato differenze quando muovevo il cursore anche su un singolo pixel.

Inoltre, ho preso screencaps per un caso estremo in cui il mio cursore si trovava su un monitor diverso rispetto alla window di gioco, e ho eseguito diverse iterazioni in cui tenevo il mio cursore nella stessa posizione, o lo spostavo leggermente. Con i miei calcoli (basati sulla misurazione della distanza da screencaps) il gioco è stato in grado di creare un risultato diverso (punteggio 32960 vs 31520) basato su un dislivello di un pixel (544 vs 545 pixel) su una distanza di circa 1.284 pixel di width. Questo funziona per essere una differenza angular di 0,03 gradi.

Direi che per qualsiasi scopo pratico, ci si può aspettare di impiegare la stessa strategia generale sullo stesso livello ripetutamente e si aspettano risultati estremamente variables. Il livello di sensibilità nei controlli è così estremo che non c'è un modo pratico per farlo fare due volte la stessa cosa. Ciò è esacerbato dal fatto che se stai giocando su un touchscreen, sarebbe straordinariamente difficile riprodurre gli stessi movimenti fino al singolo pixel.

Angry Birds utilizza la libreria Box2D per la fisica.

Box2D è deterministico? Per lo stesso input e lo stesso binario, Box2D riprodurrà qualsiasi simulazione. Box2D non usa numbers casuali né basa alcun calcolo su events casuali (come i timer, ecc.).

Tuttavia, le persone spesso vogliono un determinismo più rigoroso. Le persone spesso vogliono sapere se Box2D può produrre risultati identici su binari diversi e su piattaforms diverse. La risposta è no. Il motivo di questa risposta riguarda il modo in cui la math in virgola mobile viene implementata in molti compilatori e processri. Consiglio di leggere questo articolo se sei curioso: http://www.yosefk.com/blog/consistency-how-to-defeat-the-purpose-of-ieee-floating-point.html

http://code.google.com/p/box2d/wiki/FAQ#Determinism

Alcuni livelli sono soggetti a esplosioni casuali poco dopo l'inizio del livello, e alcuni mattoni possono cadere da soli prima di aver mai lanciato un uccello. Questi events si verificano raramente, ma nel momento in cui hai tre stelle di each livello in each gioco probabilmente lo avrai visto alcune volte, come ho fatto io.

Mi aspetto che ciò si verifichi a causa di problemi di temporizzazione, probabilmente legati al threading. Sono abbastanza sicuro che se hai fatto un test in cui hai caricato each livello una dozzina di volte e hai aspettato trenta secondi, avresti ottenuto un punteggio diverso da zero alless una volta. Alla luce della risposta di Pubby posso solo supporre che l'app Angry Birds non fornisca sempre lo stesso input per le funzioni di Box2D all'inizio di un livello.

Ho giocato su Facebook utilizzando un registratore di macro. Ho avviato il registratore, sono andato alla window degli uccelli arrabbiati, ho zumato e ho giocato ai primi due uccelli. Ho quindi fermato il registratore. Ogni volta, il mouse è andato ai pixel esatti e rilasciato con lo stesso esatto potere ecc. Doveva, perché il movimento del mouse registrato fa sempre la stessa cosa, pixel per pixel. Ogni volta ho ottenuto un punteggio diverso, e non each volta lo stesso numero di maiali uccisi ecc. Questo gioco è incoerente

Ho fatto 10 test, tirando sempre allo stesso punto (anche Chrome Angry Birds, livello 1, come nei test di agent86).

Red Crosshair del punto di prova

Non ho mai ricevuto lo stesso punteggio due volte, nonostante stia attento a tirare nello stesso identico punto, e lo faccio subito dopo l'inizio del livello. Credo che Angry Birds non sia molto deterministico.

Questo è piuttosto facile da spiegare: è stato progettato per funzionare su piccoli touch screen. Se fosse deterministico, gli utenti potrebbero ripetere facilmente le mosse a causa della precisione limitata del dispositivo di input. Ciò potrebbe essere negativo, in quanto il loro dispositivo potrebbe letteralmente non avere la precisione necessaria per mirare all'angolazione e alla potenza esatta che vogliono. Facendo oscillare leggermente i risultati, e grazie all'input di un "dito", gli utenti non noterebbero la mancanza di precisione e non sarebbero frustrati nemless dal fatto di non essere in grado di effettuare uno scatto desiderato.