- jeśli komórka jest martwa i ma dokładnie trzech sąsiadów żywych, staje się żywą
- jeśli komórka jest żywa i ma dwóch lub trzech sąsiadów żywych, żyje dalej
- jeśli komórka jest żywa i ma jednego lub mniej sąsiadów lub więcej niż trzech sąsiadów żywych, umiera (odpowiednio z samotności i przeludnienia).
import java.util.Scanner; /** * Prosta implementacja Gry w życie * @author kodatnik.blogspot.com */ public class GraWZycie { // stałe symbolizujące żywą i martwą komórkę private final char ZYWA = '#'; private final char MARTWA = '.'; // pola przechowujące rozmiar naszej planszy private int wiersze; private int kolumny; // deklaracja macierzy z planszą gry private boolean[][] plansza; // konstruktor, podajemy liczbę wierszy i kolumn planszy public GraWZycie(int wiersze, int kolumny) { // inicjalizujemy pola naszej klasy this.wiersze = wiersze; this.kolumny = kolumny; // tworzymy odpowiednią macierz, domyślnie wypełniona jest ona wartościami false plansza = new boolean[wiersze][kolumny]; } // metoda pokazująca planszę na ekranie public void pokazPlansze(){ // wyświetlamy każdy element planszy, w zależności od zawartości na ekranie pojawi się odpowiedni znak for(boolean wiersz[] : plansza){ for(boolean element : wiersz) System.out.print((element) ? ZYWA : MARTWA); System.out.println(); } } // przykładowa metoda uzupełniająca planszę populacją początkową public void utworzDaneTestowe() { // tworzymy populację początkową (standardowy Exploder) 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; } // metoda zwraca liczbę żywych sąsiadów konkretnej komórki // w wywołaniu podajemy współrzędne komórki private int liczbaSasiadow(int x, int y) { // zmienna przechowująca liczbę sąsiadów int sasiedzi = 0; // sprawdzamy komórki na około naszej for(int i = x-1; i <= x+1; i++) { // jeżeli przekraczamy zakres planszy (wiersz) idziemy dalej if(i < 0 || i > wiersze-1) continue; for(int j = y-1; j <= y+1; j++) { // jeżeli przekraczamy zakres planszy (kolumna), lub jesteśmy w komórce(x,y) idziemy dalej if(j < 0 || j > kolumny-1 || (i == x && j == y)) continue; // jeśli sąsiad jest żywy to zwiększamy naszą zmienną if(plansza[i][j]) sasiedzi++; } } // zwracamy zmienną return sasiedzi; } // metoda sprawdza czy dana komórka będzie żywa czy też martwa w następnym etapie // w wywołaniu podajemy współrzędne komórki private boolean ewolucja(int x, int y) { // sprawdzamy liczbę żywych sąsiadów int sasiedzi = liczbaSasiadow(x, y); // jeżeli nasza komórka jest żywa if(plansza[x][y]) { // jeśli liczba sąsiadów jest mniejsza lub równa jeden lub większa od trzech to nasza komórka będzie martwa if(sasiedzi <= 1 || sasiedzi > 3) return false; // jeśli liczba sąsiadów jest równa trzy lub dwa to nasza komórka będzie żywa if(sasiedzi == 3 || sasiedzi == 2) return true; } else { // jeśli nasza komórka jest martwa i ma dokładnie trzech żywych sąsiadów to będzie żyła if(sasiedzi == 3) return true; } // w każdym innym przypadku zwracamy fałsz (komórka jest martwa) return false; } // metoda tworzy następną populację/pokolenie komórek public void nastepnePokolenie() { // tworzymy planszę tymczasową o takim samy rozmiarze jak nasza boolean[][] planszaTymczasowa = new boolean[wiersze][kolumny]; // uzupełniamy nową planszę wartościami na podstawie ogólnych zasad for(int i = 0; i < wiersze; i++) for(int j = 0; j < kolumny; j++) planszaTymczasowa[i][j] = ewolucja(i, j); // nasza główna plansza staje się planszą tymczasową plansza = planszaTymczasowa; } public static void main(String[] args) { // wyświetlamy napisy informacyjne System.out.println("Gra w życie - [Enter] generuje następne pokolenie, dowolny znak i [Enter] kończy grę."); // obsługujemy wejście Scanner sc = new Scanner(System.in); // tworzymy nowy obiekt przekazując do konstruktora rozmiar planszy GraWZycie gra = new GraWZycie(15, 15); // wypełniamy naszą planszę wartościami testowymi gra.utworzDaneTestowe(); // wyświetlamy planszę na ekranie gra.pokazPlansze(); // dopóki użytkownik będzie naciskał klawisz Enter while(sc.nextLine().equals("")) { // generujemy następne pokolenie gra.nastepnePokolenie(); // wyświetlamy go na ekranie gra.pokazPlansze(); } } }Pojawianie się następnych etapów naszej populacji może odbywać się automatycznie (bez konieczności naciskania klawisza Enter). Poniżej zmodyfikowana wersja pętli while z metody main. Mankamentem tego rozwiązania jest to, iż zakończenie programu odbywa się jedynie poprzez jego przerwanie np. za pomocą kombinacji Ctrl+C.
while(true) { gra.nastepnePokolenie(); gra.pokazPlansze(); try { Thread.sleep(300); // długość pauzy w milisekundach } catch (Exception e) {} }Uruchomiona aplikacja, początkowa populacja:
Gra w życie - [Enter] generuje następne pokolenie, dowolny znak i [Enter] kończy grę. ............... ............... ............... ............... ............... .....#.#.#..... .....#...#..... .....#...#..... .....#...#..... .....#.#.#..... ............... ............... ............... ............... ...............Populacja w następnych etapach:
............... ............... ............... ............... ............... ......#.#...... ....##...##.... ....###.###.... ....##...##.... ......#.#...... ............... ............... ............... ............... ...............
............... ............... ............... ............... ............... .....#...#..... ....#.....#.... ...#..#.#..#... ....#.....#.... .....#...#..... ............... ............... ............... ............... ...............
Gra wygląda znacznie lepiej w środowisku graficznym ;)
4 Komentarze - Gra w życie
Pierwszy raz widze gre w zycie w konsoli ;) ale dobra robota
To jest interesująco zobaczyć grę od strony programowania.
Najwięcej frajdy i zabawy daje granie na konsoli. Takie jest moje zdanie, jeśli chodzi o gry. Tutaj gry mają zdecydowanie lepszą grafikę i dają sporo możliwości graczom. Konsola jest w stanie zapewnić długi godziny fajnej rozrywki. Sprawdzi się na samotne wieczory, ale też i przy okazji na jakieś fajne zabawy i spotkania z przyjaciółki. Możecie sprawdzić sobie różne oferty na stronie https://4console.pl/ , więc zdecydowanie szukajcie i sprawdzajcie, jeśli tylko macie możliwość. Na pewno znajdziecie coś fajnego dla siebie.
zycie to nie gra
Prześlij komentarz
Możesz użyć niektórych tagów HTML, takich jak <b>, <i>, <u>, <a> Nie spamuj :)