Модераторы: Rickert

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Разработка игры "Территория" (Точки), Java, с нуля 
:(
    Опции темы
Rpahut
Дата 25.1.2009, 21:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Погонял немного нашу программку.
На данный момент есть следующие недочеты:
1. Точка закрашивается при щелчке в клетку справа-внизу от нее. Пришла пора править screen2field():
Код

     private int screen2field(int coord) { // screen to field convert coordinates
       return (coord+cellSize/2) /cellSize; // shift by half cell
      }


2. Точка перекрашивается даже если она уже занята другим игроком. Чтобы этого не происходило, нужно добавить проверку в setNewColor()
Код

// метод теперь возвращает false если точка уже занята
    public boolean setNewColor(Color playerColor) { // accepts new color
        if(color!=null) // color is changed already
           return false; // do nothing and return false

        color = playerColor; // changes color
     return true;
   }

3. Ход все равно передается следующему игроку, даже если предыдущий щелкнул в занятую точку. Мы используем значение, возвращаемое setNewColor(), чтобы определить, удалось ли игроку поставить точку или нет, и передадим ход только если удалось:
Код

// здесь просто возвращаем значение
     public boolean mouseWasClicked(int x, int y, Color playerColor) { // accepts coordinates and the playerColor of the Mouse click
        int pointX = screen2field(x); // count which point was clicked
        int pointY = screen2field(y);
        return points[pointX][pointY].setNewColor(playerColor); // return value returned by setNewColor()
    
        //return true;  
      }

Код

// здесь используем значение
  public void mouseClicked(MouseEvent e) {
    
       Player currentPlayer;
  
       int screenX = e.getX(); // gets coordinate of the click
       int screenY = e.getY();
     
   
       if(firstPlayerMove) {
         currentPlayer = first;
         // firstPlayerMove = false; 
       }
       else {
         currentPlayer = second;
         // firstPlayerMove = true; 
       }

       if( canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor( )) ) {
         // если цвет успешно сменен -
         // передаем ход следующему игроку
         firstPlayerMove = !firstPlayerMove;
       }
       
  }


4. При закрытии окна появляется диалог "Would you like to stop the game  ?", но окно закрывается независимо от того would я like или нет. Может оставить одну кнопку Yes? smile 
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 26.1.2009, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Точки которые созданы заранее и хранятся в массиве у меня на решётке не видны .А точки создаваемые при щелчке мышкой рисуются там где мышкой щёлкнули..даже  друг на друге .
Я попробовала изменить screen2field но пока поведение точек не изменилось.Может быть надо поправить и field2screen  что бы был эффект попадания в углы решётки ? 
После введения проверки в setNewColor() точки перестали перекрашивать друг друга но при неполном перекрывании новая точка того же цвета всё-таки рисуется. Если щёлкать мышкой и чуть чуть смещать курсор можно нарисовать линию из частично перекрывающихся точек одного цвета.  

В mouseWasClicked мне пришлось оставить points[pointX][pointY].paint(x,y,this.getGraphics()); потому что без него  точки не рисуются .
Код

public boolean mouseWasClicked(int x, int y, Color playerColor) 
         { // accepts coordinates and the playerColor of the Mouse click
         int pointX = screen2field(x); // count which point was clicked
         int pointY = screen2field(y);
          points[pointX][pointY].paint(x,y,this.getGraphics());
          return points[pointX][pointY].setNewColor(playerColor); // sets the  owner  color
        }

видимых изменений это не принесло потому что мы не смогли привязать координаты новых точек к координатам точек в массиве. Наши точки пока гуляют сами по себе smile
mouseClicked скомпелировался нормально .
Кнопочку я попыталась убрать изменив ту часть кода где она мне встретилась 
Код

public void windowClosing(WindowEvent e) {
                int exitCode = JOptionPane.showConfirmDialog(Grids.this, "Would you like to stop the game  ?", "Options ", JOptionPane.YES_OPTION);
                if (exitCode == JOptionPane.YES_OPTION) {
                } else {    
                }
 всё скомпелировалось но и кнопочка тоже осталась..Странно однако .
Хотя это пустяк по сравнению с точками "гуляющими" по решётке .



PM MAIL   Вверх
Rpahut
Дата 26.1.2009, 02:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Цитата

В mouseWasClicked мне пришлось оставить points[pointX][pointY].paint(x,y,this.getGraphics()); потому что без него  точки не рисуются .

ТАМ они и не должны рисоваться. У вас есть метод paintComponent() в котором происходит(ну, должна происходить) отрисовка.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 26.1.2009, 19:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



paintComponent() происходит отрисовка точек которые заранее созданы в  массиве и самой решётки .Мы не определяем их цвет .
Код

 public void paintComponent(Graphics g) {
        for (int i = 0; i < rows; i++)
            g.drawLine(0, cellSize*i, cols*cellSize, cellSize*i);
        
          for (int j = 0; j < cols; j++)
             g.drawLine(j * cellSize, rows*cellSize,  j * cellSize,0);
            
        for(int y=1; y<cols; y++) {
          for(int x=1; x<rows; x++) { 
              points[x][y].drawCircle(field2screen(x), field2screen(y), g); // call for EACH point to draw 
          }
         }
     }
 если поменять на  points[x][y].paint(field2screen(x), field2screen(y), g);   то решётка выйдет без прорисовки заранее созданных  точек так что смысла в этом нет.
Оба метода для рисования точек на данный момент :
Код

 public void   paint (int  x,int   y,  Graphics g)
    {   g.setColor(color);
        
     if(color==null) {
    }
     else {
      drawCircle(x, y, g); // pass  x, y ,Graphics  g   and draw the points 
    }  
 }
    public void   drawCircle (int  x,int   y,  Graphics g)
    {   g.setColor(color);
        g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
    }       

В методе  mouseWasClicked происходит рисование точек цветами игроков при щелчке мышкой.Они то у нас и гуляют сами по себе .
Нам нужна валидация их координат на предмет совпадения с координатами заранее созданных точек которые ещё не имеют хозяина. Может быть просто перебирать координаты заранее созданных точек на предмет совпадения с координатами щелчка мышкой  плюс минус 5 пикселей ? Если такая точка существует - мы её закрасим , а если нет пускай пробуют ещё раз щёлкнуть smile

PM MAIL   Вверх
Rpahut
Дата 26.1.2009, 23:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Цитата

решётка выйдет без прорисовки заранее созданных  точек так что смысла в этом нет.

Смысл есть - для чего мы использовали setNewColor()? Когда игрок тыкает в точку, меняется хранимый в ней цвет, и она рисуется этим цветом.
paintComponent() вызывается всякий раз, когда щелкается мышка (проверьте, в mouseClicked() должна быть строчка repaint();), поэтому всякий раз перерисовывается все поле - если точка получила цвет, она появится на экране.

Ах да мой косяк. Запостил mouseClicked() без repaint'а smile Должен быть repaint()!!, в самом конце метода - он вызывает paintComponent(), без него изменения на поле видно не будет.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 27.1.2009, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



А я  вчера пыталась найти кто же вызывает paintComponent()  ..... 
Мне это было жутко интересно smile 
Потом я смирилась и решила что это какой-то особый метод который и вызывать то не надо - работает автоматом . 
Теперь у нас точки ставятся по углам решётки    smile  
Но  мы ещё не применяли метод 
Код

 private int field2screen(int coord) { // field to screen  convert coordinates
       return coord*cellSize;
    }
  мы будем его использовать для замыкания контура  ?

Будут ли  нарисованные точки   храниться в отдельном массиве  или можно  использовать  массив  который уже есть с заранее созданными точками ?


 
PM MAIL   Вверх
Rpahut
Дата 27.1.2009, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



paintComponent() на самом деле вызывается на усмотрение Явы, например когда окно разворачивается из свернутого состояния. repaint() мы используем чтобы сообщить Яве что мы изменили поле и его надо перерисовать.

А field2screen() уже используется здесь для перевода координат точки на поле в экранные координаты:
Код

points[x][y].paint(field2screen(x), field2screen(y), g);


Работать мы будем с теми точками которые у нас есть.

______________________________________
Собственно прежде чем идти дальше предлагаю внести пару штрихов в код.

1. Сейчас у нас если пощелкать у самого правого края экрана (или внизу) происходит исключение ArrayIndexOutOfBoundsException, потому что в результате пересчета экранных координат щелчка в "полевые" получается что x или y за пределами массива
Код

// GridsCanvas.mouseWasClicked()
...
// exception!
return points[pointX][pointY].setNewColor(playerColor); // pointX or pointY out of bounds

Чтобы этого не происходило мы добавим проверку координат.
Сначала вспомогательный метод для проверки координат:
Код

private boolean goodCoords(int fieldX, int fieldY) {
  /*
  if X is zero or positive and
  if Y is zero or positive and
  if X is less than field width and
  if Y is less than field height...
  */
  if(fieldX>=0 && fieldY>=0 && fieldX<cols && fieldY<rows)
    // ...good coords
    return true;

  // else - bad coords
  return false;
}

Сама проверка:
Код

     public boolean mouseWasClicked(int x, int y, Color playerColor) { // accepts coordinates and the playerColor of the Mouse click
        int pointX = screen2field(x); // count which point was clicked
        int pointY = screen2field(y);

        // check coords
        if( goodCoords(pointX, pointY) ) {
                return points[pointX][pointY].setNewColor(playerColor); // sets the  owner  color
        }
        // else do nothing
        return false;
      }


--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Rpahut
Дата 27.1.2009, 22:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



2. Рисование точек начинается с координат [1,1], т.е. не видно целый столбец и целую строку точек, хотя они все равно обрабатываются программой:
Код

// GridsCanvas.paintComponent()
...
        for(int y=1; y<cols; y++) {
          for(int x=1; x<rows; x++) {

Меняем на 
Код

        for(int y=0; y<cols; y++) {
          for(int x=0; x<rows; x++) {


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

Сначала увеличим размер окна на одну клетку.
Было:
Код

// GridsCanvas.GridsCanvas()
...
        setPreferredSize(new Dimension(600, 600));

Стало:
Код

        // [(numberOfColumns+1)*sizeOfCell , (numberOfRows+1)*sizeOfCell]
        // or [numberOfColumns*sizeOfCell+sizeOfCell , numberOfRows*sizeOfCell+sizeOfCell]
        setPreferredSize(new Dimension( (c+1)*cellSize, (r+1)*cellSize ));


Теперь места достаточно чтобы подвинуть сетку. Дорабатываем paintComponent():
Код

    public void paintComponent(Graphics g) {

        g.translate(cellSize, cellSize); // ADDED

        // lines are shorter now
        for (int i = 0; i < rows; i++)
            //g.drawLine(0, cellSize*i, cols*cellSize, cellSize*i);
            g.drawLine(0, cellSize*i, cols*cellSize-cellSize, cellSize*i); // CHANGED
        
          for (int j = 0; j < cols; j++)
             //g.drawLine( j * cellSize, rows*cellSize,  j * cellSize,0 );
             g.drawLine( j * cellSize, rows*cellSize-cellSize,  j * cellSize,0 ); // CHANGED
            
        for(int y=0; y<cols; y++) {
          for(int x=0; x<rows; x++) {
             points[x][y].paint(field2screen(x), field2screen(y), g);   
          }
         }

        g.translate(-cellSize, -cellSize); // ADDED

     }

    translate(x, y) используется чтобы сместить пространство отрисовки. Здесь мы смещаем его вправо-вниз на размер клетки
    так что все рисуемые объекты тоже смещаются на это расстояние.
    translate(-x, -y) в конце используется чтобы вернуть все как было (после отрисовки). Без него поле будет смещаться дальше и дальше
    при каждом вызове paintComponent() и уедет с экрана.

Ну и, раз уж мы сдвинули сетку, придется поправить и screen2field(), чтобы точки попадали в мышку как и раньше.
Код

     int screen2field(int coord) { // screen to field convert coordinates
       //return (coord+cellSize/2) /cellSize; // old
       //return (coord+cellSize/2) /cellSize - 1; // new 1
       return (coord-cellSize/2) /cellSize; // new 2
      }



Это сообщение отредактировал(а) Rpahut - 27.1.2009, 22:56
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 28.1.2009, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Вчера у меня отключился интернет ( ливнем  повредило телефонный кабель ). 
Сейчас пишу с чужого компьютера  .Компилятора под рукой нет но я надеюсь к вечеру интернет будет и я смогу описать  результат проделанной работы. Пока занималась проблемой с лишней кнопкой при закрытии программы .Не знаю как её убрать . Если только весь public void windowClosing(WindowEvent e) убрать и сделать JPaneOption диалог . Мы его использовали когда ещё не пользовались GUI поэтому ещё не факт что с  GUI это будет правильным решением .  
Сегодня  нам  рассказали какую документацию к программе  от нас хотят ... Сказали  написать срочно 50-100 страниц используя используя глаголы в будущем времени потому что мы сначала  должны были  писали эту документацию  а потом уже  программу разрабатывать   .. 
Надо  описать как всё работает  ,  куда что передаётся  , как  и где  принципы обьектно-ориентированного программирования себя проявляют . К алгоритмам надо приложить  диаграммы или псевдо-коде .  Я бы конечно предпочла что-бы мне  заранее  это сказали делать . Но у препода своя  железная логика . Он считает что декабре мы ещё не могли знать что реально мы   напишем и каким путём пойдём . 
У всех студентов сейчас  разные версии .  А тех у кого версии  будут одинаковые будут  "пытать "  в разных кабинетах . Преподаватели  наделают им  ошибок в коде их же собственных  програм  и заставят  их исправить что-бы выяснить кто у кого списал   ..

У меня всё скомпелировалось . Я думаю как можно сделать что-бы последняя поставленная точка мигала привлекая к себе внимание игроков. Надо вызывать paintComponent , но как ..такое впечатление что  нужно установить не просто loop а loop c таймером  для прорисовки через определённый интервал.


Это сообщение отредактировал(а) Qawra - 28.1.2009, 20:42
PM MAIL   Вверх
Rpahut
Дата 28.1.2009, 22:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Цитата

Пока занималась проблеммой с лишней кнопкой при закрытии программы .Не знаю как её убрать .

Там нужно сделать две вещи.
Во-первых, указать чтобы окно не закрывалось автоматически:
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
Во-вторых - вручную закрыть окно, если пользователь выберет Yes.
Код

        addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) {
                int exitCode = JOptionPane.showConfirmDialog(Grids.this, "Would you like to stop the game  ?", "Options ", JOptionPane.YES_NO_OPTION);
                if (exitCode == JOptionPane.YES_OPTION) {
                    dispose(); // close window
                }
            }
        }); 


__________________________
Вам показывали что BlueJ умеет генерировать документацию? 

Вобщем, он умеет, нужно только составить описание классов и методов.
Код

/**
  * GridsCanvas is a {@url JPanel} extension for Points game
  */
class GridsCanvas extends JPanel{
     public int rows=20;
     public int cols=20;
     public int cellSize=30 ;
     private Color color;
     private DrawablePoint points[][]; // array to hold all possible  points

    /**
      * Creates new game field
      * @param r number of field rows
      * @param c number of field columns
      * @param cellSize cell size in pixels
      */
    GridsCanvas(int r, int c,int cellSize) {
        this.rows = r;
        this.cols = c;
        this.cellSize=cellSize;
        setVisible(true);
        setPreferredSize(new Dimension( (r+1)*cellSize, (c+1)*cellSize ));
        points = new DrawablePoint[cols][rows];
        makePoints(rows,cols);
    }
...

Потом в BlueJ выбираем Tools->Project Documentation и получаем документацию. Вряд ли там получится 100 страниц, но...
How to write Doc Comments for the Javadoc tool

--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 29.1.2009, 00:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



С окошком наконец-то получилось .Я пробовала раньше setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); но это приводило к невозможности закрыть программу вообще . Теперь она закрылась   smile  

То что BlueJ делает документацию от нас естественно держат в секрете .
Хотя не думаю что это может помочь . То что они хотят это скорее реферат чем документация.
====================================================
Часть 1 : 
Описание проблемы , Use-Case Diagrams ( ещё не знаю что это такое , может быть это из UML ), причины по которым написание программы необходимо и возможные пути решения поставленной задачи.

Часть 2:
Описание использованных алгоритмов и их детальный дизайн ( псевдо-код или flow chart )

Часть 3 :
Описание применённых в программе принципов Обьектно-Ориентированного программирования и диаграммы классов .

Часть 4 :
Applications of Java APIs

Часть 5 :
Процедуры тестирования 

Часть 6 :
Solution Evaluation ,User Manual , Screenshoots

Приложение :
Исходный коде программы
==================================================

Приступаю к обдумываю первой части с использованием глаголов в будущем времени .Зачем писали программу ...в целях экономии бумаги школьниками smile



PM MAIL   Вверх
Qawra
Дата 29.1.2009, 16:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хотелось мне как-то выделить   точку  которая была поставленна последней.
Пока самое простое что пришло в голову это нарисовать у этой точки чёрный ободок. При небольшом дополнении к методу drawCircle
Код

public void   drawCircle (int  x,int   y,  Graphics g)
    {   
        g.setColor(color);
        g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
        g.setColor(new Color(0,0,0));
        g.drawOval(x- 8, y-8, (6*2)+2,(6*2)+2);
        g.setColor(color);
    }      
 такие ободки рисуются у всех точек . А надо что бы ободок изчезал как только поставлена следующая точка. Может быть вынести это в отдельный метод drawCircleNew  и вызывать только когда рисуется новая точка а затем перерисовывать с помощью :
Код

public void   drawCircle (int  x,int   y,  Graphics g)
    {   g.setColor(color);
        g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
    }  
     

PM MAIL   Вверх
Kakadu
Дата 29.1.2009, 17:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Насчет ободка предлагаю такое решение: добавим ещё одно поле а классе GridsCanvas и назовем его LastPoint. К классу DrawablePoint добавим метод "нарисовать ободок" и После перерисовки всех точек вызовем для последней точки рисование ободка.

У нас получается что поле характеризуется массивом точек, состояние которых описывается в поле color: 1)null - не точки: 2)Цвет 1го игрока - первый игрок, 3) 2го - второй. Мне не кажется это очень хорошим решением. Положим мы дошли до того некоторого места в написании проекта, и теперь нам предстоит заниматься замыканием контура. На сколько я помню игру "точки" замыкать контур можно, если замыканием отрезается область, содержащая хотя бы одну точку противника; при проведении границы мы не должны пересекать уже проведенных вражеских ребер. На текущем этапе проектирования нам придется вводить массив на ребра, находящиеся на поле (читайте хранить несвязный граф) и хранить, участвовала ли каждая точка в замыкании пути. ИМХО, мне это не нравится. Я бы оставил просто массив int равный размеру поля. Обходя его я бы рисовал каждую точку. (Возможно, после замыкания контура мы захотим наводить контур более жирной линией: тут начнутся проблемы. Мелочь типа наведения ободка на данном этапе легко добавляется, как добавить жирный контур мне пока не очевидно). Классы это, конечно грамотно, но... В принципе я с массивом погорячился: можно добавить в класс DrawablePoint атрибут, принадлежит ли она какому-нить замыканию.

Что будем делать, когда игрок делает ход? Тут надо привести нетривиальный алгоритм поиска замыкания. Как известно из курса мат. анализа, положительным направлением обхода контура будет такое направление при котором внешняя нормаль в данной точке границы контура при повороте по часовой стрелке (читайте при умножении на матрицу 2х2: (0 -1 1 0) ) совпадает с направлением касательной, т.е. с направлением движения. 

Итак, мы имеем точку, в которую только что кликнули. окрестные 8 точек можно воспринимать как циклически замкнутую строку (в принципе это даже не так важно). 
Нада какой-нить пример:
Код

110
011
100

вот наши 9 точек, в центр только что нажали. окружность разобьется на две группы точек: {(2,0)} и {(0,0),(0,1),(1,2)}. Проверять, что центральная точка вместе с верхними тремя замкнет контур не нужно, так как мы это уже делали, когда добавляли эти три точки (некая индукция, если рассуждать в терминах математики). значит мы должны проверить не замкнет ли центральная верхние три с нижней. далее мы выберем одно из 4х стартовых направлений (т.к. суммарное кол-во точек в обеих группах=4) и будем так же выбирать направление со следующими точками. При этом  надо маркировать (где-то хранить точки пути)

Кажется я начинаю запутываться.
Извините за этот бред, надеюсь я никого не напугал нашими перспективами.
Сам я Java не изучал (настала пора начинать!), но морской бой в Дельфях написать  могу. Постараюсь помочь в написании этой дикой вещи.


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
Rpahut
Дата 30.1.2009, 00:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Цитата(Qawra)

Хотелось мне как-то выделить   точку  которая была поставленна последней.

Kakadu дело говорит; только я бы сделал выделение двух последних точек, по одной на игрока, иначе зачем это не совсем понятно.

Kakadu, на правила мы забили. Точки можно соединять если они рядом, принадлежат одному игроку и если новое соединение не пересекает уже существующее. Счет ведется по захваченной площади.

По поводу нетривиального алгоритма поиска - не совсем понятно как найти внешнюю нормаль, если имеется только взаимно равноправное соединение между точками и где внешняя сторона еще не известно.
Предполагается добавление в DrawablePoint массива для хранения точек, с которыми соединена данная точка, и через него все остальные действия.

Поиск контура и захваченных точек задумывался при помощи рекурсии, поскольку рекурсия мне роднее матана smile 
Используются следующие идеи:
1. Если из всех соединенных друг с другом точек выкинуть тупиковые (т.е. имеющие максимум одно нетупиковое соединение) точки, то что останется и будет замкнутым контуром.
2. Построив после этого прямоугольную границу вокруг контурных точек и расширив ее на одну клетку в каждую сторону, можно из внешней части запустить поиск, который, теоретически, найдет все точки вне контура. Сейчас я, кажется, вижу в этом пункте одну серьезную дырку... Также, кажется, я вижу как ее заделать smile 
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 30.1.2009, 09:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Самое лучшее описание алгоритма я видела здесь 
http://pointsxt.logicsworld.net/forum/index.php?showtopic=69
К сожалению регистрация на форуме не работает ( как видимо и сам форум ).
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

НА ЗЛОБУ ДНЯ: Дорогие посетители, прошу обратить внимание что новые темы касающиеся новых вопросов создаются кнопкой "Новая тема" а не "Ответить"! Любые оффтопиковые вопросы, заданные в текущих тематических темах будут удалены а их авторы, при рецедиве, забанены.

  • Литературу, связанную с программированием графики, обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы связанные с программированием графики и мультимедии на языках С++ и Delphi
  • Вопросы по реализации алгоритмов рассматриваются здесь

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

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


 




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


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

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