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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> написать игру "Фараон" с нуля 
:(
    Опции темы
arilou
Дата 17.12.2008, 22:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Конечно выполнимая. Но лучше сначала сконцентрироваться на игровом процессе  smile 


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Rpahut
Дата 18.12.2008, 11:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



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


Бывалый
*


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

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



Пока у меня только классы  в блокноте  набросаны которые  вы мне  порекомендовали ( методы пока пустые). Там у меня  один метод в голове не уложился , мне показалось что он в двух разных классах почему-то прописан  .Не твёрдо знаю какие именно массивы  создавать  ,  поэтому это место пока тоже пусто  . 
Есть  нечто странное с уроков по  GUI ... 

Код

class CreatingMyWindows{
    
    public static void main (String args[]){
        
        MyWindow m1 = new MyWindow("my first oop window");
        
        
        
    }
    
}

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

public class MyWindow extends JFrame implements MouseListener,ChangeListener, FocusListener{
    
    private JPanel main,south,north,center;
    private JLabel titleLabel,sliderLabel;
    private JTextField field;
    private JButton okButton,cancelButton,helpButton;
    private JSlider slide;
    
    public MyWindow(String title){
        super(title);
        build();
    }
    
    private void build(){
        north = new JPanel(new FlowLayout(FlowLayout.LEFT));
        south = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        center = new JPanel(new FlowLayout(FlowLayout.LEFT));
        
        /*BorderLayout b = new BorderLayout();
        JPanel main  = new JPanel(b);*/
        main = new JPanel(new BorderLayout());
        
        okButton = new JButton("Ok");
        cancelButton = new JButton("Cancel");
        helpButton = new JButton("Help");
                                
        Font myFont =  new Font("Verdana",Font.BOLD+Font.ITALIC,24);        
        titleLabel = new JLabel("title");
        titleLabel.setFont(myFont);
        
        field = new JTextField(25);
        field.addFocusListener(this);
        //field.setFont(myFont);
        
        slide = new JSlider(10,50,20);
        sliderLabel = new JLabel("20");
        
        this.add(main);
        main.add(south,BorderLayout.SOUTH);
        main.add(north,BorderLayout.NORTH);
        main.add(center,BorderLayout.CENTER);
        
        //adds the buttons to the listening application
        okButton.addMouseListener(this);
        cancelButton.addMouseListener(this);
        helpButton.addMouseListener(this);
        
        slide.addChangeListener(this);
        
        south.add(okButton);
        south.add(cancelButton);
        south.add(helpButton);
        
        north.add(titleLabel);
        
        center.add(field);
        center.add(slide);
        center.add(sliderLabel);
        
        center.addMouseListener(this);
        
        //this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.setDefaultCloseOperation(HIDE_ON_CLOSE);
        this.setSize(800,600);
        this.setResizable(false);
        this.setVisible(true);
        
        
    }
    
    public void mouseClicked(MouseEvent e){
        if (e.getSource().equals(okButton)){
            //new MyWindow();
            Random r = new Random();
            int width = center.getWidth();
            int height = center.getHeight();
            center.getGraphics().drawLine(r.nextInt(width),r.nextInt(height),r.nextInt(width),r.nextInt(height));
        } else if (e.getSource().equals(cancelButton)){
            cancelButton.setVisible(false);
        } else if (e.getSource().equals(helpButton)){
            JOptionPane.showMessageDialog(null,"Help was pressed");
        } else if (e.getSource().equals(center)){
            int x = e.getX();
            int y = e.getY();
            //center.getGraphics().drawLine(x,y,x+10,y+10);
            center.getGraphics().fillOval(x,y,10,10);
        }
    }
          
    public void mouseEntered(MouseEvent e){
        
    } 
          
    public void mouseExited(MouseEvent e){
        
    }
          
    public void mousePressed(MouseEvent e){
    
    } 
          
    public void mouseReleased(MouseEvent e){
        
    }  

    public void stateChanged(ChangeEvent e){
        sliderLabel.setText(slide.getValue()+"");
        sliderLabel.setFont(new Font("Verdana",Font.PLAIN,slide.getValue()));
        int rgb = slide.getValue();
        field.setBackground(new Color(rgb*4,rgb*4,rgb*4));
        //field.setFont(new Font("Verdana",Font.PLAIN,slide.getValue()));
    }
    
    public void focusLost(FocusEvent e){
        if (e.getSource().equals(field)){
            field.setBackground(Color.WHITE);
        }
    }
    
    public void focusGained(FocusEvent e){
        if (e.getSource().equals(field)){
            field.setText("");
            int rgb = slide.getValue();
            field.setBackground(new Color(rgb*2,rgb*2,rgb*2));            
        }
    }
    
}



вот эти кусочки кода я теперь и пытаюсь  осознать .Не то чтот-бы сложно  , просто каждая строка несёт в себе некое  откровение ...
Жаль что как делать меню  нам не обьяснили  .

А С АЛГОРИТМОМ  то  ПРОСТО БЕДА !!! 
Учитель сказал что его на нашем уровне не предполагается писать этот алгоритм самому но алгоритм  должен работать правильно smile

Основная проблема в замыкании контура  из точек  .
Искусственного интеллекта нам не надо  но с этой конкретной задачей компьютер должен справиться.И ещё лучше если он захваченные области цветом закрашивать будет .Хотя можно и без заливки цветом .  

Мне понравился как играет версия с сайта  
http://www.deyton.ru/points/
Но она не не на Java а на каком то другом языке .
Функция сетевой игры которая там есть мне не нужна . 
Нужна только игра двух игроков .И интерфасе конечно  нужно полностью переработать .
У нас  наверно 50 процентов оценки от интерфаса  зависит .

Был ещё кусочек кода с какого то сайта где этот алгоритм был написан кажется на BASIC но для меня это - зашифрованное НЕЧТО . 

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


0xdeadbeef
*


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

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



Цитата

мне показалось что он в двух разных классах почему-то прописан

Он действительно прописан. Если класс Игра по совместительству еще и реализует весь интерфейс( smile ), то он получает ввод от мышки. Этот ввод нужно передавать точкам, за работу с точками отвечает класс Поле; поэтому класс Игра передает ввод классу Поле, а он уже точкам.
Если интерфейс отдельными классами, тогда там по другому конечно нужно делать.

Меню делается так же как и все остальное в свинге - создается при помощи new()  и добавляется при помощи add().
Код

JMenu menu = new JMenu("Название меню");
menuBar.add(menu);

Етесна перед этим нужно создать menuBar (класс JMenuBar) и добавить его к фрейму при помощи метода setJMenuBar() (фрейм это JFrame, наше окно).
Когда menu создано, можно создавать элементы меню (класс JMenuItem) и добавлять их к menu тем же методом add().
user posted image
Вот... Чтобы это меню еще и делало что-нибудь, нужно вписать в начале класса implements ActionListener и добавить метод
Код

public void actionPerformed(ActionEvent e) {
 // метод e.getActionCommand() позволяет получить название
 // элемента меню который нажал пользователь
 // так что сравниваем название и если совпадает - 
 // выполняем какой-то код
}

... у нас тут филиал форума по яве...

==============================================
Цитата

Учитель сказал что его на нашем уровне не предполагается писать этот алгоритм самому но алгоритм  должен работать правильно

Алгоритм писать не надо совсем, надо его понять и написать код.
В классы мы можем запихать любые данные, которые нам понадобятся в процессе поиска контуров. Из того что написано ниже видно что нам нужна информация о том, с какими точками соединена каждая точка - поэтому в классе Точка есть массив "соединитьС", он не только для того чтобы рисовать соединения на экране. Так вот - смотрим что нужно сделать - придумываем (или ищем в интернете) как можно сделать - вписываем переменные которые понадобятся и - пишем методы которые с этими переменными работают.

Контурные точки найти довольно просто. Первый вариант - это отбросить все не-контурные точки:
Если точка является частью контура, то она соединена по меньшей мере с двумя другими точками, которые в свою очередь тоже соединены с двумя или больше точками каждая, которые в свою очередь тоже соединены с двумя или больше точками... и так до переполнения стека smile У не-контурных точек соответственно наоборот. Итак:
В цикле перебираем все точки поля
Если находим незахваченную точку, выполняем для нее метод такой:
Код

 если (меньше двух соединений (с нетупиковыми точками)) {
   помечаем ее как тупиковую
 }
 если (у нее есть соединение) {
  переходим по нему к следующей точке и для нее выполняем тот же метод
 }


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


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

Кстати, игрокам придется не только ставить точки, но и рисовать соединения. Лучше чем тупо автоматически соединять точки, которые достаточно близко друг к другу - единственный вариант, который пришел мне в голову.

Interface - [ɪntəfeɪs] - интефейс, или если Р на русский манер произносить, то интерфейс.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 19.12.2008, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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




Поначалу я тоже  думала  что  "игрокам придется не только ставить точки, но и рисовать соединения ".
  Мысль о применении волнового рекурсивного алгоритма вводила меня тогда в ступор . 
Потом я  увидела   этот  алгоритм здесь 
http://pointsxt.logicsworld.net/forum/inde...pic=69&st=0

Удивительно что он  оказался даже меньше чем Quick sort алгоритм который казался мне таким неудобопонятным smile

Надо   попробовать его  применить раз уж он так кстати нашелся
( правда на Java он у меня пока не переведён ).

Графический интерфейсе нам 
сказали пока  делать в отдельном классе  . 
Может оно вместе было бы и лучше .. но сказали сделать в отдельном .
Я не знаю как люди делают красивые кнопки для интерфейса 
..где  можно поменять фон у кнопки или тени на неё навести ? 
В понедельник у нас последнее занятия  и   наступят            каникулы.
Буду пробовать закончить к Новому году ...хотя думаю  это в принципе не реально :(
  

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


Бывалый
*


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

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



Нашла такой путь создания нестандартных кнопок :
Код

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.util.*;
public class NewButton extends OldButton implements CustomLook
{
   public void NotifyStartPaint()
   {
      // Код для перехвата начала рисования
   }
   public void CustomPaint ()
  {

   // Код для рисования кнопки нового 
   // внешнего вида
   }
}



с интерфейсом CustomLook  всё понятно  а вот класс OldButton
не понятно откуда взялся . Можно заменить его на JButton ?
Импортировала я лишнее потому что не знаю что писать внутри метода .Mouse Listener наверно в первом  а второй метод из чего строить ?


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


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Qawra, сейчас у тебя в голове каша, т.к. слишком много новой информации и широкая задача. Нужно поступить следующим образом.

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

2. Нужно быть последовательной:

1.1) Научиться рисовать точки, линии на форме
1.2) Нарисовать сетку
1.3) Научиться обрабатывать события мыши на форме и рисовать точки в узлах сетки по клику мыши на форме

Потом перейти к игровой логике:
2.1) Ввести понятие "Игрок А", "Игрок Б", ход, переход хода
2.2) Ввести понятие "Точка" и понятие "Владелец точки"
2.3) Рисовать точки разных владельцев на карте разными цветами

Потом разобраться с игровым состоянием.

3.1) Изучить материалы по теории графов. Разобраться с вершинами и ребрами. Выяснить, что такое путь в графе.
3.2) Представить состояние игрового поля в виде графа. Добавление каждой новой точки вызывает создание новой вершины в графе (хотя фактически, это сетка, но мне кажется, с графами будет удобнее). Если рядом с с добавленой точкой есть другая(ие), принадлежашие своему Игроку, то также создавать в графе ребро между ними.
3.3) Связать понятие Состояние Игрового Поля с пп. 1.1-2.3. Клик по узлу сетки на форме должен вызывать добавление нового узла в граф.
3.4) Реализовать автоматическую отрисовку границ территорий. Судя по всему, это можно сделать, выполнив обход всех своих вершин в графе для каждого игрока, нарисовав линии только между теми точками, при обходе которых хотя бы один путь в графе представляет собой цикл. 

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

По пп. 1.1-1.3 тебе лучше помогут в разделе нашего форума по Java. 
По пп. 2.1-3.4 можно создавать отдельные топики в этом разделе. У нас есть правило - один топик - один вопрос. 

По мере возможности поможем. И помни, что данное задание предназначено как раз для того, чтобы научить тебя разделять поставленную задачи на более мелкие, и пошагово их выполнять. Когда-то давно в 7-ом или 8-ом классе мне нужно было написать крестики-нолики. И я с этим справился. И ты справишься. Главное - придерживаться плана и не бросаться влево-вправо.

Добавлено через 52 секунды
ЗЫ.

Цитата(Rpahut @  19.12.2008,  02:51 Найти цитируемый пост)
Если начать с любой точки контура и идти по всем ее соединениям, и по всем соединениям ее соединений, и так далее, и еще записывать наш путь, то рано или поздно мы придем к точке, на которой уже были до этого(если конечно контур замкнут; иначе доходим до тупика и поворачиваем обратно, пробуем другие соединения). Теперь по записи нашего пути смотрим, когда эта точка нам попадалась; все точки пройденные от нее и до последнего шага - замкнутый контур. Продолжаем пока не пройдем все соединения, найденные точки контуров выписываем чтоб не забыть.


Судя по описанию, таким же образом работает алгоритм поиска пути A* (А-звездочка, a-star). 

Это сообщение отредактировал(а) arilou - 20.12.2008, 01:53


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Rpahut
Дата 21.12.2008, 00:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Цитата

3.1)

Один пункт с которым я не соглашусь(и с вытекающими из него). Знание ТГ помогло бы, но изучение ее ради поставленной цели мне кажется только запутает дело. Плюс нехватка времени (судя по тому как дело двигалось до сих пор)...
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
arilou
Дата 21.12.2008, 01:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Великий МунаБудвин
****


Профиль
Группа: Экс. модератор
Сообщений: 2646
Регистрация: 15.7.2004
Где: город-герой Минск

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



Цитата(Rpahut @  21.12.2008,  00:13 Найти цитируемый пост)
Один пункт с которым я не соглашусь(и с вытекающими из него). Знание ТГ помогло бы, но изучение ее ради поставленной цели мне кажется только запутает дело. Плюс нехватка времени (судя по тому как дело двигалось до сих пор)... 


На самом деле, там все просто, на уровне средней школы. Достаточно разобраться, что такое вершины, ребра, путь, цикл.


--------------------
user posted imageuser posted image
PM WWW ICQ   Вверх
Rpahut
Дата 21.12.2008, 03:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Я не спорю. Но для массива я могу во всяком случае предложить готовое решение уже сейчас. 
Думаю до п.1.3 можно этот вопрос отложить и посмотреть как пойдет.

Qawra, развернуто пункт 1.1 плана, предложенного arilou:
Создать класс-расширение JFrame, на котором можно было бы рисовать (из программы, не руками конечно). Я делал класс-расширение JPanel, у которого в методе paintComponent() и вписывал код. Панель потом добавлял к классу-расширению JFrame. Вам в поисках правильного пути лучше свериться с конспектами или создать тему в форуме по Java.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Страницы: (3) Все 1 2 [3] 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Программирование игр, графики и искуственного интеллекта"
Rickert

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

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

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

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


 




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


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

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