Gra w Życie to gra, w której, hmm.. Obserwujemy życie komórek. Nie maja one zbyt dużo do zaoferowania, gdyż mogą być tylko martwe lub żywe. Cała akcja toczy się na dwuwymiarowej.. Tablicy :P
Ta gra to jeden z pierwszych i najbardziej znanych przykładów automatu komórkowego, wymyślony w roku 1970 przez brytyjskiego matematyka Johna Conwaya.
Reguły gry są proste:
Może przed kodem, pokaż jak to wygląda. Jako stan poczatkowy zaimplementowałem prostokąt, który w następnych populacjach tworzy ładne wzory:)
No i jak wygląda kilka kolejnych populacji:
Samo wywołanie klasy którą za chwile przedstawię jest dość proste:
1 2 3 4 5 6 7 8 9 10 11 | Gra n = new Gra(15,15); n.init(); while(true){ n.Draw(); Scanner sc = new Scanner(System.in); if(!sc.nextLine().equals("n")) break; } |
Jak widac po kodzie, kolejna populacja będzie generowana po wpisaniu litery „n”. Od „nowa”… A może od „następna”? :P mało istotne.
Klasa Gra wygląda tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 | import java.util.Arrays; import java.util.Random; /** * * @author Matt */ public class Gra { int n=10; int m=10; //stanrdowe wymiary private boolean plansza[][];//plansza glowna private boolean plansza_t[][]; //plansza przechowuje poprzednie pokolenie Gra() { plansza = new boolean[n][m]; //konstruktor } Gra(int n, int m){ this.n=n; this.m=m; plansza = new boolean[n][m]; //konstruktor nr.2 } public void init(){ /* Random r = new Random(); for(int i=0;i<(2*n);i++) plansza[r.nextInt(n)][r.nextInt(m)]=true; */ //kod zakomentowany wyżej wypełnia losowo część macierzy plansza_t=new boolean[n][m]; plansza[5][5] = true; plansza[5][7] = true; plansza[5][9] = true; plansza[6][5] = true; plansza[6][9] = true; plansza[7][5] = true; plansza[7][9] = true; plansza[8][5] = true; plansza[8][9] = true; plansza[9][5] = true; plansza[9][7] = true; plansza[9][9] = true; //a tutaj prosty wzor ktory pokazuje jak dziala ten program //figura startowa to prostokat } private void checkCell(int w, int k){ if(plansza[w][k] == false)//jesli niezywa { boolean temp[] = new boolean[8];//tymczasowa tablica Arrays.fill(temp, false);//wypelniam ją false temp[0]=(((w-1)>=0 && (k-1)>=0) && plansza_t[w-1][k-1]==true)?true:false; temp[1]=(w-1)>=0 && plansza_t[w-1][k]==true?true:false; temp[2]=(w-1)>=0 && (k+1)<m && plansza_t[w-1][k+1]==true?true:false; temp[3]=(k+1)<m && plansza_t[w][k+1]==true?true:false; temp[4]=(k+1)<m && (w+1)<m && plansza_t[w+1][k+1]==true?true:false; temp[5]=(w+1)<m && plansza_t[w+1][k]==true?true:false; temp[6]=(k-1)>=0 && (w+1)<m && plansza_t[w+1][k-1]==true?true:false; temp[7]=(k-1)>=0 && plansza_t[w][k-1]==true?true:false; // sprawdzam kazdy z 8 sasiadów. //mozna to petla zrobic ale takie rozwiazanie pokazuje istote Gry w Życie int suma_zywych_sasiadow=0; for(int i=0;i<8;i++){ if(temp[i]==true) suma_zywych_sasiadow=suma_zywych_sasiadow+1; //licze ilość sąsiadów } if(suma_zywych_sasiadow==3){ plansza[w][k]=true; //jesli jest 3 to ozywiam } } if(plansza[w][k]== true) //jesli zyje { boolean temp[] = new boolean[8]; Arrays.fill(temp, false); temp[0]=(((w-1)>=0 && (k-1)>=0) && plansza_t[w-1][k-1]==true)?true:false; temp[1]=(w-1)>=0 && plansza_t[w-1][k]==true?true:false; temp[2]=(w-1)>=0 && (k+1)<m && plansza_t[w-1][k+1]==true?true:false; temp[3]=(k+1)<m && plansza_t[w][k+1]==true?true:false; temp[4]=(k+1)<m && (w+1)<m && plansza_t[w+1][k+1]==true?true:false; temp[5]=(w+1)<m && plansza_t[w+1][k]==true?true:false; temp[6]=(k-1)>=0 && (w+1)<m && plansza_t[w+1][k-1]==true?true:false; temp[7]=(k-1)>=0 && plansza_t[w][k-1]==true?true:false; //licze sasiadów int suma_zywych_sasiadow=0; for(int i=0;i<8;i++){ if(temp[i]==true) suma_zywych_sasiadow=suma_zywych_sasiadow+1; //dodaje wartosci true } if(suma_zywych_sasiadow==3 || suma_zywych_sasiadow ==2) { //jesli ma 3 lub 2 sasiadow to zyje dalej plansza[w][k]=true; } else{//jesli nie to umiera plansza[w][k]=false; } } } public void Draw(){ for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ plansza_t[i][j]=plansza[i][j]; //kopiuje pokolenie aktualne do tymczasowej macierzy } } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ //wyswietlam plansze if(plansza[i][j]==true) System.out.print("#"); else System.out.print("."); } System.out.println(); } for(int i=0;i<n;i++){ for(int j=0;j<m;j++){ //obliczam kolejne pokolenie this.checkCell(i, j); } } } } |
Jak uruchomić plik *.jar? Bardzo prosto. Urochomić cmd, przejść do folderu z plikiem *.jar i wydać polecenie
java -jar plik.jar
gdzie plik to nazwa pliku.
Jeśli się bardzo chce można napisać program w c++ który odpadać będzie taki program.
Kod jest opatrzony komentarzami – myślę że nie wiele musze wyjaśniać.
Oj daaawnoo mnie tu nie było. Ale wakacje to był czas dużej liczby intensywnych wyjazdów i tak naprawdę, dopiero jakoś… Read More
Cześć! Zapraszam na krótkie podsumowanie kwietnia. Wyjazd do Niemiec A dokładniej pod granicę z Francją. Chrześnica miała pierwszą komunię. Po… Read More
Ostatnio tygodnie były tak bardzo wypełnione, że nie udało mi się napisać nawet krótkiego podsumowanie. Więc dziś zbiorczo podsumuję luty… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W styczniu przeczytałem "Homo Deus: Historia jutra". Książka łudząco podoba do wcześniejszej książki tego… Read More
Cześć! Zapraszam na podsumowanie roku 2023. Książki Zacznijmy od książek. W tym roku cel 35 książek nie został osiągnięty. Niemniej… Read More
Zapraszam na krótkie podsumowanie miesiąca. Książki W grudniu skończyłem czytać Mein Kampf. Nudna książka. Ciekawsze fragmenty można by było streścić… Read More