šachovnica-grafika – Java – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

šachovnica-grafika – Java – Fórum – Programujte.comšachovnica-grafika – Java – Fórum – Programujte.com

 

Milan
~ Anonymní uživatel
282 příspěvků
7. 10. 2013   #1
-
0
-

viem spraviť šachovnicu, mám na nej 2 agentov, pohybujú sa vodorovne alebo zvislo.  Majú sa na nej pohybovať napr. 4 iteracie.

ako naprogramovať ich pohyb, zatiaľ sa vedia pohnúť iba o 1 krok.skúsil som rekurziu, ale hádže výnimku...

for (A r : agentA) {
   
     or=r.getorientacia();
       i=r.getpolohax();j=r.getpolohay();
     
 if (or==0){squares[i+1][j].setBackground(Color.blue);r.setpolohax(r.getpolohax());}
    if (or==1){squares[i-1][j].setBackground(Color.blue);r.setpolohax(r.getpolohax());}
     if (or==2){squares[i][j+1].setBackground(Color.blue);r.setpolohay(r.getpolohay());}
      if (or==3){squares[i][j-1].setBackground(Color.blue);r.setpolohay(r.getpolohay());}
 int ra=generator.nextInt(3);
    
      
      r.setorietacia(ra);}

Nahlásit jako SPAM
IP: 147.232.177.–
zlz
~ Anonymní uživatel
634 příspěvků
7. 10. 2013   #2
-
0
-

Jaký kód haže jaku vyjímku?

Dej tam normálně cyklus:

for (int iterace = 0; i < maxPocetIteraci; i++) {
    tocochcidelat();
}
Nahlásit jako SPAM
IP: 88.101.8.–
zlz
~ Anonymní uživatel
634 příspěvků
7. 10. 2013   #3
-
0
-

iterace++   

Nahlásit jako SPAM
IP: 88.101.8.–
Milan
~ Anonymní uživatel
282 příspěvků
7. 10. 2013   #4
-
0
-

no v cykle mám static void moveA() throws FileNotFoundException
{
    for (int p=0;p<4;p++)
    {updatemriezka();
move();  }       
}

ale nepomohlo-pohne sa len o 1 políčko, skús ty implementovať move...

Nahlásit jako SPAM
IP: 147.232.177.–
zlz
~ Anonymní uživatel
634 příspěvků
8. 10. 2013   #5
-
0
-

Spíš bych to viděl tak, že se ti obarví vedlejší pole, ale agent se neposune vůbec.

r.setpolohax(r.getpolohax()); // <---
for (Agent agent: seznamAgentu) {
	x = agent.getpolohax();
	y = agent.getpolohay();

	switch (agent.getorientacia()) {
	case 0: if (x < maxX) x++; break;
	case 1: if (x > 0)    x--; break;
	case 2: if (y < maxY) y++; break;
	case 3: if (y > 0)    y--; break;
	}

	squares[x][y].setBackground(Color.blue)

	agent.setpolohax(x);
	agent.setpolohay(y);
	agent.setorientacia(generator.nextInt(4));
}
Nahlásit jako SPAM
IP: 88.101.8.–
Milan
~ Anonymní uživatel
282 příspěvků
12. 10. 2013   #6
-
0
-

a vedel by si dorobiť, že agent bude jesť huby,  huby sú na 1,6 a 6,1

a ešte obchádzať prekážky ?

Nahlásit jako SPAM
IP: 176.112.191.–
zlz
~ Anonymní uživatel
634 příspěvků
12. 10. 2013   #7
-
0
-

Tak před provedením toho kroku otestuj, jestli tam není překážka. Pokud je, tak na ni nevstupuj a třeba jen změň orientaci agenta, takže dřív nebo později agent v některém z dalších kroků tu překážku obejde.

No a když tam překážka není a vstoupíš na houbu, tak ji sněz. Co je na tom?

if (na_pozici_x_y neni prekazka) {
	if (na_pozici_x_y je houba) {
		odstranit_houbu_na_pozici_x_y;
		pricist_body_za_sebrani_houby;
		nebo_neco_jineho;
	}

	squares[x][y].setBackground(Color.blue)
	agent.setpolohax(x);
	agent.setpolohay(y);
}

agent.setorientacia(generator.nextInt(4));
Nahlásit jako SPAM
IP: 88.101.8.–
Milan
~ Anonymní uživatel
282 příspěvků
14. 10. 2013   #8
-
0
-

ako mám spravit vizualizáciu v každom cykle že bude vedieť krokovať aj do predošlého stavu ?

Nahlásit jako SPAM
IP: 147.232.177.–
sleepy
~ Anonymní uživatel
422 příspěvků
16. 10. 2013   #9
-
0
-

A co tak to spravit troska viac objektovejsie. Pisat sa to potom bude jednoduchsie. Inak naco je v tej metode FileNotFoundException

class Agent {
	// Tieto polia treba niekde inicializovat
	private Random rnd = new Random();
	private int orientation=0;
	private Board board;
	// orientaciu potom z invertujes vynasobenim -1
	// a pripocitas k tvojej pozicii.
	// krokovanie do na predoslu poziciu
	private ArrayList<Integer> orientations;

	private int posX, posY;

	public void draw(Graphics g) {
		// tu vykonaj cele kreslenie agenta tohto
	}
	
	public void move() {
		// Tento if nieje treba lebo ty uz mas zarucene ze na danom mieste 
		// nebude prekazka. Ale je tu pre istotu keby si este nieco ine pouzil
		// na nastavenie orientacie.
		if(canMove()) {
			makeMove();
			if(board.getPosition(posX, posY).isMushroom()){
				// nadabi na hubu a nieco sa stane
			}
			// tento if sa da nahradit ak budes vracat len body alebo nieco
			// points += board.getPosition(posX, posY).getPoints()
			// takto mozes body aj uberat neviem co maju huby robit
			orientations.add(orientation);
			generateNewOrientation();
		}
	}

	private void makeMove() {
		posX += (orientation - 2) % 2;
		posY += (orientation - 1) % 2; 
	}

	public void generateNewOrientation() {
		do{
			this.orientation = rnd.newInteger(4);
		} while(!canMove());
	}

	public int getX() {
		return this.posX;
	}

	public int getY() {
		return this.posY;
	}

	public void setOrientation(int o) {
		// Ak sa nevie pohnut na tebou zadanu poziciu tak si generuje vlastnu.
		// Pripadne si mozes vyziadat od uzivatela dalsiu
		if(o>=0 && o<4)
			this.orientation = o;
		else {	
			generateNewOrientation();
		}
	}

	private boolean canMove() {
		// Modulo v jave je uzasna vec toto ti dokaze nahradit 
		// (cos(pi/2*k),sin(pi/2*k)) co je to co robis ty tymi hnusnimi if-ami
		return board.getPosition(posX+(orientation-2)%2,
				posY+(orientation-1)%2).isBlocked()
	}
}

class Board {
	// field-y
	private BoardElement[][] boardElements;

	public void draw(Graphics g) {
		// tu nakreslis Board
		g.drawNieco ....
		for(int k=0; k ... ){
			for(...) {
				boardElements[k][j].draw(g);
			}
		}
		g.drawNieco...
	}

	public BoardElement getPosition(int x, int y) {
		if(isOutOfBoard()){
			// agent sa dostane mimo
			// nieco sa stane
			// tu by sa mala metoda prerusit
			// napr. return null alebo nieco lepse
			// nemal by sa sem dostat
			// sluzi na to metoda isBlocked()
		}
		return boardElements[x][y];
	}
}

class BoardElement {
	enum Type{
		EMPTY, BLOCKED, MUSHROOM, FREE, ....
	}
	
	private Type blockType;
	private int x,y,w,h;
	private Color color;

	public boolean isBlocked() {
		return blockType.equals(Type.BLOCKED) || blockType.equals(Type.EMPTY);
	}

	public boolean isMushroom() {
		return blockType.equals(Type.MUSHROOM);
	}

	public void draw(Graphics g){
		// Nakreslis element sachovnice
		g.setColor(color);
		g.drawRect(x,y,w,h);
		g.fillRect(x,y,w,h);
	}
}

public static void main(String[] arg) {
	Board board = new Board(...); // nieco ako chces vytvorit board
					// napriklad pocet poli
					// pociatocne rozmiestnenie stien a hub
					// ....
	int agentsCount = 10;
	List<Agent> agentsList = new ArrayList<Agent>(agentsCount);
	for(int k=0; k<agentsCount; k++) {
		Agent agent = new Agent(board, ...); // Vytvoris agenta a priradis mu 
							// premenne napr. pozicia, 
							// farba, pociatocna orientacia 
							// a hlavne Board po ktorom sa 
							// pohybuje.
		agentsList.add(agent);
	}
	// Vytvor si nieco do coho to budes kreslit napr. JComponent s overridnutou 
	// metodou paintComponent(Graphics g).
	// Bolo by dobre aby vsetky tieto veci implementvoali interface Drawable
	// ktory vyvoris iba s jenou metodou draw(Graphics g)
	// Lahsie sa to potom bude kreslit do toho komponentu
	// pripadne tam mozes vymysliet vrstvy pre pohodlnejsie vykreslovanie ... atd.
	// Toto je o epsilon lahsie rozsiritelny kod.
	JComponent myComponent = ...

	for(int step=0; step < maxSteps; step++) {
		for(Agents a : agentList) {
			// a.setOrientation(...);
			a.move();

		}
		myComponent.repaint();
	}
	
}
Nahlásit jako SPAM
IP: 147.175.177.–
Milan
~ Anonymní uživatel
282 příspěvků
22. 10. 2013   #10
-
0
-

čo treba dať k  JComponent myComponent =  ? nemám s tým skúsenosti...ešte metody draw v triede agent a v triede board..

Nahlásit jako SPAM
IP: 147.232.177.–
sleepy
~ Anonymní uživatel
422 příspěvků
23. 10. 2013   #11
-
0
-

Tu je popis toho co je JComponent: http://docs.oracle.com/javase/6/docs/api/javax/swing/JComponent.html. Je to abstraktna class-a, cize nieco cim ju rozsirujes. V linku je Direct known subclasses. Napriklad je tam JPanel, co bude asi najvhodnejsi kandidat na to co ches robit. K tim metodam je vyhodne obcas pre lepsiu rozsiritelnost vytvorit interface, ktory niektore class-y implementuju v tomto pripade by som siahol po Drawable: 

public interface Drawable{
	public void draw(Graphics g);
}

ten implementujes v Agentovi a v Board. Tym zarucis ze tam metoda draw bude a bude nieco robit. Zatial to nepotrebujes ale ak budes chciet pridavat ine veci tak sa to celkom zide, este by sa mozno hodila v nom metoda public int getLayer(), co vyriesi problem s prekryvanim. Ale k veci draw pouzijes ty na vykreslenie toho co dany objekt reprezentuje: 

class Agent implements Drawable {
// kod
	public void draw(Graphics g) {
		g.setColor(Color.YELLOW) // farba agenta napr.zlta
		g.drawOval(posX * coefX, posY * coefY, r, r);
		// kde posX, posY je pozicia
		// coefX, coefY su koeficienty tak aby sa ti pravy horny roh
		// zobrazil na pravy horny roh stvrceka na pozicii posX, posY.
		// r je polomer kruhu. Je tu troska pocitania aby ti to pekne sedelo
	}
// dalsi kod
}

class Board implements Drawable {
	public void draw(Graphics g) {
		// To iste urobis zo sachovnicou
		for ( int i=0; i<sizeX; i++) {
			for (int j=0; j<sizeY; j++) {
				boardElement.draw(g); // Napr. takto
			}
		}
	}
}
// Toto moze byt abstraktne a budes to rozsirovat
// Napriklad hubou atd...
// Ale teraz dajme ze je to finalny objekt
class BoardElement implements Drawable {
	public void draw(Graphics g) {
		switch(elementType) {
			MUSHROOM:
				g.setColor();
				...
				... // Kreslis hubu
				...
				break;
			EMPTY:
				g.setColor();
				g.drawRect(x,y,w,h); // koordinaty v okne v px
				... // kreslis prazdny blok
		}
	}
}

// No a nakoniec to cele nakreslis v niecom napr. JPanel
// pretazis public void paintComponent(Graphics g)

class MyBoard extends JPanel {
	private Board board = ...
	private Agent agent1 = ...
	private Agent agent2 = ...
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g);
		board.draw(g);
		agent1.draw(g);
		agent2.draw(g);
	}
}

// Lepsie je pouzi to drawable interface aj s tymi vrstvami podla ktorych je
// to zoradene od najnizsej po najvyssiu. Cize to musi byt Comparable<Drawable>.
// Ale to az sa ti s tym bude chciet viac hrat
class MyBoard extends JPanel {
	private TreeSet<Drawable> dawables = new TreeSet<Drawable>();
	
	@Override
	public void paintComponent(Graphics g) {
		super.paintComponent(g); // toto tam asi ani byt nemusi treba skusit
		for (Drawable d : drawables) {
			d.draw(g);
		}
	}
}

Najvacsi problem budu robit asi prepocty pozicie do px. S tym Comparable<Drawable> to staci iba rozsirit Samotny Drawable IDE ako eclipse ti uz samo navrhne co kde treba dopisat. Bude treba mat niekde ulozney int layer pre kazdy objekt rozsireny o drawable. Sluzi to len na to aby sa ti nenakreslili ako prvy agenti, ale hracia plocha potom zelenina a steny a az na koniec agenti. Ak uz to budes mat tak sa mozes porozhliadnut ako funguje Graphics2D a Objekty Shape. Dufam ze aspon niecom z tohto porozumies ;) . Inak tam kde pouzivam ten hnusny switch - case by sa to cele dalo ofintit tym ze BoardElement by bol abstraktny typ alebo interface... a vracal by iba BoardElement.Type, boolean isFree (alebo canMoveOn) a vedel by sa nakreslit. A v Board-e by si tam vkladal Mushroom, Block, atd. . Vsetko podla lubosti toto je na rychlo zbuchnuty nedokonaly a neuplny navrh toho ako by som postupoval ja, ale aj tak dufam ze aspon v niecom ti to pomoze.

Nahlásit jako SPAM
IP: 147.175.177.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 32 hostů

Podobná vlákna

Sachovnica — založil Milan

Sachovnica a wxpython — založil qqqqq

C++ grafika — založil Hornster

2D grafika — založil Dušan

Grafika — založil bk2601

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý