Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 26.02.2012, 23:36   #1
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
Радость Натолкните на алгоритм или "Ночной город своими руками"

Вопрос прост:
цель - сделать имитацию погружающегося в сон города. Т.е. допустим есть массивчик 5х10 из ноликов(на самом деле элементов около 2 тысяч, но это не суть))) - это окна, в которых нет света. Наступает вечер, эти окна начинают рандомно медленно зажигаться(нолики превращаются в единички). Потом всё быстрее, быстрее, пока почти весь "город" не будет гореть. А затем начинают медленно угасать, пока почти все не погаснут.
Собственно вопрос знатокам - как лучше реализовать такой алгоритм?
Имеющиеся данные - допустим есть переменная t, которая у нас тикает каждую секунду(или милисекунду, не суть). И заранее известно, с какого периода у нас вечер, с какого ночь и тд.
Требования - Точность не особо важна(в том плане, что не обязательно расписывать режим дня каждого жильца нашего городка... в остальном всё должно быть более менее сносно). Важно, чтоб код был не особо большой. Чтобы применялись только сишные библиотеки(с С++ и его инструментами вероятнее всего будут проблемы). Короче, простота нужна.
Подвопрос - действительно ли стоит ковырять функцию распределения вероятностей или можно сделать всё проще? Буду рад любым домыслам.)
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Старый 27.02.2012, 00:15   #2
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

нужно бегать по массиву и рандомно зажигать или не зажигать огни, а вероятность зажигания должна увеличатся по мере приближения ночи, как только прошли определённый порог начинаем обратно выключать.
microbit вне форума Ответить с цитированием
Старый 27.02.2012, 00:48   #3
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
По умолчанию

Согласен. Но... я туплю... как реализовать эту самую вероятность?
Я вредный и нервный, но бдобр.
Karp_13 вне форума Ответить с цитированием
Старый 27.02.2012, 01:04   #4
microbit
Форумчанин
 
Аватар для microbit
 
Регистрация: 26.09.2011
Сообщений: 176
По умолчанию

Код:
 if(rand()%100<a)
чем ближе а к 100 тем больше вероятность
microbit вне форума Ответить с цитированием
Старый 27.02.2012, 01:19   #5
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Код:
#include<iostream.h>
#include<windows.h>
#define N 100
#define I 5                   //Размеры массива меняй здесь
#define J 10                  //Размеры массива меняй здесь
#define NIGHT 50000          //Скорость рассвета и типа заката =)
#define BURN 30               //Уменьшай/Увеличивай в зависимости от I,J  (Время от зажигания первого до зажигания последнего окна)
#define DAY 5000             //Перерыв перед тем как людишки начнут орудовать со светом

int main()
{
    int i,j,k,ms[N][N],R1,R2,Windows=0,Sun=1,G;
    long Change=1;
    G:;
    Windows=0;
    for(k=NIGHT;k>100;k-=200)          //Здесь поэкспереминтируй как тебе надо =)
    {
    if(k==NIGHT)
    k--;
    else
    Sleep(k/100);                       // –-//--
    system("cls");
    srand((unsigned)time(NULL));
    R1=rand()%I;
    R2=rand()%J;
    ms[R1][R2]=Sun;
    for(i=0;i<I;i++)
    {
     cout<<"\n";
     for(j=0;j<J;j++)
     cout<<ms[i][j];
    }
    Windows++;
    if(Windows==BURN)    
    {
     for(i=0;i<I;i++)
     for(j=0;j<J;j++)
     ms[i][j]=Sun;
     system("cls");
     for(i=0;i<I;i++)
     {
     cout<<"\n";
     for(j=0;j<J;j++)
     cout<<ms[i][j];
     }
     printf("    Людишки ждут в ожидании зажжения/вырубания светил своих");
     Sleep(DAY);
     Change++;
     if(Change%2!=0)
     Sun=1;
     else
     Sun=0;
     goto G;
    }
    }
}
Писала на Dev-cpp. Если что не правильно поняла или чегото не хватает, то говори исправлю.

Последний раз редактировалось ACE Valery; 27.02.2012 в 02:37.
Axrik вне форума Ответить с цитированием
Старый 27.02.2012, 11:10   #6
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Axrik, что Вам плохого сделал ТС, что Вы ему такое
Код:
    G:;
    for(k=NIGHT;k>100;k-=200)          //Здесь поэкспереминтируй как тебе надо =)
    {
        ...
        k--;
        ...
        Windows++;
        if(Windows==BURN)    
        {
            ...
            goto G;
        }
    }
подсовываете?... Его ж со сдачи отправят мгновенно, даже несмотря на то, что программа, вроде, результаты даёт...

Зачем, перед началом "периода угасания", принудительно зажигать ВСЕ окна?

Последний раз редактировалось Vago; 27.02.2012 в 12:01.
Vago вне форума Ответить с цитированием
Старый 27.02.2012, 13:02   #7
Karp_13
Всё знать хотяка!
Пользователь
 
Аватар для Karp_13
 
Регистрация: 21.04.2009
Сообщений: 67
Радость

Axrik, много текста. Очень не люблю копаться в чужом коде перед сном(даже в маленьком отрывке)). Спасибо за старания тем не менее. Но прост я тут же схватился за подачку microbit'а(принцип "размер имеет значение" в этот раз протащил))), и вроде её хватило чтобы добиться успеха. Правда нужно подрегулировать около десяти дефайнов, чтобы добиться той скорости зажигания, которая бы меня устроила, но сейчас всё работает.
Вероятно ещё придётся вставить какой нибудь механизм проверки типа "сейчас середина ночи; если горит меньше 40-50% окон - повысить вероятность зажигания; если горит 70%, то понизить вероятность зажигания...". Щас побегу тестить это на реальном объекте, гепотетически это должно всех эстетически удовлетворить.)

Vago, код приведённого для меня примера я не разбирал, но что тебя собственно в нём так ранило?)
Я вредный и нервный, но бдобр.

Последний раз редактировалось Karp_13; 27.02.2012 в 13:06.
Karp_13 вне форума Ответить с цитированием
Старый 27.02.2012, 13:19   #8
Vago
Форумчанин
 
Регистрация: 15.01.2010
Сообщений: 948
По умолчанию

Цитата:
Сообщение от Karp_13 Посмотреть сообщение
Vago, код приведённого для меня примера я не разбирал, но что тебя собственно в нём так ранило?)
В том фрагменте, который я выдернул - попытка внутри цикла со счётчиком поменять переменную цикла и, главноe, goto из цикла наверх, на повторный запуск цикла. Глобально - почти полное отсутствие техники программирования и неряшливость как в мыслях, так и в оформлении при, в общем-то, похоже, светлой голове.
Vago вне форума Ответить с цитированием
Старый 27.02.2012, 19:48   #9
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Я понимаю политику большинства прогеров в отношении goto и сама если и использую, то не больше одного, но что ж поделать, свой код обычно пишу для себя и против готу ничего не имею
Axrik вне форума Ответить с цитированием
Старый 27.02.2012, 19:51   #10
Axrik
Форумчанин
 
Аватар для Axrik
 
Регистрация: 17.12.2011
Сообщений: 111
По умолчанию

Цитата:
Сообщение от Vago Посмотреть сообщение
Его ж со сдачи отправят мгновенно, даже несмотря на то, что программа, вроде, результаты даёт...
Эт лаба чтоль? =)
Axrik вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Напечатать текст, удалив из него все цифры и знаки "+" или "–". Язык С++. KaylasMKTY Помощь студентам 8 07.03.2010 21:35
MS Agent или помошник своими руками Mixasik Компоненты Delphi 2 24.07.2009 15:06
"Hide Folder" своими руками (Delphi) Air Помощь студентам 3 13.11.2008 03:38
если пользователь наберет какой-то другой символ не "y" или "n" и нажмет enter, программа проигнорирует skobets Общие вопросы C/C++ 2 03.06.2008 06:51