Как сделать так, чтобы на моем экране появлялись генерирующие случайные объекты? - PullRequest
0 голосов
/ 19 января 2019

Это мой фоновый образ, который я использовал Я - новый программист, и я все еще учусь кодировать. Я пытаюсь создать нестабильную игру с птицами, но мой код, похоже, не работает. То, что я пытаюсь сделать, это создать код, который генерирует случайные каналы в моей программе и пытается заставить их столкнуться с красным шаром.

Я пытался найти нестабильные игры с птицами, которые объясняют мне, как это работает, но это не работает в моем коде, или это очень очень сложно, я не могу понять.

Привет, спасибо за помощь, но я попытался реализовать твой код и получил эту ошибку. Я пытаюсь это исправить. Что касается ваших других комментариев, я пытался создать игру под названием flappy bird, в которой я должен генерировать случайные трубы с разной высотой труб с одинаковым количеством пространства между ними. Вот что происходит:

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.ArrayList;
import java.util.Random;
import java.awt.Rectangle;

/**
 * Auto Generated Java Class.
 */
public class Game extends JFrame implements ActionListener{
  static final int NUMBER_OF_OBSTACLES = 30; // pre-assign the number of obstacles to be generated

  // setup our objects for our game
  JLabel[] columns = new JLabel [NUMBER_OF_OBSTACLES];
  public Rectangle bird;
  public final int WIDTH = 100, HEIGHT = 100;
  public Random rand;

  int number;
  ImageIcon lblBackground = new ImageIcon("Test1.jpg");
  ImageIcon lblBackground2 = new ImageIcon("Background2.jpg");
  static int randomNumber; 
  int xLocation = 0;
  int yLocation = 0;
  int wLocation = 450;
  int xForRect = 300;
  int yForBall = 300;
  int xForRectTop = 300;
  static int randY; 
  int xSpeed = 1;
  int ySpeed = 1;
  int delay = 5;
  Rectangle rect;

  public Game() { 
    Rectangle column [];
    column = new Rectangle [150];

    setLayout(null);
    setSize (404, 600);
    setVisible(true);   //sets everything to visable 

  }
  private void generateRectangles() {
    for (int i = 0; i < columns.length; i ++ ) {
      columns[i] = new JLabel("" + i); // the name of the object will be shown as the number it is
      columns[i].setBackground(Color.green);
      columns[i].setOpaque(true);
      columns[i].setBounds(randomRect());
    }
  }

  private Rectangle randomRect() {

    // create a rectangle to store the bounds of our new object
    Rectangle rect = new Rectangle();

    rect.height = randomizer(5, 100); // random height 1 to 100
    rect.width = randomizer(5, 100);  // random width 1 to 100

    return rect;
  }

  private static int randomizer(int min, int max) {
    Random random = new Random(); // create new randomizer

    int number = random.nextInt(max - min); //randomizes a number from 0 to dist between them (for example if we are generating from 50 to 100 it will run from 0 to 50)
    number = number + min; // then add 50 to match the bottom range

    return number; // return this random number to the method that called for it
  }



  public void makeColumn(Graphics g, Rectangle column) {
    g.setColor(Color.green);
    g.fillRect(column.x, column.y, column.width, column.height);
  }


  public static int addRandomColumn() {
    randomNumber = (int)(Math.random() * 300 + 250); 
    randomNumber = randY;
    return  randY;
  }


  public void paint(Graphics g){
    super.paint(g);
    for (int p = 0; p < 9999999; p = p+1)  { 
      for (int i = 0; i <=630; i= i + 1){

        lblBackground.paintIcon(this,g, xLocation, yLocation);
        System.out.println(xLocation);
        xLocation = xLocation - xSpeed;



        g.setColor(Color.red);
        g.fillRect(150, yForBall, 20, 20);

        yForBall = yForBall + 1;

        rect = new Rectangle(xForRect,450,50,number);

        makeColumn(g,rect);
        rect = new Rectangle(xForRectTop,0,50,number);
        makeColumn(g,rect); 

        xForRect = xForRect -1;
        xForRectTop = xForRectTop -1;

        try { 
          Thread.sleep(delay);
        }
        catch (Exception error) {
        }
      }
    }

  }

  public void actionPerformed(ActionEvent evt){

  }
  public static void main(String[] args) { 
    new Game();
  }

}

Это я, что у меня так далеко. Надеюсь, вы можете помочь мне

Я планировал создать каналы в программе с различной высотой.

1 Ответ

0 голосов
/ 19 января 2019

Я задам вам вопрос в 2 областях.

1. Во первых дизайн проекта

Хорошо иметь представление о том, что вы хотите, прежде чем задать вопрос или начать писать свою программу. Исходя из этого, я предполагаю, что вы пытаетесь создать игру, в которой вы управляете птицей, которая должна избегать препятствий.

В настоящее время вы создаете свою игру, рисуя компоненты на раме. Это хороший вариант, но я предпочитаю генерировать компоненты в виде объектов (обычно JLabel s, чтобы было легко дать им графику). Создавая объекты, вы можете изменять объект только на экране, если хотите переместить его во время игры, а не перекрашивать все компоненты.

Java - это объектно-ориентированный язык программирования, поэтому лучше, если вы разрабатываете свою программу с модульной структурой.

Вот ключевые функции вашей программы, которые необходимо создать:

  • Фон JFrame
  • Создатель препятствий
  • Входной слушатель
  • Проверка на столкновение

Я обращусь только к создателю препятствия, потому что это то, о чем вы спрашивали в своем вопросе.

При написании создателя препятствий вы хотите написать его так, чтобы он был надежным и простым в использовании несколько раз. В идеале это придет в форме класса или функции, которую можно вызывать и возвращать объект на вашем экране. Это позволит обеспечить максимальную гибкость.

Также стоит отметить, что если вы не планируете использовать свои процедуры в других классах, модификатор public не нужен, лучше использовать private void.

2. Написание кода

Здесь я переписал вашу программу более простым способом. Не переопределяя метод рисования, вы избавляете себя от лишних хлопот.

Обратите внимание на ключевые изменения, которые я сделал:

  1. Теперь я создаю ваши игровые компоненты как JLabels. Они создаются процедурами в методе Game ().

  2. Прямоугольники больше не закрашены, что позволит легче обнаруживать столкновения при написании этой части программы

  3. Обратите внимание, как я создал функцию, которая генерирует числа случайным образом. Теперь я могу легко вызвать эту функцию из других мест в программе позже.

  4. Наконец я удалил ваш код задержки Thread.sleep(delay);. Для обработки событий лучше использовать нить таймера , а не задержку. Я бы порекомендовал вам создать поток таймера, который работает параллельно вашей программе. Через полсекунды, когда поток работает, вы можете перемещать птицу в направлении ввода и затем проверять, не столкнулась ли она с объектом из массива columns.

    import javax.swing.*;       
    import java.awt.*;      
    import java.awt.event.*;        
    import java.util.Random;        
    import java.awt.Rectangle;      
    
    
    public class Game extends JFrame implements ActionListener{
    
      static final int NUMBER_OF_OBSTACLES = 30; // pre-assign the number of obstacles to be generated
    
      // setup our objects for our game
      JLabel[] columns = new JLabel [NUMBER_OF_OBSTACLES];
      JLabel bird;
    
      public Game() { 
    
        // setup the frame
        setLayout(null);
        setSize (404, 600);
        setVisible(true);   //sets everything to visable 
        setDefaultCloseOperation(EXIT_ON_CLOSE);
    
        generateRectangles();
    
        placeBird();
    
      }
    
       private void placeBird() {
            // create the new bird
            bird = new JLabel("B");
            bird.setBackground(Color.red); // set background
            bird.setOpaque(true);          // make the label's background color not invisible but opaque
            bird.setBounds(this.getWidth()/2, 0 , 30, 30); // place bird at top midpoint of screen, its size is a 30,30 square
            this.add(bird);               // add the bird to our frame
            bird.setVisible(true);        // show the bird on our frame
       }
    
       private void generateRectangles() {
           for (int i = 0; i < columns.length; i ++ ) {
               columns[i] = new JLabel("" + i); // the name of the object will be shown as the number it is
               columns[i].setBackground(Color.green);
               columns[i].setOpaque(true);
               columns[i].setBounds(randomRect());
               this.add(columns[i]);
               columns[i].setVisible(true);
           }
       }
    
       private Rectangle randomRect() {
    
           // create a rectangle to store the bounds of our new object
           Rectangle rect = new Rectangle();
    
           rect.height = randomizer(5, 100); // random height 1 to 100
           rect.width = randomizer(5, 100);  // random width 1 to 100
           rect.x = randomizer(1, this.getWidth()); // random x position up to the width of the frame
           rect.y = randomizer(30, this.getHeight()); // random y position from 30 up to the height of the frame (NOTE: the 30 gap is so no obstacles start on top of the bird)
    
           return rect;
       }
    
       private static int randomizer(int min, int max) {
            Random random = new Random(); // create new randomizer
    
            int number = random.nextInt(max - min); //randomizes a number from 0 to dist between them (for example if we are generating from 50 to 100 it will run from 0 to 50)
            number = number + min; // then add 50 to match the bottom range
    
            return number; // return this random number to the method that called for it
        }
    
    
        // main runs on startup creating our frame
        public static void main(String[] args) { 
            Game game = new Game(); // start a new game
        }
    
        @Override
        public void actionPerformed(ActionEvent e) {
            throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...