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

Поиск:

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


Бывалый
*


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

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



Простенькая такая игра для двоих на листочке бумаги в клеточку : игроки по очереди ставят точки  в углах клеток , соединяют их линиями и пытаются замкнуть эти линии.Как только линия замкнётся территория считается захваченной фараоном . 
Игра продолжается пока есть  свободное место .
Побеждает тот кто чья территория больше .
Я думаю что надо  закрепить 4 клавиши за одним игроком и 4 за другим что бы они перемещали курсор в момент хода . 
Но я не умею писать игры вообще ! Учитель сказал что мы должны будем написать это за новогоднии праздники (а значит  праздников этих у меня не будет - я буду читать книжку Java2  на 1100 страниц и писать игру ). Книжку эту  он нам сказал не читать полностью а только те темы   которые  в процессе работы могут понадобиться .В какой же последовательности  мне её читать и что может понадобиться для этой конкретной игры ? !!
PM MAIL   Вверх
AntonN
Дата 20.11.2008, 22:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



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


--------------------
user posted image
PM MAIL WWW   Вверх
Qawra
Дата 21.11.2008, 17:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



У двоечников ? Это специально для них игра  ?
 Я думала я почти отличница ! Преподаватель пoка ничего не сказал про упрощения .Мы должны ещё теорию закончит . Впереди ( как я понимаю  по оглавлению ) ещё 60 страниц  для изучения : Polymorphism by Inheritance, Text files , vectors , Interfaces ,Serialisation ,Exteption Handling, Abstract classes ,Recursion ,Java DOC ,AWT and Swing .
Какие могут быть упрощения в этой игре ? Может лучше мне их самой преподавателю предложить ...

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


Правильный
**


Профиль
Группа: Комодератор
Сообщений: 825
Регистрация: 3.4.2003

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



Все названия на английском. Ты в какой стране учишься, отличница?


--------------------
Мне нужны помощники.
PM MAIL WWW   Вверх
AntonN
Дата 21.11.2008, 21:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Qawra
Цитата

У двоечников ? Это специально для них игра  ?

просто в нее часто двоечники на последних партах во время уроков играют smile
Упрощения - например поле маленькое. Или используются готовые наработки. Либо алгоритм будет рассматриваться во время обучения.


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


0xdeadbeef
*


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

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



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

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

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


Новичок



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

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



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


Бывалый
*


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

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




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

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

Как создаются  листочки в клеточку  если писать всё надо в BlueJ  ?
PM MAIL   Вверх
Rpahut
Дата 22.11.2008, 20:11 (ссылка) |   (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



BlueJ  это в форум по яве, там быстрее ответят. Или читать документацию smile Гугль говорит что там должен быть класс Canvas.

Вобще - пиши классы Точка, Поле, Игрок
Для класса Точка:
 Идентификатор игрока, который поставил точку(или ноль, если точка не поставлена)
 Идентификатор игрока, которым захвачена точка(-//-)
 Массив с указателями на точки, с которыми она соединена линией. Соседних точек максимум восемь.
 Массив с указателями на точки, с которыми соединять нельзя. Таких точек может быть четыре.
Методы:
 Занять()
 Захватить()
 СоединитьС()
 НельзяСоеденитьС()

Для класса поле:
 Две переменные - высота и ширина игрового поля (в точках)
 Массив Точек[ширина][высота]
Методы:
 ПоставитьТочку()
 СоединитьТочки()

Для класса Игрок:
 Идентификатор
 Цвет
Методы:
 ВзятьИД()
 ВзятьЦвет()

Вот примерно так.

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


Бывалый
*


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

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



 а почему в классе точка существует 
"Массив с указателями на точки, с которыми соединять нельзя.
Таких точек может быть четыре." ? 
Где они  находятся ?
PM MAIL   Вверх
AntonN
Дата 22.11.2008, 22:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Как копнете глубже поймете, что там за ужасы хранятся smile
Если игра только на двоих людей (без ИИ), то все сводится к функции захвата территории. Она вызывается каждый раз, когда игрок ставит точку, нужно пробежать все соседние такие же точки (незахваченные, свои) и при замыкании контура (тут еще определить, замыкаем ли он, и находится ли внутри него точка противника, тут я делал рекурсией, нужно учитывать глубину поиска на больших картах и чтобы стек не переполнился, и все равно получалось очень медленно) пометить контур (точнее точки его образующие) как захваченный и помещать все контуры в отдельный массив (для рисования линий при отображении).
Вообще - поисковик ничего подобного не выдает? возможно кто то уже делал похожее


--------------------
user posted image
PM MAIL WWW   Вверх
russians
Дата 23.11.2008, 01:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



AntonN, а если с ИИ? Брать пролог и курс искуственного интеллекта? ;)
PM MAIL   Вверх
Qawra
Дата 23.11.2008, 12:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Хотелось бы посмотреть на что-нибудь подобное ..хотя я думаю что на моём уровне я смогу  коде  .Надо будет сидеть с книжкой и разбираться .
Здесь есть об игре   "точки " http://pointsgame.narod.ru/
но это немного другой вариант где "Смысл состоит в окружении как можно большего числа точек противника." 
В "Фараоне " не важно окружаешь ли ты точки противника или просто пустую территорию . Важно в итоге  окружить большую площадь чем твой противник . 
Не знаю становиться ли поставленная задача от этого легче ..


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


0xdeadbeef
*


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

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



Цитата

"Массив с указателями на точки, с которыми соединять нельзя.
Таких точек может быть четыре." ? 

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

Цитата

Не знаю становиться ли поставленная задача от этого легче ..

Главное чтобы препод не потребовал компьютерного противника smile Все остальное достаточно просто. Можно будет несколько вариантов игры сделать, на захват площади или на захват точек противника.

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


Бывалый
*


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

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



Ну уж о компьютерном противнике  пусть он даже и не мечтает ! Он нам   ещё даже GUI не показывал , да и  алгоритмы мы с ним учили только lдля поиска и для сортировки ... 
Раз не очень много мы пока знаем - будем упрощать свою  задачу :
Если не поручать компьютеру проверять замыкается или нет контур ( там какой-то сложный рекурсивный алгоритм задействован )
а отдать эту функцию самим игрокам .Если игрок считает что пора контур замкнуть пускай кликнет где линию нарисовать .Компьютор проверит и линию нарисует .
Что можно ещё упростить без потери идеи ?

Узкое место во всей этой затее - документация (которую надо будет на английском языке напечатать ). Оценивается не столько сложность работы сколько  ИСПОЛЬЗОВАНИЕ   НУЖНЫХ ИНСТРУМЕНТОВ В НУЖНЫЙ МОМЕНТ .
В общем   реализация должна быть красивой до аскетизма .
PM MAIL   Вверх
Rpahut
Дата 24.11.2008, 23:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



На данный момент стоит уделить внимание именно структуре классов и тому, как они будут взаимодействовать. Когда дойдете до ГУИ и графики, можно будет сделать окошко, меню и отрисовку игрового поля. Ну и ввод естественно. Уже можно будет поиграть, но поиск контура все равно писать придется smile Рекурсия - очень даже нужный инструмент.

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


Бывалый
*


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

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



Сегодня нам показали что такое абстрактый класс  и полиморфизм .
Учитель наш с гордостью заметил что теперь мы умеем почти всё что нам надо уметь  для написания  игры ..
А ведь это не чувствуется  ! 
PM MAIL   Вверх
Rpahut
Дата 28.11.2008, 00:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Графический интерфейс учили? Или он с консоли играть хочет smile ?

Короче, вот подробнее структура классов:

Самый простой класс, сам ничего не делает и другие классы не использует.
Код

класс Игрок {
 Color цвет // тут хранится цвет игрока (класс java.awt.Color)

 паблик Игрок(Color ц) // конструктор, при создании указываем цвет
 паблик Color ВзятьЦвет() // чтоб другие классы могли получить цвет
}


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

класс Точка {
  целое x, y // положение на экране
  
  Игрок поставилТочку // кто поставил точку
  Игрок захватилТочку // кто захватил
  
  Точка[] соединитьС
  Точка[] нельзяСоединитьС

  паблик Точка(целое x, целое y) // конструктор класса

  паблик булево ПоставитьТочку(Игрок) // метод для установки точки
  бублик булево ЗахватитьТочку(Игрок) // метод для захвата точки

  паблик булево СоединитьС(Точка, Игрок) // для соединения
  паблик НельзяСоединитьС(Точка)
}


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

класс Поле {
 целое ширина, высота // размеры поля
 Точка[][] точки

 паблик Поле(целое ш, целое в) // конструктор, при создании поля указываем ему размер

 паблик УстановитьРазмер(целое ш, целое в) // через этот метод меняем размер поля

 паблик ПоставитьТочку(целое x, целое y, Игрок и) // тут все ясно
 паблик СоединитьТочки(x1, y1, x2, y2, Игрок и) // к слову, здесь и будет поиск замкнутого контура
}


Самый Главный Класс, создает поле, игроков, и рулит всем. Тут же будет создаваться основное окно, обрабатываться мышка и прочая лабуда. Много текста, но ничего сложного. С метода main() этого класса начинается выполнение всей программы(или даже немного раньше).
Код

класс Игра {
 Поле поле // поле
 Игрок[] игроки // аналогично
 целое номерТекущегоИгрока // номер игрока, чей сейчас ход

 паблик статик main(String[] args) // отсюда начинается выполнение программы

 паблик Игра() // конструктор

 паблик НоваяИгра(целое высота, целое ширина, целое количествоИгроков) // вызываем, когда нужно начать новую игру
}


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

ЗЫ
Дальше можно набивать эти пустые классы кодом. Начать стоит с конструкторов. 
В конструкторе Игрока нужно только записать цвет в соответствующее поле класса.
У точки нужно записать x и y, запихнуть null в поля поставилТочку и захватилТочку(или как там в яве, само обнуляется?), создать пустые массивы.
Конструктор Поля просто вызывает метод УстановитьРазмер(). А в нем уже нужно создавать массив Точек соответственно размерам поля. Точкам кстати при создании нужно посылать их координаты на экране, но пока отрисовки нет можно туда просто нули закинуть.
В конструкторе класса Игра создается Поле(можно размерами 0*0, запихиваем в соответствующую переменную класса) и вызывается метод НоваяИгра() с указанием желаемого размера поля и количества игроков. НоваяИгра() в свою очередь создает нужное количество Игроков, назначая каждому свой цвет, сбрасывает номерТекущегоИгрока в ноль и вызывает поле.УстановитьРазмер() чтобы пересоздать точки.

Можно еще в конструкторы вставить строчку
Код

System.out.println("Создан объект Игрок(например)");

, скомпилировать и запустить, посмотреть как создаются объекты  smile 

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


Бывалый
*


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

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



Спасибо вам за  обьяснение .Графический интерфейс мы пока не учили но предполагается что мы о нём узнаем к католическому рождеству .Через неделю у нас стартует зачётная неделя  . Занятия будут продолжаться на фоне зачётов потому что по программе не успеваем  .Если бы не занятия математикой я бы уже попробовала написать классы .Но подготовка к тесту по математике  требует сейчас очень много  времени . Какие  классы , библиотеки , ... , Java нужно применять для этого проекта ? Может мне пока лучше поискать о них информацию в интернете ...
PM MAIL   Вверх
Rpahut
Дата 28.11.2008, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



А как же, это все нужно переписать на яве. BlueJ у вас установлен?
Из стандартных классов в описании фигурирует только класс Color, обо всем остальном в интернете информации не будет. Это самодельные классы.
Хотя, может в яве и на случай игры в точки есть стандартные классы? smile 
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 29.11.2008, 21:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



BlueJ у меня  установлен .Сейчас буду повторять тот Java синтакс который уже учили ." Не густо" однако у нас с синтаксом smile
PM MAIL   Вверх
Qawra
Дата 12.12.2008, 21:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Все !!!  экзамены  и зачёты сданы smile  Надо начинать писать программу . Учитель сказал прийти в январе с готовыми классами .На следующей неделе он нам обьяснит GUI и вперёд к вершинам программирования игр . 
Вчера  при свечах   повторяла  к экзамену  Java на бумажке (электричество по случаю мощной грозы  просто  отсутствовало).
В принципе всё понятно : packages , abstract classes , inheritance , encapsylation , polymorphysm , interfaces ...Практически это пока всё   .  Хорошая вещь обьектно- ориентированное программирование ! 

 За время моего короткого знакомства с Java  мне встречался  :  java.util*     ....JoptionPane ... String  ..Math..Кажется  это всё .

Что мне надо почитать  из tutorials  в интернете ?
 Пробелов у меня  сейчас значительно больше чем знаний . 


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


0xdeadbeef
*


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

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



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


Бывалый
*


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

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



Если принимать во внимание  что обьектно-ориентированное  программирование имеет " Bottom-Up  " дизайн , мне надо определить самую элементарную часть проекта  и начать с неё...
Или лучше всё  таки начать с  создания  поля ?
Чего-то мне пока не хватает...Наверно графического интерфайса  smile
Это нормально что его пока нет ? 
PM MAIL   Вверх
Rpahut
Дата 15.12.2008, 23:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


0xdeadbeef
*


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

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



Начинать можно с любого места. Просто если начать с класса Поле, он не скомпилируется пока не будут написаны классы Точка и Игрок. Вопрос удобства.
Графический интерфейс будет позже, когда будет что выводить на экран.
--------------------
C/C++ GameDevRSS Раздела программирования игрOpenGL - уроки от NeHeКак продать идею?
PM MAIL   Вверх
Qawra
Дата 16.12.2008, 18:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


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

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



Учитель   сказкал графический интерфасе  надо писать параллельно с основными классами но храниться он  будет отдельно . 
Скачала  с торрента 70 книг  по Java . Там есть книга по программированию игр ,  книги по алгоритмам и две книги по SWING .. Вчера всё открывалось (формат файла - UIF  )  а сегодня  ни MagicISO  ни UltraISO  их не открывают .Что-то сбилось в настройках ...или антивирус ...но в принципе  не должен он  был... В общем проведя два часа  в попытках это снова открыть я  пока отложила это в сторону . 
Что-бы рисовать поле нужен будет Photoshop ?  
У меня в  Word  есть замечательный template  который выводит  листочек в клеточку  smile   

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


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


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

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



Qawra, а в чем проблема нарисовать поле самой? два цикла и всё  smile 

Код

for(int i=0; i<FIELD_WIDTH; i+=CELL_SIZE)
   for(int a=0; a<FIELD_HEIGHT; a+=CELL_SIZE)
      DrawCell(i, a);



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


Бывалый
*


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

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



У меня в голове пока не всё уложилось .Команда 
Цитата

 DrawCell(i, a);
 мне  пока не встречалась . Но что-то подобное 
мы  делали  когда  квадрат   рисовали . 
(два  nested  loop  и  команда  напечатать   *   ) 
Что надо импортировать что-бы  использовать DrawCell ?  И что там  можно  модифицировать ?  Размер , цвет   и фон  клетки могут быть разными ?

Я нашла и скачала  аналогичную  игру  написанную  на  каком-то другом   языке  smile  Сижу  ....  играю  ...проникаюсь ... Правда это тот   вариант  где  захватываются точки противника а не территория . Но зато  захваченные  точки  подсчитываются  и отображаются  автоматически.  О  такой детали  я раньше  и  не думала ,  а ведь это интересно . 
Если графический  интерфасе  переделать на свой лад  а 
 код игры перевести  на Java и  модифицировать  его  на захват территории (когда  замыкания контура происходит   в не зависимости от нахождения внутри точек  противника ), будет ли  это более простой  вариант  или  более сложный с точки зрения кода ?  C  первого  взгляда  он  мне такой вариант  кажется проще  ..Но в принципе  он ведь не избавляет  от применения  основного  рекурсивного  волнового  алгоритма ? 

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


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


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

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



Цитата(Qawra @  17.12.2008,  17:13 Найти цитируемый пост)
мне  пока не встречалась . Но что-то подобное 
мы  делали  когда  квадрат   рисовали . 


Это был псевдокод. Команду DrawCell нужно сделать самой - банально нарисовать клетку в указанных координатах. 


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


Бывалый
*


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

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



А  можно  установить карту древнего  мира  как фон  и на него как-нибудь ненавязчиво  для восприятия  нанести клетки  ?  Задача  эта  выполнимая ? 
PM MAIL   Вверх
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.1667 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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