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

Поиск:

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


Бывалый
*


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

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



у меня к сожалению классы не открываются ( программы нет нужной )
поэтому я не смогу код посмотреть и прокоментировать :(
PM MAIL   Вверх
Rpahut
Дата 11.2.2009, 01:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Qawra, исходный код можно посмотреть в архиве который выкладывал Kakadu, файлы с расширением .java . Я выложил только саму программу - архив нужно как есть сохранить на компьютер, щелкнуть его второй кнопкой и выбрать "Открыть с помощью"->Java.
BlueJ кстати тоже умеет так упаковывать, программу вместе с исходными кодами и документацией, или без них.


_______________________________
Цитата

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

Вот это я не совсем понял smile Но тем не менее:
В жизни соединений происходит два важных события - это создание и отрисовка.
Поскольку новые соединения могут образоваться только после добавления новой точки, мы вызываем makeConnections() из mouseWasClicked(), когда известно что точка добавлена. Соединения обнаруживаются и сохраняются в точках.
Отрисовка соединений происходит вместе с отрисовкой точки, что в свою очередь происходит при отрисовке поля.

Попробую запутать вас совсем:
_____________________________
Этот цикл перебирает все точки вокруг проверяемой:
Код

for(int j=-1; j<=1; j++) {
   for(int i=-1; i<=1; i++) {
...

i и j меняют в цикле свои значения от -1 до 1; если i прибавлять к x-координате проверяемой точки, то мы получим х-координату точки слева от проверяемой( х+(-1)=х-1 ), потом с такой же координатой (х+0=х), потом координату точки справа (х+1). Аналогично для координаты y и переменной j.
Все вместе позволяет перебрать точки в таком порядке:
123
456
789
Красным отмечена проверяемая точка.

Внутри циклов выполняется несколько проверок - они необходимы чтобы определить две вещи: необходимость и возможность соединения.
Код

if( goodCoords(px+i, py+j) ) {

Первое что мы проверяем, это не выпали ли наши координаты (x+i и y+j) за пределы поля; не рекомендуется работать с массивом за его пределами smile Конечно, если соседняя точка за пределами поля, т.е. на самом деле не существует, с ней не может быть соединения, спокойно можно ее пропускать и искать дальше. Иначе - есть возможность соединения.
Код

b = points[px+i][py+j];

Здесь не совсем проверка. Просто, поскольку дальше мы несколько раз обращаемся к соседней точке, удобнее выложить ее во временную переменную, тогда нам не нужно будет дальше использовать страшное "points[px+i][py+j]" а вместо него использовать b. Разумеется, при каждом проходе цикла туда кладется очередная соседняя точка.
Код

if(a!=b && b.getColor() == a.getColor()) {

Если a и b - разные точки, и в то же время имеют одинаковый цвет - да, в таком случае соседняя и проверяемая точки принадлежат одному игроку; налицо необходимость соединения.
a!=b мы проверяем, потому что в процессе перебора соседних точек нам должна попасться и текущая точка. Такой уж у нас перебор smile Естественно соединять точку саму с собой мы не хотим.
Код

if( !points[px][py+j].isConnectedTo(points[px+i][py]) ) {

Последняя проверка - на наличие другого диагонального соединения в той же клетке. Если клетка уже перечеркнута по диагонали, мы не можем построить соединение по другой диагонали.
Для этого нам нужно сначала найти две другие точки в той же клетке. Очень удобно то, что для этого достаточно взять x от одной точки и y от другой.
Вот например у нас точки с такими координатами:
[px   py   ] [px+i py   ]
[px   py+j] [px+i py+j]
[px py] это точка a, [px+i py+j] - соответственно точка b.
Тогда две другие точки - это [px+i py] и [px py+j].
Остается проверить, НЕ-соединена ли одна из них с другой - для этого там используется метод isConnectedTo().
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Rpahut
Дата 11.2.2009, 02:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Kakadu, код я ваш читал но не вникал сильно smile Общий смысл во всяком случае понятен.
Кстати, почему не используются Player1Dead и Player2Dead? Как вы собираетесь подсчитывать очки игроков?
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 11.2.2009, 23:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



спасибо.. многое стало понятней .
А линии то всё равно не рисуются  smile 
PM MAIL   Вверх
Rpahut
Дата 12.2.2009, 00:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



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


Бывалый
*


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

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



Rpahut , мне ваша версия так понравилась что я даже картинку прикрепила с почерневшей точкой попавшей в плен smile

user posted image

Исправьте меня если я не права   ,  мы не использовали полиморфизм но мы 
использовали точно  три принципа обьектно-ориентированного программирования :  encapsulation , inheriance , modylarity .
Data  abstraction мы где-то наверно тоже использовали .... Пытаюсь её отыскать ..



Это сообщение отредактировал(а) Qawra - 13.2.2009, 21:32
PM MAIL   Вверх
Kakadu
Дата 14.2.2009, 09:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Модульность - это не один из Китов ООП. Полиморфизм - да (но вроде его ни у вас, ни у меня нет). Модульность - вообще ерунда какая-то smile 

P.S. Можете выложить ваши исходники? Просто по всем страницам мне их собирать несколько лень=)
P.P.S. Кстати, наследования у вас вроде тоже нет=)


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


0xdeadbeef
*


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

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



Ну для полиморфизма маловат проект. А наследуются у нас по меньшей мере JFrame и JPanel, может и что-то еще.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 14.2.2009, 21:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Modularity это не ерунда . Это " the physical and logical decomposition of large and complex things into smaller and manageable   components ". 
У нас она присутствует там где сложные функции разбиты на маленькие методы .
Это она и есть , Modularity .... Мы её учим как принцип  обьектно-ориентированного программирования .

Data Abstruction  можно себе преставить на примере : Водитель водит машину и может не задумываться как двигаются детали внутри  двигателя. Он использует обьект зная только то что ему нужно знать как водителю .А  механик может и не уметь водить машину . Он должен знать все шестерёнки внутри двигателя и уметь их ремонтировать . Один и тот-же обьект  используется по разному .
Вот  этого  различного использования одного и того же обьекта в нашей программе я и не нахожу . 

Исходник большой потому что интерфейс увесистый получился . Ничего сделать не могу .Это мой первый интерфейс ... пускай такой и  будет .
http://rapidshare.com/files/198093947/Project2009.rar.html
PM MAIL   Вверх
Rpahut
Дата 14.2.2009, 23:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



26 метров?! Что там такое в архиве?

Ага понятно. Прикольно smile 

PS Qawra, если все переменные классов public, то это не инкапсуляция smile 

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


Бывалый
*


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

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



Ну они же не все публик !
Код

public class Window extends JFrame implements  MouseListener 
{
  private JPanel main, south, north, center;
  private JButton startButton, firstPlayerButton,helpButton, secondPlayerButton;
  private JLabel titleLabel;
  private Color firstDefautColor= Color.blue;
  private Color secondDefautColor= Color.red;
  private static BufferedInputStream stream;
  private static Clip line;
  private static AudioInputStream ais;

Код

public class Grids extends JFrame  implements  MouseListener  
   {
     public GridsCanvas canvas; 
     public int rows=20;
     public int cols=20;
     public int sellSize=30 ;
     private boolean firstPlayerMove;
     public Player first;
     public Player second;

Код

     public int rows=20;
     public int cols=20;
     public int cellSize=30 ;
     private Color color;
     private DrawablePoint points[][]; // array to hold all possible  points

Код

public class DrawablePoint 
{   private Color color;
    public  int radius;
    private int x;
    private int y;
    private Graphics g;
    public  boolean lastPoint;

Код

public  class ColorChooser extends JFrame 
{
  public Color ChangeColor(  Color firstDefautColor) 

Код

public class Player 
 {
  private Color color; 
  public Player first;
  public Player second;


смущает меня то что некоторые из них повторяются в разных классах . Не знаю нормально ли это . 
Изначально так написала потому что иначе не компелировалось .
public Player first;
public Player second;  
и 
 public int rows=20;
 public int cols=20;
 public int cellSize=30 ;
 private Color color;
например   прописаны дважды ...

Под Data Abstruction я хочу подвести класс ColorChooser
Код

import javax.swing.*;
import java.awt.*;

public  class ColorChooser extends JFrame 
{
  public Color ChangeColor(  Color firstDefautColor) 
  {
     Color choosedColor = JColorChooser.showDialog(this, "Choose your color",  firstDefautColor);
     
       if(choosedColor!=null){    
           return  choosedColor;
        }return  firstDefautColor;
  } 
}
  
Здесь делается то чего мы не знаем что и оно показывает нам диалог выбора цвета smile
 Мы  ведём машину не зная  что происходит внутри двигателя .

Не удалось мне избавиться только от дублирования 
public int rows=20;
public int cols=20;
public int cellSize=30 ;
в двух классах    Grids   и  GridsCanvas

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


0xdeadbeef
*


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

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



Qawra, почитайте еще про инкапсуляцию.
Каждый класс это отдельное пространство; если у нас два класса то в них хоть все переменные могут иметь одинаковые тип и имя. Как ни крути, а Grids.rows и GridsCanwas.rows отличаются полными именами, т.е. хотя и там и там rows, имена переменных все равно разные.

Момент второй - ключевое слово public применяется только если нужно сделать член класса доступным извне напрямую. Уверяю вас что мы нигде не работаем с переменными напрямую, только через методы классов, которые и помечаем как public.
Например у нас в DrawablePoint есть private переменная color и есть public метод setNewColor(). Программа не будет работать правильно, если записывать цвет прямо в переменную, поэтому мы ограничиваем доступ к ней. Если что компилятор даст нам по рукам - так исключается возможность оставить в программе ошибку.

_________
Если мы не знаем что делает JColorChooser.showDialog(), нам лучше им не пользоваться smile . ОК, мы знаем что он делает, но не знаем как - если это и есть абстракция, то мы пользуемся ей сплошь и рядом.
Например тип Color можно считать абстрактным(?). Кто его знает что там у него внутри.

Добавлено через 8 минут и 26 секунд
Вот немного код почистил и добавил кое-что.

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  tochki.rar 5,59 Kb
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 16.2.2009, 21:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Огромное спасибо за кусочек 
Код

firstPlayerButton.setToolTipText("Change fist player color");
secondPlayerButton.setToolTipText("Change second player color");
startButton.setToolTipText("Start game");
    // disable animation lag on rollover
startButton.setRolloverEnabled(false);    

у меня до него никак руки не доходили , хотя я чувствовала что он нужен .

В Grids я полностью убрала Serializable  и поменяла переменные на private ..
Код

import java.awt.*;
import javax.swing.*;
import java.awt.Dimension;
import java.awt.geom.Point2D;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;

   public class Grids extends JFrame  implements  MouseListener  
   {
     private GridsCanvas canvas; 
     private int rows=20;
     private int cols=20;
     private int sellSize=30 ;
     private boolean firstPlayerMove;
     private Player first;
     private Player second;
      
    public Grids(Color firstDefautColor, Color secondDefautColor) // constructor
    {   
        first = new Player(firstDefautColor); // creating a Players
        second = new Player(secondDefautColor);
        firstPlayerMove = true;
        
        canvas = new GridsCanvas(rows, cols, sellSize); 
        add(canvas);
        
        canvas.addMouseListener(this);
        setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
      
         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
                }
            }
        }); 
        pack();
        setTitle("Points");
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
        
    } 
   
  public void mouseEntered(MouseEvent e){
  }
  public void mouseExited(MouseEvent e) {
  }
  public void mousePressed(MouseEvent e) {
  }
  public void mouseReleased(MouseEvent e) {
  }
  public void mouseClicked(MouseEvent e) {
    
     Player currentPlayer;
  
     int screenX = e.getX(); // gets coordinate of the click
     int screenY = e.getY();
     
   
      if(firstPlayerMove) {
       currentPlayer = first;
       }
      else {
       currentPlayer = second; 
      }
      if( canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor( )) )
       {// if we change the color - we  change players
         firstPlayerMove = !firstPlayerMove;// we change boolean value to opposite 
       }
        repaint();
    }
}
 в общем то нас как раз учили что по умолчанию всё public .. 
может 
Код

public int rows=20;
public int cols=20;
public int cellSize=30 ;

 просто сделать FINAL  ?

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


0xdeadbeef
*


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

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



Если не указывать модификатор доступа, члены классы доступны везде внутри пакета, почти как public.

В классе Grids
Код

public int rows=20;
public int cols=20;
public int cellSize=30 ;

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


Бывалый
*


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

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



Так и сделаем ... К сороковой  странице документации я уже сдаюсь  на всё .. документацию я  тоже  уже  сдаю .. 
Что будем ещё привинчивать ? 
Можно сделать решётку resizable .  Но как это сделать в момент игры ... У нас же массив с точками создан до начала игры . Если игроки захотят изменить размер поля - массив придётся создавать заново . Значит  точки которые уже нарисованы игроками надо будет скопировать из одного массива в другой . Потдерживает ли Java такие копирования массивов  я не знаю .

PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

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

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

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

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


 




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


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

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