Arrays Kartentrick funktioniert nicht richtig

maxl199

Mitglied
Hallo,
ich habe in der Schule eine Aufgabe bekommen, einen Kartentrick zu simuliere. Die Aufgabe findet ihr im Anhang...
Hier mein Java Code:
Java:
public class Kartentrick
{
	public static void main(String[] args) {
		 do {
			 
			 int[][] karten = null;
			 karten = fuellen(karten, 0);
			 ausgeben(karten);
			 int spalte = TestScannerErweitert.readInt("Spalte der Karte: ");
			 
			 karten = fuellen(karten,spalte);
			 ausgeben(karten);
			 spalte = TestScannerErweitert.readInt("Spalte der Karte: ");
			 
			 karten = fuellen(karten,spalte);
			 ausgeben(karten);
			 spalte = TestScannerErweitert.readInt("Spalte der Karte: ");
		 } while (Character.toLowerCase(TestScannerErweitert.readChar("Nochmals? (j/n)")) == 'j');
	}
	/**
	 * Wenn der Spieler 0 als Spalte eingebit, so werden die Karten der Reihe nach ausgelegt.
	 * Wenn der Spieler 1 als Spalte eigibt, so werden zuerst die Karten der Spalte 2 ausgelegt, dann die der Spalte 1
	 * und zum Schluss die der Spalte 3.Wenn der Spieler 2 als Spalte eigibt, so werden zuerst die Karten der Spalte 1
	 * ausgelegt, dann die der Spalte 2 und zum Schluss die der Spalte 3. Wenn der Spieler 3 als Spalte eigibt, 
	 * so werden zuerst die Karten der Spalte 1 ausgelegt, dann die der Spalte 3 und zum Schluss die der Spalte 2. 
	 * @param karten
	 * @param spalte
	 * @return Array der ausgelegten Karten
	 */
	public static int[][] fuellen(int[][] karten, int spalte) {
		int[][] ret = null;
		int zahl = 1;
		// Spalte wird 0 übergeben
		if (spalte == 0) {
			ret = new int [7][3];
			for (int i = 0; i < 3; i++){
				for (int j = 0; j < 7; j++){
					ret[j][i] = zahl;
					zahl++;
				}
			}
		}
		// Spalte wird 2 Ÿbergeben
		if (spalte == 2) {
			ret = new int[7][3];
			int[] tmp = new int [7];
			// komme hier nicht weiter
			int j = 0;
			int k = 0;
			for (int i = 0; i < 7; i++) {
				if (i == 3 || i == 6 || i == 9)
					j++;
				ret[j][i] = tmp[i];
				j++;
			}
//			int iergebnis = 0;
//			int jergebnis = 0;
//			for (int ioriginal = 0; ioriginal < 3; ioriginal++){
//				for (int joriginal = 0; joriginal < 7; joriginal++){
//					if (iergebnis > 2) {
//						iergebnis = 0;
//					}
//					ret[iergebnis][jergebnis] = karten[ioriginal][joriginal];
//					iergebnis = iergebnis +1;
//					jergebnis = jergebnis +1;
//				}
//			}
		}
		return ret;
	}
	/**
	 * Es wird das Array zeilenweise ausgegeben. 
	 * @param karten
	 */	
	public static void ausgeben(int [][] karten) {

		for (int i = 0; i < karten.length; i++){
			for (int j = 0; j < karten[i].length; j++){
				System.out.print(karten[i][j]+" ");
			}
			System.out.println();
		}
	}

}
soweit läuft auch alles richtig bis auf
Java:
		// Spalte wird 2 Ÿbergeben
		if (spalte == 2) {
			ret = new int[7][3];
			int[] tmp = new int [7];
			// komme hier nicht weiter
			int j = 0;
			int k = 0;
			for (int i = 0; i < 7; i++) {
				if (i == 3 || i == 6 || i == 9)
					j++;
				ret[j][i] = tmp[i];
				j++;
			}
//			int iergebnis = 0;
//			int jergebnis = 0;
//			for (int ioriginal = 0; ioriginal < 3; ioriginal++){
//				for (int joriginal = 0; joriginal < 7; joriginal++){
//					if (iergebnis > 2) {
//						iergebnis = 0;
//					}
//					ret[iergebnis][jergebnis] = karten[ioriginal][joriginal];
//					iergebnis = iergebnis +1;
//					jergebnis = jergebnis +1;
//				}
//			}
hier bekomme ich einen Fehler ;(

Danke schonmal im Voraus :)
 

Anhänge

  • IMG_0839.jpg
    IMG_0839.jpg
    95,3 KB · Aufrufe: 51

maxl199

Mitglied
Sory hab ich vergessen :(

hier die Ausgabe mit Fehlermeldung:

1 8 15
2 9 16
3 10 17
4 11 18
5 12 19
6 13 20
7 14 21
Spalte der Karte: 2
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Kartentrick.fuellen(Kartentrick.java:53)
at Kartentrick.main(Kartentrick.java:11)
 
M

Marcinek

Gast
Du hast in deinem array zeilen und spalten vertauscht.

DAs i wird zu groß.

Außerdem hast du zwei Arrays

ret = new int[7][3];
int[] tmp = new int [7];

Alle Haben den inhalt "0".

Und dann werden daraus werte in ret gespeichert, die alle nur 0 haben.
 
Zuletzt bearbeitet von einem Moderator:

maxl199

Mitglied
ja das verstehe ich aber wie du in der Aufgabenstellung siehst, soll bei der Eingabe von zwei zuerst die 1. Spalte waagrecht, dann die 2. waagrecht, dann die 3. waagrecht ausgegeben werden. Und genau das bekomme ich nicht hin :(
 

maxl199

Mitglied
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at Kartentrick.fuellen(Kartentrick.java:53)
at Kartentrick.main(Kartentrick.java:11)


Die Fehlermeldung verstehe ich schon aber mein Problem ist folgendes:
ich habe folgendes Array:
1 8 15
2 9 16
3 10 17
4 11 18
5 12 19
6 13 20
7 14 21

und nun soll ein neues Array gemacht werden, das zuerst die 1. Spalte waagrecht, dann die 2. waagrecht, dann die 3. waagrecht beinhaltet. Und genau das bekomme ich nicht hin
Es sollte danach so ausschauen:
1 2 3
4 5 6
7 8 9
10 11 12
13 14 15
16 17 18
19 20 21

genau so wie es im Anhang beschrieben und abgebildet ist...
 
M

Marcinek

Gast
Java:
public class Array {

	public static void main(String[] args) {
		int arrayOriginal [][] = new int[][]
		{
				{1,8,15}, {2,9,16}, {3,10,17}, {4,11,18}, {5,12,19 }, {6,13,20}, {7,14,21}
		};
		
		int newArray[][] = new int [7][3];
		
		for(int i = 0; i < 21; i++) {
			newArray[(i / 3) % 7][(i%3)] = arrayOriginal[(i % 7)][(i / 7) % 3];
		}
		
        for (int[] arr : newArray) {
            System.out.println(Arrays.toString(arr));
        }
	}
}
 

maxl199

Mitglied
Danke Marcinek :) soweit funktioniert mein Programm jetzt, aber wenn ich z.B. 1 übergib dann muss ja ein Array erstellt werden, das zuerst den 2. Stapel, dann den 1. dann den 3. Stapel waagrecht enthält.... wie kann ich das dann implementieren???
Oder wenn ich 3 übergebe dann ist das selbe Problem nur muss halt als erstes der 1. Stapel dann der 3. dann der 2. Stapel ins Array geschrieben werden...
Wäre nett wenn du mir hierbei auch helfen könntest :) Ich bekomme es einfach nicht hin :(
 
M

Marcinek

Gast
Hallo,

du kannst mit einem einfach offset machen und das o.g. entsprechend anpassen.

Ich denke mein Beispiel zeigt ganz gut, wie man das macht.

Du musst etwas machen, dass das 8 Element auf Position 0,0 macht.

Wir machen hier ja keine Hausaufgaben ;D - Mit Copy-Past kommst du nicht weit ^^ Du musst schon verstehen, was da passiert.

Gruß,

Martin
 

Neue Themen


Oben