Conway's game of life

Als U een gezamenlijk project wil starten of aan projecten van anderen mee wilt werken.
Berichten: 79
Geregistreerd: 08 Apr 2013, 20:16
Woonplaats: Lokeren

Conway's game of life

Berichtdoor Sembot » 08 Nov 2013, 19:32

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;

}

Advertisement

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Conway's game of life

Berichtdoor nicoverduin » 08 Nov 2013, 19:54

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.
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Conway's game of life

Berichtdoor shooter » 08 Nov 2013, 23:35

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.
paul deelen
shooter@home.nl

Berichten: 79
Geregistreerd: 08 Apr 2013, 20:16
Woonplaats: Lokeren

Re: Conway's game of life

Berichtdoor Sembot » 09 Nov 2013, 14:45

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Conway's game of life

Berichtdoor nicoverduin » 09 Nov 2013, 16:21

En wat verwacht je nu van ons? Dat wij jouw programma gaan schrijven?
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 79
Geregistreerd: 08 Apr 2013, 20:16
Woonplaats: Lokeren

Re: Conway's game of life

Berichtdoor Sembot » 09 Nov 2013, 17:13

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

Gebruikers-avatar
Berichten: 5043
Geregistreerd: 13 Mei 2013, 20:57
Woonplaats: Heemskerk

Re: Conway's game of life

Berichtdoor nicoverduin » 09 Nov 2013, 20:57

alle begin is moeilijk :)
Docent HBO Technische Informatica, Embedded ontwikkelaar & elektronicus
http://www.verelec.nl

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Conway's game of life

Berichtdoor shooter » 09 Nov 2013, 23:31

mooi he, twee programms die hetzelfde zouden moeten doen.
paul deelen
shooter@home.nl

Terug naar Gezamenlijke projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 3 gasten