Conway's Game of Life C #

2

Non sono sicuro se questo è il posto giusto per questa domanda o SO - mod si prega di spostare se necessario.

Ho intenzione di creare GoL durante il weekend come un piccolo progetto di test: link

Capisco l'algoritmo, tuttavia volevo solo verificare l'implementazione, forse da qualcuno che l'ha provato. Essenzialmente, la mia prima implementazione (di base) sarà una griglia statica a una velocità impostata.

Se ho capito bene, questi sono i passi che mi serviranno:

  1. Sementi iniziali
  2. Crea array 2d con impostazione iniziale
  3. Foreach iteration, crea un array temporaneo, calcolando ogni cella con un nuovo stato basato sull'algoritmo Game of Life
  4. Assegna matrice temporanea alla matrice corretta.
  5. Ridisegna la griglia dalla matrice corretta.

Le mie preoccupazioni sono eccessive. Quando sto popolando la griglia dall'array, sarebbe semplicemente il caso di eseguire il looping della matrice, assegnando on o off a ogni cella della griglia e quindi ridisegnare la griglia?

Sono sulla via corretta?

    
posta Darren Young 21.02.2011 - 16:58
fonte

5 risposte

3

Invece di creare un array temporaneo da utilizzare quando si aggiorna la griglia di gioco, è possibile ottenere un algoritmo più semplice e una velocità migliore se si creano 2 griglie e si riempie una griglia utilizzando i dati dell'altro. In questo modo non devi preoccuparti di non sovrascrivere i dati correnti nel prossimo passaggio.

vale a dire. le griglie, a turno, vengono aggiornate;

  1. riempi la griglia1 con l'impostazione iniziale
  2. aggiorna il display usando grid1
  3. crea griglia2 utilizzando i dati in grid1
  4. scambia griglia1 e griglia2
  5. vai al passaggio 2
risposta data 21.02.2011 - 18:20
fonte
4

La tua proposta suona bene; non vincerai alcun record di velocità, ma imparerai sicuramente come costruire un'implementazione Life di base.

Una volta che tutto funziona sfruttando la semplice implementazione, prendi in considerazione l'implementazione dell'algoritmo di Gosper. È possibile calcolare miliardi di generazioni al secondo su schede che sono miliardi di volte più grandi di quanto si possa pensare nella memoria; utilizza tecniche di programmazione funzionale per ottenere un'immensa compressione di tempo e spazio. Imparerai molto sia sulla grafica che sulle strutture dati.

    
risposta data 23.02.2011 - 20:19
fonte
2

In realtà l'ho fatto io stesso in C #, e l'ho fatto praticamente nello stesso modo in cui lo descrivi. Non era molto veloce, ma essenzialmente avevo una serie di celle e ogni volta creavo una matrice temporanea e la popolava in base alla matrice corrente, poi la copiavo nella nuova, una specie di doppio buffering.

Esistono algoritmi più veloci per il gioco della vita che passare attraverso ciascuna cella uno per uno che può dare risultati quasi istantanei, ma non ho studiato l'argomento abbastanza per dirti qualcosa su di loro.

    
risposta data 21.02.2011 - 17:39
fonte
1

Ci proverei, e so che questo è in qualche modo possibile in .NET, per posticipare il ridisegno "fisico" della griglia finché a tutte le celle non è stato assegnato il loro nuovo valore. La libreria grafica e l'hardware possono ridisegnare l'intero

    
risposta data 21.02.2011 - 17:33
fonte
1

Un suggerimento per calcolare la popolazione della nuova cella è di evitare di fare aggiunte per le otto celle circostanti ogni volta. Invece, tieni un contatore e alcune somme per le colonne sinistra e destra quando ti sposti alla prossima cella a destra:

counter = counter - lastLeftSum + newRightSum

Questo ti farà risparmiare un sacco di indicizzazione degli array e calcolo delle addizioni.

Ho anche provato l'idea di partizionare la scheda per evitare il calcolo su ampie aree vuote, ma non è passata attraverso l'implementazione (la complessità esplode). Tuttavia, penso che questo approccio consenta al tuo programma di gestire le schede enormi in modo piacevole. Riesco a vedere alcuni miglioramenti immediati consentiti dal partioning:

  1. Consente di memorizzare alcuni modelli comuni per prevedere la situazione della scheda senza calcolo.
  2. Elaborazione parallela.

Con un simulatore più veloce, è possibile scoprire una configurazione più interessante.

    
risposta data 21.02.2011 - 19:31
fonte

Leggi altre domande sui tag