Wątek przeniesiony 2019-01-09 08:06 z Java przez Patryk27.

Mój pierwszy poważny program - chwalę się :)

0

Siema,

Chcę wam dziś przestawić moją pierwszą poważniejszą aplikacje. Jest to generator labiryntu, z wyszukaniem drogi opartej na algorytmie przeszukiwaniu grafów.
Kilka kawałków kodu (reszta dodana jako pliki)

	//***************************Wyszykiwanie Drogi *******************************************
	
	
	public  void szukajDrogi(int liczbaStart, int liczbaKoncowa,  boolean hermetyk) {
		this.liczbaWywołań++;
		Komórka start=this.getKomórka(liczbaStart);
		start.setDostepnosc(false);
		if(hermetyk){
				start.sortowanietablicy(liczbaStart, liczbaKoncowa, this.liczbaKolumn);
		}
		int i=0;		
		Komórka nextKomórka;

		
		do {
			
			nextKomórka=start.getElementOfList(i);
			i++;
			if(nextKomórka.getDostepnosc()) {
				this.listNaRozwiązanie.add(nextKomórka);
				
				
				if(nextKomórka.getNumerLiczba() != liczbaKoncowa+1){
					this.szukajDrogi(nextKomórka.getNumerLiczba()-1, liczbaKoncowa, hermetyk);
					start=this.getKomórka(liczbaStart);
					nextKomórka=this.getKomórka(liczbaStart).getElementOfList(i-1);
					if(nieMamyRozwiązania==true ){
					this.listNaRozwiązanie.remove(this.listNaRozwiązanie.size()-1);
					}
				}
				else {
					this.nieMamyRozwiązania=false;
					}
			}
	
			
			
		}while(nieMamyRozwiązania && start.getSizeOfList()>i );
	}
	
	public void ustawianieScian(boolean góra, boolean praw, boolean dół, boolean lewo, int x) {
		
		Komórka elementDoPrzestawienia = this.getKomórka(x);
		//****************************USTAWIANIE DLA GÓRY**********************************************
		elementDoPrzestawienia.przestawienieGórnejS(góra, liczbaKolumn, listaGłówna);
		//****************************USTAWIANIE DLA PRAWA*********************************************
		elementDoPrzestawienia.przestawieniePrawejS(praw, liczbaKolumn, listaGłówna);
		//****************************USTAWIANIE DLA DOŁU**********************************************
		elementDoPrzestawienia.przestawienieDółS(dół, liczbaKolumn, listaGłówna);
		//****************************USTAWIANIE DLA LEWA**********************************************
		elementDoPrzestawienia.przestawienieLewoS(lewo, liczbaKolumn, listaGłówna);
	}
	
	
public	void sortowanietablicy(int start,int koniec, int liczbaKolumn) {
		Komórka sprawdwPierwszej=this;
		if(koniec - start >0 && koniec -start < liczbaKolumn ) { // ten sam rodzaj poziom komórke  idz w prawo
			for(Komórka xx  : this.list) {
				if(xx.getNumerLiczba() == this.getNumerLiczba()+1) {
					if(this.list.size() >1) {
						sprawdwPierwszej=xx;
						}
				}
			}
		}
		if(koniec - start <0 && koniec -start < -liczbaKolumn ) { //ten sam rodzaj poziom komórke  idz w lewo
			for(Komórka xx  : this.list) {
				if(xx.getNumerLiczba() == this.getNumerLiczba()-1) {
					if(this.list.size() >1) {
						sprawdwPierwszej=xx;
						}
				}
			}
		}
		if(koniec - start <0 && koniec - start <-liczbaKolumn) { // idz w góre jeśli koniec jest mniejszy niż początek 
			for(Komórka xx  : this.list) {
				if(xx.getNumerLiczba() == this.getNumerLiczba()- liczbaKolumn) {
					if(this.list.size() >1) {
					sprawdwPierwszej=xx;
					}
				}
			}
		}
		if(koniec - start >0 && koniec - start >liczbaKolumn) { //idz w dół jeśli koniec jest większy niz poczatek 
			for(Komórka xx  : this.list) {
				if(xx.getNumerLiczba() == this.getNumerLiczba()+ liczbaKolumn) {
					sprawdwPierwszej=xx;
				}
			}	
		}
		if(sprawdwPierwszej !=this) {
			this.list.remove(sprawdwPierwszej);
			this.list.add(0, sprawdwPierwszej);
		}
		
	}
	void przestawienieGórnejS(boolean góra, int  liczbaKolumn, ArrayList<Komórka> listaGłówna) {
		if(góra==true) { // jeśli mamy połączyć w góre 
			if(this.getNumerLiczba()<= liczbaKolumn) { // sprawdzamy czy możemy połączyć jeśli nie to dajemy komunikat 
	
			}
			else {
				if(this.getGórnaS()==false) { // sprawdzamy czy są połączone jeśli nie to łączymy 
					this.laczGóra(listaGłówna, liczbaKolumn);
				}
				
			}
		}
		else { // jeśli nie mamy połączyć w góre 
			if(this.getNumerLiczba()<= liczbaKolumn) { // sprawdzamy czy możemy usumąć jeśli nie to dajemy komunikat 
	
			}
			else {
				if(this.getGórnaS()==true) { // sprawdzamy czy są połączone jeśli tak to usuwamy połaczenie 
					this.usunGóra(listaGłówna, liczbaKolumn);
				}
				
			}
		}
	}

Zdjęcie okienka aplikacji https://www.fotosik.pl/zdjecie/pelne/78e8116d5cf2006d

Czy jeśli jestem wstanie stworzyć taką aplikacje to mogę próbować załapać się na staż ?

1
      Komórka start=this.getKomórka(liczbaStart);
      start.setDostepnosc(false);

Też tak kiedyś pisałem. Ale jest to nieprofesjonalne. Standard w branży jest taki, że nazwy zmiennych, klas itp. się pisze w całości po angielsku. Choćby dlatego, żeby uniknąć potworków typu "setDostepnosc".

3
// przykład 1:
if(góra==true) { // jeśli mamy połączyć w góre 

// przykład 2:
//****************************USTAWIANIE DLA GÓRY**********************************************

Kod powinien być w większej mierze samo-dokumentujący się - jeśli potrzebujesz już umieścić komentarz, niech wnosi on coś nowego, czego nie da się zauważyć w ułamek sekundy.

2:

// ten sam rodzaj poziom komórke  idz w prawo

Ani to po polsku, ani po angielsku - co to zdanie oznacza?

3:

public  void szukajDrogi(int liczbaStart, int liczbaKoncowa,  boolean hermetyk) {

Co reprezentują parametry tej funkcji?
Czym jest liczbaStart i co zmienia opcja hermetyk?
Dlaczego nie wynika to z nazewnictwa bądź komentarza do tej metody?

4:

Czy jeśli jestem wstanie stworzyć taką aplikacje to mogę próbować załapać się na staż ?

Spróbować nie zaszkodzi ;-)

0

No i koniecznie wrzuć to na githuba, a nie tak wysyłasz klasy w załączniku:)

1

"Następną razą" powinieneś popracować nad architekturą. Klasa Komórka praktycznie robi wszystko, i musi wiedzieć wszytko. Tworzeniem labiryntu powinna zajmować się jakaś klasa Board czy Maze, bo ona "wie" jak są komórki ułożone. Stosujesz magiczne wartości jak np. 24, 49, co one znaczą? Po co pola typu boolean: lewaS, prawaS itd. to powinny być funkcje, najlepiej klasy kontenera komórek, a jeśli komórka chce wiedzieć czy ma sąsiada to pyta swój kontener. W tej postaci powielasz dane i gdy przyjdzie Ci do głowy, żeby w labiryncie przestawić komórki, to musisz pamiętać o aktualizacji tych pól w każdej komórce. Komplikujesz sprawę stosując jednowymiarową listę do odwzorowania siatki. Akurat tu zamiast listy mogłeś użyć dwuwymiarowej tablicy bo i tak nie zmieniasz dynamicznie rozmiaru.
labiryntu. Poczytaj też o typie wyliczeniowym, bardzo dobrze się sprawdza do eliminacji tego tłustego od if .. else spagetti code.

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