Schachbrett Spiel Nr. 01

Pazago

Mitglied
Guten Abend,

Ich sitzte nun schon seit..... ZU LANGE an dieser einen Aufgabe:

Gegeben ist ein Schachbrett mit 64 Feldern (8x8). Auf dem ersten Feld liegt ein Korn, auf den zweiten liegen 2, auf dem dritten 4 auf dem vierten 8 usw. Auf welchem Feld liegt das Korn Nr. 100 000? Ab welchem Feld liegen mehr als 1.000.000 Körner auf dem Brett?


Dies soll mit einer Grafischen Benutzer Oberfläche und mit Hilfe der do und while Schleife gelöst werden.


Ich habe mir gedach das ich versuche eine Variabele für das Feld und eine für das Korn zu machen doch wie sag ich Java jetzt das er bei jedem Feld verdoppeln soll ???:L


Hier mein Quell Text:

Java:
int Feld, Korn ;

 Feld = Math.random()*1;

  nFZahl = Korn ;
  
    do {

    Feld = Feld++ + Feld++ ;


    }

    while (nFZahl==Feld) ;
  }

Erklärung:
Bei
Java:
Feld = Feld 1 ;
will ich Feld auf die Zahl eins setzten wobei ich da mir ziemlich sicher bin das es Falsch ist 😳

nFZahl ist die Zahl die der Benutzter Eingibt

Java:
 Feld = Feld++ + Feld++ ;
Der Versuch es zu verdoppeln da ich immer wieder neue Erros bekomme weiß ich nicht ob das so geht ;(


Wäre super wenn Ihr mir helfen könntet 🙂


LG Pazago
 
ich habs jetzt geändert nur hat java jetzt anscheinend ein Problem mit dem Feld wo der Benutzer die Zahl rein schreiben muss:

Fehler Meldung

Java:
Schachbrett.java:73:12: incompatible types
found   : int
required: NumberField
  nFZahl = Korn ;
           ^
Schachbrett.java:82:18: incomparable types: NumberField and int
    while (nFZahl==Feld) ;
                 ^
2 errors
 
Ich hab mal alles kopiert nicht nur den Knopf


Java:
import java.awt.*;
import java.awt.event.*;

/**
  *
  * Beschreibung
  *
  * @version 1.0 vom 05.05.2011
  * @author
  */

public class Schachbrett extends Frame {
  // Anfang Attribute
  private Label laUeberschrift = new Label();
  private NumberField nFZahl = new NumberField();
  private Label laZahlfeld1 = new Label();
  private TextArea textArea1 = new TextArea("", 1, 1, TextArea.SCROLLBARS_NONE);
  private Button buBerechnen = new Button();
  // Ende Attribute

  public Schachbrett(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    int frameWidth = 476;
    int frameHeight = 433;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    Panel cp = new Panel(null);
    add(cp);
    // Anfang Komponenten

    laUeberschrift.setBounds(24, 16, 118, 16);
    laUeberschrift.setText("Schachbrett Spiel:");
    laUeberschrift.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(laUeberschrift);
    nFZahl.setBounds(32, 168, 89, 24);
    nFZahl.setText("");
    cp.add(nFZahl);
    laZahlfeld1.setBounds(24, 112, 190, 16);
    laZahlfeld1.setText("Gib die Nummer vom Korn ein:");
    laZahlfeld1.setFont(new Font("MS Sans Serif", Font.PLAIN, 13));
    cp.add(laZahlfeld1);
    textArea1.setBounds(256, 32, 193, 313);
    textArea1.setText("Das Schachbrett Spiel ist ein Spiel das aus einem Schachbrett \nmit 64 Feldern besteht (8x8).\n\nGebe einfach deine Gewünschte Nummer ein und du erhälst die\nFeld Anzahl wo das Korn mit deiner eingegebenen Nummer drauf liegt\nwenn du auf den Feld Berechnen Button drückst.\n\nViel Spaß :)");
    cp.add(textArea1);
    buBerechnen.setBounds(48, 248, 75, 25);
    buBerechnen.setLabel("Berechnen");
    buBerechnen.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        buBerechnen_ActionPerformed(evt);
      }
    });
    cp.add(buBerechnen);
    // Ende Komponenten

    setResizable(false);
    setVisible(true);
  }

  // Anfang Methoden
  public void buBerechnen_ActionPerformed(ActionEvent evt) {

  int Feld, Korn ;

  Feld = 1;

  nFZahl = Korn ;
  
    do {

    Feld = Feld * 2  ;


    }

    while (nFZahl==Feld) ;
  }

  // Ende Methoden

  public static void main(String[] args) {
    new Schachbrett("Schachbrett");
  }
}
 
stimmt.... wie muss ich das dann schreiben wenn ich wissen will auf welchem Feld welches Korn liegt kann mir daraus keinen Reim machen 🙁
 
jetzt hätte ich einen Fehler weniger bleibt nur noch einer 😀

Quelltext:

Java:
public void buBerechnen_ActionPerformed(ActionEvent evt) {

  int Feld, Korn ;

  Feld = 1;

  nFZahl = Korn ;
  
    do {

    Feld = Feld * 2  ;


    }

    while (Korn==Feld) ;
  }

Fehler:

Java:
Schachbrett.java:73:12: incompatible types
found   : int
required: NumberField
  nFZahl = Korn ;
           ^
1 error

Könnte es daran liegen das ich Korn nicht mit einer Zahl deklariert habe???:L???:L
 
Du hast hier einfach zwei verschiedene Datentypen, wie Final_Striker oben schon sagt vergleichst du Äpfel mit Birnen ... In diesem Fall ist es eben eine Zuweisung! Das geht auch nicht mit verschiedenen Datentypen ...
Java:
int Feld, Korn;
private NumberField nFZahl = new NumberField();
 
Hi,
beovor du das ganze in Java runterschreibst, versuch es doch wenigstens erstmal als Pseudocode zu schreiben, dadurch wird dir das Lösen um Welten leichter fallen.

Wenn das ganze Graphisch angezeigt werden soll (evtl als 8*8 Schachbrett auf dem jeweils als Zahl auf jedem Feld die Körner angezeigt werden), macht es unter umständen sogar Sinn die Felder einzeln zu speichern.
Was macht das Feld aus? Die Position und die Anzahl der Körner.
Pack also alle Felder in ein int-Array mit 64 Feldern und du hast schonmal eine passende Datenstruktur.

Willst du Körner auf ein Feld packen musst du wissen wieviele Körner auf ein Feld passen:
Feld nummer n, Körner die auf Feld n passen, 2^n-1 (2 hoch (n-1))
1,1,1
2,2,2
3,4,4
4,8,8
...
Fällt dir was auf? 🙂 Die Anzahl Körner die auf ein Feld passen kann man mathematisch bestimmen.

Wie könntest du jetzt bestimmen auf welchem Feld dein gesuchtes Korn ist und wieviel Körner auf den Feldern landen?

Eine Möglichkeit:
Setze dir einen Kornvorrat (z.B. 10)
Dann gehst du die Felder durch. Bei jedem Feld holst du solange Körner vom Vorrat auf das Feld bis das Feld voll ist oder der Vorrat leer. (Oder du machst es ohne Vorrat und zählst mit wieviele Körner du hingelegt hast).
Sobald du deinen Vorrat von n Körnern hingelegt hast (oder das n-te Korn legst bei der anderen Version) liegt auf dem Feld bei dem du gerade bist das gesuchte Korn.
Für mich sieht das nach 2 Schleifen aus, eine Möglichkeit mit do-while gibt es aber auch 😉
Gruß
 
Ich hab es nun von meiner Idee um gebaut so das ich die Korn Anzahl vor gebe dabei ist nun das raus gekommen :

Java:
public void buBerechnen_ActionPerformed(ActionEvent evt) {

  int Feld, Korn ;

  Feld = 1;

  Korn = 100000 ;
  
    do {

    Feld = Feld * 2  ;


    }

    while (Korn==Feld) ;
    System.out.println
    (Feld) ;
  }

Es funktioniert auch ohne Fehler 😀
nur kommt als Ergebniss immer egal wie hoch die zahl ist 2 raus???:L
liegt es an der Rechnung oder an dem was ich Ausgebe? wenn es an der Ausgabe liegt was muss ich da rein schreiben???:L???:L

Hab es schon mit allen was mir so spontan eingefallen ist Versucht Feld * 2, Feld++, und das alles mal kombienert wurde um so mehr es war immer zwei mehr :noe:
 
Zuletzt bearbeitet:
du wiedeholst die do-while-Schleife solange Korn=Feld wenn dann musst du schreiben while(Korn!=Feld) da aber in deiner schleife nie 100000 rauskommen wird wenn du immer mal 2 nimmst musst du schreiben while(Korn>Feld) nun brauchst du noch eine Variable die die Durchläufe der schleife zählt auf diesem Feld wird dann das 100000te Korn liegen

aufs 2d-array überträgst du das folgendermaßen dabei ist enspricht 'anzahl' den Durchläufen.
das korn liegt auf dem Feld mit der x Koordinate (anzahl%8) und auf der y Koordinate (anzahl/8)
 
Zuletzt bearbeitet:
Java:
public class SchachbrettKorn {
	public static void main(String[] args) {
		long gesuchtesKorn = 100000L;
		int brettGroesse = 8*8;
		long anzahlKoerner = 1L;
		int anzahlDurchlaeufe = 1;	
		
		while (anzahlKoerner < gesuchtesKorn && anzahlDurchlaeufe <= brettGroesse) {
			anzahlKoerner = anzahlKoerner *2;
			anzahlDurchlaeufe++;
		}
		
		int feldNr;
		String feldStr="";
		
		if (anzahlDurchlaeufe % 8 == 0) {
			feldNr = 8;
			
			if (anzahlDurchlaeufe / 8 == 1) {
				feldStr = "A";
			} else if (anzahlDurchlaeufe / 8 == 2) {
				feldStr = "B";
			} else if (anzahlDurchlaeufe / 8 == 3) {
				feldStr = "C";
			} else if (anzahlDurchlaeufe / 8 == 4) {
				feldStr = "D";
			} else if (anzahlDurchlaeufe / 8 == 5) {
				feldStr = "E";
			} else if (anzahlDurchlaeufe / 8 == 6) {
				feldStr = "F";
			} else if (anzahlDurchlaeufe / 8 == 7) {
				feldStr = "G";
			}
		} else {
			feldNr = anzahlDurchlaeufe % 8;
			
			if (anzahlDurchlaeufe / 8 == 0) {
				feldStr = "A";
			} else if (anzahlDurchlaeufe / 8 == 1) {
				feldStr = "B";
			} else if (anzahlDurchlaeufe / 8 == 2) {
				feldStr = "C";
			} else if (anzahlDurchlaeufe / 8 == 3) {
				feldStr = "D";
			} else if (anzahlDurchlaeufe / 8 == 4) {
				feldStr = "E";
			} else if (anzahlDurchlaeufe / 8 == 5) {
				feldStr = "F";
			} else if (anzahlDurchlaeufe / 8 == 6) {
				feldStr = "G";
			} else if (anzahlDurchlaeufe / 8 == 7) {
				feldStr = "H";
			}
		}
		
		if (gesuchtesKorn <= anzahlKoerner) {
			System.out.println("Es liegen " +anzahlKoerner+ " Körner (inkl. des gesuchten Korns "+gesuchtesKorn+") auf Feld "+feldStr+feldNr+".");
		} else {
			System.out.println("Das Spielfeld ist zu klein oder die Anzahl der gesuchten Körner zu groß.");
		}
	}
}
 
Bissle verkürzt:

Java:
public class SchachbrettKorn {
	public static void main(String[] args) {
		long gesuchtesKorn = 100000L;
		int brettBreite = 8;
		int brettHoehe = 8;
		long anzahlKoerner = 1L;
		int anzahlDurchlaeufe = 1;	
		
		while (anzahlKoerner < gesuchtesKorn && anzahlDurchlaeufe <= brettBreite * brettHoehe) {
			anzahlKoerner = anzahlKoerner *2;
			anzahlDurchlaeufe++;
		}
		
		String[] feldStr = new String[] {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
		
		if (gesuchtesKorn <= anzahlKoerner) {
			if (anzahlDurchlaeufe % brettBreite == 0) {		
				System.out.println("Es liegen " +anzahlKoerner+ " Körner (inkl. des gesuchten Korns "+gesuchtesKorn+") auf Feld "+feldStr[anzahlDurchlaeufe / brettBreite + 1]+brettBreite+".");
			} else {	
				System.out.println("Es liegen " +anzahlKoerner+ " Körner (inkl. des gesuchten Korns "+gesuchtesKorn+") auf Feld "+feldStr[anzahlDurchlaeufe / brettBreite]+anzahlDurchlaeufe % brettBreite+".");
			}
		} else {
			System.out.println("Das Spielfeld ist zu klein bzw. die Anzahl der gesuchten Körner zu groß.");
		}
	}
}
 
Sowas müßte auch gehen
Java:
    private static int fieldWithAtLeast(long n)
    {
        return (int)Math.ceil(Math.log(n)/Math.log(2));
    }

    private static int fieldWhereTotal(long n)
    {
        return fieldWithAtLeast(n+1)-1;
    }
Wenn auch ohne schleife. Aber wenn man's drauf anlegt...
Java:
do
{
    result = compute();
} while (false);
:joke:
 

Zurück
Oben