Foro sobre Java SE > Como generar números aleatorios que salten de tanto en tanto
No entiendo eso de que "salten de 30 en 30". ¿Podrías poner un ejemplo concreto?
Probé esto y me funcionó:
public void generarComida() {
if(p.x==comida.x && p.y==comida.y) {
int xx = (int)(Math.random()*this.getWidth());
int yy = (int)(Math.random()*this.getHeight());
comida.x = xx - (xx % blocksize);
comida.y = yy - (yy % blocksize);
System.out.println("comida: "+comida.x+", "+comida.y);
}
Primero obtenemos las dos posiciones aletorias entre 0 y los límites de la ventana; después a cada una de esas posiciones le restamos el residuo de dividirlas entre blocksize.
En el constructor del programa repites el código que reemplazé así que puedes cambiarlo simplemente por una llamada a este método.
Cuando verificas las teclas que han sido presionadas, en bucle while, incluyes en cada bloque una lamada a repaint(), cuando simplemente podrías incluirla al final antes de sleep().
Por cierto, hace poco hice el mismo juego pero desde un enfoque diferente. Por ejemplo, hice una matriz en la cual se pueden guardar diferentes tipos de bloques (comida, muros, cuepo de la serpiente, o vacíos); esto puede ser ventajoso ya que todo lo manejas sobre la matriz y al final de cada paso la recorres y dibujas los tipos de bloques almacenados en ella. En este caso, por ejemplo, no se necesita ya utilizar el código de arriba y además puedes fácilmente cambiar el ancho y el alto en cuanto a la cuadrícula y olvidarte del ancho y alto de la ventana. Otra cosa es que te simplificaría manejar el cuerpo de la serpiente hecho de varios bloques porque sólo manejas coordenadas y no dimesiones y posiciones de éstos.
Si lo deseas, te puedo pasar el código para que una vez lo tengas terminado puedas compararlo. Es algo que yo hacía (y todavía hago) para ayudarme a ver diferentes formas de solucionar un problema.
tendrias que realizar la accion en un if que cada ves q sealiza el ciclo en un contador aunmente los 30 que deseas y se lo sume al numero aleatorio que se genero
Buenas, estoy intentando hacer un juego de Snake por mi propia cuenta para practicar, y quisiera saber como hacer para generar números aleatorios de 30 en 30 y que como tope tenga de tamaño 600, que es el alto/ancho de la ventana. Anexo el código que he hecho hasta ahora, dividido en 3 clases.
Clase main:
public class Main{
public static void main(String[]args){
new Ventana();
}
}
Clase ventana:
import java.awt.Color;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import javax.swing.*;
public class Ventana extends JFrame{
Ventana(){
super("Snake");
this.setLayout(new GridBagLayout());
this.setSize(600,600);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(true);
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx=0;
gbc.gridy=0;
gbc.gridwidth=1;
gbc.gridheight=1;
gbc.weightx=1.0;
gbc.weighty=1.0;
gbc.fill= GridBagConstraints.BOTH;
panel p = new panel();
p.setBackground(Color.black);
add(p,gbc);
this.setVisible(true);
}
}
Clase panel:
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class panel extends JPanel implements KeyListener,Runnable{
private Point p;
private Thread th;
private boolean W,A,S,D;
private Point comida;
private final int blocksize = 30;
public panel(){
this.addKeyListener(this);
th = new Thread(this);
p = new Point();
comida = new Point();
this.setFocusable(true);
comida.x=(int)Math.round(Math.random()*this.getWidth())/blocksize;
comida.y=(int)Math.round(Math.random()*this.getHeight())/blocksize;
th.start();
}public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
g.fillOval(comida.x, comida.y, blocksize, blocksize);
g.setColor(Color.blue);
g.fillRect(p.x, p.y, blocksize, blocksize);
if(p.x>600||p.x<0){
W=A=S=D=false;
}else if(p.y>600||p.y<0){
W=A=S=D=false;
}
}public void generarComida(){
if(p.x==comida.x&&p.y==comida.y){
comida.x=(int)Math.round(Math.random()*this.getWidth())/blocksize;
comida.y=(int)Math.round(Math.random()*this.getHeight())/blocksize;
System.out.println(comida.x+", "+comida.y);
this.repaint();
}
}
public void keyPressed(KeyEvent e) {
if(e.getKeyCode()==KeyEvent.VK_W){
W=true;
A=S=D=false;
}else if(e.getKeyCode()==KeyEvent.VK_D){
D=true;
W=A=S=false;
}else if(e.getKeyCode()==KeyEvent.VK_S){
S=true;
W=A=D=false;
}else if(e.getKeyCode()==KeyEvent.VK_A){
A=true;
W=S=D=false;
}
}
public void keyReleased(KeyEvent e) {
}
public void keyTyped(KeyEvent e) {
}
public void run() {
while(true){
if(W==true){
p.y-=blocksize;
this.repaint();
}
else if(A==true){
p.x-=blocksize;
this.repaint();
}
else if(S==true){
p.y+=blocksize;
this.repaint();
}
else if(D==true){
p.x+=blocksize;
this.repaint();
}try{
this.generarComida();
Thread.sleep(300);
System.out.println(p.x+", "+p.y);
System.out.println(comida.x+", "+comida.y);
}catch(Exception e){}
}
}
}
Si corren el programa se dan cuenta de que la comida se genera en 0,0 y luego reaparece en otro punto cercano, muchas gracias de antemano.