"Schatzsuche"

Status
Nicht offen für weitere Antworten.

Zorito.

Neues Mitglied
In Infomatik haben wir eine für mich nicht ganz leicht zu bewältigende Aufgabe bekommen ( ist erst meine erstes Jahr ):

Unser Lehrer hat uns den Auftrag gegeben, eine Art "Schatzsuche" mit Java herzustellen, wobei "kalt" und "warm" ( also zum "Schatz ) angegeben werden sollten.

Ich hab das so verstanden.
Auf dem Bildschirm soll i-wo der "Schatz" sein ( kA, ob der zufällig verteilt sein soll oder man das selber bestimmt ). Wenn man das auf i-einen Feld auf dem Bildschirm drückt, steht das sowas wie K oder W oder i-was, was deutlich macht, wie nah / fern der Schatz ist.

Wir sollen das in Java machen bzw ein Struktogramm dazu anfertigen können.
Ich wäre sehr dankbar, wenn ich möglichst schnell eine Antwort bekommen könnte ( hier sind ja bestimmt genug Menschen, die sich mit Java auskennen <= )

Danke im Vorraus.
------------------------------------------------

Mir wurd schon mal was empfohlen:

Du machst ein 2-Dimensionales Array voller Buttons, diese stellen die x- bzw. y-Achse auf dem Bildschirm dar. Irgendein zufälliges Element wählst du dann als Schatz. Wenn ein Button dann angeklickt wird berechnest du den Weg zum Schatz und schaust ob der innerhalb einer bestimmten Grenze ist.

z.B. Der Schatz liegt auf [4][5] und ich klicke auf [3][3] bin ich (4-3)+(5-3)=3 Felder vom Schatz entfernt.



doch auch hiermit kann ich nichts anfangen.. kann mir einer genau erklären, was ich zur Lösung machen muss ?
 

hdi

Top Contributor
Also der Tipp, den du bekommen hast, ist doch schon sehr gut! Eigentlich ist die einzige Logik darin die Entfernungs-Berechnung, und das wurde dir ja schon gegeben! Was genau hindert dich jetzt noch daran,
dass so zu machen? Ich meine...weisst du nicht wie du Buttons machst, oder das 2d-Array, oder was...
 

Ariol

Top Contributor
wieso nicht?

einfach speichern wie weit du vorher vom schatz entfernt warst und dann nachsehen, ob du näher kommst oder dich entfernst.

vorher 5, jetzt 3 => wärmer
vorher 3, jetzt 5 => kälter
 

hdi

Top Contributor
Ich hab dir hier ein bisschen was gemacht, aber es ist nicht die Lösung, sondern nur ein kleines Skelett um dir ein wenig Arbeit abzunehmen. Versuche es erst zu verstehen, und dann ergänze die "???" durch Code.

Noch ein Tipp: Per setText(String) oder setBackground(Color) kannst du von einem JButton den Text/die Farbe ändern.
Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Schatzsuche {

	public static int schatzX, schatzY;

	public static void main(String[] args) {

		// Fenster erstellen:
		JFrame fenster = new JFrame("Schatzsuche");
		fenster.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JPanel panel = new JPanel();
		// die grösse deines fensters sollte natürlich im Einklang mit deinem 2d
		// Array von Buttons sein. zB 10*10 Felder, jeweils 25 Pixel gross,
		// also:
		panel.setPreferredSize(new Dimension(???, ???));
		fenster.add(panel);

		// zuerst mal brauchen wir ein passendes Layout für das Panel, damit wir
		// unsere quadratische 10*10 Anordnung machen können:
		panel.setLayout( ??? );

		// Jetzt pflastern wir das Panel mit 10*10 unserer SchatzButtons voll:
		for (int i = 0; i < 10; i++) {
			for (int j = 0; j < 10.; j++) {
				// neuen button erstellen
				SchatzButton button = new SchatzButton( ??? , ???);
				button.setPreferredSize(new Dimension( ?? , ??));
                        // das hier sind nur paar Anpassungen, ist nicht wichtig:
				button.setFont(new Font("Arial",Font.PLAIN,10));
				button.setMargin(new Insets(0,0,0,0)); // Macht die Ränder kleiner
				// den add() Befehl musst du halt je nach verwendetem Layout anpassen !!!!
				panel.add(button); // oder so ähnlich
			}
		}

		// Jetz bestimmen wir noch, wo der Schatz ist (zufällig):
		Random random = new Random();
		schatzX = random.nextInt(10); // zwischen 0 und 10
	        ???

		// So, jetz ist alles vorbereitet, wir können das Fenster anzeigen:
		fenster.pack();
		fenster.setLocationRelativeTo(null);
		fenster.setVisible(true);
	}

	
}
class SchatzButton extends JButton {

	private int x;
	private int y;

	public SchatzButton(int x, int y) {
		this.x = x;
		this.y = y;

		// Ein Button muss anklickbar sein, und dann angeben wie weit man
		// vom Schatz weg ist: Was beim Klick auf einen Button passiert,
		// bestimmt
		// ein ActionListener:
		this.addActionListener(myAction());
	}

	private ActionListener myAction() {
		ActionListener action = new ActionListener() {
			@Override
			public void actionPerformed(ActionEvent arg0) {

				if ( ??? ) {
                                       // Auf den Schatz geklickt! Das muss man dem User zeigen:
					???
				} else {
                                       // daneben... warm oder kalt?
					???
				}
			}
		};
		return action;
	}
}
 

hdi

Top Contributor
ja das stimmt, das ist schlecht gemacht. Man sollte den ActionListener lieber beim Erstellen des Buttons einfügen, statt Klassen-übergreifend auf Variablen zuzugreifen:

Code:
// neuen button erstellen (bisschen anpassen)
				SchatzButton button = new SchatzButton( ??? , ???);
				button.addActionListener(new ActionListener() {
						@Override
						public void actionPerformed(ActionEvent arg0) {

							if ( ???) {
								???
							} else {
								???
							}
						}
					});
				}

Dann fehlt aber noch was in der SchatzButton-Klasse:

Code:
public int getX(){ return this.x }
public int getY() { return this.y}
 

hdi

Top Contributor
Ich hab jetz mal selbst ne Frage, hab das jetz nämlich mal für mich zu ende gemacht, und passt an sich alles
aber ich hab n extrem stranges problem mit dem Layout.

hab gridlayout hergenommen (10,10) und adde in der Schleife die buttons mit add(i,j).

Das Ding ist, das Fenster hat die richtige Grösse (obwohl ich dem Panel keine Size gebe, dashab ich rausgenommen!), und wenn ich mit der Maus darin rumfahr und Klick tut sich auch was.

Aber die Anzeige ist verkorkst: Alle Buttons scheinen irgendwie übereinander oben links in einem 30*30 px Bereich angezeigt zu werden Oo. Wie gesagt ich kann aber im leeren Fenster-bereich rumklicken, und dann seh ich wie oben die Buttons darauf reagieren..

Was is da los:

Code:
panel.setLayout(new GridLayout(gridSize,gridSize)); // gridSize = 10;
		for (int i = 0; i < gridSize; i++) {
			for (int j = 0; j < gridSize; j++) {
				
				// neuen button erstellen...
				button.setPreferredSize(new Dimension(25,25));
				button.setFont(new Font("Arial",Font.PLAIN,10));

				panel.add(button, i, j);
			}
		}
//..
fenster.add(panel);
fenster.pack();
fenster.setVisible(true);

Hier mal, wie das bei mir aussieht:



Es langt schon, wenn ich nur mit der Maus rumbeweg im Fenster, dann sieht man oben links wie sich die Buttons dauernd übermalen usw... Ist das ein spezielles Phänomen vom GridLayout? Hatte das noch nie verwendet bisher..

edit: wenn ichs mit JButton mach und meine eigene Buttonklasse weglass, passt alles...was isn daran falsch??
 

hdi

Top Contributor
Der Vollständigkeit halber nochmal die fertige Version:

Code:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Random;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Schatzsuche {

	private static int schatzX, schatzY; // position des schatzes: feld (x,y)
	private static final int gridSize = 10; // anzahl der spalten und zeilen

	public static void main(String[] args) {

		JPanel panel = new JPanel();
		// passendes quadratisches Layout der Dimension (gridSize,gridSize):
		panel.setLayout(new GridLayout(gridSize, gridSize));

		// Jetzt pflastern wir das Panel mit unserer SchatzButtons voll:
		for (int i = 0; i < gridSize; i++) {
			for (int j = 0; j < gridSize; j++) {

				// neuen button erstellen
				final JButton button = new JButton();
				// ... der auf klicks reagieren soll:
				button.addActionListener(new ActionListener() {
					@Override
					public void actionPerformed(ActionEvent arg0) {
						int xDistance = Math.abs(schatzX - button.getX()
								/ button.getWidth());
						int yDistance = Math.abs(schatzY - button.getY()
								/ button.getHeight());
						if (xDistance == 0 && yDistance == 0) {
							// GEFUNDEN!
							button.setBackground(Color.green);
							button.setText("=)");
						} else {
							// nicht gefunden:
							if (xDistance + yDistance > 2) {
								// kalt..
								button.setBackground(new Color(100, 100, 255));
								button.setText("K");
							} else {
								// warm..
								button.setBackground(new Color(255, 100, 100));
								button.setText("W");
							}
						}
					}
				});
				button.setPreferredSize(new Dimension(50, 50));
				button.setFont(new Font("Arial", Font.BOLD, 16));
				button.setMargin(new Insets(0, 0, 0, 0)); // macht nur die
				// Ränder kleiner
				panel.add(button, i, j); // an geeigneter Stelle im Raster
				// einfügen
			}
		}
		// Noch schnell den Schatz verstecken (zufällig)
		Random random = new Random();
		schatzX = random.nextInt(gridSize); // zwischen 0 (inkl.) und 10 (exkl.)
		schatzY = random.nextInt(gridSize);

		// Wir können nun das Fenster zusammenbauen und anzeigen
		JFrame f = new JFrame("Schatzsuche");
		f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		f.add(panel);
		f.pack();
		f.setLocationRelativeTo(null);
		f.setVisible(true);
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
P Java BlueJ Schatzsuche Java Basics - Anfänger-Themen 2

Ähnliche Java Themen


Oben