# Denkfehler ^^ ?!



## kaoZ (18. Jul 2014)

Ich spiele grad ein wenig mit den Graphics Objekten herum und habe hier glaube ich einen Denkfehler den ich übersehe , also ich habe eine map in form einer Map Datei

Map1-1.map

```
10
10
1 1 1 1 1 1 1 1 1 1 
1 0 0 1 1 1 0 0 0 1
1 1 1 1 0 0 0 0 0 1
1 0 0 0 0 0 1 1 1 1
1 0 0 0 1 1 0 0 0 1
1 1 1 0 0 0 0 0 0 1
1 0 0 0 0 0 1 1 1 1
1 1 1 0 0 0 0 1 1 1
1 0 0 0 0 0 0 0 0 1 
1 1 1 1 1 1 1 1 1 1
```

Die erste Zeile repräsentiert Zeilen , die zweite die Spalten ab der 3ten wird die map gemapped ^^

Die map wird dann im Konstruktor über den Pfad direkt eingelesen:



Spoiler





```
public SimpleMapTest(String s) {
		
		InputStreamReader in;
		BufferedReader reader;
		
		try {
			in = new InputStreamReader(getClass().getResourceAsStream(s));
			reader = new BufferedReader(in);
			
			numRows = Integer.parseInt(reader.readLine());
			numCols = Integer.parseInt(reader.readLine());
			
			map = new int[numRows][numCols];

			String delimiter = "\\s+";

			for (int row = 0; row < numRows; row++) {
				String line = reader.readLine(); // read line
				String[] tokens = line.split(delimiter); // split line
				for (int col = 0; col < numCols; col++) {
					map[row][col] = Integer.parseInt(tokens[col]);
				}
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
	}
```





das klappt wunderbar, auch die ausgabe in der Konsole über diese Methode habe ich erfolgreich implementiert :


```
public void printMap(){
		for (int row = 0; row < numRows; row++) {
			for (int col = 0; col < numCols; col++) {
				System.out.print(map[row][col]);
			}
			System.out.println();
		}
	}
```

nun möchte ich die Map optisch darstellen, und habe hierzu folgende methode implementiert :


```
public void drawMap(Graphics g){
		
		for (int row = 0; row < numRows; row++) {
			for (int col = 0; col < numCols; col++) {
				if (map[row][col] == 0) {
					g.setColor(Color.WHITE);
				}
				if (map[row][col] == 1) {
					g.setColor(Color.BLACK);
				}
				
				g.fillRect(row * 30, col * 30, 50, 50);
			}
		}
		
		
	}
```

funktioniert auch soweit nur das er mir die map dann vollkommen spiegelverkehrt, wie man hier schön erkennen kann






 abbildet, es muss also ein Denkfehler mit dem 2dim array sein ich sehe ihn nur grade nicht 

vielleicht erblickt es ja jemand auf Anhieb 

hier noch die main Methode, die ja eigentlich irrelevant sein sollte :


```
public class Foo {

	public static void main(String[] args) {
		final SimpleMapTest t = new SimpleMapTest("Map1-1.map");
		
		JPanel panel = new JPanel(){
			
			@Override
			public void paintComponent(Graphics g){
				super.paintComponent(g);
				t.drawMap(g);
			}
		};
		
		JFrame f = FrameUtil.createFrame("test", 2, null, panel);
		f.setSize(250,50);
		f.setVisible(true);
	}
	
}
```


----------



## TheCreeper202 (18. Jul 2014)

> g.fillRect(row * 30, col * 30, 50, 50);


* 30 und dann 50x50 gezeichnet? Da überlappt sich doch alles!


> funktioniert auch soweit nur das er mir die map dann vollkommen spiegelverkehrt abbildet, es muss also ein Denkfehler mit dem 2dim array sein ich sehe ihn nur grade nicht


Spiegelverkehrt? Vertikal, Horizontal oder beides?


----------



## TheCreeper202 (18. Jul 2014)

Fehler gefunden:


> g.fillRect(row * 30, col * 30, 50, 50);


das muss so sein:

```
g.fillRect(col * 30, row * 30, 50, 50);
```
X und Y vertauscht


----------



## kaoZ (18. Jul 2014)

die Größe war erst einmal nur um zu sehen ob er es überhaupt zeichnet , und nicht nur mit einem pixel darstellt ^^

dammit , immer diese Grüzte mit dem x und y bei n-dim Arrays im Vergleich zum normalen Koordinaten System:lol:


danke für den denkanstoß 

so passt es nun :


```
public class SimpleMapTest {
	
	int numRows;
	int numCols;
	int position;
	
	int tileSize;
	int numTilesAcross;
	
	int[][] map;
	
	public SimpleMapTest(String s) {
		
		setTileSize(10);
		
		InputStreamReader in;
		BufferedReader reader;
		
		try {
			in = new InputStreamReader(getClass().getResourceAsStream(s));
			reader = new BufferedReader(in);
			
			numRows = Integer.parseInt(reader.readLine());
			numCols = Integer.parseInt(reader.readLine());
			
			numTilesAcross = numRows;
			
			map = new int[numRows][numCols];

			String delimiter = "\\s+";

			for (int row = 0; row < numRows; row++) {
				String line = reader.readLine(); // read line
				String[] tokens = line.split(delimiter); // split line
				for (int col = 0; col < numCols; col++) {
					map[row][col] = Integer.parseInt(tokens[col]);
				}
			}
			
		} catch (Exception ex) {
			ex.printStackTrace();
		}
		
	}
	
	public void printMap(){
		for (int row = 0; row < numRows; row++) {
			for (int col = 0; col < numCols; col++) {
				System.out.print(map[row][col]);
			}
			System.out.println();
		}
	}
	
	public void drawMap(Graphics g){
		
		for (int row = 0; row < numRows; row++) {
			for (int col = 0; col < numCols; col++) {
				if (map[row][col] == 0) {
					g.setColor(Color.WHITE);
				}
				if (map[row][col] == 1) {
					g.setColor(Color.BLACK);
				}
				g.fillRect(col * tileSize, row * tileSize, tileSize, tileSize);
			}
		}
	}
	
	public void setTileSize(int size){
		this.tileSize = size;
	}
	
	public int getNumTilesAcross()			{return this.numTilesAcross;}
}
```


----------



## Androbin (18. Jul 2014)

[OT] Hier klicken: "Thema als 'erledigt' markieren" [/OT]


----------



## kaoZ (18. Jul 2014)

> Hier klicken: "Thema als 'erledigt' markieren"



bereits geschehen 

Ps: Nette Signatur :toll:


----------



## Joose (18. Jul 2014)

kaoZ hat gesagt.:


> Ps: Nette Signatur :toll:



Wäre hier eine while-Schleife statt der if-Abfrage praktischer oder probierst du es nur 1x neu?


----------



## kaoZ (18. Jul 2014)

einmal reicht *hust*


----------

