Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Программа, моделирующая поле из 16 клеток 
:(
    Опции темы
Joey12
Дата 1.4.2011, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 31.3.2011

Репутация: нет
Всего: нет



Здравствуйте, уважаемые знатоки Java! Пишу вот по какому поводу. Моя задача - составить программу, моделирующую квадратное поле из 16 клеток. На поле случайным образом расположены препятствия двух типов и персонаж, способный перемещаться (один шаг - одна клетка). Препятствия первого типа он поглощает, второго должен уметь обходить. 

Я написал программу без использования графического интерфейса. В качестве поля у меня выступает двумерный массив. По умолчанию он заполнен нулями. Случайным образом в момент создания объекта на поле размещаются препятствия первого (1) и второго (2) типа. Персонаж (3) - это объект класса наследника поля.  

Код

public class Area {
    int Field[][]=new int[4][4]; //массив, моделирующий поле размером 4*4
    Area() { //конструктор по умолчанию, заполняющий поле нулями, т.е. пустыми клетками
        int i1; 
        int i2;
        for (i1=0;i1<4;i1++) {
            for (i2=0;i2<4;i2++){
                Field[i1][i2]=0;
            }
        }
    }

    Area(int dust, int barrier){  //конструктор, заполняющий поле указанным количеством препятствий
        int i1;
        int i2;
        for (i1=0;i1<4;i1++) {
            for (i2=0;i2<4;i2++){
                Field[i1][i2]=0;
            }
        }
        this.SetDust(dust);
        this.SetBarrier(barrier);
    }
    
    void ShowArea() {  //вывод массива на экран
        int i1; 
        int i2;
        for (i1=0;i1<4;i1++) {
            for (i2=0;i2<4;i2++){
                System.out.print(Field[i1][i2]+" ");
            }
            System.out.println();
        }
    }

    void SetDust(int num) {  //генерация "пыли" для указанного количества клеток поля
        int i;
        int x;
        int y;
        for (i=0;i<num;i++) {
            x=(int)((Math.random()*4)+1); //случайное значение в диапазоне 1-4
            y=(int)((Math.random()*4)+1);
            Field[x-1][y-1]=1; //для координат на поле необходимо отнять 1, так как это элементы массива, где нумерация начинается с 0
        }
    }

    void SetBarrier(int num) {//генерация указанного количества барьеров
        int i;
        int x;
        int y;
        for (i=0;i<num;i++) {
            x=(int)((Math.random()*4)+1);
            y=(int)((Math.random()*4)+1);
            if (Field[x-1][y-1]!=1)
                    Field[x-1][y-1]=2; //проверяем, не занята ли пылью ячейка
            else {
                Field[x-1][y-1]=1;
                i=i-1;  //если занята, цикл должен иметь на одну итерацию больше                
            }

        }
    }


    public static void main(String[] args) {
        Area MainField = new Area(5,2); //создаем поле
        Cleaner Walle = new Cleaner(MainField); //создаем персонаж
        MainField.ShowArea(); //вывод на экран поля
        for (int a=1;a<=20;a++) {  //20 шагов
             Walle.moveCleaner(MainField);
             System.out.println();
             MainField.ShowArea();
        }
    }
}

class Cleaner extends Area {
    int Clx; //переменные, хранящие адрес ячейки пылесоса
    int Cly;
    int direction;
    int tempx;
    int tempy;

    Cleaner(Area a){
        direction=1;
        Clx =(int)((Math.random()*4)+1);
        Cly=(int)((Math.random()*4)+1);
        Clx = Clx-1;
        Cly = Cly-1;
        a.Field[Clx][Cly]=3;
    }
    
    void GetPosition(){ //вывод на экран текстовой информации о расположении пылесоса
        System.out.println("x = "+(Clx+1));
        System.out.println("y = "+(Cly+1));
    }

    void moveCleaner(Area a) {  //перемещение
        step(direction);
        if ((tempx>3)||(tempx<0))  //проверка новой клетки на наличие барьера либо конца поля
        {
            this.ChangeDirection();
            moveCleaner(a);
        }
        else if ((tempy>3)||(tempy<0)) {
            this.ChangeDirection();
             moveCleaner(a);
        }
        
        else if (a.Field[tempx][tempy]==2) {
             this.ChangeDirection();
             moveCleaner(a);
        }
           
        else {   //шаг с заменой предыдушей ячейки на пустую
            a.Field[Clx][Cly]=0;
            Clx=tempx;
            Cly=tempy;
            a.Field[Clx][Cly]=3;
        }
    }

    void ChangeDirection() {  //смена направления хода случайным образом
        direction = (int)((Math.random()*4)+1);
    }
    
    void step(int direction){  //варианты шага для выбранного направления
        switch(direction){
            case 1:
            {
                tempx=Clx+1;
                tempy=Cly;
                break;
            }
                
            case 2: {
                tempx=Clx-1;
                tempy=Cly;
                break;
            }

            case 3: {
                tempx=Clx;
                tempy=Cly-1;
                break;
            }

            case 4: {
                tempx=Clx;
                tempy=Cly+1;
                break;
            }
        }
    
        
    }
}


Программа работает - выводит на экран массив. После каждого шага тройка (персонаж) перемещается, удаляет единицы, заменяя их нулями и обходит двойки. Но теперь мне нужно сделать графическую версию. Опыта работы с GUI в NetBeans у меня нет, ранее из визуального программирования изучал только Visual Basic. Я создал новый проект, в нем - jFrame с шестнадцатью jLabel-ами. Каждому jLabel присвоил картинку по умолчанию (для 0, т.е. пустой ячейки). Получилось такое поле: 

user posted image

Теперь я хотел бы связать их с предыдущей программой, т.е. как я понимаю, при старте программы должен срабатывать механизм сравнения для каждого лейбла и соответствующего ему элемента массива. Т.е, если элемент массива равен 0 - картинка для пустой ячейки поля, если равен 1 - для препятствия, 3 - картинка персонажа. При нажатии кнопки "Шаг" - перерисовка поля.  


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

Код

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * MainFrame.java
 *
 * Created on 01.04.2011, 13:35:27
 */

/**
 *
 * @author Privat
 */
public class MainFrame extends javax.swing.JFrame  {

    /** Creates new form MainFrame */
    public MainFrame() {
        initComponents();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jButton1 = new javax.swing.JButton();
        jButton2 = new javax.swing.JButton();
        jButton3 = new javax.swing.JButton();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        jLabel3 = new javax.swing.JLabel();
        jLabel4 = new javax.swing.JLabel();
        jLabel5 = new javax.swing.JLabel();
        jLabel6 = new javax.swing.JLabel();
        jLabel7 = new javax.swing.JLabel();
        jLabel8 = new javax.swing.JLabel();
        jLabel9 = new javax.swing.JLabel();
        jLabel10 = new javax.swing.JLabel();
        jLabel11 = new javax.swing.JLabel();
        jLabel12 = new javax.swing.JLabel();
        jLabel13 = new javax.swing.JLabel();
        jLabel14 = new javax.swing.JLabel();
        jLabel15 = new javax.swing.JLabel();
        jLabel16 = new javax.swing.JLabel();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jButton1.setLabel("Start");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        jButton2.setLabel("Step");

        jButton3.setLabel("Exit");
        jButton3.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton3ActionPerformed(evt);
            }
        });

        jLabel1.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel1.setText("jLabel1");

        jLabel2.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel2.setText("jLabel2");

        jLabel3.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel3.setText("jLabel3");

        jLabel4.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel4.setText("jLabel4");

        jLabel5.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel5.setText("jLabel5");

        jLabel6.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel6.setText("jLabel6");

        jLabel7.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel7.setText("jLabel7");

        jLabel8.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel8.setText("jLabel8");

        jLabel9.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel9.setText("jLabel9");

        jLabel10.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel10.setText("jLabel10");

        jLabel11.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel11.setText("jLabel11");

        jLabel12.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel12.setText("jLabel12");

        jLabel13.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel13.setText("jLabel13");

        jLabel14.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel14.setText("jLabel14");

        jLabel15.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel15.setText("jLabel15");

        jLabel16.setIcon(new javax.swing.ImageIcon(getClass().getResource("/Images/0.png"))); // NOI18N
        jLabel16.setText("jLabel16");

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(90, 90, 90)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(jLabel1, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel5, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel9, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel13, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jLabel2, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel6, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel10, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addComponent(jLabel14, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel3, javax.swing.GroupLayout.PREFERRED_SIZE, 122, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel4, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel11, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jLabel12, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE))
                        .addGroup(layout.createSequentialGroup()
                            .addComponent(jLabel7, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                            .addComponent(jLabel8, 0, 0, Short.MAX_VALUE)))
                    .addGroup(layout.createSequentialGroup()
                        .addComponent(jLabel15, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(jLabel16, javax.swing.GroupLayout.PREFERRED_SIZE, 121, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 1, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addGap(85, 85, 85))
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, layout.createSequentialGroup()
                .addGap(171, 171, 171)
                .addComponent(jButton1, javax.swing.GroupLayout.DEFAULT_SIZE, 61, Short.MAX_VALUE)
                .addGap(89, 89, 89)
                .addComponent(jButton2)
                .addGap(85, 85, 85)
                .addComponent(jButton3, javax.swing.GroupLayout.DEFAULT_SIZE, 54, Short.MAX_VALUE)
                .addGap(163, 163, 163))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(31, 31, 31)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel2)
                    .addComponent(jLabel3)
                    .addComponent(jLabel1)
                    .addComponent(jLabel4))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel6)
                    .addComponent(jLabel7)
                    .addComponent(jLabel5)
                    .addComponent(jLabel8, javax.swing.GroupLayout.PREFERRED_SIZE, 120, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel9)
                    .addComponent(jLabel10)
                    .addComponent(jLabel11)
                    .addComponent(jLabel12))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jLabel13)
                    .addComponent(jLabel14)
                    .addComponent(jLabel15)
                    .addComponent(jLabel16))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 35, Short.MAX_VALUE)
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(jButton3)
                    .addComponent(jButton2)
                    .addComponent(jButton1))
                .addGap(24, 24, 24))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        Area MainField = new Area(5,2);
        Cleaner Walle = new Cleaner(MainField);

    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
      System.exit(0);
    }                                        

    /**
    * @param args the command line arguments
    */

    public static void main(String args[]) {
          java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new MainFrame().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel10;
    private javax.swing.JLabel jLabel11;
    private javax.swing.JLabel jLabel12;
    private javax.swing.JLabel jLabel13;
    private javax.swing.JLabel jLabel14;
    private javax.swing.JLabel jLabel15;
    private javax.swing.JLabel jLabel16;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JLabel jLabel5;
    private javax.swing.JLabel jLabel6;
    private javax.swing.JLabel jLabel7;
    private javax.swing.JLabel jLabel8;
    private javax.swing.JLabel jLabel9;
    // End of variables declaration                   

}





Это сообщение отредактировал(а) Joey12 - 1.4.2011, 14:44
PM MAIL   Вверх
dorogoyIV
Дата 1.4.2011, 17:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(Joey12 @  1.4.2011,  14:37 Найти цитируемый пост)
как можно прикрутить

у тебя все методы типа void, а надо, что бы методы возвращали какое то значение... , тогда можно графическим компонентам задавать какой то функционал 
 smile 
PM MAIL   Вверх
Joey12
Дата 1.4.2011, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 2
Регистрация: 31.3.2011

Репутация: нет
Всего: нет



dorogoyIV, но ведь массив Field у меня является общедоступным, т.е. по идее я могу для каждого jLabel проверить значение соответствущего ему элемента массива (всего 4 варианта, так что можно написать простенький switch), мне главное понять, как сделать классы первой программы доступными во второй. Я не пойму, куда именно их прописать и как реализовать доступ напрямую к полю Field класса Area. 
PM MAIL   Вверх
dorogoyIV
Дата 2.4.2011, 00:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1503
Регистрация: 26.3.2007

Репутация: 36
Всего: 46



Цитата(Joey12 @  1.4.2011,  19:21 Найти цитируемый пост)
как реализовать доступ напрямую к полю Field класса Area. 

Код

Area area = new Area();
int [][] field = area.Field;

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   jk1
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, jk1.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: GUI и Java FX приложения | Следующая тема »


 




[ Время генерации скрипта: 0.0502 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.