Вчора товариш
написав про свою реалізацію гри "Життя" Конуея. Я колись у школі написав багато її реалізацій - на ZX Basic, QBasic і Turbo Pascal. Я у неї навіть грав "вручну" - на шаховій дошці :)
Ну і вирішив тряхнути стариною - написати на plain C++. Колись, на другому курсі універу, коли я самотужки вивчав C++ у мене була думка написати реалізацію, але я тоді уже сидів під Linux і NCurses мені здалися дуже злими. А у графіку я взагалі тоді не ліз - навіть без X-сервера сидів :) Такшо тоді воно так і залишилось не реалізованим.
Першу реалізацію (чисто консольна версія, навіть без ncurses) я осилив хвилин за 30-40. При чому воно запрацювало одразу після успішної компіляції :)
Дивитись на неї можна тута:
Conway's Life (CLI version)Основа всього - клас Field. Поле клітин представлене як std::vector - звичайним одномірним вектором. Доступ по координатам стандартний: x * width + y. У методі Cycle захована вся логіка: в залежності від кількості сусідів наповнюється новий вектор, після чого відбувається швидкий swap. Метод що підраховує кількість сусідів страшнуватий, але працює. І я не знаю поки як його можна зробити красивіше.
Друга реалізація - той самий клас, але з GUI на Qt4. Витратив на неъ близько 2 годин. Спочатку близько години малював крапками і розважався з QImage і scanLine. Вийшло непогано, на полі 1000x1000 давало близько 2 fps. Потім залишив ці оптимізації і тупо, через QPainter зробив scalable версію. Ще хвилин 30 зайняло прикручування контролів і таймінгів.
На 100x100 Field::Cycle() відпрацьовує за 3 мс на одному ядрі AMD Phenom(tm) II X4 955. Малює швидко, окремих кадрів не видно. На 1000x1000 з квадратиками по 1 пікселю Field::Cycle() працювало за 342 мс, але давало десь 0.3 fps. Збирав у релізі, без оптимізацій.
Подивитись на цю версію можна тута:
Conway's Life (Qt version). Реалізацію Field не змінював.