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

Поиск:

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


0xdeadbeef
*


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

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



Цитата

points [][]= new DrawablePoint[cols][rows];
 компайлер на этой строчке требует идентифайер

Эту строчку можно было хотя бы скопировать у меня. Зачем там квадратные скобки (points [][]... smile )?? Мы просто должны указать имя переменной, в которую хотим положить new DrawablePoint[cols][rows]:
Код

points = new DrawablePoint[cols][rows];

У BlueJ конечно кривые сообщения об ошибках, но если он ругается на эту строчку, значит ошибку стоит искать именно в ней. Зачем исправлять объявление массива, к которому у Явы нет никаких претензий?

Цитата

Если сделать всё в одну строчку 
private DrawablePoint points[][] = new DrawablePoint[cols][rows]; 

...то массив будет нулевого размера, потому что эта строка выполняется до конструктора класса, и в переменных cols и rows еще лежат нули. Дальше вы еще пытаетесь с этим массивом что-то делать - отсюда и все ошибки.
Так делать не надо!

Цитата

В классе  DrawablePoint у нас прописано почему- то даже два метода

Метод drawCircle() вы добавили сами ;). Пусть он пока остается, только сделайте его private. Для отрисовки точки используйте ее метод paint().

Цитата

при запуске программы выходит NullPointerException на этой строчке

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


Бывалый
*


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

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



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

import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

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
     
       
    GridsCanvas(int r, int c,int cellSize) {
        this.rows = r;
        this.cols = c;
        this.cellSize=cellSize;
        setVisible(true);
        setPreferredSize(new Dimension(600, 600));
        points = new DrawablePoint[cols][rows];
        makePoints(rows,cols);
    }

    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(x*cellSize, y*cellSize, g);  
          }
         }
     }
     
     public void makePoints ( int rows , int cols)
      {  for(int y=0; y<cols; y++)
            {for(int x=0; x<rows; x++) 
             {  points[x][y] = new DrawablePoint( color);  
               
           }      
       }
   }
}
 сначала они прорисовались на самом краю решётки , там где координаты x=0 и y=0 . Но потом я для симметрии приравняла начальные x и y к 1 и точки встали симметрично , не касаясь краёв решётки .  Можно наверно даже так оставить ( не накладывать решётку на новую JFrame ).

Попыталась я закрасить кружочки добавив строчку 
Код

g.fillOval(getX() - 6, getY() - 6, 6 * 2, 6 * 2);
 скомпелировалось , но видимого результата от неё нет  .
пытаюсь добавить MouseListener к решётке 
Код

 canvas.addMouseListener(new MouseAdapter(){
          
            public void mouseClicked(MouseEvent e) {
                GridsCanvas canvas = (GridsCanvas) e.getSource();
                Point clickPoint = e.getPoint();
                DrawablePoint drawablePoint = new DrawablePoint(Color.RED);
                drawablePoint.setLocation(clickPoint);
                canvas.add(drawablePoint);
                canvas.repaint();
            }
       });

 компайлер не может найти метод setLocation ..Туманно пока представляю что ему надо в этом случае импортировать  или  имплементировать . Всё что можно было представить я уже импортировала  smile
Код

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.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;

public class Grids extends JFrame  implements Serializable , MouseListener {
    
     GridsCanvas canvas; 
     public int rows=20;
     public int cols=20;
     public int sellSize=30 ;
    
    Grids() // constructor
    {
        canvas = new GridsCanvas(rows, cols, sellSize); 
        add(canvas);
      
        addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) {
                int exitCode = JOptionPane.showConfirmDialog(Grids.this, "Would you like to play new game  ?", "Options ", JOptionPane.YES_NO_OPTION);
                if (exitCode == JOptionPane.YES_OPTION) {
                    new Grids( );
                } else {  // this.System.exit();     
                }
            }
        });
        
        canvas.addMouseListener(new MouseAdapter(){
          
            public void mouseClicked(MouseEvent e) {
                GridsCanvas canvas = (GridsCanvas) e.getSource();
                Point clickPoint = e.getPoint();
                DrawablePoint drawablePoint = new DrawablePoint(Color.RED);
                drawablePoint.setLocation(clickPoint);
                canvas.add(drawablePoint);
                canvas.repaint();
            }
       });
        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) {
  
    }
}

 почему-то он не видит public void mouseClicked который прописан в кострукторе . Поэтому мне пришлось прописать public void mouseClicked ещё раз  в конце класса  .

 

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


0xdeadbeef
*


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

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



Цитата

Я поняла ..у меня даже точки прорисовались

Это замечательно! smile Можно двигаться дальше.

Рекомендации по движению дальше:
1. Сначала прочитайте, не вникая сильно, что я тут понаписал, постарайтесь уловить суть идеи.
2. Начните читать с начала, подробнее разбирая каждый пункт. Вносите изменения в код по мере продвижения.
3. Добавляйте в свой код комментарии, особенно касательно новых для вас вещей - так лучше усваивается.
4. Спрашивайте, если что непонятно.

______________________________________
Так, мы убедились что GridsCanvas и точки рисуются, так что пока отложим доработки (мы еще доработаем рисование сетки и точки). Есть более важная весчь - это обработка мыши, чтобы можно было щелкать по точкам.
Для того чтобы ловить события мыши, мы добавим implements MouseListener в класс Grids, и в него же впишем метод:
Код

public void mouseClicked(MouseEvent e) {
}


Пояснение:
implements MouseListener значит что класс, к которому это приписано, желает получать сообщения о том, что происходит с мышью.
Ява будет передавать классу сообщения о мыши, но чтобы их получать, в классе должны иметься определенные методы:
public void mouseEntered(MouseEvent e) // вызывается, когда мышка входит в пределы действия компонента
public void mouseExited(MouseEvent e) // наоборот
public void mouseDragged(MouseEvent e) // кнопка нажата и мышка двигается
public void mouseClicked(MouseEvent e) // пользователь щелкнул кнопкой мыши
Все эти методы должны присутствовать в классе Grids, иначе Ява не станет с ним работать; но нас интересует только где пользователь щелкнет кнопкой, поэтому мы впишем код только в mouseClicked(), а остальные методы оставим пустыми.

Еще нужно указать, какой именно компонент нас интересует. Для этого в конструктор Grids вставляем:
Код

canvas.addMouseListener(this); /* ЭТОТ класс хочет знать что происходит
                                                       с мышкой в пределах компонента CANVAS */


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

boolean firstPlayerMove; // объявление и создание переменной

а в конструкторе Grids присваиваем ей значение:
Код

firstPlayerMove = true; // инициализация переменной

Теперь чтобы узнать чей ход можно написать
Код

if(firstPlayerMove) {
  // ходит первый игрок
}
else {
  // ходит второй игрок
}

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

--------------------
Теперь мы можем узнать где и какой игрок щелкнул мышкой. Дальше, допустим, мы хотим чтобы точка, в которую щелкнули, красилась цветом игрока, который щелкнул (это займет много текста).
Точками управляет класс GridsCanvas (массив points находится в нем, значит он за них и отвечает), поэтому информацию о щелчке нужно сначала передать ему. Для этого можно добавить в GridsCanvas метод, принимающий соответствующие параметры, например такой:
Код

public boolean mouseWasClicked(int x, int y, Color playerColor) { // принимает координаты щелчка и цвет игрока который щелкнул

Класс GridsCanvas уже может рассчитать в какую точку попал щелчок(если вообще попал) и передать цвет этой точке. Но, опять, чтобы точка могла принять цвет, у нее должен быть метод по типу такого:
Код

public boolean setNewColor(Color newColor) { // метод принимает новый цвет
  color = newColor; // и меняет цвет точки на него
  return true;
}

Как рассчитать, в какую Точку попадают координаты щелчка:
если чтобы определить экранные координаты точки, мы умножали ее координаты-на-поле на cellSize
то здесь нам нужно наоборот, определить координаты-на-поле, поэтому делим экранные координаты на cellSize

--------------отступление--------------------
Настоятельно рекомендую поместить код преобразования координат экран->поле и поле->экран в отдельные методы класса GridsCanvas:
Код

int screen2field(int coord) { // screen to field
  return coord/cellSize;
}
...
int field2screen(int coord) { // field to screen
  return coord*cellSize;
}

Код

// использование:
// вместо например
points[x][y].drawCircle(x*cellSize, y*cellSize, g);
// стоит писать
points[x][y].drawCircle(field2screen(x), field2screen(y), g);

Это важно, потому что дальше код преобразования координат у нас поменяется немного, может быть несколько раз, и вам придется либо везде менять x*cellSize на новую формулу, либо можно будет просто подправить метод field2screen().
--------------------------------------------------

Так...
Метод DrawablePoint.setNewColor() я выше описал, теперь GridsCanvas.mouseWasClicked().
Код

public boolean mouseWasClicked(int x, int y, Color playerColor) {
  int pointX = screen2field(x); // считаем какая точка кликнута
  int pointY = screen2field(y);

  points[pointX][pointY].setNewColor(playerColor); // установить новый цвет - цвет игрока который кликнул
  repaint(); /* Очень важная штука, хотя я и забыл ее упомянуть.
                       Сообщаем Яве что поле надо перерисовать.
                       Она нужна чтоб вызвался метод paintComponent(),
                        без нее мы не увидим что точка поменяла цвет.*/
  return true;
}

Довольно просто.
Можете потом пощелкать в окне в стороне от сетки и посмотреть что получится =)

Теперь метод mouseClicked(), с которого все и началось.
Код

public void mouseClicked(MouseEvent e) {
  Player currentPlayer;
  int screenX = e.getX(); // получаем координаты щелчка
  int screenY = e.getY();

  // определяем игрока который щелкнул
  if(firstPlayerMove) currentPlayer = first;
  else currentPlayer = second;

  // сообщаем канвасу, кто и где щелкнул
  // canvas.mouseWasClicked(screenX, screenY, currentPlayer); // а-а-а косяк
  canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor());
}

Тут, как видно, нам еще нехватает метода Player.getColor(), который возвращал бы цвет игрока, но его я думаю вы напишете без подсказок.

--------------------------------------------
И все вместе с высоты птичьего полета:
1. Пользователь щелкает в окне
2. Ява вызывает Canvas.mouseClicked()
3. mouseClicked() передает информацию в GridsCanvas.mouseWasClicked()
4. mouseWasClicked() устанавливает новый цвет точки

PS Да чуть не забыл - в DrawablePoint.paint() нужно вставить строчку g.setColor(color); чтобы кружок рисовался цветом точки!!!

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


Бывалый
*


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

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



в Grids пришлось прописать как членов класса  две переменные Player first  и Player second 
Код

public Player first;
 public Player second;
 
которые  создаются при нажатии на кнопки в стартовом окошке
Код

 public void mouseClicked(MouseEvent e) {
    if (e.getSource().equals(startButton)) 
    {
        new Grids( );
        stopSound();
        this.setVisible(false);
       Player first= new Player(  firstDefautColor);
       Player second = new Player( secondDefautColor);  
     
    } else if (e.getSource().equals(firstPlayerButton)) 
    { firstDefautColor = cchooser.ChangeColor( firstDefautColor  );
          
    } else if (e.getSource().equals(secondPlayerButton)) 
    { 
       secondDefautColor = cchooser.ChangeColor( secondDefautColor  );
    } 
    }
 

Я создала метод setNewColor в классе DrawablePoint .
Но " пощелкать в окне в стороне от сетки " мне не удалось .У меня там   пока только решётка и ничего больше нет  smile
Класс Player скомпелировался 
Код

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

public class Player 
 {
  private Color color;
  private Color firstPlayerColor;
  private Color secondPlayerColor;
  public Player first;
  public Player second;
  
  public Player(Color color ) // constructor 
  {    
      this.color = color;   
    }
    
    public Color getColor (Player currentPlayer )
    { if ( currentPlayer == first)
        {return firstPlayerColor;
        }
         else return secondPlayerColor;
        }
    }
 В методе getColor я передаю аргумент currentPlayer что-бы вернуть цвет игрока .Тут возникает проблема с Grids. mouseClicked который собственно и использует этот метод. canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor(currentPlayer )) ; компелируется но вызывает ошибку NullPointerException  когда я щёлкаю мышкой по решётке  . В классе Grids 
Код

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.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;

public class Grids extends JFrame  implements Serializable , MouseListener {
    
     GridsCanvas canvas; 
     public int rows=20;
     public int cols=20;
     public int sellSize=30 ;
     boolean firstPlayerMove;
     boolean secondPlayerMove;
     public Player first;
      public Player second;
    
    Grids() // constructor
    {   firstPlayerMove = true;
        secondPlayerMove = true;
        
        canvas = new GridsCanvas(rows, cols, sellSize); 
        add(canvas);
        
        canvas.addMouseListener(this);
      
        addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) {
                int exitCode = JOptionPane.showConfirmDialog(Grids.this, "Would you like to play new game  ?", "Options ", JOptionPane.YES_NO_OPTION);
                if (exitCode == JOptionPane.YES_OPTION) {
                    new Grids( );
                } else {  // this.System.exit();     
                }
            }
        }); 
        pack();
        setTitle("Points");
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
    } 
   /*if(firstPlayerMove) {
                // first player turn 
         }
           else {
               // second player turn
          } 
          
          */
   public void mouseEntered(MouseEvent e){
  }
  public void mouseExited(MouseEvent e) {
  }
  public void mouseDragged(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;
       
     canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor(currentPlayer )) ;
  
    }
}




Сначала я поместила 
Код

if(firstPlayerMove) {
  // ходит первый игрок
}
else {
  // ходит второй игрок
}
 но теперь думаю они должны быть частью отдельного метода .Поэтому я их из конструктора убрала и не знаю что с ними делать .




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


0xdeadbeef
*


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

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



Цитата

в Grids пришлось прописать как членов класса  две переменные Player first  и Player second 

Блин какая путаница с классами.
Я как-то позабыл, что игроки у нас создаются в стартовом окне.
Ну ничего, это можно поправить - вы правильно прописали игроков, осталось только убрать эти переменные из стартового окна. А то так у нас четверо игроков - двое прописаны там и двое тут.
Еще нужно немного исправить программу. Привожу код:
Код

// в стартовом окне
public void mouseClicked(MouseEvent e) {
    if (e.getSource().equals(startButton)) 
    {
        new Grids(firstDefaultColor, secondDefaultColor); // <-- отправляем цвета в конструктор Grids
        stopSound();
        this.setVisible(false);
       // Player first= new Player(  firstDefautColor);
       // Player second = new Player( secondDefautColor);
    }
....

Код

// в классе Grids
Grids(Color defaultColorOne, Color defaultColorTwo) // constructor
{
     first = new Player(defaultColorOne); // игроки теперь создаются тут
     second = new Player(defaultColorTwo);
....

Когда это добавите, ошибка nullPointerException должна пропасть.

________________________________
Цитата

Класс Player скомпелировался 

Ну, Player.getColor() на самом деле гораздо проще:
Код

public Color getColor ()
{ 
  return color; // нам только нужно чтобы игрок сказал какой его цвет
  // и все
}

Смысл именно в том чтобы получить от игрока его цвет.
first.getColor() - возвращает цвет первого игрока
second.getColor() - возвращает цвет второго игрока
currentPlayer.getColor() - возвращает цвет того игрока, который сейчас ходит

_______________________________
Цитата

Сначала я поместила 
if(firstPlayerMove) {
  // ходит первый игрок
}
else {
  // ходит второй игрок
}
но теперь думаю они должны быть частью отдельного метода .Поэтому я их из конструктора убрала и не знаю что с ними делать .

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


Бывалый
*


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

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



В Grids.mouseClicked(MouseEvent e) мы создаём обьект currentPlayer который 
видимо будет использоваться только в этом  классе . Могу я его обьявить private или даже наверно  "protected  ?  
Код

public void mouseClicked(MouseEvent e) {
       private Player currentPlayer;
       int screenX = e.getX(); // gets coordinate of the click
       int screenY = e.getY();
     
       if(firstPlayerMove) 
           currentPlayer = first;
       else currentPlayer = second;
    
     canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor( )) ;
  
    }
 в этом же классе у нас обьявляются две переменные 
Код

 private boolean firstPlayerMove;
 private boolean secondPlayerMove;
 которые потом будут использоваться в конструкторе Grids . Я сделала их private .Если что мы их переделаем на public.
Какой идентифаер присвоить  firstDefautColor и
  secondDefautColor пока не знаю . Они у нас появляются в стартовом окошке как private 
Код

private Color firstDefautColor= Color.blue;
 private Color secondDefautColor= Color.red;
 при нажатии на кнопку мы предлагаем сменить цвет 
Код

firstDefautColor = cchooser.ChangeColor( firstDefautColor  );
 затем мы используем  эти переменные в Grids при создании игроков 
Код

 first = new Player(firstDefautColor); // creating a Players
 second = new Player(secondDefautColor);
 но когда в Grids я предлагаю игрокам начать новую игру 
Код

addWindowListener(new WindowAdapter() 
        {
            public void windowClosing(WindowEvent e) {
                int exitCode = JOptionPane.showConfirmDialog(Grids.this, "Would you like to play new game  ?", "Options ", JOptionPane.YES_NO_OPTION);
                if (exitCode == JOptionPane.YES_OPTION) {
                    new Grids( firstDefautColor,  secondDefautColor);
                } else {  // this.System.exit();     
                }
            }
 компайлер пишет что " local variable firstDefautColor is accessed from within inner class ; need to be  declared final ". Я пробовала прописать public  и это не помогло . Компайлер хочет именно " final ". В   этом  случае мы видимо не сможем менять цвет  игрока ...

Запустила я программу полюбоваться на решётку ...
Если кликнуть то часть точек меняет цвет на цвет игрока smile
Там правда прорисовывается  лишняя точка в левом верхнем углу с координатами (0,0) которой там теоретически быть не должно . Мы рисуем точки начиная с x=1 , y=1
Код

 for(int y=1; y<cols; y++) {
          for(int x=1; x<rows; x++) {
             points[x][y].drawCircle(field2screen(x), field2screen(y), g); 
             g.fillOval(getX() - 6, getY() - 6, 6 * 2, 6 * 2);

 Точка эта тоже способна менять цвет на цвет игрока. Причём делает она это при первом же шелчке мышки на решётке ! 


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


0xdeadbeef
*


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

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



Цитата

В Grids.mouseClicked(MouseEvent e) мы создаём обьект currentPlayer который 
видимо будет использоваться только в этом  классе . Могу я его обьявить private или даже наверно  "protected  ?

А зачем?.
И объект мы не создаем, нет никакого new Player(). Мы создаем переменную, и создаем мы ее внутри метода, так что за пределами метода ее "видно" не будет.
private и protected приписывается членам класса чтобы обозначить, возможен ли к ним доступ из других классов или нет. К переменным метода из за его пределов нельзя добраться независимо от того хотите вы этого или нет.

Цитата

"Would you like to play new game  ?"

Так новую игру начать в любом случае не выйдет. Нужно стартовое окно setVisible(true) а Grids закрыть. Советую на это забить сейчас.

Цитата

 for(int y=1; y<cols; y++) {
          for(int x=1; x<rows; x++) {
             points[x][y].drawCircle(field2screen(x), field2screen(y), g); 
             g.fillOval(getX() - 6, getY() - 6, 6 * 2, 6 * 2);

g.fillOval(getX() - 6, getY() - 6, 6 * 2, 6 * 2); - А вот здесь что у вас???
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 18.1.2009, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Это я пробовала сама кружочки закрасить smile 
Без этого тоже работает так что я это уже отключила.
Точнее я это перенесла в метод 
Код

 public void   drawCircle (int  x,int   y,  Graphics g)
    {   g.setColor(color);
        g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
    }  
 
может быть это и вызывало лишнию точку потому что теперь её ужё нет . 

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


Бывалый
*


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

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



Теперь я думаю можно скрыть точки которые мы создали и попытаться нарисовать точки за игроков .В GridsCanvas я отключаю пока 
Код

 //points[x][y].drawCircle(field2screen(x), field2screen(y), g);   
  и пытаюсь проследить логику программы .
Когда мы нажимаем кнопку старт у нас запускается конструктор Grids
Код

new Grids(firstDefautColor, secondDefautColor );
 что бы игра продолжалась конструктор должен вызвать метод принимающий команды от мышки .Если я вызываю         mouseClicked (MouseEvent e); в конструкторе  то это не компелируется .Пишет что нехватает ")" 
Метод Grids.mouseClicked я попыталась изменить что-бы начать рисовать точки по очереди цветами игроков .  Даже не целюсь в углы решётки.Просто пытаюсь передать цвет и ход .
Код

public void mouseClicked(MouseEvent e) {
       
       Player currentPlayer;
       
       int screenX = e.getX(); // gets coordinate of the click
       int screenY = e.getY();
     
       if(firstPlayerMove) 
          { currentPlayer = first;
            Point clickPoint = e.getPoint();
            DrawablePoint newPoint = new DrawablePoint( currentPlayer.getColor( ));
            newPoint.drawCircle ( screenX, screenY,Graphics  g);
            canvas.add(newPoint);
            canvas.repaint();
            firstPlayerMove=false;
            secondPlayerMove=true;
            //mouseClicked(); Тут я пытаюсь вызвать метод снова .Но не получается
             
        }
       if (secondPlayerMove)
       {
         currentPlayer = second;
          Point clickPoint = e.getPoint();
          DrawablePoint newPoint = new DrawablePoint( currentPlayer.getColor( ));
          newPoint.drawCircle (screenX, screenY, Graphics g);
          canvas.add(newPoint);
          canvas.repaint();
          secondPlayerMove=false;
          firstPlayerMove=true;
          
        }
     
   
      canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor( )) ;
       
    }

 Это наверно неправильно что всё происходит в одном методе mouseClicked . Но неправильно не  только это .... На строчке            newPoint.drawCircle ( screenX, screenY, Graphics g); нехватает ")"  



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


0xdeadbeef
*


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

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



Цитата

Теперь я думаю можно скрыть точки которые мы создали и попытаться нарисовать точки за игроков .В GridsCanvas я отключаю пока

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

Логика программы такая:  пока пользователь ничего не делает, в нашей программе ничего не происходит. Тут то же что и в настоящих точках, на листочке - пока вы не поставите точку, игра никуда не продвинется. Как только происходит щелчок - запускается метод mouseClicked() и все остальные, в которых наш код и выполняет всю работу, а потом программа снова засыпает до следующего щелчка.
Как я раньше и писал:
Цитата

И все вместе с высоты птичьего полета:
1. Пользователь щелкает в окне
2. Ява вызывает Canvas.mouseClicked()
3. mouseClicked() передает информацию в GridsCanvas.mouseWasClicked()
4. mouseWasClicked() устанавливает новый цвет точки



Цитата

что бы игра продолжалась конструктор должен вызвать метод принимающий команды от мышки.Если я вызываю         mouseClicked (MouseEvent e); в конструкторе  то это не компелируется .

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

Этот метод вызывает сама Ява - каждый раз когда mouse clicked. Нам этого делать не нужно! Да и в MouseEvent наша программа тогда  должна перед этим вписать координаты щелчка, которого еще небыло - как вы собирались заставить это работать?...

У нас в Grids.mouseClicked был кусок такой:
Код

  // определяем игрока который щелкнул
  if(firstPlayerMove) currentPlayer = first;
  else currentPlayer = second;

Чтобы игроки ходили по очереди, нужно его подправить немного:
Код

  // определяем игрока который щелкнул
  if(firstPlayerMove) {
    currentPlayer = first;
    firstPlayerMove = false; // в следующий раз будет ход второго игрока
  }
  else {
    currentPlayer = second;
    firstPlayerMove = true; // ход второго игрока; следующий ход - первого
  }

Переменную secondPlayerMove выкиньте вообще и забудьте. У нас если fistPlayerMove равно true - значит сейчас ход первого игрока; если fistPlayerMove равно false - значит ход не первого игрока - это то есть второго. Если не ходит первый, значит однозначно ходит второй - у нас их всего двое.

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


Бывалый
*


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

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



Методом проб и ошибок я нашла чего не хватало для рисования точек при щелчке мышкой .Точки у нас уже созданы и при щелчке они меняют цвет ,но если их создать не прорисовывая , то щелчки по пустой решётке ни к какому эфекту не приводят .
В методе mouseWasClicked вместо repaint(); нужен был points[pointX][pointY].drawCircle(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].setNewColor(playerColor); // sets the  owner  color
          //repaint(); 
          points[pointX][pointY].drawCircle(x,y,this.getGraphics());
          return true;  
        }
 теперь если даже на пустой решётке рисуются точки . Правда они рисуются не в углах решетки а там где мышка кликнет . Ход игроков передаётся нормально .
Любимые мои грабли засели в подсознании . 
Я слишком много и быстро прочитала  о Java . Когда обьём информации превысил определённый уровень - детали перестали цеплятся сознанием и стали формироваться  образы в которых переменные были прописаны вместе с параметрами ...
Наверно это с сайта sun  на котором  я каждый день читала структуры классов  что бы нарисовать  GUI .
Особенно трудно  когда  я за компьютером в школе потому что  русский язык там не отображается .В результате  я не могу прочитать в текстовом файле то что вы мне рекомендуете сделать и действую как получается  . И получаются грабли smile
Код

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.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.Serializable;

public class Grids extends JFrame  implements Serializable , MouseListener {
    
     GridsCanvas canvas; 
     public int rows=20;
     public int cols=20;
     public int sellSize=30 ;
     private boolean firstPlayerMove;
     public Player first;
     public Player second;
     
     
    
    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);
      
        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) {
                } else {    
                }
            }
        }); 
        pack();
        setTitle("Points");
        setLocationRelativeTo(null);
        setResizable(false);
        setVisible(true);
        
    } 
   
  public void mouseEntered(MouseEvent e){
  }
  public void mouseExited(MouseEvent e) {
  }
  public void mouseDragged(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;
       firstPlayerMove = false; 
       }
      else {
       currentPlayer = second;
       firstPlayerMove = true; 
      }
      canvas.mouseWasClicked(screenX, screenY, currentPlayer.getColor( )) ;
       
    }
}

==============================
import javax.swing.*;
import java.awt.*;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

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
     
       
    GridsCanvas(int r, int c,int cellSize) {
        this.rows = r;
        this.cols = c;
        this.cellSize=cellSize;
        setVisible(true);
        setPreferredSize(new Dimension(600, 600));
        points = new DrawablePoint[cols][rows];
        makePoints(rows,cols);
    }

    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);   
          }
         }
     }
     
     public void makePoints ( int rows , int cols)
      {  for(int y=0; y<cols; y++)
            {for(int x=0; x<rows; x++) 
             {  points[x][y] = new DrawablePoint( color);  
               
            }      
          }
         }
     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].setNewColor(playerColor); // sets the  owner  color
    
          points[pointX][pointY].drawCircle(x,y,this.getGraphics());
          return true;  
        }
   
     int screen2field(int coord) { // screen to field convert coordinates
       return coord/cellSize;
      }

     int field2screen(int coord) { // field to screen  convert coordinates
       return coord*cellSize;
    }
  }
  
=================================
import javax.swing.*;
import java.awt.*;
import java.awt.geom.Point2D;

class DrawablePoint //extends Component
{

    private Color color;
    public  int radius;
    public int x;
    public int y;
    
    
    
    DrawablePoint(Color color) 
    {
        this.color = color ;
        radius = 6;
        
    }
    public void   drawCircle (int  x,int   y,  Graphics g)
    {   g.setColor(color);
        g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
    }  
    
    public boolean setNewColor(Color playerColor) { // accepts new color
        color = playerColor; // changes color
     return true;
   }
   
   
}
=============================
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Player 
 {
  private Color color;
  
  public Player first;
  public Player second;
  
  public Player(Color color ) // constructor 
  {    
      this.color = color;   
    }
    
    public Color getColor ( )
    { return color;
        }
    }

 




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


0xdeadbeef
*


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

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



Боюсь что все то же самое, но не на русском, я написать не смогу. No vy mozhete perevesti russkij tekst v translit na etoj stranice smile  Верный способ сломать глаза.

Ладно.
Цитата

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

Точки в любом случае меняют цвет, но этого естественно не видно, если у вас отключена отрисовка. 
Я так понял вы хотите чтобы пока точка не поставлена ее небыло видно? Для этого достаточно подправить метод DrawablePoint.paint().

Я как-то помнится советовал вам использовать DrawablePoint.paint() вместо drawCircle() - потому что drawCircle(), очевидно, рисует круг и ничего больше, а paint() отображает Точку, и отображает в том виде, в каком нам хочется. У меня например не рисуется сетка на поле - вместо этого непоставленные точки отображаются в виде пустых кружков светло-серого цвета. Поставленные точки закрашиваются цветом игрока. Вы можете сделать как вам больше нравится - например не рисовать "пустые" точки совсем - но paint() все равно должен вызываться для каждой точки.

В метод paint() можно добавить условие, проверяющее поставлена точка или нет, и в зависимости от результата менять код рисования точки. Я пробежался по коду и сдается мне что у ваших точек color==null когда они не поставлены - это можно использовать:
Код

public void drawCircle(int x, int y, Graphics g) {
  g.setColor(color); // use current point color

  if(color==null) {
    // do not draw circle
  }
  else {
    drawCircle(x, y, g); // do draw circle
  }
}

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


Бывалый
*


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

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



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

Я уже пробовала использовать paint() , но у меня по какой-то причине не рисовалось и я этот метод удалила . Потом я использовала drawCircle и он рисовал пустые кружочки . Затем я заменила в самом методе drawCircle на fillOval и всё чудно прорисовалось. То есть мои точки немного овальные получились но не пустыми. Название метода drawCircle осталось по инерции. Сам метод рисует овальные цветные точки .Нужно ли его менять в интересах логики игры или можно оставить ? 
У меня решётка прорисовывается но точки ставятся где угодно ( даже друг на друга можно ставить ) . Для того что-бы они могли ставиться только в углах решётки нужно видимо  подкорректировать методы работающие с координатами
Код

      int screen2field(int coord) { // screen to field convert coordinates
       return coord/cellSize;
      }

     int field2screen(int coord) { // field to screen  convert coordinates
       return coord*cellSize;

эти методы используются в mouseWasClicked
Код

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].setNewColor(playerColor); // sets the  owner  color
    
          points[pointX][pointY].drawCircle(x,y,this.getGraphics());
          return true;  
        }
не знаю как этого добиться но нужно сделать небольшой зазор в координатах углов клетки . Приходит в голову использовать % 
но думаю что это не будет  работать во всех возможных случаях . Могут быть OutOfBoundary Exceptions...
 

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


0xdeadbeef
*


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

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



Ну для начала - в предыдущем сообщении я приводил код, там метод подразумевался именно paint(); я сам запутался и не то название написал.

Игре абсолютно безразлично, как называются методы (кроме спец. случаев, вроде mouseClicked); но принято давать методам(и классам и переменным) имена, отражающие их назначение - с расчетом на то, что кто-то помимо программиста будет читать код, или вы сами, скажем через годик, откроете исходники и попытаетесь в них разобраться.
Пока метод drawCircle() рисует только круг - можно называть его так. Но - опять то о чем я говорил, и немного забегая вперед - рисование точки это не просто рисование круга. По меньшей мере там:
1. не рисуется ничего, если точка не поставлена
2. рисуется круг, если точка поставлена
3. когда точка захвачена (внутри замкнутого контура), это тоже влияет на внешний вид точки
Все вместе это нужно называть более общим словом - вроде paint() или display().

Дальше - все что нужно для рисования точек у нас уже есть. Если вас не устраивает, как рисуется точка, то вы меняете код в методе paint() (или drawCircle()) - потому что именно этот метод определяет, как рисуется точка.

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

// GridsCanvas.paintComponent()
...
        for(int y=1; y<cols; y++) {
          for(int x=1; x<rows; x++) {
             points[x][y].paint(field2screen(x), field2screen(y), g);   // call for EACH point
          }
         }
...

Но класс GridsCanvas, в котором у нас рисуются точки, не может решать, какую точку рисовать, а какую нет - у нас происходит "разделение труда" между классами, и GridsCanvas(второе имя Field) отвечает за то чтобы каждая точка рисовалась на положенном ей месте на поле. Точка не может решать, на каком месте ей нарисоваться, но она может решать рисоваться ли ей вообще.

======================================
Смысл Объектно-Ориентированного программирования
в том, что программа разделяется на объекты-классы, каждый из которых занят своим делом.

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

// class DrawablePoint
private Color color; // у класса есть color
...
public void paint(int x, int y, Graphics g) { // у класса есть x, y и g
  g.setColor(color); // используем color
  if(color==null) {
  }
  else {
    drawCircle(x, y, g); // используем x, y и g
  }
}
...


То же с классом GridsCanvas:
Код

// class GridsCanvas
   private Point points[][];
   private int rows, cols;
   private int cellSize;
...
     /* Заметьте, все используемые переменные - свои.
     Мы не залезаем в другие классы и можем вообще
     ничего о них не знать. */
     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].paint(field2screen(x), field2screen(y), g);
          }
         }
     }
...


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


Бывалый
*


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

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



Методы я разделила . Теперь они выглядят так 
Код

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
     
       
    GridsCanvas(int r, int c,int cellSize) {
        this.rows = r;
        this.cols = c;
        this.cellSize=cellSize;
        setVisible(true);
        setPreferredSize(new Dimension(600, 600));
        points = new DrawablePoint[cols][rows];
        makePoints(rows,cols);
    }

    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].paint(field2screen(x), field2screen(y), g);   // call for EACH point
          }
         }
     }
     
     public void makePoints ( int rows , int cols)
      {  for(int y=0; y<cols; y++)
            {for(int x=0; x<rows; x++) 
             {  points[x][y] = new DrawablePoint( color);  
               
            }      
          }
         }
     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].setNewColor(playerColor); // sets the  owner  color
    
          points[pointX][pointY].paint(x,y,this.getGraphics());
          return true;  
        }
   
     int screen2field(int coord) { // screen to field convert coordinates
       return coord/cellSize;
      }

     int field2screen(int coord) { // field to screen  convert coordinates
       return coord*cellSize;
    }
  }
  
=====================
class DrawablePoint 
{
    private Color color;
    public  int radius;
    public int x;
    public int y;
    
    DrawablePoint(Color color) 
    {
        this.color = color ;
        radius = 6;
        
    }
    public void   paint (int  x,int   y,  Graphics g)
    {   g.setColor(color);
        
     if(color==null) {
    }
     else {
      drawCircle(x, y, g); // pass  x, y и g  to the  drawCircle
    }  
 }
    public void   drawCircle (int  x,int   y,  Graphics g)
    {   g.setColor(color);
         g.fillOval(x - 6, y - 6, 6 * 2, 6 * 2); 
    }  
    public boolean setNewColor(Color playerColor) { // accepts new color
        color = playerColor; // changes color
     return true;
   }  
}
 между методами paint и drawCircle теперь установленно " разделение труда " 
smile
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

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

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

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

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


 




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


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

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