Co muszę poprawić, aby komórki ginęły i ożywały prawidłowo?

0

treść zadania w załączniku.


/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package cwiczeniaa;
import java.util.Scanner;
 
/**
 *
 * @author Krzysiek
 */
public class Cwiczeniaa {
 
    /**
     * @param args the command line arguments
     */
 
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int n;
        do{
        System.out.println("Podaj liczbe dodatnią nieujemną: ");
        n=in.nextInt();
        }while(n<=0);
 
        int[][] a=new int[n][n];
       //wypełnianie tablicy wartosciami
       for(int i=0; i<n; i++)
       for(int j=0; j<n; j++)a[i][j]=0;
       //tutaj wartosci dla zywych komórek, ale tak że n musi mieć w tym wypadku co najmniej 5
               a[1][1]=1;
               a[0][1]=1;
               a[0][2]=1;
               a[0][3]=1;
               a[0][4]=1;
               a[4][2]=1;
               a[3][1]=1;
               a[1][2]=1;
               a[0][3]=1;
               a[3][4]=1;
        
         int ileZywych=0;
        for(int u=0; u<5; u++){
         for(int i=0; i<n; i++){
       for(int j=0; j<n; j++){
           //teraz sprawdzamy komórki, opracowałem algorytm dla sąsiadujących komórek które znajdują się w tych pozycjach od komórki głównej
           for(int k=-1; k<2; k++){
           for(int g=-1; g<2; g++){
             int x=k+i; 
             int y=g+j;
             //jeżeli liczba wychodzi poza zakres tablicy, to ją zmieniam na sąsiadującą z drugiej strony
            if(x<0)x=n-1;
            if(y<0)y=n-1;
            if(x>(n-1))x=0;
            if(y>(n-1))y=0;
            if(a[x][y]==1)ileZywych++;
           }
        }
           if(ileZywych==3)a[i][j]=1;
           
           if(a[i][j]==1 && ileZywych!=2 && ileZywych!=3)
           a[i][j]=0;
           
           ileZywych=0;
       }
       
       //wypisanie całej tablicy komórek, żeby sprawdzić zmiany
           
    }
           for(int e=0; e<n; e++){
        for(int t=0; t<n; t++)System.out.print(a[e][t]+" ");
           System.out.println();
           }
        System.out.println();
        System.out.println();
        System.out.println();
    }
}
}

0

Wszystko już działa poprawnie, niepotrzebnie wrzuciłem wypisywanie w środku pętli, zamiast poza nią i w pięciokrotnej iteracji

5

Ok napisałeś program który zrozumie kompilator, to teraz napisz program który zrozumie człowiek

0

Pieprzyć to, zostanę freelancerem :*

0
krzysiu1998v13 napisał(a):

Pieprzyć to, zostanę freelancerem :*

Bycie freelancerem usprawiedliwia jakość kodu? Aaa, no chyba, że chcesz studentom programy za dyche pisać.

0

W javie i tak strukturalnie? Nie ładnie :)
Jak patrzę w kod to za cholerę nie mogę się domyśleć co on robi (musiałbym się głębiej zastanowić). Gwarantuję Ci, że też zapomnisz za kilka dni i będziesz miał problem :D

Recepta:

  • R. Martin, Czysty Kod: 2x dziennie po śniadaniu i przed snem

(Realizuj w księgarni, a nie w aptece)

0

Może jesteś zbyt głupi, żeby programować, skoro miałbyś problemy z czytaniem własnego kodu? Przypomina mi się historia gościa z mojej klasy, który nie potrafił przeczytać po sobie wypracowań i ani on, ani nauczycielka nie wiedziała co tam jest napisane :D Kolejna sprawa, rozwiązywałem zadanie, nie tworzyłem jakiegoś swojego dzieła, tylko spełniałem kryteria zadania, można całościowo napisać program w Javie obiektowo, ale po co w takiej sytuacji? Na koniec chciałem powiedzieć coś odnośnie książki "Clean Code", nie czuję się na tyle dobry w programowaniu, żeby bawić się w jakieś wzorce projektowe i uporządkowanie, na razie łupię sobie cokolwiek, żeby się uczyć i tyle :D

1

@krzysiu1998v13
Programiści są leniwi, a tym bardziej, jak widzą taki kod, żeby komuś pomóc po godzinach, więc szanujmy się. Twoja piaskownica, Twoje kredki, ale tutaj bawimy się razem. Oczywiście są miłośnicy rozwiązywania krzyżowek programistycznych, to sobie nad tym posiędzą (bo lubią), ale nie każdemu się chce. Wiec taka rada na przyszlość.

0

@krzysiu1998v13: może to właśnie Ty jesteś zbyt głupi, bo nie zauważasz co zrobiłeś. Sam wstawiłeś swój kod i pytasz się co poprawić i myślisz, że ludzie będą 20 minut siedzieć i rozszyfrowywać znaczenie zmiennych i masy ifów pomieszanych z pętlami.

0

Absolutnym minimum przed wrzuceniem kodu na forum jest sformatowanie go. Każde IDE ma wbudowany formatter, więc formatowanie to kwestia skrótu klawiaturowego. W NetBeansie to chyba Alt+Shift+F.

Wbicie skrótu klawiaturowego to kwestia sekundy. Śledzenie niesformatowanego kodu wrzuconego na forum to kwestia wielu minut traconych przez wielu użytkowników. Sprawa jest chyba jasna.

0
krzysiu1998v13 napisał(a):

Na koniec chciałem powiedzieć coś odnośnie książki "Clean Code", nie czuję się na tyle dobry w programowaniu, żeby bawić się w jakieś wzorce projektowe i uporządkowanie, na razie łupię sobie cokolwiek, żeby się uczyć i tyle :D

A nie lepiej uczyć się mądrze i z głową? Od razu ucz się czegoś poprawnie żeby się nie dublować i nie wbijać sobie złych nawyków do głowy.

0

OK...
Co do samego kodu, to już się wypowiedzieli co nieco wyżej... ale jeżeli masz tych forów ile masz, to jest to podejrzane... co więcej, nie wszędzie są nawiasy... i nie wiadomo, która pętla co obejmuje... Ale zostawmy to, spróbujmy ciut pooptymalizować... Sąsiadów dla każdej komórki wystarczy wyznaczyć tylko jeden raz (!)... Przykład:

a=[[0,1,1],[0,0,1],[0,1,1]]

V={}
V[(0,0)]=[a[0][1], a[1][0], a[1][1]]
V[(0,1)]=[a[0][0], a[1][0], a[1][1], a[1][2], a[0][2]]
V[(0,2)]=[a[0][1], a[1][1], a[1][2]]
V[(1,0)]=[a[0][0], a[0][1], a[1][1], a[2][1], a[2][0]]
V[(1,1)]=[a[0][0], a[1][0], a[2][0], a[1][0], a[1][2], a[2][0], a[2][1], a[2][2]]
V[(1,2)]=[a[0][2], a[0][1], a[1][1], a[2][1], a[2][2]]
V[(2,0)]=[a[1][0], a[1][1], a[2][1]]
V[(2,1)]=[a[2][0], a[1][0], a[1][1], a[1][2], a[2][2]]
V[(2,2)]=[a[2][1], a[1][1], a[1][2]]

Nie wygląda to prosto ale można to zrobić sprytnie pętlą podwójną i Ifami, ale tylko jeden raz, a nie za każdym razem...

Następne pokolenie wyznaczamy obliczając sumę wartości wszystkich sąsiadów dla każdej komórki:

b=[[0 for i in range(3)] for j in range(3)]
for i in range(3):
    for j in range(3):
        x = sum(V[i, j])
        if (a[i][j]==0 and x==3) or (a[i][j]==1 and abs(x-2.5)==0.5):
            b[i][j]=1
a = b.copy()

Także nie ciesz się tak bardzo, że napisałeś kod, bo to jest raczej lipa, ale na początek nie jest źle... :)

PS. Zastanawiałeś się nad wersją trójwymiarową tej gry ?? Tak mi przyszło do głowy, nie wiem czy ktoś nad tym myślał... :)

1
Terrored napisał(a):
krzysiu1998v13 napisał(a):

Na koniec chciałem powiedzieć coś odnośnie książki "Clean Code", nie czuję się na tyle dobry w programowaniu, żeby bawić się w jakieś wzorce projektowe i uporządkowanie, na razie łupię sobie cokolwiek, żeby się uczyć i tyle :D

A nie lepiej uczyć się mądrze i z głową? Od razu ucz się czegoś poprawnie żeby się nie dublować i nie wbijać sobie złych nawyków do głowy.

Przecież każdy wie, że lepiej się uczyć najpierw "jako tako" a potem od nowa, i od nowa, stopniowo naprawiając swoje dawne błędy.

Przykładowo w zeszłym roku szlifowałem konsekwentne otwieranie nawiasu klamrowego w tej samej linijce co deklaracja / pod deklaracją - co projekt, to inaczej, dla wprawy. Nie bardzo mi to szczerze mówiąc wychodziło, więc odpuściłem sobie Javę i zacząłem pisać w Pythonie, żeby nie zawracać sobie głowy klamrami. Tylko kurczę jest ten problem, że najpierw trzeba by opanować robienie wcięć bo bez nich kod nie działa, a jeszcze tego nie umiem...

Może ktoś by porobił te wcięcia za mnie? To tylko paręset linii w jednej funkcji, płacę w obelgach :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1