# Projekt: Slot Machine



## Torreto (12. Apr 2011)

Hallo Java experten 

ich bin zur zeit an dem Projekt SlotMachine dran.
Soll ein projekt für dir schule sein.

ich bin zur zeit bein random zahlen zu den bilder zuweisen und hänge da...
kriege die bilder nicht in alle felder rein...
es sind 6 bilder die in 9 felder rein müssen

habe es wie hier unten gemacht: 


```
...
Random zufallsgenerator = new Random();
  int random1 = 1;
  int random2 = 2;
...
  if (random1==1) {g.drawImage(zehn,45,90,99,99,this);}
  if (random1==2) {g.drawImage(zehn,45,205,99,99,this);}
...
```

gibt es eine bessere bzw eine andere methode?


----------



## Volvagia (12. Apr 2011)

Ist Einarmiger Bandit, oder?
Machs doch etwas realitätsgebundener.
3 Arrays oder Liste werden zufällig mit Bildern gefüllt, 3 Zufallszahlen wählen das mittlere Symbol aus, und das und die Umgebenden werden dargestellt.


----------



## Torreto (12. Apr 2011)

nicht einarmiger bandit sondern eher "novoline" style...
also 3x3 felder in dennen eben senkrechte, wagerechte und diagonale kombinationen möglich sind.
nur wenn ich das mit dem generator mache werden nicht alle felder gefüllt...
und weiss nicht genau wie ich das mit arrays oder listener mache...


----------



## Volvagia (12. Apr 2011)

Sorry, das sollte Liste heißen.


```
//Reinladen:
Image[][] slotImages = new Image[vertikale Bildanzahl][horenziontale Slotanzahl]
slotImage[0][1] = cherryImage; //Einfach befüllen.
...
//n Zufallszahlen:
Random zufallsgenerator = new Random();
int[] random = new random[slotanzahl];
for(byte b = 0; b < random.lenght(); b++)
	random[b] = zufallsgenerator.nextInt();
...
//Zeichnen:
for(byte b = 0; b < slotImages.lenght(); b++);
{
	g.drawImage(slotImages[random[b] - 1][b]], x, y, null); //Vorher auf über/unterlauf testen.
	g.drawImage(slotImages[random[b]][b]], x, y, null);
	g.drawImage(slotImages[random[b] + 1][b]], x, y, null);
}
```


----------



## Torreto (12. Apr 2011)

hmm krieg es nicht hin einzufüge kommen haufen fehler...
zun Beipsiel bei: 

slotImage[0][1] = cherryImage; die klammern und 0 und 1 soll falsch sein...


----------



## Torreto (13. Apr 2011)

Habe mal hier mein Quellcode kopiert...
Kann mir das einer an meinem Quellcode erklären?

Also entweder wie ich das mit dem Generator hinkriege das alle Felder gefüllt werden oder wie es geht wie es Volvoga erklärt hat.

Slot Mashine.rar // Load.to Uploadservice
(Hier nochmal download link mit Programm und den dazugehörigen Bildern!)


```
import java.awt.*;
import java.awt.event.*;
import java.util.*;




public class Slot extends Frame implements ActionListener
{
  // Attribute
  Label l1      = new Label("Konto");
  Label l2      = new Label("Einsatz");
  Label l3      = new Label("Gewinn");

  Button hoeher = new Button ("+");
  Button niedriger = new Button ("-");
  Button spin = new Button ("Spin");
  Button reset = new Button ("Reset");

  TextArea  anleitung = new TextArea("Anleitung...", 4,10);
  TextField konto = new TextField("100", 5);
  TextField einsatz = new TextField("10", 5);
  TextField gewinn = new TextField("", 5);

  Image back        = getToolkit().getImage("back.jpg");
  Image zehn        = getToolkit().getImage("zehn.jpg");
  Image bube        = getToolkit().getImage("bube.jpg");
  Image dame        = getToolkit().getImage("dame.jpg");
  Image koenig      = getToolkit().getImage("koenig.jpg");
  Image ass         = getToolkit().getImage("ass.jpg");
  Image joker       = getToolkit().getImage("joker.jpg");
  Image background  = getToolkit().getImage("background.jpg");
  Image geld        = getToolkit().getImage("konto.jpg");
  Image guthaben    = getToolkit().getImage("guthaben.jpg");
  Image plus        = getToolkit().getImage("plus.jpg");
  Image minus       = getToolkit().getImage("minus.jpg");
  Image preis       = getToolkit().getImage("gewinn.jpg");

  Random zufallsgenerator = new Random();
  int random1 = 1;
  int random2 = 2;
  int random3 = 3;
  int random4 = 4;
  int random5 = 5;
  int random6 = 6;
  int random7 = 7;
  int random8 = 8;
  int random9 = 9;





  public static void main (String args[])
  {
      Slot mywindow = new Slot();
  }

    public Slot()
    {

      setSize(700,600);
      setLocation(250,250);
      setVisible(true);
      setTitle("Slot Mashine");
      setResizable(false);

      anleitung.setEditable(false);
      konto.setEditable(false);
      einsatz.setEditable(false);
      gewinn.setEditable(false);


      //Schließfunktion
      addWindowListener(new WindowAdapter()
      {
           public void windowClosing(WindowEvent event)
           {
                System.exit(0);
           }
      });


      //Layout-Manager
        setLayout(null);


      //Bounden der Oberflächen-Elemente
        //l1.setBounds         (25,440,70,11);
        //l2.setBounds         (197,440,80,11);
        //l3.setBounds         (397,440,75,11);

        niedriger.setBounds  (165,460,30,30);
        hoeher.setBounds     (280,460,30,30);
        anleitung.setBounds  (480,400,200,180);
        konto.setBounds      (20,460,75,30);
        einsatz.setBounds    (200,460,75,30);
        gewinn.setBounds     (395,460,75,30);
        spin.setBounds     (280,515,130,60);
        reset.setBounds    (65,515,130,60);


      //Hinzufügen zum Frame
        add(l1);
        add(l2);
        add(l3);

        add(niedriger);
        add(hoeher);
        add(anleitung);
        add(konto);
        add(einsatz);
        add(gewinn);
        add(spin);
        add(reset);

        spin.addActionListener(this);
        hoeher.addActionListener(this);
        niedriger.addActionListener(this);




      //Farbe und Größe der Schriften
      konto.setFont(new Font("Arial", Font.BOLD, 23));
      einsatz.setFont(new Font("Arial", Font.BOLD, 23));
      gewinn.setFont(new Font("Arial", Font.BOLD, 23));
      spin.setFont(new Font("Arial", Font.ITALIC, 40));
      reset.setFont(new Font("Arial", Font.ITALIC, 40));
      l1.setFont(new Font("Monospaced", Font.ITALIC, 18));
      l2.setFont(new Font("Monospaced", Font.ITALIC, 18));
      l3.setFont(new Font("Monospaced", Font.ITALIC, 18));


      konto.setForeground (new Color(0,0,255));
      einsatz.setForeground (new Color(0,0,255));
      gewinn.setForeground (new Color(255,0,0));


    }

    public void paint (Graphics g)
  {
     g.drawImage(background,0,0,700,600,this);
     g.drawImage(geld,20,430,75,30,this);
     g.drawImage(guthaben,185,435,100,19,this);
     g.drawImage(plus,280,460,30,30,this);
     g.drawImage(minus,165,460,30,30,this);
     g.drawImage(preis,395,430,75,30,this);
     
     g.drawRect(480,80,200,300);  // Mögliche Gewinne
     g.drawRect(20,80,450,350);   // Hauptfenster

     g.drawRect(65,90,100,100);
     g.drawRect(65,205,100,100);    // Erste reihe der Rechtecke im Haputfenster
     g.drawRect(65,320,100,100);

     g.drawRect(190,90,100,100);
     g.drawRect(190,205,100,100);    // Zweite reihe der Rechtecke im Haputfenster
     g.drawRect(190,320,100,100);

     g.drawRect(315,90,100,100);
     g.drawRect(315,205,100,100);    // Dritte reihe der Rechtecke im Haputfenster
     g.drawRect(315,320,100,100);

     g.drawImage(back,20,80,450,350,this);


     //Zufallsfunktion der Bilder
     if (random1==1) {g.drawImage(zehn,45,90,99,99,this);}
     if (random1==2) {g.drawImage(zehn,45,205,99,99,this);}
     if (random1==3) {g.drawImage(zehn,45,320,99,99,this);}
     if (random1==4) {g.drawImage(zehn,190,90,99,99,this);}
     if (random1==5) {g.drawImage(zehn,190,205,99,99,this);}
     if (random1==6) {g.drawImage(zehn,190,320,99,99,this);}
     if (random1==7) {g.drawImage(zehn,335,90,99,99,this);}
     if (random1==8) {g.drawImage(zehn,335,205,99,99,this);}
     if (random1==9) {g.drawImage(zehn,335,320,99,99,this);}

     if (random2==1) {g.drawImage(bube,45,90,99,99,this);}
     if (random2==2) {g.drawImage(bube,45,205,99,99,this);}
     if (random2==3) {g.drawImage(bube,45,320,99,99,this);}
     if (random2==4) {g.drawImage(bube,190,90,99,99,this);}
     if (random2==5) {g.drawImage(bube,190,205,99,99,this);}
     if (random2==6) {g.drawImage(bube,190,320,99,99,this);}
     if (random2==7) {g.drawImage(bube,335,90,99,99,this);}
     if (random2==8) {g.drawImage(bube,335,205,99,99,this);}
     if (random2==9) {g.drawImage(bube,335,320,99,99,this);}

     if (random3==1) {g.drawImage(dame,45,90,99,99,this);}
     if (random3==2) {g.drawImage(dame,45,205,99,99,this);}
     if (random3==3) {g.drawImage(dame,45,320,99,99,this);}
     if (random3==4) {g.drawImage(dame,190,90,99,99,this);}
     if (random3==5) {g.drawImage(dame,190,205,99,99,this);}
     if (random3==6) {g.drawImage(dame,190,320,99,99,this);}
     if (random3==7) {g.drawImage(dame,335,90,99,99,this);}
     if (random3==8) {g.drawImage(dame,335,205,99,99,this);}
     if (random3==9) {g.drawImage(dame,335,320,99,99,this);}

     if (random4==1) {g.drawImage(koenig,45,90,99,99,this);}
     if (random4==2) {g.drawImage(koenig,45,205,99,99,this);}
     if (random4==3) {g.drawImage(koenig,45,320,99,99,this);}
     if (random4==4) {g.drawImage(koenig,190,90,99,99,this);}
     if (random4==5) {g.drawImage(koenig,190,205,99,99,this);}
     if (random4==6) {g.drawImage(koenig,190,320,99,99,this);}
     if (random4==7) {g.drawImage(koenig,335,90,99,99,this);}
     if (random4==8) {g.drawImage(koenig,335,205,99,99,this);}
     if (random4==9) {g.drawImage(koenig,335,320,99,99,this);}

     if (random5==1) {g.drawImage(ass,45,90,99,99,this);}
     if (random5==2) {g.drawImage(ass,45,205,99,99,this);}
     if (random5==3) {g.drawImage(ass,45,320,99,99,this);}
     if (random5==4) {g.drawImage(ass,190,90,99,99,this);}
     if (random5==5) {g.drawImage(ass,190,205,99,99,this);}
     if (random5==6) {g.drawImage(ass,190,320,99,99,this);}
     if (random5==7) {g.drawImage(ass,335,90,99,99,this);}
     if (random5==8) {g.drawImage(ass,335,205,99,99,this);}
     if (random5==9) {g.drawImage(ass,335,320,99,99,this);}

     if (random6==1) {g.drawImage(joker,45,90,99,99,this);}
     if (random6==2) {g.drawImage(joker,45,205,99,99,this);}
     if (random6==3) {g.drawImage(joker,45,320,99,99,this);}
     if (random6==4) {g.drawImage(joker,190,90,99,99,this);}
     if (random6==5) {g.drawImage(joker,190,205,99,99,this);}
     if (random6==6) {g.drawImage(joker,190,320,99,99,this);}
     if (random6==7) {g.drawImage(joker,335,90,99,99,this);}
     if (random6==8) {g.drawImage(joker,335,205,99,99,this);}
     if (random6==9) {g.drawImage(joker,335,320,99,99,this);}

  }





  public void actionPerformed(ActionEvent e)
  {
    random1 = zufallsgenerator.nextInt(10);
    random2 = zufallsgenerator.nextInt(10);
    random3 = zufallsgenerator.nextInt(10);
    random4 = zufallsgenerator.nextInt(10);
    random5 = zufallsgenerator.nextInt(10);
    random6 = zufallsgenerator.nextInt(10);
    random7 = zufallsgenerator.nextInt(10);
    random8 = zufallsgenerator.nextInt(10);
    random9 = zufallsgenerator.nextInt(10);
    repaint();

  }

}
```


----------



## Volvagia (13. Apr 2011)

Man kann im Forum auch hochladen.


```
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferedImage;
import java.util.Random;
import java.util.concurrent.TimeUnit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
 
public class Slot extends JFrame implements ActionListener
{
	private static final long serialVersionUID = 1L;

	private static final int MAX_SPINNS = 50;
	private static final int MIN_SPINNS = 10;
	private static final long SLOT_START_SPEED = 5L; //Weniger ist mehr!
	private static final long SLOT_ACCELERATION = 1L; //Weniger ist mehr!

	private JLabel l1 = new JLabel("Konto");
	private JLabel l2 = new JLabel("Einsatz");
	private JLabel l3 = new JLabel("Gewinn");
 
	private JButton hoeher = new JButton ("+");
	private JButton niedriger = new JButton ("-");
	private JButton spin = new JButton ("Spin");
	private JButton reset = new JButton ("Reset");
 
	private JTextArea  anleitung = new JTextArea("Anleitung...", 4,10);
	private JTextField konto = new JTextField("100", 5);
	private JTextField einsatz = new JTextField("10", 5);
	private JTextField gewinn = new JTextField("", 5);

	private Image[] slotImages = {
			getToolkit().getImage("zehn.jpg"),
			getToolkit().getImage("bube.jpg"),
			getToolkit().getImage("dame.jpg"),
			getToolkit().getImage("koenig.jpg"),
			getToolkit().getImage("ass.jpg"),
			getToolkit().getImage("joker.jpg")
	};
	
	private Image background = getToolkit().getImage("background.jpg");
	private Image geld = getToolkit().getImage("konto.jpg");
	private Image guthaben = getToolkit().getImage("guthaben.jpg");
	private Image plus  = getToolkit().getImage("plus.jpg");
	private Image minus = getToolkit().getImage("minus.jpg");
	private Image preis = getToolkit().getImage("gewinn.jpg");
	private Image back = getToolkit().getImage("back.jpg");
	
	private int[] selectedSlots = new int[] {
			0, 0, 0
	};
	
	private BufferedImage offscreenImage;
	
	public static void main(String args[])
	{
		new Slot();
	}
	public Slot()
	{
		super("Slot Mashine");
		setSize(700,600);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		setLayout(null);
		waitForImages();
		
		anleitung.setEditable(false);
		konto.setEditable(false);
		einsatz.setEditable(false);
		gewinn.setEditable(false);
 
		niedriger.setBounds(165,460,30,30);
		hoeher.setBounds(280,460,30,30);
		anleitung.setBounds(480,400,200,180);
		konto.setBounds(20,460,75,30);
		einsatz.setBounds(200,460,75,30);
		gewinn.setBounds(395,460,75,30);
		spin.setBounds(280,515,130,60);
		reset.setBounds(65,515,130,60);
 
 
		add(l1);
		add(l2);
		add(l3);
 
		add(niedriger);
		add(hoeher);
		add(anleitung);
		add(konto);
		add(einsatz);
		add(gewinn);
		add(spin);
		add(reset);
 
		spin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e)
			{
				for(byte b = 0; b < 3; b++)
				{
					new SpinThread(b).start();
				}
			}
		});
		hoeher.addActionListener(this);
		niedriger.addActionListener(this);
 
		//Farbe und Größe der Schriften
		konto.setFont(new Font("Arial", Font.BOLD, 23));
		einsatz.setFont(new Font("Arial", Font.BOLD, 23));
		gewinn.setFont(new Font("Arial", Font.BOLD, 23));
		spin.setFont(new Font("Arial", Font.ITALIC, 40));
		reset.setFont(new Font("Arial", Font.ITALIC, 40));
		l1.setFont(new Font("Monospaced", Font.ITALIC, 18));
		l2.setFont(new Font("Monospaced", Font.ITALIC, 18));
		l3.setFont(new Font("Monospaced", Font.ITALIC, 18));
 
		konto.setForeground (new Color(0,0,255));
		einsatz.setForeground (new Color(0,0,255));
		gewinn.setForeground (new Color(255,0,0));

		setVisible(true); 
    }
	private void waitForImages()
	{
		MediaTracker tracker = new MediaTracker(this);
		int size = slotImages.length;
		for(int i = 0; i < size; i++)
			tracker.addImage(slotImages[i], i);
		
		tracker.addImage(background, size);
		tracker.addImage(geld, size + 1);
		tracker.addImage(guthaben, size + 2);
		tracker.addImage(plus, size + 3);
		tracker.addImage(minus, size + 4);
		tracker.addImage(preis, size + 5);
		tracker.addImage(back, size + 6);
		
		try
		{
			tracker.waitForAll();
		}
		catch (InterruptedException e) {}
	}
	
	
	public void paint(Graphics g)
	{
		super.paint(g);
		
		g.drawImage(background,0,0,700,600,this);
		g.drawImage(geld,20,430,75,30,this);
		g.drawImage(guthaben,185,435,100,19,this);
		g.drawImage(plus,280,460,30,30,this);
		g.drawImage(minus,165,460,30,30,this);
		g.drawImage(preis, 395, 430, 75, 30, this);
     
		g.drawRect(480,80,200,300);  // Mögliche Gewinne
		g.drawRect(20,80,450,350);   // Hauptfenster
 
		g.drawRect(65,90,100,100);
		g.drawRect(65,205,100,100);    // Erste reihe der Rechtecke im Haputfenster
		g.drawRect(65,320,100,100);
 
		g.drawRect(190,90,100,100);
		g.drawRect(190,205,100,100);    // Zweite reihe der Rechtecke im Haputfenster
		g.drawRect(190,320,100,100);
 
		g.drawRect(315,90,100,100);
		g.drawRect(315,205,100,100);    // Dritte reihe der Rechtecke im Haputfenster
		g.drawRect(315,320,100,100);
 
		g.drawImage(back,20,80,450,350,this);
 
		for(byte b = 0; b < selectedSlots.length; b++)
		{
			int imageId = selectedSlots[b];

			int prevImageId = imageId - 1;
			prevImageId = prevImageId >= 0 ? prevImageId : slotImages.length - 1;
			
			if(b == 0) //Bedarf dringend einer Verbesserung
				g.drawImage(slotImages[prevImageId], 45, 90, null);
			else if(b == 1)
				g.drawImage(slotImages[prevImageId], 190, 90, null);
			if(b == 2)
				g.drawImage(slotImages[prevImageId], 335, 90, null);

			if(b == 0)
				g.drawImage(slotImages[imageId], 45, 205, null);
			else if(b == 1)
				g.drawImage(slotImages[imageId], 190, 205, null);
			if(b == 2)
				g.drawImage(slotImages[imageId], 335, 205, null);
			
			int nextImageId = imageId + 1;
			nextImageId = nextImageId < slotImages.length ? nextImageId : 0;
			
			if(b == 0)
				g.drawImage(slotImages[nextImageId], 45, 320, null);
			else if(b == 1)
				g.drawImage(slotImages[nextImageId], 190, 320, null);
			if(b == 2)
				g.drawImage(slotImages[nextImageId], 335, 320, null);
		}
	}
	private class SpinThread extends Thread
	{
		private int i;
		private Random random;
		
		private SpinThread(int i)
		{
			this.i = i;
			random = new Random();
		}
		public void run()
		{
			long speed = SLOT_START_SPEED;
			
		    int rand = random.nextInt(MAX_SPINNS - MIN_SPINNS + 1) + MIN_SPINNS;
			rand = rand * (i + 1);
		    
		    for(int j = 0; j < rand; j++)
		    {
		    	if(random.nextInt(2)%2 == 0)
		    	{
		    		selectedSlots[i] = selectedSlots[i] + 1;
			    	selectedSlots[i] = selectedSlots[i] != slotImages.length ? selectedSlots[i] : 0;
			    	repaint();
		    	}
		    	
		    	try
				{
					TimeUnit.MILLISECONDS.sleep(speed);
				}
				catch (InterruptedException e) {}
				speed+= SLOT_ACCELERATION;
		    }
		}
	}
	public void update(Graphics g)
	{
		int frameWidth = getWidth();
		int frameHeight = getHeight();
	 
		if(offscreenImage == null)
			offscreenImage = new BufferedImage(frameWidth, frameHeight, BufferedImage.TYPE_INT_RGB);
		
		Graphics2D g2d = offscreenImage.createGraphics();
		g2d.setColor(this.getBackground());
		g2d.fillRect(0, 0, frameWidth, frameHeight);
		g2d.setColor(this.getForeground());
		paint(g2d);
		g.drawImage(offscreenImage, 0, 0, null);
	}
	public void actionPerformed(ActionEvent e)
	{
		/*random1 = zufallsgenerator.nextInt(10);
    	random2 = zufallsgenerator.nextInt(10);
    	random3 = zufallsgenerator.nextInt(10);
    	random4 = zufallsgenerator.nextInt(10);
    	random5 = zufallsgenerator.nextInt(10);
    	random6 = zufallsgenerator.nextInt(10);
    	random7 = zufallsgenerator.nextInt(10);
    	random8 = zufallsgenerator.nextInt(10);
    	random9 = zufallsgenerator.nextInt(10);*/
		repaint();
	}
}
```


----------



## Torreto (13. Apr 2011)

Erstmal vielen vielen dank das du dir überhaupt mühe machst!

Also ich soll das nicht im JFrame machen sondern normale Frame...
Habe das soweit alles geändert nur bei zeile 246 kommt ein fehler:

Package TimeUnit does not exist
[JAVA=246]TimeUnit.MILLISECONDS.sleep(speed);[/code]


----------



## Volvagia (13. Apr 2011)

Sehr seltsam.
Kannst es auch durch "Thread.sleep(speed)" ersetzen.


----------



## Torreto (13. Apr 2011)

Ja ist für die schule... die machen es nach alter art^^

Könntest du mir Zeile 21, 59-61, 108-114, 137-155, 186-266 nochmal erklären was da genau geschieht bzw kurz kommentieren?


----------



## Volvagia (13. Apr 2011)

```
private static final long serialVersionUID = 1L;
```
ist eine Variable, die man bei serialisierbaren Klassen angeben sollte. Die verhindert, dass man eine veraltete Version einer Klasse läd, indem man einfach die Klassenversion einträgt. Wenn du nicht serialisieren willst (was du eh nicht willst), kannst du sie einfach ignorieren oder wieder entfernen.


```
private int[] selectedSlots = new int[] {
	0, 0, 0
};
```
definiert ein Array und füllt es mit Nullen. Ich kann nicht glauben, dass ihr mit GUIs rumspielt und diese Basics noch nicht gelernt habt.


```
spin.addActionListener(new ActionListener() {
	public void actionPerformed(ActionEvent e)
	{
		for(byte b = 0; b < 3; b++)
		{
			new SpinThread(b).start();
		}
	}
});
```
erzeugt eine neue anonyme Klasse. Die Klassen haben keinen Konstruktor (im klassischen Sinn), und können keine neuen Methoden aufnehmen. Man kann aber alte überschreiben. In dem Fall wird einfach nur in einer Schleife 3 mal durchgelaufen, und jedes mal eine neue Instanz von SpinThread erzeugt und start() aufgerufen.


```
MediaTracker tracker = new MediaTracker(this);
int size = slotImages.length;
for(int i = 0; i < size; i++)
	tracker.addImage(slotImages[i], i);
		
tracker.addImage(background, size);
tracker.addImage(geld, size + 1);
tracker.addImage(guthaben, size + 2);
tracker.addImage(plus, size + 3);
tracker.addImage(minus, size + 4);
tracker.addImage(preis, size + 5);
tracker.addImage(back, size + 6);
		
try
{
	tracker.waitForAll();
}
catch (InterruptedException e) {}
```
wartet darauf, dass die Bilder vollständig geladen sind. Mit addImage wird eins hinzugefügt, und mit waitForAll wartet er, bis alle da sind.


```
for(byte b = 0; b < selectedSlots.length; b++)
{
	int imageId = selectedSlots[b];

	int prevImageId = imageId - 1;
	prevImageId = prevImageId >= 0 ? prevImageId : slotImages.length - 1;
			
	if(b == 0) //Bedarf dringend einer Verbesserung
		g.drawImage(slotImages[prevImageId], 45, 90, null);
	else if(b == 1)
		g.drawImage(slotImages[prevImageId], 190, 90, null);
	if(b == 2)
		g.drawImage(slotImages[prevImageId], 335, 90, null);

	if(b == 0)
		g.drawImage(slotImages[imageId], 45, 205, null);
	else if(b == 1)
		g.drawImage(slotImages[imageId], 190, 205, null);
	if(b == 2)
		g.drawImage(slotImages[imageId], 335, 205, null);
			
	int nextImageId = imageId + 1;
	nextImageId = nextImageId < slotImages.length ? nextImageId : 0;
			
	if(b == 0)
		g.drawImage(slotImages[nextImageId], 45, 320, null);
	else if(b == 1)
		g.drawImage(slotImages[nextImageId], 190, 320, null);
	if(b == 2)
		g.drawImage(slotImages[nextImageId], 335, 320, null);
}
```
ist der Zeichenteil der Slots. In einer Schleife rennt er 3 mal durch, und hohlt sich den ausgewählten Slot (selectedSlots*). Danach hohlt er sich noch den vorherigen und nächsten (int prevImageId = imageId - 1; und int nextImageId = imageId + 1; bzw. prüft sie auf einen Überlauf, falls einer der Slots -1 oder mehr als es Bilder gibt (- 1) hat. (prevImageId = prevImageId >= 0 ? prevImageId : slotImages.length - 1; und nextImageId = nextImageId < slotImages.length ? nextImageId : 0
Danach wird einfach jedes Bild an seinen Platz gemahlt.*


----------



## Torreto (13. Apr 2011)

Vielen Dank! 

So bisher letze frage...
wie bekomme ich es hin das sich der dritte balken kürzer dreht?
bzw wo kann ich das einstellen für jeden balken?


----------



## Volvagia (13. Apr 2011)

```
private class SpinThread extends Thread
{
	private int i;
	private Random random;
	
	private SpinThread(int i)
	{
		this.i = i;
		random = new Random();
	}
	public void run()
	{
		long speed = SLOT_START_SPEED;
		
		int rand = random.nextInt(MAX_SPINNS - MIN_SPINNS + 1) + MIN_SPINNS;
		rand = rand * (i + 1);
		    
		for(int j = 0; j < rand; j++)
		{
			if(random.nextInt(2)%2 == 0)
		    	{
				selectedSlots[i] = selectedSlots[i] + 1;
				selectedSlots[i] = selectedSlots[i] != slotImages.length ? selectedSlots[i] : 0;
				repaint();
			}
 	
			try
			{
				TimeUnit.MILLISECONDS.sleep(speed);
			}
			catch (InterruptedException e) {}
			speed+= SLOT_ACCELERATION;
		}
	}
}
```

Das kontrolliert die Balken und wird 3 mal unabhängig voneinander gestartet. (Siehe ActionListener von Spin)
Zuerst wird eine Zufallszahl zwischen MIN_SPINNS und MAX_SPINNS erzeugt. Diese wird mit der Balkenid multipliziert (+ 1, da der erste Balken sonst immer 0 wäre), damit sie in fast allen Fällen nacheinander stehenbleiben, und sosoft, wie dabei rausgekommen ist rennt er durch. Per Zufall macht er in 50 von 100 Fällen garnichts, ich dachte damit kommt mehr Zufall rein und es sieht nach mehr Eigenleben aus. Danach erhöht er die id des momentanen Bildes und beantragt ein neu zeichnen. Danach wartet er und erhöht speed, damit er mit der Zeit langsamer wird.
Hab aber noch nie mit so einer Maschine gespielt, daher ist das Verhalten nur geraten.


----------



## Torreto (13. Apr 2011)

Vielen Dank! Werde mich nochmal melden wenn ich probleme habe


----------



## Torreto (28. Apr 2011)

Habe bis her den + und - Button hinzugefügt aber bekomme einfach das berechnen und ausgeben des gewinns nicht heraus...

hier noch mal der quellcode:


```
import java.awt.*;
import java.awt.event.*;
import java.awt.image.*;
import java.util.*;


public class Slot extends Frame implements ActionListener
{
  
  
  int i = 10;
  int bth = 10;
  
    private static final int MAX_SPINNS = 20;
    private static final int MIN_SPINNS = 15;
    private static final long SLOT_START_SPEED = 5L; //Weniger ist mehr!
    private static final long SLOT_ACCELERATION = 1L; //Weniger ist mehr!

    private Label l1 = new Label("Konto");
    private Label l2 = new Label("Einsatz");
    private Label l3 = new Label("Gewinn");

    private Button hoeher = new Button ("+");
    private Button niedriger = new Button ("-");
    private Button spin = new Button ("Spin");
    private Button reset = new Button ("Reset");

    private TextArea  anleitung = new TextArea("Anleitung...", 4,10);
    private TextField konto = new TextField("100", 5);
    private TextField einsatz = new TextField("10", 5);
    private TextField gewinn = new TextField("", 5);

    private Image[] slotImages = {
            getToolkit().getImage("zehn.jpg"),
            getToolkit().getImage("bube.jpg"),
            getToolkit().getImage("dame.jpg"),
            getToolkit().getImage("koenig.jpg"),
            getToolkit().getImage("ass.jpg"),
            getToolkit().getImage("joker.jpg")
    };

    private Image background        = getToolkit().getImage("background.jpg");
    private Image geld              = getToolkit().getImage("konto.jpg");
    private Image guthaben          = getToolkit().getImage("guthaben.jpg");
    private Image plus              = getToolkit().getImage("plus.jpg");
    private Image minus             = getToolkit().getImage("minus.jpg");
    private Image preis             = getToolkit().getImage("gewinn.jpg");
    private Image back              = getToolkit().getImage("back.jpg");

    private int[] selectedSlots = new int[] {
            0, 0, 0
    };

    private BufferedImage offscreenImage;

    public static void main(String args[])
    {
        new Slot();
    }
    public Slot()
    {
        super("Slot Mashine");
        setSize(700,600);
        setLocationRelativeTo(null);
        setResizable(false);
        setLayout(null);
        waitForImages();
        
        //Schließfunktion
      addWindowListener(new WindowAdapter()
      {
           public void windowClosing(WindowEvent event)
           {
                System.exit(0);
           }
      });

        anleitung.setEditable(false);
        konto.setEditable(false);
        einsatz.setEditable(false);
        gewinn.setEditable(false);

        niedriger.setBounds(165,460,30,30);
        hoeher.setBounds(280,460,30,30);
        anleitung.setBounds(480,400,200,180);
        konto.setBounds(20,460,75,30);
        einsatz.setBounds(200,460,75,30);
        gewinn.setBounds(395,460,75,30);
        spin.setBounds(280,515,130,60);
        reset.setBounds(65,515,130,60);


        add(l1);
        add(l2);
        add(l3);

        add(niedriger);
        add(hoeher);
        add(anleitung);
        add(konto);
        add(einsatz);
        add(gewinn);
        add(spin);
        add(reset);

        spin.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e)
            {
                for(byte b = 0; b < 3; b++)
                {
                    new SpinThread(b).start();
                }
            }
        });
        
        
        hoeher.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae)
            {
                if(bth >= 100)
                {
                
                }
                else
                {
                bth = bth + 5;
                
                einsatz.setText(String.valueOf(bth));
                }
                
            }
        });
              
              
        niedriger.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e)
            {
              if(bth <= 0) { }
                
                else
                { 
                bth = bth - 5;
                einsatz.setText(String.valueOf(bth));
                }
            }
        });

        //Farbe und Größe der Schriften
        konto.setFont(new Font("Arial", Font.BOLD, 23));
        einsatz.setFont(new Font("Arial", Font.BOLD, 23));
        gewinn.setFont(new Font("Arial", Font.BOLD, 23));
        spin.setFont(new Font("Arial", Font.ITALIC, 40));
        reset.setFont(new Font("Arial", Font.ITALIC, 40));
        l1.setFont(new Font("Monospaced", Font.ITALIC, 18));
        l2.setFont(new Font("Monospaced", Font.ITALIC, 18));
        l3.setFont(new Font("Monospaced", Font.ITALIC, 18));

        konto.setForeground (new Color(0,0,255));
        einsatz.setForeground (new Color(0,0,255));
        gewinn.setForeground (new Color(255,0,0));

        setVisible(true);
    }
    private void waitForImages()
    {
        MediaTracker tracker = new MediaTracker(this);
        int size = slotImages.length;
        for(int i = 0; i < size; i++)
        tracker.addImage(slotImages[i], i);

        tracker.addImage(background, size);
        tracker.addImage(geld, size + 1);
        tracker.addImage(guthaben, size + 2);
        tracker.addImage(plus, size + 3);
        tracker.addImage(minus, size + 4);
        tracker.addImage(preis, size + 5);
        tracker.addImage(back, size + 6);

        try
        {
            tracker.waitForAll();
        }
        catch (InterruptedException e) {}
    }


    public void paint(Graphics g)
    {
        super.paint(g);

        g.drawImage(background,0,0,700,600,this);
        g.drawImage(geld,20,430,75,30,this);
        g.drawImage(guthaben,185,435,100,19,this);
        g.drawImage(plus,280,460,30,30,this);
        g.drawImage(minus,165,460,30,30,this);
        g.drawImage(preis, 395, 430, 75, 30, this);

        g.drawRect(480,80,200,300);  // Mögliche Gewinne
        g.drawRect(20,80,450,350);   // Hauptfenster


        g.drawImage(back,20,80,450,350,this);


        for(byte b = 0; b < selectedSlots.length; b++)
        {
            int imageId = selectedSlots[b];

            int prevImageId = imageId -1;
            prevImageId = prevImageId >= 0 ? prevImageId : slotImages.length - 1;

            if(b == 1) //Bedarf dringend einer Verbesserung
                g.drawImage(slotImages[prevImageId], 45, 90, null);
            else if(b == 2)
                g.drawImage(slotImages[prevImageId], 190, 90, null);
            if(b == 0)
                g.drawImage(slotImages[prevImageId], 335, 90, null);

            if(b == 0)
                g.drawImage(slotImages[imageId], 45, 205, null);
            else if(b == 2)
                g.drawImage(slotImages[imageId], 190, 205, null);
            if(b == 1)
                g.drawImage(slotImages[imageId], 335, 205, null);

            int nextImageId = imageId +1;
            nextImageId = nextImageId < slotImages.length ? nextImageId : 1;

            if(b == 1)
                g.drawImage(slotImages[nextImageId], 45, 320, null);
            else if(b == 0)
                g.drawImage(slotImages[nextImageId], 190, 320, null);
            if(b == 2)
                g.drawImage(slotImages[nextImageId], 335, 320, null);
        }
    }
    private class SpinThread extends Thread
    {
        private int i;
        private Random random;

        private SpinThread(int i)
        {
            this.i = i;
            random = new Random();
        }
        public void run()
        {
            long speed = SLOT_START_SPEED;

            int rand = random.nextInt(MAX_SPINNS - MIN_SPINNS + 1) + MIN_SPINNS;
            rand = rand * (i + 1);

            for(int j = 0; j < rand; j++)
            {
                if(random.nextInt(2)%2 == 0)
                {
                    selectedSlots[i] = selectedSlots[i] + 1;
                    selectedSlots[i] = selectedSlots[i] != slotImages.length ? selectedSlots[i] : 0;
                    repaint();
                }

                try
                {
                    Thread.sleep(speed);
                }
                catch (InterruptedException e) {}
                speed+= SLOT_ACCELERATION;
            }
        }
    }
    public void update(Graphics g)
    {
        int frameWidth = getWidth();
        int frameHeight = getHeight();

        if(offscreenImage == null)
            offscreenImage = new BufferedImage(frameWidth, frameHeight, BufferedImage.TYPE_INT_RGB);

        Graphics2D g2d = offscreenImage.createGraphics();
        g2d.setColor(this.getBackground());
        g2d.fillRect(0, 0, frameWidth, frameHeight);
        g2d.setColor(this.getForeground());
        paint(g2d);
        g.drawImage(offscreenImage, 0, 0, null);
    }
    public void actionPerformed(ActionEvent e)
    {
    }
}
```


----------



## Torreto (30. Apr 2011)

keiner eine idee?


----------



## Volvagia (2. Mai 2011)

Ich habs mal ein wenig umgeschrieben.


```
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.image.BufferStrategy;
import java.lang.reflect.InvocationTargetException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
 
public class Slot extends JFrame
{
	private static final long serialVersionUID = 1L;

	private static final byte SLOT_JUMP_MOD = 95;
	private static final int SLOT_RUNS = 100;
	private static final long SLOT_SPEED = 5L;
	
	private static final String DESCRIPTION_TEXT = "Anleitung...";
	
	
	private JLabel l1 = new JLabel("Konto");
	private JLabel l2 = new JLabel("Einsatz");
	private JLabel l3 = new JLabel("Gewinn");
 
	private JButton hoeher = new JButton ("+");
	private JButton niedriger = new JButton ("-");
	private JButton spin = new JButton ("Spin");
	private JButton reset = new JButton ("Reset");
 
	private JTextArea  anleitung = new JTextArea(DESCRIPTION_TEXT, 4,10);
	private JTextField konto = new JTextField("100", 5);
	private JTextField einsatz = new JTextField("10", 5);
	private JTextField gewinn = new JTextField("", 5);

	private Image[] slotImages = {
			getToolkit().getImage("zehn.jpg"),
			getToolkit().getImage("bube.jpg"),
			getToolkit().getImage("dame.jpg"),
			getToolkit().getImage("koenig.jpg"),
			getToolkit().getImage("ass.jpg"),
			getToolkit().getImage("joker.jpg")
	};
	
	private Image background = getToolkit().getImage("background.jpg");
	private Image geld = getToolkit().getImage("konto.jpg");
	private Image guthaben = getToolkit().getImage("guthaben.jpg");
	private Image plus  = getToolkit().getImage("plus.jpg");
	private Image minus = getToolkit().getImage("minus.jpg");
	private Image preis = getToolkit().getImage("gewinn.jpg");
	private Image back = getToolkit().getImage("back.jpg");
	
	private int[] selectedSlots = new int[] {
			0, 0, 0
	};
	
	private BufferStrategy bs;
	
	public static void main(String args[])
	{
		new Slot();
	}
	public Slot()
	{
		super("Slot Machine");
		setSize(700,600);
		setLocationRelativeTo(null);
		setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		setResizable(false);
		setLayout(null);
		waitForImages();
		
		anleitung.setEditable(false);
		konto.setEditable(false);
		einsatz.setEditable(false);
		gewinn.setEditable(false);
 
		niedriger.setBounds(165,460,30,30);
		hoeher.setBounds(280,460,30,30);
		anleitung.setBounds(480,400,200,180);
		konto.setBounds(20,460,75,30);
		einsatz.setBounds(200,460,75,30);
		gewinn.setBounds(395,460,75,30);
		spin.setBounds(280,515,130,60);
		reset.setBounds(65,515,130,60);
 
 
		add(l1);
		add(l2);
		add(l3);
 
		add(niedriger);
		add(hoeher);
		add(anleitung);
		add(konto);
		add(einsatz);
		add(gewinn);
		add(spin);
		add(reset);
 
		spin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				handleGamecontroll();
			}
		});
		hoeher.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int intEinsatz = Integer.parseInt(einsatz.getText());
				int intGuthaben = Integer.parseInt(konto.getText());
				
				intEinsatz+= 10;
				if(intEinsatz > intGuthaben)
					return;
				
				einsatz.setText(String.valueOf(intEinsatz));
			}
		});
		niedriger.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int intEinsatz = Integer.parseInt(einsatz.getText());
				
				intEinsatz-= 10;
				if(intEinsatz <= 0)
					return;
				einsatz.setText(String.valueOf(intEinsatz));
			}
		});
		
		//Farbe und Größe der Schriften
		konto.setFont(new Font("Arial", Font.BOLD, 23));
		einsatz.setFont(new Font("Arial", Font.BOLD, 23));
		gewinn.setFont(new Font("Arial", Font.BOLD, 23));
		spin.setFont(new Font("Arial", Font.ITALIC, 40));
		reset.setFont(new Font("Arial", Font.ITALIC, 40));
		l1.setFont(new Font("Monospaced", Font.ITALIC, 18));
		l2.setFont(new Font("Monospaced", Font.ITALIC, 18));
		l3.setFont(new Font("Monospaced", Font.ITALIC, 18));
 
		konto.setForeground (new Color(0,0,255));
		einsatz.setForeground (new Color(0,0,255));
		gewinn.setForeground (new Color(255,0,0));

		setVisible(true); 
    }
	private void waitForImages()
	{
		MediaTracker tracker = new MediaTracker(this);
		int size = slotImages.length;
		for(int i = 0; i < size; i++)
			tracker.addImage(slotImages[i], i);
		
		tracker.addImage(background, size);
		tracker.addImage(geld, size + 1);
		tracker.addImage(guthaben, size + 2);
		tracker.addImage(plus, size + 3);
		tracker.addImage(minus, size + 4);
		tracker.addImage(preis, size + 5);
		tracker.addImage(back, size + 6);
		
		try
		{
			tracker.waitForAll();
		}
		catch (InterruptedException e) {}
	}
	private void handleGamecontroll()
	{
		final Runnable run = new Runnable() {
			public void run()
			{
				spin.setEnabled(false);
				reset.setEnabled(false);
				
				int intEinsatz = Integer.parseInt(einsatz.getText());
				int intKonto = Integer.parseInt(konto.getText());
				
				intKonto-= intEinsatz;
				konto.setText(String.valueOf(intKonto));
			}
		};
		
		if(!EventQueue.isDispatchThread())
		{
			try
			{
				SwingUtilities.invokeAndWait(new Runnable() {
					public void run() {
						run.run();
					}
				});
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			catch (InvocationTargetException e)
			{
				e.printStackTrace();
			}
		}
		else
			run.run();
		
		new Thread() {
			public void run() {
				Thread t = new SpinThread();
				t.start();
				
				try
				{
					t.join();
				}
				catch (InterruptedException e) {}
				
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						int intKonto = Integer.parseInt(konto.getText());
						if(selectedSlots[0] == selectedSlots[1] && selectedSlots[1] == selectedSlots[2])
						{
							int intEinsatz = Integer.parseInt(einsatz.getText());
							intEinsatz*= 5;

							intKonto = Integer.parseInt(konto.getText());
							intKonto+= intEinsatz;
							
							konto.setText(String.valueOf(intKonto));
						}

						if(intKonto > 0)
						{
							spin.setEnabled(true);
							reset.setEnabled(true);
						}
					}
				});
			}
		}.start();
	}
	
	public void paint(Graphics g2)
	{
		if(bs == null)
		{
			createBufferStrategy(4);
			bs = getBufferStrategy();
		}
		if(bs == null)
			return;
		
		Graphics g = bs.getDrawGraphics();
		
		super.paint(g);
				
		g.drawImage(background,0,0,700,600,this);
		g.drawImage(geld,20,430,75,30,this);
		g.drawImage(guthaben,185,435,100,19,this);
		g.drawImage(plus,280,460,30,30,this);
		g.drawImage(minus,165,460,30,30,this);
		g.drawImage(preis, 395, 430, 75, 30, this);
     
		g.drawRect(480,80,200,300);  // Mögliche Gewinne
		g.drawRect(20,80,450,350);   // Hauptfenster
 
		g.drawRect(65,90,100,100);
		g.drawRect(65,205,100,100);    // Erste reihe der Rechtecke im Hauptfenster
		g.drawRect(65,320,100,100);
 
		g.drawRect(190,90,100,100);
		g.drawRect(190,205,100,100);    // Zweite reihe der Rechtecke im Haputfenster
		g.drawRect(190,320,100,100);
 
		g.drawRect(315,90,100,100);
		g.drawRect(315,205,100,100);    // Dritte reihe der Rechtecke im Haputfenster
		g.drawRect(315,320,100,100);
 
		g.drawImage(back,20,80,450,350,this);
 
		for(byte b = 0; b < selectedSlots.length; b++)
		{
			int imageId = selectedSlots[b];

			int prevImageId = imageId - 1;
			prevImageId = prevImageId >= 0 ? prevImageId : slotImages.length - 1;
			
			if(b == 0) //Bedarf dringend einer Verbesserung
				g.drawImage(slotImages[prevImageId], 45, 90, null);
			else if(b == 1)
				g.drawImage(slotImages[prevImageId], 190, 90, null);
			if(b == 2)
				g.drawImage(slotImages[prevImageId], 335, 90, null);

			if(b == 0)
				g.drawImage(slotImages[imageId], 45, 205, null);
			else if(b == 1)
				g.drawImage(slotImages[imageId], 190, 205, null);
			if(b == 2)
				g.drawImage(slotImages[imageId], 335, 205, null);
			
			int nextImageId = imageId + 1;
			nextImageId = nextImageId < slotImages.length ? nextImageId : 0;
			
			if(b == 0)
				g.drawImage(slotImages[nextImageId], 45, 320, null);
			else if(b == 1)
				g.drawImage(slotImages[nextImageId], 190, 320, null);
			if(b == 2)
				g.drawImage(slotImages[nextImageId], 335, 320, null);
		}
		
		g.dispose();
		bs.show();
	}


	private class SpinThread extends Thread
	{
		private int stoppedSlots;
		private Random random;
		
		private SpinThread()
		{
			super("SpinThread");
			
			stoppedSlots = 0;
			random = new Random();
		}
		public void run()
		{
			for(int i = 0; i < SLOT_RUNS * 3; i++)
			{
				for(int j = stoppedSlots; j < 3; j++)
				{
					int rand = random.nextInt(100) + 1;
					if(rand <= SLOT_JUMP_MOD)
					{
						selectedSlots[j] = selectedSlots[j] + 1;
						selectedSlots[j] = selectedSlots[j] != slotImages.length ? selectedSlots[j] : 0;
					}
				}
				repaint();
				
				if(i > 0 && i%SLOT_RUNS == 0)
					stoppedSlots++;
				
				try
				{
					TimeUnit.MILLISECONDS.sleep(SLOT_SPEED);
				}
				catch (InterruptedException e) {}
			}
		}
	}
}
```

Jetzt bekommst du den 5-Fachen Einsatz, wenn die mittleren 3 Bilder ident sind. Hoffe ich zumindest, hatte es bis jetzt noch kein einziges mal. Wenn du willst das wir dir helfen, musst du schon genau sagen, was du willst.


----------



## Torreto (3. Mai 2011)

ich brauche nix großes nur das der gewinn berechnet wird... und das der gewinn dann auf das konto übertragen wird und in der gewinnbox angezeigt wird... nur das ich das nur mit frame und nicht mit jframe machen soll... das wäre eig alles was noch fehlt... vielen dank nochmal...


----------



## Volvagia (4. Mai 2011)

Macht er ja. Wenn in der Mitte 3 gleiche Symbole sind, bekommst du Gewinn gutgeschrieben.


----------



## Torreto (4. Mai 2011)

ich kriege es irgendwie nicht vom JFrame in normalen Frame umzuschreiben... 
könntest du es vielleicht machen?
vielen dank für die hilfe


----------



## Volvagia (4. Mai 2011)

BufferStrategy scheint mit einen Frame nicht zusammenarbeiten zu wollen. ???:L


```
import java.awt.Button;
import java.awt.Color;
import java.awt.EventQueue;
import java.awt.Font;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.Label;
import java.awt.MediaTracker;
import java.awt.TextArea;
import java.awt.TextField;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.lang.reflect.InvocationTargetException;
import java.util.Random;
import java.util.concurrent.TimeUnit;

import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
 
public class Slot extends Frame
{
	private static final long serialVersionUID = 1L;

	private static final byte SLOT_JUMP_MOD = 90;
	private static final int SLOT_RUNS = 100;
	private static final long SLOT_SPEED = 5L;
	
	private static final String DESCRIPTION_TEXT = "Anleitung...";
	
	
	private Label l1 = new Label("Konto");
	private Label l2 = new Label("Einsatz");
	private Label l3 = new Label("Gewinn");
 
	private Button hoeher = new Button ("+");
	private Button niedriger = new Button ("-");
	private Button spin = new Button ("Spin");
	private Button reset = new Button ("Reset");
 
	private TextArea  anleitung = new TextArea(DESCRIPTION_TEXT, 4,10);
	private TextField konto = new TextField("100", 5);
	private TextField einsatz = new TextField("10", 5);
	private TextField gewinn = new TextField("", 5);

	private Image[] slotImages = {
			getToolkit().getImage("zehn.jpg"),
			getToolkit().getImage("bube.jpg"),
			getToolkit().getImage("dame.jpg"),
			getToolkit().getImage("koenig.jpg"),
			getToolkit().getImage("ass.jpg"),
			getToolkit().getImage("joker.jpg")
	};
	
	private Image background = getToolkit().getImage("background.jpg");
	private Image geld = getToolkit().getImage("konto.jpg");
	private Image guthaben = getToolkit().getImage("guthaben.jpg");
	private Image plus  = getToolkit().getImage("plus.jpg");
	private Image minus = getToolkit().getImage("minus.jpg");
	private Image preis = getToolkit().getImage("gewinn.jpg");
	private Image back = getToolkit().getImage("back.jpg");
	
	private int[] selectedSlots = new int[] {
			0, 0, 0
	};
	
	private BufferedImage offscreenImage;
	
	public static void main(String args[])
	{
		new Slot();
	}
	public Slot()
	{
		super("Slot Machine");
		setSize(700,600);
		setLocationRelativeTo(null);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent e)
			{
				int i = JOptionPane.showConfirmDialog(null, "Sicher, dass beendet werden soll?",
						"Wählen Sie eine Option aus", JOptionPane.YES_NO_OPTION);
				if(i == JOptionPane.YES_OPTION)
				{
					dispose();
				}
			}
		});
		setResizable(false);
		setLayout(null);
		waitForImages();
		
		anleitung.setEditable(false);
		konto.setEditable(false);
		einsatz.setEditable(false);
		gewinn.setEditable(false);
 
		niedriger.setBounds(165,460,30,30);
		hoeher.setBounds(280,460,30,30);
		anleitung.setBounds(480,400,200,180);
		konto.setBounds(20,460,75,30);
		einsatz.setBounds(200,460,75,30);
		gewinn.setBounds(395,460,75,30);
		spin.setBounds(280,515,130,60);
		reset.setBounds(65,515,130,60);
 
 
		add(l1);
		add(l2);
		add(l3);
 
		add(niedriger);
		add(hoeher);
		add(anleitung);
		add(konto);
		add(einsatz);
		add(gewinn);
		add(spin);
		add(reset);
 
		spin.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				handleGamecontroll();
			}
		});
		hoeher.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int intEinsatz = Integer.parseInt(einsatz.getText());
				int intGuthaben = Integer.parseInt(konto.getText());
				
				intEinsatz+= 10;
				if(intEinsatz > intGuthaben)
					return;
				
				einsatz.setText(String.valueOf(intEinsatz));
			}
		});
		niedriger.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent e) {
				int intEinsatz = Integer.parseInt(einsatz.getText());
				
				intEinsatz-= 10;
				if(intEinsatz <= 0)
					return;
				einsatz.setText(String.valueOf(intEinsatz));
			}
		});
		
		//Farbe und Größe der Schriften
		konto.setFont(new Font("Arial", Font.BOLD, 23));
		einsatz.setFont(new Font("Arial", Font.BOLD, 23));
		gewinn.setFont(new Font("Arial", Font.BOLD, 23));
		spin.setFont(new Font("Arial", Font.ITALIC, 40));
		reset.setFont(new Font("Arial", Font.ITALIC, 40));
		l1.setFont(new Font("Monospaced", Font.ITALIC, 18));
		l2.setFont(new Font("Monospaced", Font.ITALIC, 18));
		l3.setFont(new Font("Monospaced", Font.ITALIC, 18));
 
		konto.setForeground (new Color(0,0,255));
		einsatz.setForeground (new Color(0,0,255));
		gewinn.setForeground (new Color(255,0,0));

		setVisible(true); 
    }
	private void waitForImages()
	{
		MediaTracker tracker = new MediaTracker(this);
		int size = slotImages.length;
		for(int i = 0; i < size; i++)
			tracker.addImage(slotImages[i], i);
		
		tracker.addImage(background, size);
		tracker.addImage(geld, size + 1);
		tracker.addImage(guthaben, size + 2);
		tracker.addImage(plus, size + 3);
		tracker.addImage(minus, size + 4);
		tracker.addImage(preis, size + 5);
		tracker.addImage(back, size + 6);
		
		try
		{
			tracker.waitForAll();
		}
		catch (InterruptedException e) {}
	}
	private void handleGamecontroll()
	{
		final Runnable run = new Runnable() {
			public void run()
			{
				spin.setEnabled(false);
				reset.setEnabled(false);
				
				int intEinsatz = Integer.parseInt(einsatz.getText());
				int intKonto = Integer.parseInt(konto.getText());
				
				intKonto-= intEinsatz;
				konto.setText(String.valueOf(intKonto));
			}
		};
		
		if(!EventQueue.isDispatchThread())
		{
			try
			{
				SwingUtilities.invokeAndWait(new Runnable() {
					public void run() {
						run.run();
					}
				});
			}
			catch (InterruptedException e)
			{
				e.printStackTrace();
			}
			catch (InvocationTargetException e)
			{
				e.printStackTrace();
			}
		}
		else
			run.run();
		
		new Thread() {
			public void run() {
				Thread t = new SpinThread();
				t.start();
				
				try
				{
					t.join();
				}
				catch (InterruptedException e) {}
				
				SwingUtilities.invokeLater(new Runnable() {
					public void run() {
						int intKonto = Integer.parseInt(konto.getText());
						if(selectedSlots[0] == selectedSlots[1] && selectedSlots[1] == selectedSlots[2])
						{
							int intEinsatz = Integer.parseInt(einsatz.getText());
							intEinsatz*= 5;

							intKonto = Integer.parseInt(konto.getText());
							intKonto+= intEinsatz;
							
							konto.setText(String.valueOf(intKonto));
						}

						if(intKonto > 0)
						{
							spin.setEnabled(true);
							reset.setEnabled(true);
						}
					}
				});
			}
		}.start();
	}
	
	public void paint(Graphics g)
	{
		super.paint(g);
				
		g.drawImage(background,0,0,700,600,this);
		g.drawImage(geld,20,430,75,30,this);
		g.drawImage(guthaben,185,435,100,19,this);
		g.drawImage(plus,280,460,30,30,this);
		g.drawImage(minus,165,460,30,30,this);
		g.drawImage(preis, 395, 430, 75, 30, this);
     
		g.drawRect(480,80,200,300);  // Mögliche Gewinne
		g.drawRect(20,80,450,350);   // Hauptfenster
 
		g.drawRect(65,90,100,100);
		g.drawRect(65,205,100,100);    // Erste reihe der Rechtecke im Hauptfenster
		g.drawRect(65,320,100,100);
 
		g.drawRect(190,90,100,100);
		g.drawRect(190,205,100,100);    // Zweite reihe der Rechtecke im Haputfenster
		g.drawRect(190,320,100,100);
 
		g.drawRect(315,90,100,100);
		g.drawRect(315,205,100,100);    // Dritte reihe der Rechtecke im Haputfenster
		g.drawRect(315,320,100,100);
 
		g.drawImage(back,20,80,450,350,this);
 
		for(byte b = 0; b < selectedSlots.length; b++)
		{
			int imageId = selectedSlots[b];

			int prevImageId = imageId - 1;
			prevImageId = prevImageId >= 0 ? prevImageId : slotImages.length - 1;
			
			if(b == 0) //Bedarf dringend einer Verbesserung
				g.drawImage(slotImages[prevImageId], 45, 90, null);
			else if(b == 1)
				g.drawImage(slotImages[prevImageId], 190, 90, null);
			if(b == 2)
				g.drawImage(slotImages[prevImageId], 335, 90, null);

			if(b == 0)
				g.drawImage(slotImages[imageId], 45, 205, null);
			else if(b == 1)
				g.drawImage(slotImages[imageId], 190, 205, null);
			if(b == 2)
				g.drawImage(slotImages[imageId], 335, 205, null);
			
			int nextImageId = imageId + 1;
			nextImageId = nextImageId < slotImages.length ? nextImageId : 0;
			
			if(b == 0)
				g.drawImage(slotImages[nextImageId], 45, 320, null);
			else if(b == 1)
				g.drawImage(slotImages[nextImageId], 190, 320, null);
			if(b == 2)
				g.drawImage(slotImages[nextImageId], 335, 320, null);
		}
	}
    public void update(Graphics g)
    {
        int frameWidth = getWidth();
        int frameHeight = getHeight();
 
        if(offscreenImage == null || (offscreenImage.getWidth() != frameWidth ||
        		offscreenImage.getHeight() != frameHeight))
            offscreenImage = new BufferedImage(frameWidth, frameHeight, BufferedImage.TYPE_INT_RGB);
 
        Graphics2D g2d = offscreenImage.createGraphics();
        g2d.setColor(this.getBackground());
        g2d.fillRect(0, 0, frameWidth, frameHeight);
        g2d.setColor(this.getForeground());
        paint(g2d);
        g2d.dispose();
        g.drawImage(offscreenImage, 0, 0, null);
    }


	private class SpinThread extends Thread
	{
		private int stoppedSlots;
		private Random random;
		
		private SpinThread()
		{
			super("SpinThread");
			
			stoppedSlots = 0;
			random = new Random();
		}
		public void run()
		{
			for(int i = 0; i < SLOT_RUNS * 3; i++)
			{
				for(int j = stoppedSlots; j < 3; j++)
				{
					int rand = random.nextInt(100) + 1;
					if(rand <= SLOT_JUMP_MOD)
					{
						selectedSlots[j] = selectedSlots[j] + 1;
						selectedSlots[j] = selectedSlots[j] != slotImages.length ? selectedSlots[j] : 0;
					}
				}
				repaint();
				
				if(i > 0 && i%SLOT_RUNS == 0)
					stoppedSlots++;
				
				try
				{
					TimeUnit.MILLISECONDS.sleep(SLOT_SPEED);
				}
				catch (InterruptedException e) {}
			}
		}
	}
}
```


----------



## Torreto (5. Mai 2011)

Du hast ja jezz einiges verändert kannst du mir dann den code nochmal erklären?

was genau Zeile 29-31, 127, 132-149, 190-263, 343-381 aussagt

und bei 324-340 ist das einfach der DoubleBuffer?


----------



## Volvagia (5. Mai 2011)

29 - 31 definieren nur Konstante für die Umdrehungen. SLOT_JUMP_MOD sagt, wie w*****einlich es ist, das sich ein Slot weiterdreht (in Prozent). Je höher, umso flüsseriger sind die Drehungen, je weiter sie sich 50 nähern, umso zufälliger sind die Endergebnisse. SLOT_RUNS sagt, wie oft sich der linke Slot drehen soll. Der mittlere und rechte dreht sich automatisch 2 bzw. 3 mal so oft. SLOT_SPEED sagt, wie lange in etwa gewartet wird, nach dem sich jeder Slot 1 mal bewegt hat.

127 ruft die Methode handleGamecontroll auf.

132 - 149 ließt den Einsatz und das Guthaben aus, erhöht bzw. erniedrigt es, schaut, ob es das Guthaben übersteigt oder kleiner/gleich als 0 ist und wenn alles passt schreibt er es in das Textfeld.

190 - 263 schaltet zuerst die Buttons aus und zieht den Einsatz ab. Dann wird der SpinThread gestartet und gewartet bis er fertig ist. Danach wird geprüft, ob die mittlere Reihe 3 gleiche Symbole enthält, und falls ja, wird der Einsatz mit 5 multipliziert und gutgeschrieben. Wenn das Guthaben danach > 0 ist werden die Buttons wieder aktiviert.

343 - 381 läuft die Slots der Reihe nach durch und erhöht sie mit SLOT_JUMP_MOD Wahrscheinlichkeit, bis SLOT_JUMP_MOD oder ein vielfaches davon erreicht ist. Danach wird der nächste Slot deaktiviert, bis alle still stehen.

Ja, der Buffer war nötig da BufferedStrategie am Frame mehr als vorher geflimmert hat. :lol:


----------



## Torreto (5. Mai 2011)

Super. Riesen großen dank für deine Hilfe!


----------

