Projekt: Slot Machine

T

Torreto

Gast
Hallo Java experten :D

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:

Java:
...
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

Top Contributor
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.
 
Zuletzt bearbeitet:
T

Torreto

Gast
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

Top Contributor
Sorry, das sollte Liste heißen.

Java:
//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);
}
 
T

Torreto

Gast
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...
 
T

Torreto

Gast
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!)

Java:
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

Top Contributor
Man kann im Forum auch hochladen.

Java:
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();
	}
}
 
T

Torreto

Gast
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]
 
T

Torreto

Gast
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

Top Contributor
Java:
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.

Java:
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.

Java:
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.

Java:
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.

Java:
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.
 
Zuletzt bearbeitet:
T

Torreto

Gast
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

Top Contributor
Java:
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.
 
T

Torreto

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

hier noch mal der quellcode:

Java:
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)
    {
    }
}
 

Volvagia

Top Contributor
Ich habs mal ein wenig umgeschrieben.

Java:
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

Mitglied
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...
 

Torreto

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

Volvagia

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

Java:
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

Mitglied
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

Top Contributor
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:
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
H Github Projekt starten/anbinden in eclipse Java Basics - Anfänger-Themen 11
B VISA.jar in Projekt einbinden (Library) Java Basics - Anfänger-Themen 5
I WildFily - unterschiedliche Libs im Projekt verursachen Problem Java Basics - Anfänger-Themen 11
F Einem GIT repository ein Projekt hinzufügen Java Basics - Anfänger-Themen 1
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
C externe jar einbinden in Eclipse-Projekt Java Basics - Anfänger-Themen 2
B non-modular dependency in modularem Projekt verwenden Java Basics - Anfänger-Themen 3
S Kleines Java-Projekt; Kassenprogramm Java Basics - Anfänger-Themen 7
S Mein erstes eigenes Projekt - Aufbau und Strukturierung Java Basics - Anfänger-Themen 6
J Projekt neu übersetzen Java Basics - Anfänger-Themen 3
E Kleines Java-Projekt für Anfänger Java Basics - Anfänger-Themen 10
A Java die richtige Programmiersprache für mein Projekt? Java Basics - Anfänger-Themen 1
B Quicksort in Verbindung mit einem Projekt Java Basics - Anfänger-Themen 1
S Video Projekt Java Basics - Anfänger-Themen 28
A Hilfe bei Java Projekt Java Basics - Anfänger-Themen 4
B Grundsatzfragen zu meinem neuen Projekt Einnahmen-Ausgaben App Java Basics - Anfänger-Themen 8
C Projekte in 2 versch. Arbeitsbereichen: auf ein Projekt verweisen (ohne Fehler zu bekommen) Java Basics - Anfänger-Themen 8
D Gemeinsames Projekt Java Basics - Anfänger-Themen 13
J Veranstaltungs Projekt Java Basics - Anfänger-Themen 2
K Java Projekt Hilfe Java Basics - Anfänger-Themen 5
C Fehler beim Speichern (Build projekt) Java Basics - Anfänger-Themen 42
Dimax In Java File (nicht in Java Projekt) mysql Driver importieren Java Basics - Anfänger-Themen 3
G Projekt architektur (implementierung) Java Basics - Anfänger-Themen 3
J Java findet plötzlich die Dateien im Projekt nicht mehr. Java Basics - Anfänger-Themen 12
W Neues Lern-Projekt gesucht Java Basics - Anfänger-Themen 8
R Java-Projekt im FTP hochladen Java Basics - Anfänger-Themen 6
C Projekt öffnen BlueJ Java Basics - Anfänger-Themen 1
S Image Datei selektieren und in Projekt Verzeichnis abspeichern/kopieren Java Basics - Anfänger-Themen 16
D Ausführbare jar/exe aus JAVAFX Projekt erstellen (IntelliJ) Java Basics - Anfänger-Themen 14
A Wie kann ich folgendes Projekt realisieren? Java Basics - Anfänger-Themen 4
B Derzeit JSF - Projekt, später soll MobileApp folgen Java Basics - Anfänger-Themen 5
H projekt 1 code schöner schreiben. Java Basics - Anfänger-Themen 25
H java erstes projekt Java Basics - Anfänger-Themen 502
B Erste Schritte nio oder io für neues Projekt Java Basics - Anfänger-Themen 1
G Mein Java Projekt funktioniert nicht Java Basics - Anfänger-Themen 5
alkaA Intellij Java Datei aus nicht Projekt ausführen? Java Basics - Anfänger-Themen 2
D Erste Schritte Projekt in Ecplise in einer .zip Datei speichern Java Basics - Anfänger-Themen 8
I Projekt als .jar Datei speichern - Bilder werden nicht mehr angezeigt Java Basics - Anfänger-Themen 4
F Git Projekt im Build Path Java Basics - Anfänger-Themen 3
Edin Sinnvolle Projekt-/Codepräsentation Java Basics - Anfänger-Themen 2
L Suche ein sampel Projekt Java Basics - Anfänger-Themen 2
L PROBLEM! "Bug" bei Konto-Projekt! Java Basics - Anfänger-Themen 7
J App.jar muss im Projekt App als Bibliothek vorhanden sein?! Java Basics - Anfänger-Themen 1
J Projekt nicht editierbar modifizieren (NetBeans 8) Java Basics - Anfänger-Themen 10
L Compiler-Fehler AndroidStudio Projekt startet nicht mehr!!! Java Basics - Anfänger-Themen 2
F Eclipse alle Projekt weg Java Basics - Anfänger-Themen 6
D Erste Schritte Projekt Zuul Java Basics - Anfänger-Themen 192
D JavaFX, Verweis auf Datei im Projekt Java Basics - Anfänger-Themen 0
M Hilfe bei Roulette Projekt Java Basics - Anfänger-Themen 7
M bestehendes Projekt als Applet speichern Java Basics - Anfänger-Themen 2
M Netbeans Projekt lauffähig abspeichern Java Basics - Anfänger-Themen 3
G Erste Schritte Suche Java Programmierer für kleines Projekt Java Basics - Anfänger-Themen 1
S Best Practice Projekt als .JAR exportiert Java Basics - Anfänger-Themen 4
H Ist Java überhaupt die richtige Sprache für das Projekt? Java Basics - Anfänger-Themen 8
elischa Eclipse Plugin Projekt, Maven Projekt und dependencies Java Basics - Anfänger-Themen 5
M Open Source Projekt mit Unit Tests gesucht Java Basics - Anfänger-Themen 5
T Java Projekt aufbau Java Basics - Anfänger-Themen 5
C java Projekt mit Xuggler exportieren Java Basics - Anfänger-Themen 9
H Menüführung Projekt Wecker Java Basics - Anfänger-Themen 5
S Klassen Externe Klasse in ein Projekt mit einbinden Java Basics - Anfänger-Themen 7
T Config: Projekt erkennt Javaversion nicht Java Basics - Anfänger-Themen 12
M Erste Schritte Heruntergeladenes Java Projekt lauffähig kriegen Java Basics - Anfänger-Themen 1
A Java Projekt Java Basics - Anfänger-Themen 1
1 Im Java Projekt eine txt datei einbinden? Java Basics - Anfänger-Themen 8
N Eclipse Projekt im Terminal (Mac) öffnen.... Java Basics - Anfänger-Themen 4
O Zu viel static im Projekt Java Basics - Anfänger-Themen 9
M Bekomm altes Uni-Projekt in java nicht mehr zum laufen Java Basics - Anfänger-Themen 7
H Empfohlene Projekt-Struktur und mehr ... Java Basics - Anfänger-Themen 5
J Thread erstellen (BlueJ Projekt) Java Basics - Anfänger-Themen 3
I Fehler mit kurzem Projekt Java Basics - Anfänger-Themen 7
J Schule Java Projekt Java Basics - Anfänger-Themen 8
fLooojava Bluetooth Projekt - Problem beim mehrmaligen Senden Java Basics - Anfänger-Themen 5
J Projekt im anderen Projekt benutzen Java Basics - Anfänger-Themen 2
B Projekt öffnen (Eclipse) Java Basics - Anfänger-Themen 2
L Erstes Projekt aus zwei Projekten Java Basics - Anfänger-Themen 1
M Maven Dependency im Java Projekt Java Basics - Anfänger-Themen 1
L Eclipse Projekt überschreiben Java Basics - Anfänger-Themen 4
L Suche Programmier-Projekt mit Anleitung Java Basics - Anfänger-Themen 3
G Projekt: Webmeeting für Musiker Java Basics - Anfänger-Themen 12
R Anfängertipps für ein Projekt Java Basics - Anfänger-Themen 1
B [Projekt] CyberCafé Software Java Basics - Anfänger-Themen 13
fLooojava kleines Projekt - Verwendung von Youtube Java Basics - Anfänger-Themen 22
X Projekt Java Anfänger Java Basics - Anfänger-Themen 28
T mein erstes Java projekt Java Basics - Anfänger-Themen 8
J BlueJ Liste Würfel Projekt Java Basics - Anfänger-Themen 2
N Input/Output Exportieren Java Projekt Java Basics - Anfänger-Themen 6
M JSF Projekt erstellen unter Eclipse Java Basics - Anfänger-Themen 7
J Erste Schritte Hilfe bei absolutem Anfänger-Projekt Java Basics - Anfänger-Themen 4
S Projekt-Idee für testgetriebene Entwicklung gesucht Java Basics - Anfänger-Themen 2
D McDonalds - Java Projekt frage Java Basics - Anfänger-Themen 7
G Problem: Java Projekt als ausführbare Jar Exportieren (Eclipse) Java Basics - Anfänger-Themen 10
V Kann kein Java Projekt mehr mit Eclipse erstellen Java Basics - Anfänger-Themen 5
K Java Projekt als ausführbare Jar Exportieren (Eclipse) Problem Java Basics - Anfänger-Themen 24
E HILFE Projekt für die Schule--> Bilder einfügen Java Basics - Anfänger-Themen 9
N Kann man in einem Projekt nur eine Klasse ausführen? Java Basics - Anfänger-Themen 6
I Projekt aus .jar Sources erstellen Java Basics - Anfänger-Themen 10
E Mein erstes Java Projekt - Sauberer code? Java Basics - Anfänger-Themen 28
D Verschiedene Fragen zu meinem Projekt Java Basics - Anfänger-Themen 6
D Auf anderes Projekt zugreifen Java Basics - Anfänger-Themen 25
H Entwicklung am selben Projekt im Netzwerk Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben