Conway's game of life
8 berichten
• Pagina 1 van 1
Conway's game of life
Hai ,
Ben opzoek naar een programma van game of life op een lcd van 20x4 karakters , heb de volgende site's gevonden
http://blog.thelifeofkenneth.com/2009/0 ... mment-form
https://gist.github.com/PhirePhly/193087/
Mijn vraag is nu hoe maak ik het display wat groter , nu is het X=4 en Y=2 karakters zou graag mijn volledig scherm 20X4 karakters gebruiken
De tekst wordt dan weg gehaald uit de code
Is dit gemakkelijk te veranderen????
Dank bij voorbaat
Hier volgt de code
/* The Game of Life displayed on an HD44780 LCD from an Arduino */
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers
// of the interface pins
LiquidCrystal lcd(12,11,5,4,3,2);
#define WORLDMAXX 19
#define WORLDMAXY 15
byte world[WORLDMAXX+1][WORLDMAXY+1];
// check this for stable states every 6
byte oldworld[WORLDMAXX+1][WORLDMAXY+1];
int stepcount;
void initworld();
void isalive(int x, int y);
int countneighbor(int x, int y);
void generatechars();
void printworld();
void setup() {
// set up the LCD's number of rows and columns:
lcd.begin(20, 4); //was (16,2)
randomSeed(analogRead(0));
lcd.setCursor(4, 0);
lcd.print(" Conway's");
lcd.setCursor(4, 1);
lcd.print("Game of Life");
initworld();}
void loop() {
int i, j;
generatechars();
printworld();
for (i = 0;
i<= WORLDMAXX; i++) {
for (j = 0;
j<= WORLDMAXY; j++) {
isalive(i,j);
}
}
for (i = 0;
i<= WORLDMAXX; i++) {
for (j = 0; j<= WORLDMAXY; j++) {
world[i][j] = world[i][j] >> 1;
}
}
// Every 6 steps, check to see if the
// world is in a stable state
if (stepcount) {
delay(300);
} else {
int diffflag = 0;
for (i = 0;
i<= WORLDMAXX; i++) {
for (j = 0; j<= WORLDMAXY; j++) {
if (world[i][j] != oldworld[i][j]) {
// they're still different
diffflag = 1;
}
}
}
if (diffflag == 0) {
// we're in steady state
initworld();
} else {
// save the new world for later
for (i = 0; i<= WORLDMAXX; i++) {
for (j = 0; j<= WORLDMAXY; j++) {
oldworld[i][j] = world[i][j];
}
}
}
delay (297); // It takes about 3ms to check...
}
stepcount = (stepcount + 1) % 6;}
void initworld() {
int i, j;
for (i=0; i<=WORLDMAXX; i++) {
for (j=0; j<=WORLDMAXY; j++) {
world[i][j] = !random(4);
}
}
stepcount = 0;
return;}
// Calculate the next state for the square
void isalive(int x, int y) {
int count = countneighbor(x, y);
if (count == 2) {
// 2 neighbors, stay the same
world[x][y] += world[x][y] << 1; }
if (count == 3) { // 3 neighbors, must be alive
world[x][y] += 2; } // any other number of neighbors, must be dead
return;
}
int countneighbor(int x, int y) {
int count = 0;
if (x > 0) {
count += world[x-1][y] & 1;
if (y > 0) {
count += world[x-1][y-1] & 1;
}
if (y < WORLDMAXY) {
count += world[x-1][y+1] & 1;
}
}
if (x < WORLDMAXX) {
count += world[x+1][y] & 1;
if (y > 0) {
count += world[x+1][y-1] & 1;
}
if (y < WORLDMAXY) {
count += world[x+1][y+1] & 1;
}
}
if (y > 0) {
count += world[x][y-1] & 1; }
if (y < WORLDMAXY) {
count += world[x][y+1] & 1; }
return count;
}
// pack world[][] into the required byte[8]
// arrays to be passed to the LCD
void generatechars() {
byte tempchar[8];
int i, j, k, l;
for (i = 0; i<2; i+=1) { // y poss / 8
for (j = 0; j<4; j+=1) { // x poss / 5
for (k = 0;
k < 8; k+=1) {
tempchar[k] = 0;
for (l = 0; l<5; l+=1) {
tempchar[k] += (world[j*5 + l][i * 8 + k] & 1) << (4 - l);
}
}
// done building this char
lcd.createChar(i*4 + j, tempchar);
}
}
return;
}
void printworld() { int i, j;
for (i=0; i<2; i+=1) {
lcd.setCursor(0, i);
for (j=0; j<4; j+=1) {
lcd.write(i*4 + j);
}
}
return;
}
Ben opzoek naar een programma van game of life op een lcd van 20x4 karakters , heb de volgende site's gevonden
http://blog.thelifeofkenneth.com/2009/0 ... mment-form
https://gist.github.com/PhirePhly/193087/
Mijn vraag is nu hoe maak ik het display wat groter , nu is het X=4 en Y=2 karakters zou graag mijn volledig scherm 20X4 karakters gebruiken
De tekst wordt dan weg gehaald uit de code
Is dit gemakkelijk te veranderen????
Dank bij voorbaat
Hier volgt de code
/* The Game of Life displayed on an HD44780 LCD from an Arduino */
// include the library code:
#include <LiquidCrystal.h>
// initialize the library with the numbers
// of the interface pins
LiquidCrystal lcd(12,11,5,4,3,2);
#define WORLDMAXX 19
#define WORLDMAXY 15
byte world[WORLDMAXX+1][WORLDMAXY+1];
// check this for stable states every 6
byte oldworld[WORLDMAXX+1][WORLDMAXY+1];
int stepcount;
void initworld();
void isalive(int x, int y);
int countneighbor(int x, int y);
void generatechars();
void printworld();
void setup() {
// set up the LCD's number of rows and columns:
lcd.begin(20, 4); //was (16,2)
randomSeed(analogRead(0));
lcd.setCursor(4, 0);
lcd.print(" Conway's");
lcd.setCursor(4, 1);
lcd.print("Game of Life");
initworld();}
void loop() {
int i, j;
generatechars();
printworld();
for (i = 0;
i<= WORLDMAXX; i++) {
for (j = 0;
j<= WORLDMAXY; j++) {
isalive(i,j);
}
}
for (i = 0;
i<= WORLDMAXX; i++) {
for (j = 0; j<= WORLDMAXY; j++) {
world[i][j] = world[i][j] >> 1;
}
}
// Every 6 steps, check to see if the
// world is in a stable state
if (stepcount) {
delay(300);
} else {
int diffflag = 0;
for (i = 0;
i<= WORLDMAXX; i++) {
for (j = 0; j<= WORLDMAXY; j++) {
if (world[i][j] != oldworld[i][j]) {
// they're still different
diffflag = 1;
}
}
}
if (diffflag == 0) {
// we're in steady state
initworld();
} else {
// save the new world for later
for (i = 0; i<= WORLDMAXX; i++) {
for (j = 0; j<= WORLDMAXY; j++) {
oldworld[i][j] = world[i][j];
}
}
}
delay (297); // It takes about 3ms to check...
}
stepcount = (stepcount + 1) % 6;}
void initworld() {
int i, j;
for (i=0; i<=WORLDMAXX; i++) {
for (j=0; j<=WORLDMAXY; j++) {
world[i][j] = !random(4);
}
}
stepcount = 0;
return;}
// Calculate the next state for the square
void isalive(int x, int y) {
int count = countneighbor(x, y);
if (count == 2) {
// 2 neighbors, stay the same
world[x][y] += world[x][y] << 1; }
if (count == 3) { // 3 neighbors, must be alive
world[x][y] += 2; } // any other number of neighbors, must be dead
return;
}
int countneighbor(int x, int y) {
int count = 0;
if (x > 0) {
count += world[x-1][y] & 1;
if (y > 0) {
count += world[x-1][y-1] & 1;
}
if (y < WORLDMAXY) {
count += world[x-1][y+1] & 1;
}
}
if (x < WORLDMAXX) {
count += world[x+1][y] & 1;
if (y > 0) {
count += world[x+1][y-1] & 1;
}
if (y < WORLDMAXY) {
count += world[x+1][y+1] & 1;
}
}
if (y > 0) {
count += world[x][y-1] & 1; }
if (y < WORLDMAXY) {
count += world[x][y+1] & 1; }
return count;
}
// pack world[][] into the required byte[8]
// arrays to be passed to the LCD
void generatechars() {
byte tempchar[8];
int i, j, k, l;
for (i = 0; i<2; i+=1) { // y poss / 8
for (j = 0; j<4; j+=1) { // x poss / 5
for (k = 0;
k < 8; k+=1) {
tempchar[k] = 0;
for (l = 0; l<5; l+=1) {
tempchar[k] += (world[j*5 + l][i * 8 + k] & 1) << (4 - l);
}
}
// done building this char
lcd.createChar(i*4 + j, tempchar);
}
}
return;
}
void printworld() { int i, j;
for (i=0; i<2; i+=1) {
lcd.setCursor(0, i);
for (j=0; j<4; j+=1) {
lcd.write(i*4 + j);
}
}
return;
}
Advertisement
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Conway's game of life
Zomaar een beetje een gok:
// pack world[][] into the required byte[8]
// arrays to be passed to the LCD
void generatechars() {
//
// verander tempchar[8] in tempchar[80
//
byte tempchar[8];
int i, j, k, l;
//
// verander i<2 in i<4
//
for (i = 0; i<2; i+=1) { // y poss / 8
//
// verander j <4 in j<20
//
for (j = 0; j<4; j+=1) { // x poss / 5
//
// verander k<8 in k<80
//
for (k = 0; k < 8; k+=1) {
tempchar[k] = 0;
for (l = 0; l<5; l+=1) {
//
// kan zijn dat je die 8 in 80 moet veranderen maar dat zou wel eens een geheugen probleem kunnen worden
//
tempchar[k] += (world[j*5 + l][i * 8 + k] & 1) << (4 - l);
}
}
// done building this char
//
// kan zijn dat je de 4 in 20 moet veranderen
//
lcd.createChar(i*4 + j, tempchar);
}
}
return;
}
void printworld() { int i, j;
//
// hier de 2 in 4 veranderen en de 4 in 20
//
for (i=0; i<2; i+=1) {
lcd.setCursor(0, i);
for (j=0; j<4; j+=1) {
lcd.write(i*4 + j);
}
}
return;
}
zou mijn eerste stap zijn.
// pack world[][] into the required byte[8]
// arrays to be passed to the LCD
void generatechars() {
//
// verander tempchar[8] in tempchar[80
//
byte tempchar[8];
int i, j, k, l;
//
// verander i<2 in i<4
//
for (i = 0; i<2; i+=1) { // y poss / 8
//
// verander j <4 in j<20
//
for (j = 0; j<4; j+=1) { // x poss / 5
//
// verander k<8 in k<80
//
for (k = 0; k < 8; k+=1) {
tempchar[k] = 0;
for (l = 0; l<5; l+=1) {
//
// kan zijn dat je die 8 in 80 moet veranderen maar dat zou wel eens een geheugen probleem kunnen worden
//
tempchar[k] += (world[j*5 + l][i * 8 + k] & 1) << (4 - l);
}
}
// done building this char
//
// kan zijn dat je de 4 in 20 moet veranderen
//
lcd.createChar(i*4 + j, tempchar);
}
}
return;
}
void printworld() { int i, j;
//
// hier de 2 in 4 veranderen en de 4 in 20
//
for (i=0; i<2; i+=1) {
lcd.setCursor(0, i);
for (j=0; j<4; j+=1) {
lcd.write(i*4 + j);
}
}
return;
}
zou mijn eerste stap zijn.
Re: Conway's game of life
maxworldx veranderen en dan naar nico kijken. kun je gelijk zien hoe belangrijk comments zijn als je iets wil veranderen.
programma bestaat uit twee delen een world maker voor het life programma en dan worden de characters gemaakt die vervolgens op het display gezet worden.
programma bestaat uit twee delen een world maker voor het life programma en dan worden de characters gemaakt die vervolgens op het display gezet worden.
paul deelen
shooter@home.nl
shooter@home.nl
Re: Conway's game of life
Hai ,
Thanks voor de snelle reacties , heb reeds de uitleg gevolgd die jullie mij gaven
#define WORLDMAXX 19
#define WORLDMAXY 15
Als ik #define WORLDMAXX 19 vervang door 99 ( volledig lcd scherm) krijg ik een error not enough memory , zelfs halveren doet het niet
Als ik Nico gegevens invoeg krijg ik op de bovenste lijn 4 x de copy van de eerste lijn
op de 2 de lijn 3x de copy van de eerste lijn
op de 3 de lijn 2x de copy van de eerste lijn
We zullen nog wat verder zoeken
Het programma gebruikt 13% voor de sketch
en 35% voor de dynamische memory
Heb wel inmiddels een prog gevonden voor een lcd 20x4 en waar ik het begin scherm kan veranderen en het prog is ook wat kleiner
https://github.com/szczys/arduino-chara ... r_life.ino
Nu is de bedoeling om met een zelf getekende begin scherm de eind resultaat te bekijken ( kan zijn een glider ,oscillator ,still-life, oid )
zodat we eventueel nieuwe patterns kunnen maken ??????
Het programma geeft 12% nodig voor de sketch
en 4% nodig voor de dynamische memory
Hier de code voor de bereidwilligen:
/* Conway's Game of Life
*
* 2012-05-26
* Mike Szczys
* jumptuck.com
* CC-BY-SA
*
* Hardware: Arduino and 20x4 character LCD
*
* This program will play Conway's Game of Life
* of a 20x4 character LCD. It uses custom characters
* to divide each row in two for a total resolution of 20x8
*
* REQUIRES:
* LiquidCrystal library that is built into the Arduino IDE
*
* TODO:
* -Fix bug that generates garbage at column 0
* -Add a button for more random input
*
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
/*
Display buffer:
* index 0-19 for characters left to right
*
* -each column is a bye
* -LSB is top row (four character rows, eight virtual rows)
********************************/
char lifeboard[20] = {
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256)
};
// make some custom characters:
byte box_full[8] = {
0b01110,
0b01110,
0b01110,
0b00000,
0b00000,
0b01110,
0b01110,
0b01110
};
byte box_N[8] = {
0b01110,
0b01110,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
byte box_S[8] = {
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b01110,
0b01110,
0b01110
};
void evolve() {
//Setup a temporary game baord for the next generation
unsigned char nextGeneration[20];
for (unsigned char i=1;
i<20;
i++) nextGeneration[i] = 0;
//Iterate through all current cells to calculate next generation
for (unsigned char row=0; row<8; row++) {
for (unsigned char col=0; col<20; col++) {
//get state of this cell
unsigned char thisCell = 0;
if (lifeboard[col]&(1<<row)) thisCell = 1;
//===start check of all neighbors===
unsigned char neighbor_count = 0;
//get search coordinates
unsigned char neighbor_cols[3] = {col-1, col, col+1};
//fix wrap around for board
if (col == 0) neighbor_cols[0] = 19;
if (col == 19) neighbor_cols[2] = 0;
unsigned char neighbor_rows[3] = {row-1, row, row+1};
//fix wrap around for board
if (row == 0) neighbor_rows[0] = 7;
if (row == 7) neighbor_rows[2] = 0;
for (unsigned char i=0; i<3; i++) {
for (unsigned char j=0; j<3; j++) {
if (lifeboard[neighbor_cols[i]]&(1<<neighbor_rows[j])) neighbor_count += 1;
}
}
//Subtract current cell as it was counted as a neighbor
neighbor_count -= thisCell;
//===end check of all neighbors===
//use neighbor_count to check Conway's Game of Life rules
if (thisCell) {
if ((neighbor_count < 2) || (neighbor_count > 3)) nextGeneration[col] &= ~(1<<row);
else nextGeneration[col] |= (1<<row);
}
else if (neighbor_count == 3) nextGeneration[col] |= 1<<row;
}
}
//copy all temp values to the screen game board
for (unsigned char i=0; i<20; i++) {
lifeboard[i] = nextGeneration[i];
}
}
void setup() {
lcd.createChar(0, box_full);
lcd.createChar(1, box_N);
lcd.createChar(2, box_S);
lcd.begin(20, 4);}void loop() {
for (unsigned char row=0; row<4; row++){
lcd.setCursor(0, row);
unsigned char v_row1 = row*2;
unsigned char v_row2 = v_row1 + 1;
for (unsigned char col=0; col<20; col++) {
if ((lifeboard[col]&(1<<v_row1)) && (lifeboard[col]&(1<<v_row2))) lcd.write((byte)0);
else if (lifeboard[col]&(1<<v_row1)) lcd.write((byte)1);
else if (lifeboard[col]&(1<<v_row2)) lcd.write((byte)2);
else lcd.print(' ');
}
}
evolve();
delay(300);
//lcd.print(millis()/1000);
}
mvg
Thanks voor de snelle reacties , heb reeds de uitleg gevolgd die jullie mij gaven
#define WORLDMAXX 19
#define WORLDMAXY 15
Als ik #define WORLDMAXX 19 vervang door 99 ( volledig lcd scherm) krijg ik een error not enough memory , zelfs halveren doet het niet
Als ik Nico gegevens invoeg krijg ik op de bovenste lijn 4 x de copy van de eerste lijn
op de 2 de lijn 3x de copy van de eerste lijn
op de 3 de lijn 2x de copy van de eerste lijn
We zullen nog wat verder zoeken
Het programma gebruikt 13% voor de sketch
en 35% voor de dynamische memory
Heb wel inmiddels een prog gevonden voor een lcd 20x4 en waar ik het begin scherm kan veranderen en het prog is ook wat kleiner
https://github.com/szczys/arduino-chara ... r_life.ino
Nu is de bedoeling om met een zelf getekende begin scherm de eind resultaat te bekijken ( kan zijn een glider ,oscillator ,still-life, oid )
zodat we eventueel nieuwe patterns kunnen maken ??????
Het programma geeft 12% nodig voor de sketch
en 4% nodig voor de dynamische memory
Hier de code voor de bereidwilligen:
/* Conway's Game of Life
*
* 2012-05-26
* Mike Szczys
* jumptuck.com
* CC-BY-SA
*
* Hardware: Arduino and 20x4 character LCD
*
* This program will play Conway's Game of Life
* of a 20x4 character LCD. It uses custom characters
* to divide each row in two for a total resolution of 20x8
*
* REQUIRES:
* LiquidCrystal library that is built into the Arduino IDE
*
* TODO:
* -Fix bug that generates garbage at column 0
* -Add a button for more random input
*
*/
#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
/*
Display buffer:
* index 0-19 for characters left to right
*
* -each column is a bye
* -LSB is top row (four character rows, eight virtual rows)
********************************/
char lifeboard[20] = {
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256),
random(256)
};
// make some custom characters:
byte box_full[8] = {
0b01110,
0b01110,
0b01110,
0b00000,
0b00000,
0b01110,
0b01110,
0b01110
};
byte box_N[8] = {
0b01110,
0b01110,
0b01110,
0b00000,
0b00000,
0b00000,
0b00000,
0b00000
};
byte box_S[8] = {
0b00000,
0b00000,
0b00000,
0b00000,
0b00000,
0b01110,
0b01110,
0b01110
};
void evolve() {
//Setup a temporary game baord for the next generation
unsigned char nextGeneration[20];
for (unsigned char i=1;
i<20;
i++) nextGeneration[i] = 0;
//Iterate through all current cells to calculate next generation
for (unsigned char row=0; row<8; row++) {
for (unsigned char col=0; col<20; col++) {
//get state of this cell
unsigned char thisCell = 0;
if (lifeboard[col]&(1<<row)) thisCell = 1;
//===start check of all neighbors===
unsigned char neighbor_count = 0;
//get search coordinates
unsigned char neighbor_cols[3] = {col-1, col, col+1};
//fix wrap around for board
if (col == 0) neighbor_cols[0] = 19;
if (col == 19) neighbor_cols[2] = 0;
unsigned char neighbor_rows[3] = {row-1, row, row+1};
//fix wrap around for board
if (row == 0) neighbor_rows[0] = 7;
if (row == 7) neighbor_rows[2] = 0;
for (unsigned char i=0; i<3; i++) {
for (unsigned char j=0; j<3; j++) {
if (lifeboard[neighbor_cols[i]]&(1<<neighbor_rows[j])) neighbor_count += 1;
}
}
//Subtract current cell as it was counted as a neighbor
neighbor_count -= thisCell;
//===end check of all neighbors===
//use neighbor_count to check Conway's Game of Life rules
if (thisCell) {
if ((neighbor_count < 2) || (neighbor_count > 3)) nextGeneration[col] &= ~(1<<row);
else nextGeneration[col] |= (1<<row);
}
else if (neighbor_count == 3) nextGeneration[col] |= 1<<row;
}
}
//copy all temp values to the screen game board
for (unsigned char i=0; i<20; i++) {
lifeboard[i] = nextGeneration[i];
}
}
void setup() {
lcd.createChar(0, box_full);
lcd.createChar(1, box_N);
lcd.createChar(2, box_S);
lcd.begin(20, 4);}void loop() {
for (unsigned char row=0; row<4; row++){
lcd.setCursor(0, row);
unsigned char v_row1 = row*2;
unsigned char v_row2 = v_row1 + 1;
for (unsigned char col=0; col<20; col++) {
if ((lifeboard[col]&(1<<v_row1)) && (lifeboard[col]&(1<<v_row2))) lcd.write((byte)0);
else if (lifeboard[col]&(1<<v_row1)) lcd.write((byte)1);
else if (lifeboard[col]&(1<<v_row2)) lcd.write((byte)2);
else lcd.print(' ');
}
}
evolve();
delay(300);
//lcd.print(millis()/1000);
}
mvg
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Conway's game of life
En wat verwacht je nu van ons? Dat wij jouw programma gaan schrijven?
Re: Conway's game of life
Hai ,
Nee nee ,wacht maar af tot ik in een knoop geraak dan kan ik hulp gebruiken
Ik weet dat jullie op de achtergrond meekijken
Bedankt in ieder geval voor de uitnodiging
Zal wel een tijdje duren ???
Mvg
Nee nee ,wacht maar af tot ik in een knoop geraak dan kan ik hulp gebruiken
Ik weet dat jullie op de achtergrond meekijken
Bedankt in ieder geval voor de uitnodiging
Zal wel een tijdje duren ???
Mvg
- nicoverduin
- Berichten: 5043
- Geregistreerd: 13 Mei 2013, 20:57
- Woonplaats: Heemskerk
Re: Conway's game of life
alle begin is moeilijk
Re: Conway's game of life
mooi he, twee programms die hetzelfde zouden moeten doen.
paul deelen
shooter@home.nl
shooter@home.nl
8 berichten
• Pagina 1 van 1
Terug naar Gezamenlijke projecten
Wie is er online?
Gebruikers in dit forum: Geen geregistreerde gebruikers en 8 gasten