Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Консольное приложение


Автор: naumann 21.12.2011, 07:42
Это требование предъявляемые к программе...я не прошу делать за меня... просто подскажите опытным советом, в какую сторону думать ... Заранее большое спасибо=)

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

Автор: lazycat 21.12.2011, 12:55
IMHO проще всего будет сделать многопоточную программу: один поток - "трасса", контроль за автомобилями, вывод необходимых данных на консоль и т.д. и по одному потоку на каждый автомобиль. 

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

Успехов.

Автор: DeadlyAngel 22.12.2011, 06:21
в <epam> чтоkли поступаешь))))???? smile 

Автор: _Y_ 22.12.2011, 10:10
Цитата(naumann @  21.12.2011,  07:42 Найти цитируемый пост)
402 метра, каждую секунду в консоль нужно выводить

Странное условие. О http://ru.wikipedia.org/wiki/%D0%93%D0%B0%D1%81%D1%82%D0%BE%D0%BD_%D0%B4%D0%B5_%D0%A8%D0%B0%D1%81%D0%BB%D1%83-%D0%9B%D0%BE%D0%B1%D0%B0 речь идет? На современнях-то скоростях мало что увидишь при частоте вывода один раз в секунду  smile 

Думаю, все можно сделать очень просто. Трасса моделируется прямой (какими трассы драгстеров и являются), два автомобиля ускоряются по законам физики 7-го класса. Что еще надо при частоте-то вывода 1 раз в секунду.

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

Как это осуществить? - Так же как как делаются прогресс бары. Вот хотя бы http://forum.vingrad.ru/index.php?showtopic=343406&view=findpost&p=2436549.

Автор: naumann 22.12.2011, 20:18
Цитата(DeadlyAngel @ 22.12.2011,  06:21)
в <epam> чтоkли поступаешь))))???? smile


да хотел=)... 

Спасибо ребят за советы=)...

Автор: naumann 22.12.2011, 21:05
... в каждого из авто есть свойство ускорение и максимальная скорость. Взял формулы для определения текущей скорости: 
    v = a*t, где a-ускорение, t-время и пройденного пути: s=v*t, где v-текущая скорость, t-время ... ммм... как лучше засечь время (если так можно выразиться) при старте авто, чтобы его можно было подставлять в формулу... просто сделать счетчик? или?... smile 

Автор: Mirkes 23.12.2011, 07:28
Цитата(naumann @  22.12.2011,  21:05 Найти цитируемый пост)
... в каждого из авто есть свойство ускорение и максимальная скорость. Взял формулы для определения текущей скорости:     v = a*t, где a-ускорение, t-время и пройденного пути: s=v*t, где v-текущая скорость, t-время ... ммм... как лучше засечь время (если так можно выразиться) при старте авто, чтобы его можно было подставлять в формулу... просто сделать счетчик? или?...   


Вообще говоря пройденный путь считается не так. он равен s=a*t^2/2.
Время считается с момента старта, посему просто считать секундами, например. Если нужна большая точность - то с более мелким шагом.

Автор: _Y_ 23.12.2011, 10:12
naumann, для начала разгона формулы v = a*t и s=a*t^2/2, конечно, годятся. Но по уму они применимы только к сферическому коню в вакууме, поскольку подразумевают неограниченную максимальную скорость автомобиля. На самом же деле нужно учитывать, что сопротивление его движению растет со скоростью. При этом мощность двигателя в идеале просто псостоянна.

Реалный случай описать довольно сложно:
1. Сопротивление качению растет со скоростью - формулу не знаю.
2. Аэродинамическое сопротивление растет пропрорционально квадрату скорости.
3. Мощность двигателя звисит от его оборотов и проходит через максимум. Кривая довольно сложная.
4. Обороты двигателя связаны с выбранной передачей трансмиссии. Передачи же за время разгона переключаются.

Но это уже полный офф. Врядли стоит задача описания объективной реальности. Я бы просто взял для скорости формулу кривой с насыщением. Что-то вроде v = max*t/(d+t).

У этой формулы начальный участок близок к линейной зависимости, а потом наступает насыщение при приближении к максимальной скорости max.

И еще. Не делайте инкрементальное увеличение скорости и/или пройденного пути. Это очень распространенная ошибка. В каждом цикле считайте скорость и путь по одной и той же формуле; т.е. от старта.

Автор: naumann 24.12.2011, 16:49
... Еще раз спасибо за Ваши ответы, но еще вопрос если позволите...
    Пусть у меня есть коллекция машин-участниц ArrayList<Car> cars; Нужно задать последовательность заездов всех элементов(машин) этой коллекции т.е. берем 0 и 1 элемент(1 и 2 машину из коллекции) они соревнуются между собой... потом возвращаемся в коллекцию берем 2 и 3 элемент(3 и 4 машину)... и т.д... как лучше пройти коллекцию?! smile  smile 

Автор: _Y_ 27.12.2011, 11:19
В простейшем варианте - последоовательный проход:
Код

for(int i = 0; i < cars.size(); i++){
   for(int j = i+1; j < cars.size(); j++){
        //Здесь код вызова соревнования между машинками i и j 
   }  
}

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

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

Автор: naumann 27.12.2011, 12:00
Цитата(_Y_ @ 27.12.2011,  11:19)
В простейшем варианте - последоовательный проход:
Код

for(int i = 0; i < cars.size(); i++){
   for(int j = i+1; j < cars.size(); j++){
        //Здесь код вызова соревнования между машинками i и j 
   }  
}

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

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

=)спасибо ... 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)