I create a game in which enemy objects appear randomly on the panel. In order to realize this, I want to create a two-dimensional array that stores the coordinates of the enemies. Something like this:

int[][] pos = { {2380, 29}, {2500, 59}, {1380, 89}, {780, 109}, {580, 139}, {680, 239}, {790, 259}, {760, 50}, {790, 150}, {980, 209}, {560, 45}, {510, 70}, {930, 159}, {590, 80}, {530, 60}, {940, 59}, {990, 30}, {920, 200}, {900, 259}, {660, 50}, {540, 90}, {810, 220}, {860, 20}, {740, 180}, {820, 128}, {490, 170}, {700, 30} }; 

The problem is that I would like to fill the pos array with random numbers automatically, so that I can use it as follows:

 public void Enemies() { enemies = new ArrayList<>(); for (int[] p : pos) { enemies.add(new Enemy(p[0], p[1])); } } 

All this is in one class:

 package test2; import java.awt.Color; import java.awt.Dimension; import java.awt.Font; import java.awt.FontMetrics; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Rectangle; import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.KeyAdapter; import java.awt.event.KeyEvent; import java.util.ArrayList; import java.util.Random; import javax.swing.Timer; import javax.swing.JPanel; public class MyPanel extends JPanel implements ActionListener{ int playerX = 40; int playerY = 60; int DELAY = 15; int panelWidth = 800; int panelHeight = 600; Timer timer; Player player; boolean alive; ArrayList<Enemy> enemies; int [] [] positions = null; public MyPanel(){ this.addKeyListener(new TAdapter()); this.setFocusable(true); this.setBackground(Color.BLACK); alive = true; this.setPreferredSize(new Dimension(panelWidth, panelHeight)); Enemies(); player = new Player(playerX, playerY); timer = new Timer(DELAY, this); timer.start(); } public void Enemies(){ enemies = new ArrayList<>(); for (int [] p: positions){ enemies.add(new Enemy(p[0], p[1]));}} public void paintComponent(Graphics g){ super.paintComponent(g); if(alive){ draw(g); } else{ gameOver(g);} Toolkit.getDefaultToolkit().sync(); } private void gameOver(Graphics g) { // TODO Auto-generated method stub String message = "Game over"; Font font = new Font("Helvetica", Font.BOLD, 17); FontMetrics fm = getFontMetrics(font); g.setColor(Color.WHITE); g.setFont(font); g.drawString(message, (panelWidth - fm.stringWidth(message))/2, panelHeight/2); } private void draw(Graphics g) { // TODO Auto-generated method stub Graphics2D g2d = (Graphics2D) g; g2d.drawImage(player.getImage(), player.getX(), player.getY(), this); ArrayList<Weapon> ws = player.getWeapons(); for (Weapon w1: ws){ Weapon w = (Weapon) w1; g2d.drawImage(w.getImage(), w.getX(), w.getY(), this); } for (Enemy e1: enemies){ Enemy e =(Enemy) e1; g2d.drawImage(e.getImage(), e.getX(), e.getY(), this); } } public void actionPerformed(ActionEvent e){ alive(); updateWeapons(); updateEnemies(); updatePlayer(); checkCollisions(); repaint(); } void alive(){ if (!alive){ timer.stop(); } } void updateWeapons(){ ArrayList<Weapon> ws = player.getWeapons(); for (int i = 0; i < ws.size(); i++){ Weapon w = (Weapon) ws.get(i); if (w.visible()){ w.move(); } else{ ws.remove(i); } } } void updatePlayer(){ player.move(); } void updateEnemies(){ if (enemies.isEmpty()){ alive = false; return; } for (int i = 0; i < enemies.size(); i++){ Enemy e = enemies.get(i); if(e.visible()){ e.move(); }else { enemies.remove(i); } } } public void checkCollisions(){ Rectangle r3 = player.getBounds(); for (Enemy enemy: enemies){ Rectangle r2 = enemy.getBounds(); if (r3.intersects(r2)){ player.setVisible(false); enemy.setVisible(false); alive = false; } } ArrayList<Weapon> ws = player.getWeapons(); for (Weapon w : ws) { Rectangle r1 = w.getBounds(); for (Enemy enemy : enemies) { Rectangle r2 = enemy.getBounds(); if (r1.intersects(r2)) { w.setVisible(false); enemy.setVisible(false); } } } } class TAdapter extends KeyAdapter{ public void keyReleased(KeyEvent e) { player.keyReleased(e); } public void keyPressed(KeyEvent e) { player.keyPressed(e); } } 

}

  • And what is the difficulty in using the Random class? - Anton Shchyrov
  • I do not understand where to insert the part of the code that is responsible for this. - Fely
  • Where do you initialize your pos array? There and insert - Anton Shchyrov

1 answer 1

The java.util.Random class is a pseudo-random number generator.

The int nextInt (int n) method returns the next random int value in the range from 0 to n

Replace maxValueOfX , maxValueOfY and enemiesNumber with your values.

 int enemiesNumber = 10; final int maxValueOfX = 1366; final int maxValueOfY = 768; Random random = new Random(); int[][] positions = new int[enemiesNumber][2]; for (int i = 0; i < positions.length; i++) { positions[i][0] = random.nextInt(maxValueOfX); positions[i][1] = random.nextInt(maxValueOfY); }