Не получается создать двумерный массив

354
08 февраля 2017, 23:55

Создаю игру, в коорой вражеские объкты появляются на панели рандомно. Для того, чтобы это реализовать, хочу создать двумерный массив, который хранит координаты врагов. Что-то такое:

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}
};

Проблема заключается в том, что я бы хотела заполинть массив pos случайными числами автоматически, чтобы потом использовать в следующем:

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

Все это находится в одном классе:

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);
        }
    }

}

Answer 1

Класс java.util.Random представляет собой генератор псевдослучайных чисел.

Метод int nextInt(int n) возвращает следующее случайное значение типа int в диапазоне от 0 до n

Замените maxValueOfX, maxValueOfY и enemiesNumber на свои значения.

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);
}
READ ALSO
Структура общения клиент-сервера через ObjectOutput(Input)Stream Java

Структура общения клиент-сервера через ObjectOutput(Input)Stream Java

Помогите понять как правильно настроить структура общения через объектыСервер:

329
Конветирую класс java в kotlin

Конветирую класс java в kotlin

Конвертирую класс из java в kotlin, при условии, что класс рабочий

316
Алгоритм заливки замкнутого контура (FloodFill). Android. Java

Алгоритм заливки замкнутого контура (FloodFill). Android. Java

ЗдравствуйтеХочу реализовать заливку на Java под Android

572
Запись SMS/inbox Android &gt;= 4.4

Запись SMS/inbox Android >= 4.4

Имеется код:

289