Vinnaren i pepparkakshustävlingen!
2017-02-19, 20:09
  #6793
Medlem
Hej försöker göra en random number generator som ger slumpmässiga nummer från 3000 till 3251 och har prövat det här:
Kod:
Random rn = new Random();
int answer rn.nextInt(3251) + 3000

vilket inte funkade, det gav slumpmässiga nummer som är högre än 3251 men när jag testade med 1 till 50 funkade det perfect..
Undrar om någon vet hur jag fixar det?
Citera
2017-02-19, 20:15
  #6794
Moderator
Protons avatar
Citat:
Ursprungligen postat av axxor
Hej försöker göra en random number generator som ger slumpmässiga nummer från 3000 till 3251 och har prövat det här:
Kod:
Random rn = new Random();
int answer rn.nextInt(3251) + 3000

vilket inte funkade, det gav slumpmässiga nummer som är högre än 3251 men när jag testade med 1 till 50 funkade det perfect..
Undrar om någon vet hur jag fixar det?
http://stackoverflow.com/questions/3...specific-range borde väl kunna ordna saken?
Citera
2017-02-19, 20:50
  #6795
Medlem
vtcs avatar
Citat:
Ursprungligen postat av axxor
Hej försöker göra en random number generator som ger slumpmässiga nummer från 3000 till 3251 och har prövat det här:
Kod:
Random rn = new Random();
int answer rn.nextInt(3251) + 3000

vilket inte funkade, det gav slumpmässiga nummer som är högre än 3251 men när jag testade med 1 till 50 funkade det perfect..
Undrar om någon vet hur jag fixar det?
Fundera på om du verkligen borde ha 3251 där...
Citera
2017-02-20, 14:42
  #6796
Medlem
Lecapitaines avatar
Skriver ett s.k. breakoutspel i java. Har skrivit ut alla objekt som behövs för spelet,men har problem att få bollen att förstå att bollen kommer i kontakt (intersect) med brickorna. När bollen kommer i kontakt med en specifik bricka så vill jag att den brickan skall försvinna.

Tror jag vet på ett ungefär hur jag skall lösa det. Först måste jag antagligen lagra brickobjekten som skapas i klassen Spelplan i en array. Därefter måste jag skriva en if-sats som avgör om bollen kommer i kontakt med en bricka och i sådana fall skall den brickan försvinna.

Bifogar de klasser som projektet består av:
Main
HTML-kod:
import javax.swing.JFrame;
import java.awt.*;
public class Main {

	public static void main(String[] args) {
		Spel spela = new Spel();
		JFrame A = new JFrame();
		A.setBounds(10, 10, 700, 600);
		A.setTitle("BreakOut Game");
		A.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		A.setVisible(true);
		A.setResizable(false);
		A.add(spela);
	}

}
Spel
HTML-kod:
import javax.swing.JPanel;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.*;

public class Spel extends JPanel implements KeyListener, ActionListener {
	private boolean play = false;
	private int score = 0;
	private int TotalBrics =21;
	private Timer A;
	public int map[][];
	public int brickheight;
	public int brickwidth;
	private int delay = 8;
	private int delay2 = 15;
	private int liv = 3;
	private int SliderX = 310;
	private int BallX = 120;
	private int BallY = 350;
	private int VelX = -1;
	private int VelY = 2;
	JLabel AntalLiv = new JLabel();
	private Spelplan skapabrickor;//Deklarerar en variabel som används för anropa klassen Spelplan
	public Spel(){
		skapabrickor = new Spelplan(); //Anropar klassen spelplan så funktioner från denna klass kan köras.
		addKeyListener(this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(true);
		Timer A = new Timer(delay, this);
		A.start();
		ActionListener UppdateraSuccesivt = new ActionListener()
		  {
	  public void actionPerformed(ActionEvent evt) {
        Uppdatera();   // uppdaterar x och y-koordinater
        repaint();  // Refresh the JFrame
     }
	  
  };
  new Timer(delay2, UppdateraSuccesivt).start();	 
	}
	 public void paint(Graphics g)
	 {
		 //Bakgrund
		 g.setColor(Color.BLACK);
		 g.fillRect(1, 1, 692, 592);
		 //Spelbrickor
		 skapabrickor.draw((Graphics) g);	//Måste användas så att Spelbrickor skrivs ut i JFrame!
		 //SidoLinjer
		 g.setColor(Color.YELLOW);
		 g.fillRect(0, 0, 3, 592);
		 g.fillRect(0, 0, 692, 3);
		 g.fillRect(691, 0, 3, 592);
		 //Slagträ
		 g.setColor(Color.GREEN);
		 g.fillRect(SliderX, 550, 100, 8);
		 //Boll
		 g.setColor(Color.RED);
		 g.fillOval(BallX, BallY, 25, 25);
		 g.dispose();
	 }
	
	 public void Uppdatera()
		{
		 if(new Rectangle(BallX, BallY, 25, 25).intersects(new Rectangle(SliderX, 550, 100, 8)))
		 {
			 VelY = -VelY;
		 }
		 BallX += VelX;
 		BallY += VelY;
 		if(BallX > 565 || BallX <0)
 		{
 			VelX = -VelX;
 		}
 		if(BallY < 0)
 		{
 			VelY = -VelY;
 		}
 		if(BallY > 665)
 		{
 			liv = liv-1;
 			BallX = 250;
 			BallY = 250;
 			if(liv==0)
 			{
 				System.exit(0);
 			}
 		} 
		
		}
	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_RIGHT)
				{
					if(SliderX >= 600)
						{
							SliderX = 600;
						}
						else
						{
							MoveRight();
						}
			
		}
		else if(e.getKeyCode() == KeyEvent.VK_LEFT)
		{
			if(SliderX < 10)
			{
				SliderX = 10;
			}
			else
			{
				MoveLeft();
				
			}
		}
	}
	public void MoveRight()
	{
		play = true;
		SliderX +=20;
		repaint();
	}
	public void MoveLeft()
	{
		play = true;
		SliderX -=20;
		repaint();
	}
	
	@Override
	public void keyTyped(KeyEvent e) {}

	@Override
	public void keyReleased(KeyEvent e) {
		
	}
	
Spelplan
HTML-kod:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

public class Spelplan {
     int u = 0;
	 int startX = 100;
	 int startY = 50;
	// Rectangle [][] spelbrickor = new Rectangle[5][2];
	 int poang = 5;
	int width = 50;
	 int height = 25;
	int spacing = 2;
//Genererar flera stycken spelbrickor, totalt row*col
	public void draw(Graphics g) {	
	
		for (int row = 0; row < 2; row++) {
            int y = startY + (row * (height + spacing));
            for (int col = 0; col < 5; col++) {
                int x = startX + (col * (width + spacing));
                g.setColor(Color.PINK);
                g.fillRect(x, y, width, height);
                g.setColor(Color.WHITE);
              //  g.setFont(font);
                g.drawString(String.valueOf(poang), x+25, y+20);
               // spelbrickor[col][row] = g;

	}
		}
	}

	
}
Citera
2017-02-20, 14:47
  #6797
Medlem
ojns avatar
Citat:
Ursprungligen postat av Lecapitaine
Tror jag vet på ett ungefär hur jag skall lösa det.
Toppen. Lycka till.
Citera
2017-02-20, 14:48
  #6798
Moderator
Protons avatar
Citat:
Ursprungligen postat av Lecapitaine
Skriver ett s.k. breakoutspel i java. Har skrivit ut alla objekt som behövs för spelet,men har problem att få bollen att förstå att bollen kommer i kontakt (intersect) med brickorna. När bollen kommer i kontakt med en specifik bricka så vill jag att den brickan skall försvinna.

Tror jag vet på ett ungefär hur jag skall lösa det. Först måste jag antagligen lagra brickobjekten som skapas i klassen Spelplan i en array. Därefter måste jag skriva en if-sats som avgör om bollen kommer i kontakt med en bricka och i sådana fall skall den brickan försvinna.

Bifogar de klasser som projektet består av:
Main
HTML-kod:
import javax.swing.JFrame;
import java.awt.*;
public class Main {

	public static void main(String[] args) {
		Spel spela = new Spel();
		JFrame A = new JFrame();
		A.setBounds(10, 10, 700, 600);
		A.setTitle("BreakOut Game");
		A.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		A.setVisible(true);
		A.setResizable(false);
		A.add(spela);
	}

}
Spel
HTML-kod:
import javax.swing.JPanel;
import java.awt.Rectangle;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.*;

public class Spel extends JPanel implements KeyListener, ActionListener {
	private boolean play = false;
	private int score = 0;
	private int TotalBrics =21;
	private Timer A;
	public int map[][];
	public int brickheight;
	public int brickwidth;
	private int delay = 8;
	private int delay2 = 15;
	private int liv = 3;
	private int SliderX = 310;
	private int BallX = 120;
	private int BallY = 350;
	private int VelX = -1;
	private int VelY = 2;
	JLabel AntalLiv = new JLabel();
	private Spelplan skapabrickor;//Deklarerar en variabel som används för anropa klassen Spelplan
	public Spel(){
		skapabrickor = new Spelplan(); //Anropar klassen spelplan så funktioner från denna klass kan köras.
		addKeyListener(this);
		setFocusable(true);
		setFocusTraversalKeysEnabled(true);
		Timer A = new Timer(delay, this);
		A.start();
		ActionListener UppdateraSuccesivt = new ActionListener()
		  {
	  public void actionPerformed(ActionEvent evt) {
        Uppdatera();   // uppdaterar x och y-koordinater
        repaint();  // Refresh the JFrame
     }
	  
  };
  new Timer(delay2, UppdateraSuccesivt).start();	 
	}
	 public void paint(Graphics g)
	 {
		 //Bakgrund
		 g.setColor(Color.BLACK);
		 g.fillRect(1, 1, 692, 592);
		 //Spelbrickor
		 skapabrickor.draw((Graphics) g);	//Måste användas så att Spelbrickor skrivs ut i JFrame!
		 //SidoLinjer
		 g.setColor(Color.YELLOW);
		 g.fillRect(0, 0, 3, 592);
		 g.fillRect(0, 0, 692, 3);
		 g.fillRect(691, 0, 3, 592);
		 //Slagträ
		 g.setColor(Color.GREEN);
		 g.fillRect(SliderX, 550, 100, 8);
		 //Boll
		 g.setColor(Color.RED);
		 g.fillOval(BallX, BallY, 25, 25);
		 g.dispose();
	 }
	
	 public void Uppdatera()
		{
		 if(new Rectangle(BallX, BallY, 25, 25).intersects(new Rectangle(SliderX, 550, 100, 8)))
		 {
			 VelY = -VelY;
		 }
		 BallX += VelX;
 		BallY += VelY;
 		if(BallX > 565 || BallX <0)
 		{
 			VelX = -VelX;
 		}
 		if(BallY < 0)
 		{
 			VelY = -VelY;
 		}
 		if(BallY > 665)
 		{
 			liv = liv-1;
 			BallX = 250;
 			BallY = 250;
 			if(liv==0)
 			{
 				System.exit(0);
 			}
 		} 
		
		}
	@Override
	public void keyPressed(KeyEvent e) {
		if(e.getKeyCode() == KeyEvent.VK_RIGHT)
				{
					if(SliderX >= 600)
						{
							SliderX = 600;
						}
						else
						{
							MoveRight();
						}
			
		}
		else if(e.getKeyCode() == KeyEvent.VK_LEFT)
		{
			if(SliderX < 10)
			{
				SliderX = 10;
			}
			else
			{
				MoveLeft();
				
			}
		}
	}
	public void MoveRight()
	{
		play = true;
		SliderX +=20;
		repaint();
	}
	public void MoveLeft()
	{
		play = true;
		SliderX -=20;
		repaint();
	}
	
	@Override
	public void keyTyped(KeyEvent e) {}

	@Override
	public void keyReleased(KeyEvent e) {
		
	}
	
Spelplan
HTML-kod:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;

public class Spelplan {
     int u = 0;
	 int startX = 100;
	 int startY = 50;
	// Rectangle [][] spelbrickor = new Rectangle[5][2];
	 int poang = 5;
	int width = 50;
	 int height = 25;
	int spacing = 2;
//Genererar flera stycken spelbrickor, totalt row*col
	public void draw(Graphics g) {	
	
		for (int row = 0; row < 2; row++) {
            int y = startY + (row * (height + spacing));
            for (int col = 0; col < 5; col++) {
                int x = startX + (col * (width + spacing));
                g.setColor(Color.PINK);
                g.fillRect(x, y, width, height);
                g.setColor(Color.WHITE);
              //  g.setFont(font);
                g.drawString(String.valueOf(poang), x+25, y+20);
               // spelbrickor[col][row] = g;

	}
		}
	}

	
}
Och hur lyder frågan?
Citera
2017-02-20, 14:52
  #6799
Medlem
Lecapitaines avatar
Citat:
Ursprungligen postat av Proton
Och hur lyder frågan?
Hur skall jag få bollen att uppfatta att den kommer i kontakt med en specifik bricka och i sådana fall skall den försvinna.
Citera
2017-02-20, 15:23
  #6800
Moderator
Protons avatar
Citat:
Ursprungligen postat av Lecapitaine
Hur skall jag få bollen att uppfatta att den kommer i kontakt med en specifik bricka och i sådana fall skall den försvinna.
Borde det inte vara tvärtom, att det är brickan som uppfattar om den är i kontakt med bollen?

För varje flyttning av bollen får du ju kontrollera dess position. Faller denna position samman med någon bricka får du ju ta och rita om spelplanen, minus den bricka som kolliderade?

Det är teorin iaf, även om den är aningen klumpig kanske.
Citera
2017-02-20, 17:13
  #6801
Medlem
Citat:
Ursprungligen postat av Lecapitaine
Hur skall jag få bollen att uppfatta att den kommer i kontakt med en specifik bricka och i sådana fall skall den försvinna.
Spelplanen känner till var alla brickor är så fråga spelplanen om en kollision har skett. Spelplanen kan i sin tur fråga sina brickor om de känner sig träffade ...och då försvinna.
Citera
2017-02-20, 22:48
  #6802
Medlem
Citat:
Ursprungligen postat av Lecapitaine
Hur skall jag få bollen att uppfatta att den kommer i kontakt med en specifik bricka och i sådana fall skall den försvinna.


Orkar inte kolla din kod. Men ska du göra ett spel behöver du en loop som du kör tills spelet är slut, i denna kollar du input, hanterar input och ritar ut allt som ska ritas.
Således behöver du bara kolla ifall bollen träffar något i andra steget. Finns tiotusentals guider för detta lätt åtkommet genom google. Läs om bounding box collision och liknande. Lättare ifall allt är object, även rutorna.
Citera
2017-02-21, 01:12
  #6803
Moderator
Neksnors avatar
Citat:
Ursprungligen postat av axxor
Hej försöker göra en random number generator som ger slumpmässiga nummer från 3000 till 3251 och har prövat det här:
Kod:
Random rn = new Random();
int answer rn.nextInt(3251) + 3000

vilket inte funkade, det gav slumpmässiga nummer som är högre än 3251 men när jag testade med 1 till 50 funkade det perfect..
Undrar om någon vet hur jag fixar det?
Lär dig läsa javadoc...
https://docs.oracle.com/javase/8/doc...il/Random.html
Citat:
public Random()
Creates a new random number generator. This constructor sets the seed of the random number generator to a value very likely to be distinct from any other invocation of this constructor.
Citat:
public int nextInt(int bound)
Returns a pseudorandom, uniformly distributed int value between 0 (inclusive) and the specified value (exclusive), drawn from this random number generator's sequence. The general contract of nextInt is that one int value in the specified range is pseudorandomly generated and returned. All bound possible int values are produced with (approximately) equal probability. The method nextInt(int bound) is implemented by class Random as if by:

public int nextInt(int bound) {
if (bound <= 0)
throw new IllegalArgumentException("bound must be positive");

if ((bound & -bound) == bound) // i.e., bound is a power of 2
return (int)((bound * (long)next(31)) >> 31);

int bits, val;
do {
bits = next(31);
val = bits % bound;
} while (bits - val + (bound-1) < 0);
return val;
}
The hedge "approximately" is used in the foregoing description only because the next method is only approximately an unbiased source of independently chosen bits. If it were a perfect source of randomly chosen bits, then the algorithm shown would choose int values from the stated range with perfect uniformity.

The algorithm is slightly tricky. It rejects values that would result in an uneven distribution (due to the fact that 2^31 is not divisible by n). The probability of a value being rejected depends on n. The worst case is n=2^30+1, for which the probability of a reject is 1/2, and the expected number of iterations before the loop terminates is 2.

The algorithm treats the case where n is a power of two specially: it returns the correct number of high-order bits from the underlying pseudo-random number generator. In the absence of special treatment, the correct number of low-order bits would be returned. Linear congruential pseudo-random number generators such as the one implemented by this class are known to have short periods in the sequence of values of their low-order bits. Thus, this special case greatly increases the length of the sequence of values returned by successive calls to this method if n is a small power of two.

Parameters:
bound - the upper bound (exclusive). Must be positive.
Returns:
the next pseudorandom, uniformly distributed int value between zero (inclusive) and bound (exclusive) from this random number generator's sequence
Throws:
IllegalArgumentException - if bound is not positive
Since:
1.2
Din kod ger alltså ett tal mellan 3000 (inklusive) och 6251 (exklusive), mer formellt uttryckt: [3000, 6251).
I ditt fall skulle jag försöka fixa ett slumptal i [0, 251] och sedan addera med 3000.
Citera
2017-02-21, 07:14
  #6804
Medlem
Lecapitaines avatar
Citat:
Ursprungligen postat av e7andy
Spelplanen känner till var alla brickor är så fråga spelplanen om en kollision har skett. Spelplanen kan i sin tur fråga sina brickor om de känner sig träffade ...och då försvinna.
Ok, så du tror det räcker med att skriva en if-sats i klassen Spel som kollar om bollen kolliderar med en spelbricka med en viss position och i sådanafall tas den bort. Du tror inte det är nödvändigt att skriva om klassen Spelplan så brickorna lagras i en array, utan det räcker med att skriva ut brickor med olika positioner genom en for-loop?
Citera

Stöd Flashback

Flashback finansieras genom donationer från våra medlemmar och besökare. Det är med hjälp av dig vi kan fortsätta erbjuda en fri samhällsdebatt. Tack för ditt stöd!

Stöd Flashback