Brauche hilfe beim Programmieren eines Java Applet

javap

Grünschnabel
Bin dabei, ein 4gewint Applet zu programmieren.

Ich möchte die Bilder mit einer paint Methode auf die Spielfläche zeichnen, nur wie stell ich dass an? Ich komme einfach nicht weiter, habt ihr vielleicht eine Idee?
 
Zuletzt bearbeitet:
Klassen schreibt man groß, aber ich würde das komplett anderst machen:

Java:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.util.HashMap;
import java.util.Map;

public class Viergewinnt extends Applet
{
	private static final long serialVersionUID = 1L;
	
	private boolean init = true;
	private int playerOnRow = 0;
	private Map<String, Field> fieldMap;
	private Images images;
	private Grid grid;
	private Paint paint;

	public void init()
	{
		new MouseListener(this);
		this.images = new Images(this);
		this.grid = new Grid();
		this.createFields();
		this.paint = new Paint(this);
		
		this.init = false;
		this.repaint();
	}
	private void createFields()
	{
		this.fieldMap = new HashMap<String, Field>();
		
		for(int y = 0; y < 6; y++)
			for(int x = 0; x < 7; x++)
				this.fieldMap.put(x + "/" + y, new Field());
	}
	
	public void paint(Graphics g)
	{
		if(this.init)
			return;
		this.paint.run(this.images, this.fieldMap, g);
		this.grid.paint(g);
	}
	
	public void mouseClicked(int x)
	{
		if(x < 90 || x > 506)
			return;
		x-= 90;
		x = (int)Math.floor(x / 60);
		
		int y = 5;
		for(; y != -1 && this.fieldMap.get(x + "/" + y).getImage() != null; y--);
		if(y < 0)
			return;

		Image image = null;
		if(this.playerOnRow == 0)
			image = this.images.getSol();
		else if(this.playerOnRow == 1)
			image = this.images.getLuna();
		
		if(image == null)
			return;
		
		this.fieldMap.get(x + "/" + y).setImage(image);
		
		if(this.playerOnRow == 0)
			this.playerOnRow = 1;
		else
			this.playerOnRow = 0;
		this.repaint();
	}
}
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;

public class Images extends Object
{
	private Image sol;
	private Image luna;
	
	public Images(Viergewinnt viergewinnt)
	{
		super();
		
		MediaTracker tracker = new MediaTracker(viergewinnt);
		this.sol = Toolkit.getDefaultToolkit().getImage("sol.jpg");
		this.luna = Toolkit.getDefaultToolkit().getImage("luna.jpg");
		
		tracker.addImage(this.sol, 0);
		tracker.addImage(this.luna, 1);
		
		try
		{
			tracker.waitForAll();
		}
		catch(Throwable t)
		{
			t.printStackTrace();
		}
	}
	public Image getSol()
	{
		return(this.sol);
	}
	public Image getLuna()
	{
		return(this.luna);
	}
}
import java.awt.Graphics;

public class Grid extends Object
{
	public Grid()
	{
		super();
	}
	public void paint(Graphics g)
	{
		g.drawString("Vier Gewinnt", 260, 18);
		
		g.drawRect(85, 85, 420, 420);

		g.drawLine(85, 155, 505, 155);
		g.drawLine(85, 225, 505, 225);
		g.drawLine(85, 295, 505, 295);
		g.drawLine(85, 365, 505, 365);
		g.drawLine(85, 435, 505, 435);
		g.drawLine(85, 505, 505, 505);

		g.drawLine(145, 85, 145, 505);
		g.drawLine(205, 85, 205, 505);
		g.drawLine(265, 85, 265, 505);
		g.drawLine(325, 85, 325, 505);
		g.drawLine(385, 85, 385, 505);
		g.drawLine(445, 85, 445, 505);
	}
}
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MouseListener extends MouseAdapter
{
	private Viergewinnt viergewinnt;
	
	public MouseListener(Viergewinnt viergewinnt)
	{
		super();
		
		viergewinnt.addMouseListener(this);
		this.viergewinnt = viergewinnt;
	}
	public void mouseClicked(MouseEvent m)
	{
		int x = m.getX();
		this.viergewinnt.mouseClicked(x);
	}
}
import java.awt.Image;

public class Field extends Object
{
	private Image image;
	
	public Field()
	{
		super();
	}
	public void setImage(Image image)
	{
		this.image = image;
	}
	public Image getImage()
	{
		return(this.image);
	}
}
import java.awt.Graphics;
import java.awt.Image;
import java.util.Map;

public class Paint extends Object
{
	private Viergewinnt viergewinnt;
	
	public Paint(Viergewinnt viergewinnt)
	{
		super();
		
		this.viergewinnt = viergewinnt;
	}
	public void run(Images images, Map<String, Field> fieldMap, Graphics g)
	{
		for (int y = 0; y < 6; y++)
			for(int x = 0; x < 7; x++)
			{
				Field field = fieldMap.get(x + "/" + y);
				if(field == null)
				{
					System.err.println("Error");
					return;
				}
				Image image = field.getImage();
				if(image != null)
					g.drawImage(image, x * 60 + 90, y * 70 + 95, this.viergewinnt);
			}
	}
}

Du musst aber noch überprüfen ob wer gewonnen hat und ein Doppelbuffer könnte auch nicht schaden.

Viel Spaß damit.
 

Anhänge

  • preview.jpg
    preview.jpg
    37,6 KB · Aufrufe: 18
  • luna.jpg
    luna.jpg
    1,2 KB · Aufrufe: 108
  • sol.jpg
    sol.jpg
    884 Bytes · Aufrufe: 107
danke für die schnelle hilfe, aber der Code ist ja ein ganz anderer als der, den ich gepostet habe. Ist mein code völliger schwachsinn?

Kann man dass auch nicht leichter programmieren, so dass auch ein laie versteht, was im quellcode geschieht?
 
Nein, das nicht.
Aber bei meinen ist einfach nur alles schön auf Klassen aufgeteilt, wärend bei dir alles in einer pickt. Und nach ner Zeit wird das einfach unübersichtlich, deshalb sollte man es gleich verwenden. Als ich mit OOP angefangen habe hatte mein Source (meine Klasse) ein wenig mehr als 3000 Zeilen. Und glaub mir, es ist wesendlich angenehmer OO zu Programmieren, vor allem da es auch extrem einfach ist.
Ich habe ihm dir mal durchkommentiert.
Ich weiß, im Board sieht es immer sehr groß aus, aber lade ihm dir mal in ne IDE wie Eclipse oder was auch immer du bevorzugst, und schau ihm dir an.
In Wirklichkeit ist der nicht besonderst groß.
Hast du dennoch Fragen zu irgend einer Zeile dann frag.

Java:
import java.applet.Applet;
import java.awt.Graphics;
import java.awt.Image;
import java.util.HashMap;
import java.util.Map;

public class Viergewinnt extends Applet //Erbe von Applet
{
	private static final long serialVersionUID = 1L; //Serialisierungs-Zeugs
	
	private boolean init = true; //Wird noch intialisiert
	private int playerOnRow = 0; //Welcher Spieler ist dran?
	private Map<String, Field> fieldMap; //Hier werden die Felder gespeichert
	private Images images; //Das Bilder-Object
	private Grid grid; //Das Raster-Objekt
	private Paint paint; //Das Zeichen-Object

	public void init() //Überschreibt Applet.init();
	{
		new MouseListener(this); //Das MouseListener-Object
		this.images = new Images(this); //Das Bilder-Object wird intialisiert.
		this.grid = new Grid();//-""- Raster-Object -""-
		this.createFields(); //Felder werden erstellt.
		this.paint = new Paint(this);//Das Paint-Object wird intialisiert.
		
		this.init = false; //Intialisierung abgeschlossen
		this.repaint();//Zeichne neu
	}
	private void createFields() //Siehe Viergewinnt.init();
	{
		this.fieldMap = new HashMap<String, Field>(); //Neue HashMap
		
		for(int y = 0; y < 6; y++) //Vertikal
			for(int x = 0; x < 7; x++)//Horzeniontal
				this.fieldMap.put(x + "/" + y, new Field());//Feld erstellen und in Map schreiben.
	}
	
	public void paint(Graphics g) //Die Zeichenmethode
	{
		if(this.init) //Wird noch intialisiert
			return; //Zeichnen abbrechen
		this.paint.run(this.images, this.fieldMap, g); //Methode run des Zeichenobjekts aufrufen.
		this.grid.paint(g); //Methode Paint des Raster-Objects aufrufen.
	}
	
	public void mouseClicked(int x) //Noch so ne Methode
	{
		if(x < 90 || x > 506) //Maus ausserhalb des Rasters
			return; //dann abbrechen
		x-= 90; //sonst x
		x = (int)Math.floor(x / 60); //ausrichten.
		
		int y = 5;//eine Int mit Wert 5.
		for(; y != -1 && this.fieldMap.get(x + "/" + y).getImage() != null; y--); //Stein nach unten fallen lassen.
		if(y < 0)
			return;

		Image image = null; //Bilddatei erstellen.
		if(this.playerOnRow == 0) //Spieler 1 an der Reihe
			image = this.images.getSol(); //Sonne hohlen
		else if(this.playerOnRow == 1) //sonst
			image = this.images.getLuna(); //Mond holen.
		
		if(image == null) //Fehlerabfang
			return;
		
		this.fieldMap.get(x + "/" + y).setImage(image); //Stein setzen.
		
		if(this.playerOnRow == 0) //Anderer Spieler dran.
			this.playerOnRow = 1;
		else
			this.playerOnRow = 0;
		this.repaint(); //Neu zeichen.
	}
}
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.Toolkit;

public class Images extends Object
{
	private Image sol; //Sonne,
	private Image luna; //Mond,
	//und keine Sterne. ._.
	public Images(Viergewinnt viergewinnt)
	{
		super();
		
		MediaTracker tracker = new MediaTracker(viergewinnt); //Ein MediaTracker bitte
		this.sol = Toolkit.getDefaultToolkit().getImage("sol.jpg"); //Bild laden
		this.luna = Toolkit.getDefaultToolkit().getImage("luna.jpg"); //Bild laden
		
		tracker.addImage(this.sol, 0); //Bild tracker geben
		tracker.addImage(this.luna, 1); //this²
		
		try
		{
			tracker.waitForAll(); //Warten bis fertig geladen wurde.
		}
		catch(Throwable t)
		{
			t.printStackTrace();
		}
	}
	public Image getSol() //Sonne zurückgeben
	{
		return(this.sol);
	}
	public Image getLuna() //Mond zurückgeben
	{
		return(this.luna);
	}
}
import java.awt.Graphics;

public class Grid extends Object
{
	public Grid()
	{
		super(); //Konstruktor von Object aufrufen.
	}
	public void paint(Graphics g) //Zeichnet überschrift und Raster. Nix besonderes.
	{
		g.drawString("Vier Gewinnt", 260, 18);
		
		g.drawRect(85, 85, 420, 420);

		g.drawLine(85, 155, 505, 155);
		g.drawLine(85, 225, 505, 225);
		g.drawLine(85, 295, 505, 295);
		g.drawLine(85, 365, 505, 365);
		g.drawLine(85, 435, 505, 435);
		g.drawLine(85, 505, 505, 505);

		g.drawLine(145, 85, 145, 505);
		g.drawLine(205, 85, 205, 505);
		g.drawLine(265, 85, 265, 505);
		g.drawLine(325, 85, 325, 505);
		g.drawLine(385, 85, 385, 505);
		g.drawLine(445, 85, 445, 505);
	}
}
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

public class MouseListener extends MouseAdapter
{
	private Viergewinnt viergewinnt;
	
	public MouseListener(Viergewinnt viergewinnt)
	{
		super();
		
		viergewinnt.addMouseListener(this); //Viergewinnt den MouseListener geben.
		this.viergewinnt = viergewinnt;
	}
	public void mouseClicked(MouseEvent m) //Taste gedrückt.
	{
		int x = m.getX(); //Hohle x-Koordinaten
		this.viergewinnt.mouseClicked(x); //Und rufe das Teil da auf.
	}
}
import java.awt.Graphics;
import java.awt.Image;
import java.util.Map;

public class Paint extends Object
{
	private Viergewinnt viergewinnt;
	
	public Paint(Viergewinnt viergewinnt)
	{
		super();
		
		this.viergewinnt = viergewinnt;
	}
	public void run(Images images, Map<String, Field> fieldMap, Graphics g) //Hier wird gezeichnet
	{
		for (int y = 0; y < 6; y++) //Vertikal
			for(int x = 0; x < 7; x++) //Horenziontal
			{
				Field field = fieldMap.get(x + "/" + y); //Hohle das Feld
				if(field == null) //Fehlerabfang
				{
					System.err.println("Error");
					return;
				}
				Image image = field.getImage(); //Hohle den Spielsteing
				if(image != null) //Ist einer gesetzt
					g.drawImage(image, x * 60 + 90, y * 70 + 95, this.viergewinnt); //Zeichne ihm.
			}
	}
}
 
irgendwie wird fast der gesamte text rot makiert dargestellt. woran liegt dass? An Eclipse? Oder hab ich jetzt was nicht mibekommen:confused:


Und ist es wirklich nicht möglich, den Code zu erweitern, den ich zu anfang gepostet habe? Es muss nicht perfekt geschrieben sein, ist vollkommen egal, hauptsache dass Programm wird irgendwie ausgeführt, so dass es funktioniert. Kann man da nicht kurz etwas dahinklatschen, unswar so, dass dabei mäglichst wenig text entsteht? :)

wäre dir sehr dankbar, wenn du mir da ein bisschen weiterhelfen könntest.
 

Anhänge

  • viergewinnt.jpg
    viergewinnt.jpg
    45 KB · Aufrufe: 20
Zuletzt bearbeitet:
Doch schon, aber am Ende wirst du dich nichtmehr so gut auskennen.
Eben weil alles der Reihe nach drinnensteht.

Du kannst aber auch die Methode zum berechnen des Feldes (Viergewinnt.mouseClicked(int)) und die zum Zeichnen (Paint.run(Images, Map, Graphics)) anpassen und für deinen Source verwenden.

Ach ja, und die Datei braucht den selben Namen wie die Klasse. (Controll + 1)
 
Ich habe hier jetzt einen neuen code und der funktioniert auch soweit ganz gut, aber wie ermittle ich jetzt den Gewinn bei einer Diagonalen? könntest du mir da weiterhelfen, ich komm einfach nicht auf die lösung.

Und ich wollte noch einen Button per mouselistener einbauen, mit dem man dass momentane Spielfeld leeren kann, also die spielsteine vom Feld löschen.

Außerdem ist noch ein weiterer kleiner fehler im code. Wenn ein Spieler dass Spiel gewinnt, wird dass Spielfeld sofort gelöscht, dass Spielfeld soll aber erst dann nach dem Gewinnen gelöscht werden, wenn der spieler die confirm nachricht bestätigt.
Hoffe du kannst mir weiterhelfen =)

hier der code

Code:
import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.JOptionPane;

public class VierGewinnt_dummy extends Applet implements MouseListener {

	private static final long serialVersionUID = -8566236578954888489L;

	static int feld[][] = { 
						    { 0, 0, 0, 0, 0, 0, 0 }, 
							{ 0, 0, 0, 0, 0, 0, 0 },
							{ 0, 0, 0, 0, 0, 0, 0 }, 
							{ 0, 0, 0, 0, 0, 0, 0 },
							{ 0, 0, 0, 0, 0, 0, 0 }, 
							{ 0, 0, 0, 0, 0, 0, 0 } 
							};

	int player = 1;

	int a = 0;

	int b = 0;

	Image rot;

	Image blau;

	Image cube;

	String Spieler1 = JOptionPane
			.showInputDialog("Spieler1:");

	String Spieler2 = JOptionPane
			.showInputDialog("Spieler 2:");
		
	
	public void init() {
		addMouseListener(this);
		cube = Toolkit.getDefaultToolkit().createImage("cube.gif");
		rot = getImage(getCodeBase(), "rot.gif");
		blau = getImage(getCodeBase(), "blau.gif");
		JOptionPane.showMessageDialog(null, Spieler1 +" beginnt!");
	}
	

	public boolean gewonnen(String Spieler) {
		String s = "";
		for (int y2 = 0; y2 < 6; y2++) {
			for (int x1 = 0; x1 < 7; x1++) {
				s = s + feld[y2][x1];
			}
		}

		for (int x1 = 0; x1 < 7; x1++) {
			for (int y2 = 0; y2 < 6; y2++) {
				s = s + feld[y2][x1];
			}
		}

		repaint();

		if (s.contains(Spieler)) {

			for (int x1 = 0; x1 < 7; x1++)
				for (int y1 = 0; y1 < 6; y1++)
					feld[y1][x1] = 0;
			repaint();
			return true;
		}
		return false;
	}

	public void drawSpielfeld(Graphics g) {
		g.drawImage(cube, 0, 0, this);
		g.setFont(new Font("Comic Sans MS", + Font.BOLD, 20));
		g.setColor(Color.white);
		g.drawLine(0, 50, 0, 350);
		g.drawLine(50, 50, 50, 350);
		g.drawLine(100, 50, 100, 350);
		g.drawLine(150, 50, 150, 350);
		g.drawLine(200, 50, 200, 350);
		g.drawLine(250, 50, 250, 350);
		g.drawLine(300, 50, 300, 350);
		g.drawLine(350, 50, 350, 350);
	
		
		
		g.drawLine(0, 50, 350, 50);
		g.drawLine(0, 100, 350, 100);
		g.drawLine(0, 150, 350, 150);
		g.drawLine(0, 200, 350, 200);
		g.drawLine(0, 250, 350, 250);
		g.drawLine(0, 300, 350, 300);
		g.drawLine(0, 350, 350, 350);
		g.setColor(Color.red);
		g.drawString("Vier Gewinnt", 225, 20);

		g.drawRect(0,350,350,390);
		g.setColor(Color.white);
		g.fillRect(1, 349, 349, 389);
		g.setColor(Color.black );
		g.drawRect(50, 355, 242, 35);
		g.setFont(new Font("Comic Sans MS",  + Font.BOLD, 20));
		g.setColor(Color.black);
		g.drawString("Spielfeld Leeren", 96, 380);
		
		
	
	}

	public void paint(Graphics g) {
		resize(351, 400);
		drawSpielfeld(g);
		for (int x = 0; x < 7; x++) {
			for (int y = 0; y < 6; y++) {
				if (feld[y][x] == 1)
					g.drawImage(rot, 50 * x, 50 * y + 50, this);
				if (feld[y][x] == 2)
					g.drawImage(blau, 50 * x, 50 * y + 50, this);
			}
		}

		g.drawString(Spieler1 + ":" + a, 0, 20);
		g.drawString(Spieler2 + ":" + b, 0, 45);
		
		if (player == 1) { g.drawRect(230,22,118,22); 
							g.setColor(Color.red);
							g.fillRect(231, 23, 117, 21);}
		if (player == 2) {
			g.drawRect(230,22,118,22); 
			g.setColor(Color.blue);
			g.fillRect(231, 23, 117, 21);
		}
	}

	public void mouseClicked(MouseEvent arg0) {

	}

	public void mousePressed(MouseEvent arg0) {

		int x = arg0.getX();
		if (player == 1) {
			int feldvoll = 5;
			if (x < 50) {
				for (feldvoll = 5; feld[feldvoll][0] != 0; feldvoll--) {
				}
				feld[feldvoll][0] = 1;
			}
			if (x > 50 && x < 100) {
				for (feldvoll = 5; feld[feldvoll][1] != 0; feldvoll--) {
				}
				feld[feldvoll][1] = 1;
				
			}
			if (x > 100 && x < 150) {
				for (feldvoll = 5; feld[feldvoll][2] != 0; feldvoll--) {
				}
				feld[feldvoll][2] = 1;
			}
			if (x > 150 && x < 200) {
				for (feldvoll = 5; feld[feldvoll][3] != 0; feldvoll--) {
				}
				feld[feldvoll][3] = 1;
			}
			if (x > 200 && x < 250) {
				for (feldvoll = 5; feld[feldvoll][4] != 0; feldvoll--) {
				}
				feld[feldvoll][4] = 1;
			}
			if (x > 250 && x < 300) {
				for (feldvoll = 5; feld[feldvoll][5] != 0; feldvoll--) {
				}
				feld[feldvoll][5] = 1;
			}
			if (x > 300 && x < 350) {
				for (feldvoll = 5; feld[feldvoll][6] != 0; feldvoll--) {
				}
				feld[feldvoll][6] = 1;
			}
			player = 2;
		} else if (player == 2) {
			int feldvoll = 5;
			if (x < 50) {
				for (feldvoll = 5; feld[feldvoll][0] != 0; feldvoll--) {
				}
				feld[feldvoll][0] = 2;
			}
			if (x > 50 && x < 100) {
				for (feldvoll = 5; feld[feldvoll][1] != 0; feldvoll--) {
				}
				feld[feldvoll][1] = 2;
			}
			if (x > 100 && x < 150) {
				for (feldvoll = 5; feld[feldvoll][2] != 0; feldvoll--) {
				}
				feld[feldvoll][2] = 2;
			}
			if (x > 150 && x < 200) {
				for (feldvoll = 5; feld[feldvoll][3] != 0; feldvoll--) {
				}
				feld[feldvoll][3] = 2;
			}
			if (x > 200 && x < 250) {
				for (feldvoll = 5; feld[feldvoll][4] != 0; feldvoll--) {
				}
				feld[feldvoll][4] = 2;
			}
			if (x > 250 && x < 300) {
				for (feldvoll = 5; feld[feldvoll][5] != 0; feldvoll--) {
				}
				feld[feldvoll][5] = 2;
			}
			if (x > 300 && x < 350) {
				for (feldvoll = 5; feld[feldvoll][6] != 0; feldvoll--) {
				}
				feld[feldvoll][6] = 2;
			}
			player = 1;
		}

	
		if (gewonnen("1111")) {
			a = a + 1;
			JOptionPane.showMessageDialog(null, Spieler1
					+ " hat gewonnen!");
			JOptionPane.showMessageDialog(null, Spieler2 + " ist dran!");
		}
		if (gewonnen("2222")) {
			b = b + 1;
			JOptionPane.showMessageDialog(null, Spieler2
					+ " hat gewonnen!");
			JOptionPane.showMessageDialog(null, Spieler1 + " ist dran!");

		}
	}

	public void mouseReleased(MouseEvent arg0) {

	}

	public void mouseEntered(MouseEvent arg0) {

	}

	public void mouseExited(MouseEvent arg0) {

	}
}
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück