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

Поиск:

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


0xdeadbeef
*


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

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



px и py имеют тип int - это видно там где они созданы:
Код

    private void makeConnections(int px, int py) {

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

DrawablePoint p;
int px, py;
...
px = p.getX();
py = p.getY();


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


Бывалый
*


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

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



Линии толще  оказывается сделать нельзя . Я попробовала  нарисовать сразу несколько линий вместо одной
и у меня получились такие " гантельки " . 
user posted image
Сейчас  диагональные линии  имеют расширения на концах .
user posted image Пускай  будут  оригинально - диагональными smile







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


0xdeadbeef
*


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

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



Ок, выкладываю что у меня получилось. Алгоритм еще нуждается в проверке.

1. Добавляем в DrawablePoint:
Код

   // new private member
   private Color captured;

...
   /** Remember who captured this point
   * @param by color of player who captured the point
   */
   void setCaptured(Color by) {
      captured = by; // point is now captured by color 'by'
   }

   /** Get color of player who captured this point
   * @return color of player who captured point, or null
   */
   Color getCaptured() {
      return captured;
   }


2. Добавляем в GridsCanvas массив - член класса:
Код

     private boolean wasHere[][]; // visited points map


3. !!! Рекурсивная ф-ция определения захваченности точки !!!:
Код

     /** Check if point is inside of contour
     * @param px x coord of point to check
     * @param py y coord of point to check
     * @param myColor color of player who set last point
     * @return one of three values: -1 - ignore point; 1 - point captured; 0 - point not captured
     */
     int pointCaptured(int px, int py, Color myColor) {
          // if point is on field
          if(goodCoords(px, py)) {
               if(wasHere[px][py] || // if already was here...
                  (points[px][py].getColor()==myColor && points[px][py].getCaptured()==null) ) // ...or point belongs to current player and not captured
                        return -1; // not interesting

               wasHere[px][py] = true; // mark point as visited

               // recursive call to this method:
               if( pointCaptured(px+1, py, myColor)==0 ) return 0; // right
               if( pointCaptured(px-1, py, myColor)==0 ) return 0; // left
               if( pointCaptured(px, py+1, myColor)==0 ) return 0; // down
               if( pointCaptured(px, py-1, myColor)==0 ) return 0; // up

               // diagonally
               if( !points[px+1][py].isConnectedTo(points[px][py+1]) ) { // if no another diagonal connection...
                   if( pointCaptured(px+1, py+1, myColor)==0 ) return 0; // right-down
               }
               if( !points[px+1][py].isConnectedTo(points[px][py-1]) ) { // --//--
                   if( pointCaptured(px+1, py-1, myColor)==0 ) return 0; // right-up
               }
               if( !points[px-1][py].isConnectedTo(points[px][py-1]) ) { // --//--
                   if( pointCaptured(px-1, py-1, myColor)==0 ) return 0; // left-up
               }
               if( !points[px-1][py].isConnectedTo(points[px][py+1]) ) { // --//--
                   if( pointCaptured(px-1, py+1, myColor)==0 ) return 0; // left-down
               }

               // none of prevous methods returned zero
               return 1; // point is captured
          }
          return 0; // field border reached, point not captured
     }

Тут много буков, но это из за повторяющегося кода. Разберем позже.

4. Добавляем в mouseWasClicked():
Код

                if(ok) {
                    // if color changed
                    makeConnections(pointX, pointY);

                    // new code goes here
                    for(int j=0; j<rows; j++) { // for-all-points loop
                        for(int i=0; i<cols; i++) {
                            wasHere = new boolean[cols][rows]; // clear visited points map
                            if( pointCaptured(i, j, playerColor)==1 ) { // if point is actually captured by current player
                                points[i][j].setCaptured(playerColor); // set it to be captured
                            }
                        }
                    }
               }


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


0xdeadbeef
*


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

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



______________________________________________
Qawra, вы рекурсию проходили?

Тут в общем смысл в том что метод pointCaptured() вызывает сам себя, но с другими параметрами, для соседних точек. И вызывает до тех пор, пока не убедится что наша точка внутри контура, или наоборот не внутри... Если точка внутри замкнутого контура, то от нее нельзя прошагать до края поля, не наткнувшись на контур. Если мы добрались до края поля, значит контура вокруг точки нет.

Что важно для рекурсивного кода - это чтобы он не вызывал сам себя до бесконечности, иначе мы никогда не дождемся результатов проверки smile Поэтому есть массив wasHere[][], спертый у Kakadu, в котором мы отмечаем пройденные точки и не проверяем их повторно:
Код

               if(wasHere[px][py] || // if already was here...

Вторая половина проверки
Код

                  (points[px][py].getColor()==myColor && points[px][py].getCaptured()==null) )

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


Если мы на этой точке еще не были и если это не граница, помечаем точку
Код

               wasHere[px][py] = true; // mark point as visited

и вызываем pointCaptured() для соседних точек - сначала для точек по горизонтали и вертикали:
Код

               if( pointCaptured(px+1, py, myColor)==0 ) return 0; // right
               if( pointCaptured(px-1, py, myColor)==0 ) return 0; // left
// и т.д. ...

Они тоже вызывают pointCaptured() для своих соседних точек, и те для своих тоже, и так пока есть непроверенные точки.


Правда, если в какой-то момент pointCaptured() будет вызван для точки за пределами поля, то он вернет ноль - тогда в одной из этих строчек сработает проверка, например тут:
Код

if( pointCaptured(px+1, py, myColor)==0 ) return 0; // если нам вернули ноль, тоже возвращаем ноль

В этом случае поиск завершается досрочно - ноль возвращается и возвращается, пока не попадет к нам в руки, сюда:
Код

                            if( pointCaptured(i, j, playerColor)==1 ) { // 0==1? нет! точка не захвачена

откуда мы метод и вызываем.


Если точка внутри замкнутого контура, то проверка продолжится пока мы не посетим все точки внутри контура. В этом случае ноль нигде не возвращается и выполнение доходит до строки
Код

               // none of prevous methods returned zero
               return 1; // point is captured
          }

Единица опять же возвращается сюда
Код

                            if( pointCaptured(i, j, playerColor)==1 ) { // 1==1 - точка захвачена

и так мы понимаем, что точка захвачена.

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

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

               if( !points[px+1][py].isConnectedTo(points[px][py+1]) ) { // if no diagonal connection...
                   if( pointCaptured(px+1, py+1, myColor)==0 ) return 0; // right-down
               }
...

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


Бывалый
*


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

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



3 пункт добавляем в GridCanvas ? Я пока его туда определила ..

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



Это сообщение отредактировал(а) Qawra - 6.2.2009, 00:01
PM MAIL   Вверх
Rpahut
Дата 5.2.2009, 23:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Теорию графов я еще и сам не проходил. Переделаем в следующем году smile 

Да, pointCaptured() должен быть в GridsCanvas - он ведь там и используется.

ЗЫ
Если будут вопросы - задавайте. Разберемся с этим и займемся доводкой программы.

ЗЫЗЫ
Метод pointCaptured() должен быть private. Куда мои глаза глядели...

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


Бывалый
*


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

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



Всё скомпелировалось но с функциональной стороны  изменения не заметны . 
Захватываем всё !  И точки ... и пустую территорию ! Ни от чего не отказываемся !

Не знаю точно какой язык будем в следующем году изучать . Звучит как Императивное и обьектно - ориентированное программирование . Наверно С и С++
Видела студентка у них ( на курс старше ) проект  "виртуальное пианино" писала и  страдала что  ей плохо от запоздалой нотной грамотности smile
Значит зададут нам что-то связаное с мультимедия  . 

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


0xdeadbeef
*


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

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



Чтоб было видно изменения, нужно править DrawablePoint.paint() - учесть в коде значение переменной captured и менять отображение точки.
Тут очень много вариантов, как выделять захваченные точки, так что конкретного решения не предлагаю.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 7.2.2009, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Я пока пытаюсь нарисовать flowchart к алгоритмам .

не умею прикреплять большую картинку , даю ссылку не неё 
http://img6.imageshack.us/my.php?image=flowchart2an6.png
Это ещё не реккурсивный зверь . Это тот playerColor о который я так часто спотыкалась smile

Это сообщение отредактировал(а) Qawra - 7.2.2009, 17:54
PM MAIL   Вверх
Kakadu
Дата 9.2.2009, 21:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Нада мне вас догонять=) Вот выкладываю свое творение.


Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  Faraon.zip 52,62 Kb


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


0xdeadbeef
*


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

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



Куда ближе к оригинальным правилам smile 

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


Бывалый
*


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

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



Я пока  медленно схожу с ума  от  Сlass  диаграмм  ...   

Наверно поэтому у меня в последней версии Какаду  линии не рисуются  smile 
PM MAIL   Вверх
Rpahut
Дата 10.2.2009, 21:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Вот собранная версия.

Присоединённый файл ( Кол-во скачиваний: 15 )
Присоединённый файл  Faraon.jar 22,42 Kb
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 10.2.2009, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У меня не скачивается а открывается..  но при этом ничего не понятно ...

Мы когда в Grid Canvas метод makeConnections прописылали
Код

private void makeConnections(int px, int py) // create connection for the point ,px point x coordinate,py point y coordinate
    {
        DrawablePoint a, b;

        a = points[px][py]; // a - current point

        // for all eight points around current point
        for(int j=-1; j<=1; j++) {
            for(int i=-1; i<=1; i++) {
                if( goodCoords(px+i, py+j) ) {
                    b = points[px+i][py+j]; // b - point to check
                    // if not current point but have same color
                    if(a!=b && b.getColor() == a.getColor()) {
                        // if no another diagonal connection in this cell already exists
                        if( !points[px][py+j].isConnectedTo(points[px+i][py]) ) {
                            a.connectTo(b); // connect a to b
                            b.connectTo(a); // connect b to a
                        }

for(int j=-1; j<=1; j++) {
            for(int i=-1; i<=1; i++) {
 был для зазора в координатах ?

пытаюсь сейчас весь алгоритм рисования линий с начала до конца проследить и словами связно  его обьяснить . пока он у меня идёт от DrawablePoint  к mouseWasClicked . А надо бы наоборот  smile  


Это сообщение отредактировал(а) Qawra - 10.2.2009, 23:34
PM MAIL   Вверх
Kakadu
Дата 10.2.2009, 23:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Мда, перебилдить забыл, когда архивировал. Извини Qawra.

(Я тут заметил, что с проектированием интерфейса у меня какие-то заморочки. Надо книжку про Swing подчитать. Обидно только, что в четверг уже начинается универ.)

Я вам скажу, Rpahut, что это прикольно придумано так просматривать окружающие точки вложенными циклами от -1 до 1. smile  Максимум на что меня хватило, это создать константный массив из 8 пар приращений к координатам, чтобы просматривать окружающие точки. Или я уже отошел от этого способа... не помню...

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


--------------------
Добрые мариносы долго кормили украдкой маленьких зерлингов. От этой украдки зерлинги пухли и дохли
PM MAIL   Вверх
Страницы: (9) Все « Первая ... 5 6 [7] 8 9 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

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

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

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

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


 




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


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

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