Найлегша гра на сі. Чому я пишу ігри на C (так, на C)




Запитання: Що порадьте для створення ігор з нуля?


Доброго часу. Нещодавно був натхненний іграшками на кшталт Papers, Please і Hotline Miami. Є своя ідея створення гри. Але річ у тому, що не знаю на чому краще писати. Гра задумав з видом зверху, не 3D, для ПК. По роботі пишу на 1С, але с-ка не для ігор, хоча якщо дуже постаратися можна, також вивчав самі ази Java. Я розумію, що спочатку краще спробувати зробити щось просто, типу хрестики-нуліки або змійку, щоб отримати базові знання.
На просторах інтернету пропонують використовувати C + +, але також пропонують використовувати C # + XNA. У кого є досвід у створенні ігор, порадьте літературу або дайте якісь поради щодо програмування ігор з нуля.

Відповідь:

Повідомлення від MonteKristo

порадьте літературу

На жаль російською дуже мало літератути, тим більше якісної. Перекладають далеко не все, не відразу, а буває, що не якісно. Буває, що переведуть книгу за два роки після виходу оригіналу, а вже вийшла нова версія оригіналу і перша застаріла. Тому я вивчаю англійську та перекладаю за допомогою Lingvo та translate.google.com актуальні книги

Шукати книги зі створення ігор різними мовами та технологіями можна тут:

Але не в жодному разі не починайте з книг з категорій: Progressing та Mastering

Що якийсь розділ означає можна дізнатися якщо клікнути "i". Можна ще безкоштовно завантажити приклади після реєстрації. Я це показав на малюнку:

Питання: Створення гри мовою Сі?

Відповідь: Додано через 30 хвилин

Повідомлення від HighPredator

Взагалі на сі можна написати все. Було б бажання, мізки та час.

Бажання є, мізків немає, час шукатиму >< Благодарю!

Повідомлення від McFair

Так само можна самому почати без движка ще вивчати Opengl, створити пару тетрісів, і дивишся зрозумієш що до чого.

Відчуваю доведеться писати движок самому

Повідомлення від McFair

7.Невідомо, нібито частину малюнка вирізати і накласти на куб?

Так, відмалювати об'єкт і відтектурувати його, наклавши зображення.

Повідомлення від cyber-satyr

GTK, наприклад, крос. А так, для вендів юзай winapi, там чисто сиший інтерфейс.

Дякую! Це я й мав на увазі

Повідомлення від McFair

8.Більше залежить від гри, цілей і стилю програмування, все потрібно враховувати, якщо брати один і той же проект на сі і шарп то звичайно сі набагато виграє, але в шарпі швидкість розробки на 2 \ 3 по-моєму підвищиться.

Непоганим вибором напевно буде поєднання їх. Основу писати на шарпі, а на Сі докручувати фітчі?)

Запитання: Створення гри ММОРПГ


Вітаю. Нещодавно створював тут тему, де дізнавався про створення гри 2д.
Все ж таки я вирішив дізнатися, в якому напрямку мені вчитися.
Ось 2 скріншоти:
http://kape.cc/uploads/posts/2011-05...a630f08343.jpg
http://mmohuts.com/wp-content/galler..._07.jpg?bb7a3b
І відео:

Мені потрібно зробити подібну гру. Загалом, локація – системою сітки. Локація поділена на деякі кубики
Я розумію, що потрібна графіка, звуки, звукові бібліотеки, але для початку візьмемо звукові бібліотеки.
Забудьте про графіка (вона допустимо є), є звуки.
Хочу запитати, чи задовольняє зв'язка з ++ + OpenGL моїм вимогам та створенню схожої гри, а саме: пересування об'єкта по клітинах з анімацією, зіткнення об'єктів, взяття графіки зі спрайтів + ​​скелетна анімація (голий персонаж + прив'язка предметів - графіки, до тіла персонажа (одяг)).

Відповідь: 8Observer8, ніколи не любив фізику, поки не зрозумів, що вона така необхідна ... Але зараз, я зрозумів, що Box2D для моєї задуманої гри точно не потрібен ... Дивився документацію на SFML, після, сьогодні потикав попередній напрацювання і зміг зробити щоб взаємодіяв зі стінами, скільки щастя було)) Просто витратити прийшло близько 1-2 години щоб зрозуміти як це зробити, але це того варте.
До речі хочу спробувати зробити хоча б перший рівень бомбермена)

Додано через 10 хвилин
P.S. паралельно вивчаю c++

Запитання: Порадьте літературу зі створення ігор від початку до кінця


Порадьте літературу зі створення ігор від початку до кінця. З усіма елементами, на + можна. Тільки нову книгу видавництва 2010-2015 року

Відповідь:А ви що для малювання використовуватимете: DirectX чи OpenGL? Я дивився є загальні книги з теорії ігор ->. Якого плану ви будете ігри писати: 2D, 3D, RPG, стрілялки, гонки, шахи, го? У всіх цих ігор специфіки різні

Питання: створення гри


Здрастуйте, задумав зробити простеньку гру (rpg). Робитиму просто "Для себе". Гра буде статична (bmb картинки персонажів, об'єктів і т.д, можливо gif) Коли почав ритися в інтернеті в пошуках того, як це взагалі робиться, знайшов купу готових компонентів для delphi (наприклад delphix) і тому у мене виникло питання, чи варто використовувати щось подібне? Чи краще все самому вимальовувати на canvas?

Відповідь:

MrDmitry,
Статична гра? Це щось нове у програмі будівлі.
Якщо вона і в правду така, то вам вистачить TImage.
А якщо все-таки це динамічна гра то вам знадобиться TPaintBox.

Мало хто знає але у помсті з Delphi поставляються приклади програм включаючи 3 міні-ігри!

У Windows 7 натисніть пуск | Усі програми | Embarcadero RAD Studio XE5 Samples.

У мене ця папка
C:\Users\Public\Documents\RAD Studio\12.0\Samples\

Що стосується компонентів та двигунів.
Про компоненти одразу забудьте. Немає компонента який зробить за вас гру. Гра пишеться руками та головою.

Що стосується двигунів. Двигун прискорює розробку.
У движку ви знайдете купу готового коду. Двигун треба підбирати під гру.

Від двигуна раджу подивитися математичну та геометричну бібліотеку. Бібліотеку для роботи з континентом та мультимедіа. Які формати файлів підтримує програма?
Підтримка камери. Підтримка спецефектів.

Ви не сказали 2D чи 3D гра.
Наявність відсутність підтримки спрайтів, білбордів. Виведення тексту.

Додано через 14 хвилин та 34 секунди
Думаю, вам буде цікаво. Є сайт відвіданий створення ігор.

Тут можна і підглянути і запозичити як ідеї для гри, так і ідеї реалізації.

Питання: Створення мови у Visual Studio


шукаю зрозумілі покрокові приклади/уроки зі створення мови у Visual Studio.

Знайшов приклад мови, але мені треба зрозуміти що, як і навіщо, т.к. мій асм мало схожий на око.

--
Потрібно взагалі:
"Кросскомпілятор" зі свого асму в студії, з підказками коду, в коди для процесора Z80 (поки не розбирався зі способом завантаження на "залізку" або емулятор, це наступний етап).

Вимоги:
редактор - сама НД (2013);
асемблерний Z80 код на екрані, без зайвих модулів;
вибір мови під час створення проекту (де список мов C#, F#, VB.NET та інших).

Відповідь:а як "сказати" студії 2013 року щоб вона підсвічувала і підказувала?

Питання: Створення гри на движку C++


Народ, допоможіть зі створенням гри на движку з ++. Doodle jump, Буду вдячний аналогу. Проблема в тому, що почав тільки нещодавно вивчати. І ніяк не можу написати правильну програму. Мабуть, я ще конкретний Нуб. Вдячний заздалегідь!

Створення гри для Linux за допомогою Weaver Framework

Це стаття про Weaver Framework, невеликий фреймворк для створення двовимірних ігор під Лінукс. Weaver написаний мовою програмування Сі, тобто. для створення гри з його допомогою вам знадобиться хоча б початкові знання цієї мови програмування.

Спочатку потрібно сказати, що фреймворк всього містить близько 70 функцій для маніпулювання звуком, картинками, створення графічних примітивів, детектора зіткнень і ще. У ході цієї статті буде описано майже всі функції.

Сайт проекту знаходиться за адресою http://weaver.nongnu.org/ Там же можна отримати вже зібраний пакет у форматі.deb або тарбол з вихідним кодом, для не debian-based систем. Отже, почнемо.

Після завершення успішної установки, можна відразу приступати до створення проекту. Для цього потрібно відкрити консоль, перейти в директорію, де розташовуватиметься наш новий проект і набрати:

weaver

У ході створення проекту Буде створено ієрархію директорій, призначених для зберігання графічних, звукових та вихідного коду файлів. Для початку, щоб потренуватися, створимо проект test. Він використовуватиметься для вивчення можливостей weaver.

2.1. Створення порожнього проекту

weaver test

Декілька слів про вміст директорії проекту.

test

|-fonts

|-images

|-music

|-sounds

| |-weaver

LICENSE

Makefile

У принципі назви говорять самі за себе. Згадаю лише про/src , тут містяться як безпосередньо файли проекту ( game.c, game.h - основні), так і (у директорії/weaver ) файли самого фреймворку необхідні для вдалого складання проекту.

Розглянемо файл /src/game.c Детальніше. Він є основним файлом проекту і саме в ньому є головний цикл програми.

int main(int argc, char **argv)

Awake_the_weaver(); // Initializing Weaver API

// Main loop

For(;;)(

Get_input();

If(keyboard)(

Break;

Weaver_rest(10000000);

May_the_weaver_sleep();

Return 0;

Функції

awake_the_weaver()

may_the_weaver_sleep()

дозволяють і забороняють використання функцій із фреймворку. Між ними є головний цикл програми.

get_input() служить для захоплення стану клавіатури та мишки. Слідом за цим йде ділянка коду. відповідальний за вихід із програми натискання будь-якої клавіші.

weaver_rest(n) призначена для призупинення програми на кілька наносекунд, ця ж функція відповідає і за FPS, чим нижче число n, тим вище FPS.

Для складання проекту набираємо в консолі команду make та чекаємо вдалого завершення.

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/display.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/keyboard.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/vector2.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/vector3.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/vector4.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/weaver.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/sound.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/image.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/weaver/font.c

gcc -Wall -O2 -g $(freetype-config --cflags) -c src/game.c

gcc -Wall -O2 -g $(freetype-config --cflags) -g -o test display.o keyboard.o vector2.o vector3.o vector4.o weaver.o sound.o image.o font.o game. o -lX11 -lXext -lm -lvorbisfile -lasound -lpng -lfreetype $(freetype-config --cflags)

Успіх. Запустимо проект:

./test

От і все! Натискання будь-якої клавіші закриває гру.

2.2. Робота з клавіатурою

Стан клавіатури містить глобальну змінну keyboard . Дізнатися, чи натиснута потрібна нам клавіша можна таким нехитрим чином:

if (keyboard[ ])

// щось відбувається

Якщо потрібно, щоб програма реагувала на поєднання клавіш, використовуємо Логічне-І:

if (keyboard[ ] && keyboard[ ])

/ / Щось так станеться!

Тепер змінимо програму так, щоб вихід проводився за натисканням Ctrl-Q.

Змінимо

if(keyboard)

Break;

на

if(keyboard && keyboard[Q])

Break;

Ризикнемо зібрати і запустити гру. Тепер для виходу необхідно натиснути комбінацію клавіш Ctrl-Q.

2.3. Малювання графічних примітивів

Для малювання примітивів є функції:

draw_circle()

draw_ellipse()

draw_line()

draw_point()

draw_rectangle()

Для заливки примітно використовуються функції

fill_circle()

fill_ellipse()

fill_rectangle()

Їхня назва, як і назви більшості функцій weaver, наочні і не потребують докладного опису. Описи вимагають лише параметри, але посилання на Reference Guide буде дано наприкінці статті.

Не будемо стояти на місці і намалюємо жовтий квадрат із координатами (x=50, y=150) та розміром 125x125. В основний цикл додамо такий запис:

draw_rectangle(50, 150, 125, 125, YELLOW);

де YELLOW – колір нашого квадрата.

Збираємо проект і дивимося, що вийшло.

Не те, на що ми очікували, правда?

Справа в тому, що задаючи колір у малюванні квадрата, ми задаємо колір його межі, тому нам необхідно залити наш квадрат за допомогою функції fill_rectangle(). Що ми робимо, додаючи після команди малювання квадрата наступний рядок:

fill_rectangle(50, 150, 125, 125, YELLOW);

Пробуємо та дивимося!

На цей раз у нас все вийшло. Тепер спробуємо поєднати наші знання про використання клавіатури та малювання примітивів. Але перед цим трохи оптимізуємо нашу програму, створивши квадрат як змінну.

rectangle є структурою, з 4 параметрами вісь x (параметр x), вісь y (параметр y), ширина (параметр w) та висота (параметр z).

Створимо змінну типу rectangle, додавши після ініціалізації weaver (нагадаю, це awake_the_weaver()):

rectangle rect1;

Потім ініціалізуємо її параметри:

rectangle rect1;

rect1.x=50;

rect1.y=150;

rect1.w=rect1.z=125;

Задамо обробку для натискання клавіш<стрелка-влево>і<стрелка-вправо>клавіатури.

If (keyboard)

Rect1.x-=10;

If (keyboard)

Rect1.x+=10;

А потім і малювання самого квадрата:

draw_rectangle(rect1.x, rect1.y, rect1.w, rect1.z, YELLOW);

Зазначу, що ініціалізація параметрів змінної має бути до головного циклу відтворення, тобто. до for(;;).

Зберемо та запустимо наш проект.

І знову не те, що ми хотіли б бачити?

Справа в тому, що малювання відбувається при кожній ітерації головного циклу, але й лише. Все, що було намальовано до цієї ітерації, так і залишається на екрані ніяк не стираючись. Це легко вирішується очищенням екрана перед кожним новим відображенням екрана. Для заливки (а в даному випадку очищення) екрана використовується функція

fill_screen()

приймає як параметр колір заливки. Додамо її перед малюванням квадрата і знову побачимо, що вийде.

Успіх! Перейдемо до завантаження та малювання зображень.

Єдиний можливий weaver формат зображення - . png , його і використовуватимемо. Потрібно пам'ятати, що всі зображення повинні бути в директорії/images.

Для початку оголосимо та ініціалізуємо покажчик на тип surface, що представляє зображення:

surface *face=new_image("face.png");

Функція new_image() приймає один аргумент – назву графічного файлу.

Для відображення графічного файлу існує функція

draw_surface()

приймає в якості аргументів покажчик на графічний файл, що зображається ( surface *origin ), покажчик на те, де зображатиметься ( surface *destiny) та координати (x, y).

Графічні файли можна малювати на інших графічних файлах, щоб малювати просто на екрані, як параметр destiny потрібно вказувати window, це і є покажчик на поточне вікно малювання.

Заберемо зайві згадки про квадрат, зберемо проект і запустимо його.

Підсумок наших старань:

Для зручнішої маніпуляції малюнком створимо структуру, що складається з покажчика на картинку та її координат на екрані.

struct pict(

Surface * FC;

Int x;

Int y;

Наново створимо та ініціалізуємо зображення:

face.fc=new_image("face.png");

face.x = 100;

face.y=100;

Змусимо його відображатися:

draw_surface(face.fc, window,face.x, face.y);

Тепер можна спробувати керувати розташування зображення, використовуючи наші знання про клавіатуру. Не підказуватиму вам, сподіваюся у вас вийти.

2.5.Виведення тексту на екран.

Цей розділ напевно розчарує, але weaver не вміє виводити текстові повідомлення на екран. У проекті є модулі, які відповідають за виведення тексту, але вони не використовуються. Чому? Мабуть, автор ще не готовий до цього;). Але він сам запропонував вирішення проблеми. Для виведення тексту використовується своєрідна палітра - набір літер, розміщений на зображенні, звідки літери в разі потреби беруться і виводяться на екран. Цей прийом використовувався і раніше у старих (і не дуже) іграх.

Скористаємося ним і ми. Для цього завантажимо картинку з набраними літерами в нашу гру.

surface * font=new_image("font2.png");

Отже, ми маємо картинку з розміщеними на ній кількома літерами. Як брати з неї потрібні на літери? Для виведення певної частини зображення використовується функція blit_surface(). Параметр *src приймає покажчик на вихідний графічний файл, *dest приймає покажчик на поверхню для зображення, (x_src, y_src) - координати, звідки починатиметься вирізане зображення, width - ширина нового зображення, height - його висота, (x_dest, y_dest) - координати цільової поверхні, куди буде виводитися вирізане зображення.

Додамо виклик функції та подивимося, що вийде.

blit_surface(font, window, 0, 0, 90, 100, 500, 500);

Не так це і страшно, але залишилося одне питання – на малюнку червоні літери на темно-синьому тлі, але виводяться лише літери червоного кольору. Це пов'язано з тим, що темно-синій колір (#00029a) вважається прозорим і не виводиться. Якщо вас не влаштовує саме цей колір, можна його поміняти, просто задавши інше значення змінної transparent_color.

2.5.Звук

На жаль, формат звукових файлів теж накладено обмеження - weaver програє лише файли формату Ogg Vorbis. Для відтворення звуків є дві функції: play_music() і play_sound(). Різниця між ними в тому, що play_music() повторюватиме музику доти, доки не буде викликана функція stop_music(). Функція play_sound() програє музичний файл лише один раз і керувати відтворенням цієї функції ми не в змозі. Очевидно, що play_music() краще використовуватиме відтворення звукового фону гри, а play_sound() для відтворення звукових ефектів.

Спробуємо відтворити звук. Для play_sound() файл повинен розташовуватись у директорії sound, а для play_music() у директорії music відповідно.

Додамо перед головним циклом:

play_sound("sound.ogg");

Потім, як завжди, зберемо і запустимо гру. Et voilà, чути звук пострілів.

2.6.Визначення зіткнень

Для визначення зіткнень між об'єктами служить набір функцій, що має назву префікс collision_* . Використовувати їх так само легко, як і все інше. Для прикладу створимо два прямокутники:

rectangle rect1, rect2;

rect1.x=rect1.y=50;

rect1.w=rect1.z=25;

rect2.x=rect2.y=150;

rect2.w=rect2.z=50;

Один з них рухатиметься:

if (keyboard)

Rect1.x-=10;

if (keyboard)

Rect1.x+=10;

if (keyboard)

Rect1.y-=10;

if (keyboard)

Rect1.y+=10;

І фінальна частина, перевірка на зіткнення та реакція на це:

if (collision_rectangle_rectangle(&rect1, &rect2))

Break;

Звичайно, що для наочності слід відображати наші прямокутники на екрані.

Тепер ми знаємо, щоб спробувати написати власну невелику гру. Це буде дуже спрощений Маріо без перешкод, але з ворогами.

Почнемо!

3.1. Проект називатиметься YAM (Yet Another Mario)

weaver yam

Це все добре, але з чого почати? Для початку непогано було б вигадати інтерфейс гри, потім знайти необхідні ресурси для графічного оформлення гри. Що це? Це можуть бути спрайти персонажів, фоновий малюнок, палітра букв.

Про інтерфейс. Його у нас не буде, по суті гра буде одним коротким рівнем, пройти його потрібно буде з однієї спроби.

Тепер про спрайти. Докладніше про них ви можете почитати у Вікіпедії. Є велика кількість сайтів, де можна знайти як скрипнуті з ігор спрайти, так і авторські, зроблені «за мотивами». Нам потрібні як мінімум два типи спрайтів, для Маріо та для його супротивника. Погуглив, я знайшов кілька сайтів з базами даних спрайтів, на одному з них спрайти були розміщені в єдиному зображенні, на іншому надавалися окремими картинками. Виберемо де вони розбиті, це нам знадобиться для зручнішого створення анімації персонажів.

3.2. Так як ми бажаємо, щоб при натисканні на клавішу руху переміщалася не просто статична картинка, а була хоч якась подоба руху, нам потрібно анімувати персонажів. Робиться це з допомогою низки схожих зображень, де розбіжності лише у деталях.

У нас є 3 види спрайт для анімації Маріо.

Принцип анімації, я думаю вам знайомий, це просто послідовне зображення кількох картинок.

Створюємо структуру, де зберігатимемо дані про персонажа:

struct character(

Surface * FC;

Int x;

Int y;);

Ініціалізуємо змінну для Маріо:

Mario.x=mario.y=100;

Mario.fc=new_image("mw1.png");

Mario.fc=new_image("mw2.png");

Mario.fc=new_image("mw3.png");

Ну і нарешті навіщо анімацію персонажа, але так як екран оновлюється кожні 0.01 секунди, то зображення змінюватимуться дуже часто. Це можна виправити або зменшивши значення FPS, передавши функції weaver_rest() значення більше поточного, або використовуючи лічильник кадрів, який буде вирішувати, який спрайт буде відображатися в даному кадрі. Будемо використовувати метод із лічильником.

Перед головним циклом створимо змінну counter, яка і буде лічильником

int counter = 0;

А в головному циклі буде перевірка лічильника і в залежності від його значення буде малюватись той чи інший спрайт анімації:

If (counter<=10){

Counter++;

If (counter>10 && counter<=20){

Draw_surface(mario.fc, window, mario.x, mario.y);

Counter++;

If (counter>20 && counter<=29){

Draw_surface(mario.fc, window, mario.x, mario.y);

Counter++;

If (counter>29)

Counter = 0;

Готово, можна збирати проект та запускати.

Так само анімуємо і противника Маріо.

Тепер, щоб Маріо мала хоч якусь можливість перемогти, реалізуємо можливість його стрибка. З цим все просто при натисканні на клавішу змінюється значення координат по вертикалі.

Після цього можна почати обробляти зіткнення Маріо та його супротивника. Для цього додамо до структур, що описують персонажа гри, прямокутник, за перетином яких і відстежуватимемо.

Тепер структура виглядає так:

struct character(

Surface * FC;

Int x;

Int y;

Rectangle col_det;);

Задаємо базові значення для персонажів (в принципі це і не потрібно, тому що в головному циклі вони все-одно оновляться), додаємо пару рядків для прив'язки прямокутників до координат спрайтів. Для наочності змусимо на деякий час прямокутники будуть відображатись червоним кольором, це ми приберемо в самому кінці. Запускаємо і дивимося, що вийшло.

Тепер можна приступити і до реалізації відповіді на перетин прямокутників, для цього ми використовуємо вже знайому функцію collsion_rectangle_rectangle():

if (collision_rectangle_rectangle(&mario.col_det, &bowser.col_det))

Break;

Ось і все, при зіткненні персонажів гра завершуватиметься. Легко і просто.

3.3. Залишилося додати останні штрихи до гри, тобто. фон та звукові ефекти

Для додавання звукових ефектів та фонової музики скористаємося функціями play_music()/stop_music() та play_sound().

Управління просте - стрілка вліво - стрілка вправо - рух, стрілка вгору - стрибок

Ось і готова наша убога пародія на чудову гру. Якщо виникне бажання, можете додати хмари, кущі, та й, звичайно ж, грибочки.

Як бачите, написати гру, використовуючи лише Сі досить легко, набагато важче зробити це добре.

Насамкінець невеликий список корисних посилань

http://weaver.nongnu.org / - Веб сайт фреймворку Weaver, там ви знайдете як докладну документацію, так і приклади коду.

Якщо ви бажаєте повторити приклади зі статті – ось посилання на архів із вихідними текстами нашої гри:http://narod.ru/disk/16196657001/yam.tar.gz.html.

118.0 Kb новий

2D-гра написана на JavaScript ES6 HTML5, 17-рівень.

Надіслав: xAtom | JavaScript | Будь-яка ОС

  • Змійка(WinAPI) 255.8 Kb

    Гра 2D, написана на WinAPI, серед CodeBlocks 17.12(unicode) на C++14.

    Надіслав: xAtom | Visual C++ Windows NT/2000/XP/Vista/7

  • xzGame - хрестики нуліки 3.9 Kb

    хрестики нуліки зі смаком))
    самі побачите обов'язково прочитаєте тхт файл

    [email protected]
    з будь-якого питання

    Надіслав: kalandar | C/C++ | Windows NT/2000/XP/Vista/7

  • 501

    Приклад простий Raycast графіки з можливістю переміщення картою, і обертання камери, на асемблері компілятор FASM, працює у реальному режимі. Використовується 13h відео режим BIOS 320х200, 256 колірний режим.

    Використовуються переривання BIOS
    - INT 10h
    - INT 16h

    Можливості графічної оболонки:
    - Заливання екрану
    - Малювання спрайтів
    - Малювання прямокутників (простих ліній)
    Особливості графічної оболонки
    - Невелика вага, простота
    - Використання відео буфера для створення кадру

    У цій версії можна обертати камеру, малювання сцени відбувається за рахунок кидання променя, чим промінь довше тим перешкода далі, чим вона далі тим менше.

    Плюси цього вихідника:
    - Майже повністю робочий raycast
    - Можливість обертання камери
    -Можливість переміщення у просторі.
    Мінуси:
    - Низька продуктивність потрібна оптимізація

    Вихідник гри (source):
    http://catcut.net/CAPB
    Канал ютуб:
    https://www.youtube.com/ТипаПрограміст
    Сайт проекту:
    http://neosoft.pp.ua

    Надіслав: Типу Програміст | Assembler | Будь-яка ОС

  • Вихідники програми ConfigIL2 5265.1 Kb

    Вихідники програми налаштування параметрів гри Ил-2. Мова програмування VB6. В архіві всі необхідні файли та ресурси, у тому числі бібліотеки, що підключаються.

    Надіслав: Alik044 | Visial Basic | Windows NT/2000/XP/Vista/7

  • City Race 12255.4 Kb

    Гра якихось даунів із команди Gravity Games, гра не дуже, вся баганута. У цій 2Д гонці є пошкодження машин, турбо тощо. Гра створена на Construct 2.

    Надіслав: adminds | документ | Будь-яка ОС

  • Гусеничний робот 1637.6 Kb

    2D-гра Гусеничний робот, 12-рівнева гра створена в середовищі Eclipse для Android.

    Надіслав: xAtom | Java | Інша ОС

  • Асемблер клітинний автомат, гра 501

    Клітинний автомат або гра "життя" на асемблері, компілятор FASM, працює в реальному режимі. Використовується 13h відео режим BIOS 320х200, 256 колірний режим. Цей код працює на голому залізі в реальному режимі.


    http://catcut.net/tihx


    http://catcut.net/7Nqw

    [email protected]

    Сайт проекту:
    http://neosoft.pp.ua

    Надіслав: Типу Програміст | Assembler | Будь-яка ОС

  • Асемблер гра шашки 501

    Заготівля для створення гри шашки на асемблері, компілятор FASM працює в реальному режимі. Використовується 13h відео режим BIOS 320х200, 256 колірний режим.
    У цьому вихіднику немає умов перемоги, поразки, а також немає дамок.

    Для керування:
    W, S, D, A - Переміщення по полю гри.
    Enter - Вибрати шашку, після чого знову в тій клітці куди вона повинна бути схожою.

    Вихідник можна завантажити тут:
    http://catcut.net/5ZGy
    Також є канал проекту, де іноді з'являються відео, вихідники нових програм:
    https://www.youtube.com/channel/UCTVn_Azy0WTDGAh7OYNReJg?view_as=subscriber

    І так канал має свій сервер з вихідними, де в основному вихідники на асемблері (майже всі сміття), а також є на С++, операційна система на Сі, і програма на Паскалі:
    http://catcut.net/7Nqw
    За бажання додати свій вихідник на сервер, пишіть мені на пошту:
    [email protected]
    (Так та анонімність не мій коник...)

    Сайт проекту:
    http://neosoft.pp.ua

    Надіслав: Типу Програміст | Assembler | Будь-яка ОС

  • Пригода кульки 1537.6 Kb

    2D-гра Пригода кульки, 25 рівнів. Для Android гра створена за допомогою Eclipse.

    Надіслав: xAtom | Java | Інша ОС

  • Проста гра на асемблері, хто витягне сірник останнім. 501

    Проста гра на двох програє той, хто тягне сірник останнім.
    (Гра проста, але перевага, можливий її запуск без ОС)

    Вихідник можна завантажити тут:
    http://catcut.net/YMqw
    Також є канал проекту, де іноді з'являються відео, вихідники нових програм:
    https://www.youtube.com/channel/UCTVn_Azy0WTDGAh7OYNReJg?view_as=subscriber

    І так канал має свій сервер з вихідними, де в основному вихідники на асемблері (майже всі сміття), а також є на С++, операційна система на Сі, і програма на Паскалі:
    http://catcut.net/7Nqw
    За бажання додати свій вихідник на сервер, пишіть мені на пошту:
    [email protected]
    (Так та анонімність не мій коник...)

    Надіслав: Типу Програміст | Assembler | Інша ОС

  • Проста графічна гра на асемблері. 501

    Проста гра на асемблері, компілятор FASM працює в реальному режимі. Використовується 13h відео режим BIOS 320х200, 256 колірний режим. Примітивна колізія шириною, висотою.

    Суть гри не дати потрапити кометам у ваш космічний корабель, для цього ви можете рухатися тільки вліво або вправо, до рамок, згодом гра прискорюється, гра продовжується доки гравець не програє.

    Вихідник можна завантажити тут:
    http://catcut.net/KMqw

    Також є канал проекту, де іноді з'являються відео, вихідники нових програм:
    https://www.youtube.com/channel/UCTVn_Azy0WTDGAh7OYNReJg?view_as=subscriber

    І так канал має свій сервер з вихідними, де в основному вихідники на асемблері (майже всі сміття), а також є на С++, операційна система на Сі, і програма на Паскалі:
    http://catcut.net/7Nqw
    За бажання додати свій вихідник на сервер, пишіть мені на пошту:
    [email protected]
    (Так та анонімність не мій коник...)

  • Відеоігри протягом уже понад 30 років активно розвиваються, починаючи від геймплею та графічних можливостей, аж до просунутих систем штучного інтелекту та сприйняття користувачами матеріалу, що подається розробниками. Кіберспорт, у свою чергу, є повноцінним видом спорту з багатомільйонними призами та мільярдними оборотами. А сама індустрія відеоігор невпинно набирає обертів, будучи однією з найбільш касових та масових відгалужень сфери розваг. А до всього цього людство прийшло від найпримітивнішої реалізації «тенісу», яка запускалася на осцилографі.


    Я, як першокурсник, вирішив у рамках вивчення базових консольних можливостей C/C++ можливо запрограмувати "класичну" ASCII-гру, що вимагає від гравця швидкості мислення, безперервної взаємодії з грою, а також має нескладну графічну частину, яку гравець міг би інтерпретувати в певну подобу тривимірного зображення.


    Незважаючи на візуальну примітивність подібних рішень, вони безумовно викликають у гравців ностальгію з олдскульних ігор.

    Натхнення

    На зорі появи на ринку мобільних телефонів з монохромними дисплеями виділилася гра "Space Impact", що прошивається в апаратах Nokia. Вона чудово вписалася в обмежені можливості тодішніх стільникових. Після введення простих ігор у мобільні телефони – продаж апаратів різко зріс, а мобільний геймінг поступово став популярним, і зараз цілком конкурує з індустрією «дорослих» ААА-проектів.


    «Space Impact» і послужила основою для моєї першої гри через свою легкість виконання та популярність на початку 2000-х.

    Особливості «Space Invader»

    Насамперед – легковажність програми. Виконуваний файл займає менше 100 кб і працюватиме, як задумано, практично на будь-якому комп'ютері під OC Windows з Visual C++.


    По-друге, переносимість - вихідний код можна за кілька хвилин переробити під POSIX-системи, тим самим забезпечивши працездатність на UNIX та Mac операційних системах, лише замінивши кілька функцій та перезібравши програму на відповідному компіляторі.


    Третя перевага – програма портативна, не вимагає жодних додаткових файлів. Усі додаткові файли при необхідності створюються автоматично в каталозі місцезнаходження файлу, що виконується.


    Найпростіший інтуїтивно зрозумілий інтерфейс, що не вимагає опису або інструкцій щодо використання.


    • Підпункт "Нова гра" - запускає новий ігровий сеанс.
    • Підпункт «Продовжити» - завантажує останню збережену гру з бінарного файлу в директорії файлу, що виконується, і запускає ігровий сеанс з використанням отриманих даних.
  • Пункт «Допомога» - інструкції по роботі з програмою та її опис. Перегортаються по натисканню стрілок на клавіатурі.
  • Пункт «Зал слави» - список лідерів ігрових сесій, завантажується з бінарного файлу в директорії файлу і форматовано виводиться в консоль.
  • Пункт «Вихід» – вихід із програми.
  • «Світ», що зсувається вліво, з динамічною швидкістю. «Світ» містить рандомні поля зверху та знизу завтовшки 1 або 2 символи. Також між полями рандомно з'являється "космічний сміття", що відображається символом "¤", що є перешкодою для гравця.
  • Притиснутий до лівого краю вікна космічний корабель. Корабель зміщується за допомогою стрілок на клавіатурі вгору і вниз, після натискання пропуску випускає снаряд, що знищує «космічний сміття» по дотику.
  • «Приладова панель» вгорі консолі, що відображає пройдений кілометраж, поточну швидкість і кількість спроб, що залишилися.
  • Як працює Space Invader?

    Під час запуску програми виникає заставка-анімація. Вона складається з шести заздалегідь відформатованих символьних масивів, що змінюються через кожні 200мс.


    Початкова заставка – підсумковий слайд


    Далі йде звернення до функції головного меню з параметром 1(ціле число). Функція відображає меню з виділеними кутовими дужками пунктом меню, номер якого збігається з вхідним параметром. Пунктів у меню 4 відповідно вхідний параметр може відрізнятися від 1 до 4. При натисканні стрілки вниз відбувається рекурсивне поводження з інкрементованим вхідним параметром у тому випадку, якщо вхідний параметр менше 4, з параметром 1, якщо вхідний параметр дорівнює 4. При натисканні Space або Enter відбувається звернення до функції, що відповідає виділеному пункту меню.


    void StartMenu(int switcher) ( system("cls"); switch (switcher) ( case 1: cout<< "\n\n\n << ИГРАТЬ! >> << "\n\n\n ИГРАТЬ!\n\n << ПОМОЩЬ! >> << "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n << ЗАЛ СЛАВЫ >> << "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n ЗАЛ СЛАВЫ\n\n << ВЫХОД >>"; break; ) int choice = _getch(); if (choice == 224) choice = _getch(); if (choice == 72) if (switcher != 1) StartMenu(switcher - 1); else StartMenu( 4), if (choice == 80) if (switcher != 4) StartMenu(switcher + 1); else StartMenu(1); if (choice == 13 || choice == 32) ) GameMenu(1); if (switcher == 2) Help(0); if (switcher == 3)


    Головне меню (вхід у функцію виконано з параметром 1)


    При зверненні до функції, що відповідає пункту «Гра», запускається функція, аналогічна за функціоналом, але вибір є тільки з 2-х пунктів. Відповідно, вхідний параметр буде 1 або 2, і при натисканні будь-якої зі стрілок (вгору або вниз) нам необхідно лише змінити цифру на протилежну. Найбільш оптимізованим буде варіант забирання вхідного параметра від 3 (3 – 1 = 2, 3 – 2 = 1).


    void GameMenu(int switcher) (system("cls"); if (switcher == 1) cout<< "\n\n\n\n\n << НОВАЯ ИГРА! >> << "\n\n\n\n\n НОВАЯ ИГРА!\n\n << ПРОДОЛЖИТЬ! >>"; int choice = _getch(); if (choice == 224) choice = _getch(); if (choice == 72 || choice == 80) GameMenu(3 - switcher); if (choice == 27) StartMenu(1); if (choice == 13 || choice == 32) Game(switcher);


    Додаткове меню (вхід у функцію виконано з параметром 1)


    Тепер до основного процесу гри. При виборі підпункту "Нова гра" - запускається новий ігровий сеанс. Створюється двовимірний масив розмірністю 14 рядків на 50 стовпців. Перший рядок виділяється під панель приладів. Перший прилад – кількість пройдених кілометрів, вона дорівнює кількості оновлень консолі (спочатку консоль оновлюється раз на 80мс, з кожним оновленням цей параметр декрементується, доки досягне значення 25).


    int odometerBuf = odometer, odometerDigitLength; for (odometerDigitLength = 0; odometerBuf != 0; odometerBuf /= 10, odometerDigitLength++);//обчислення кількості цифр на одометрі for (int i = odometerDigitLength, odometerBuf = odometer; i >= 0; i--, s = odometerBuf % 10 + "0", odometerBuf /= 10); // промальовування одометра на приладову панель scr = "К"; scr = "М";//дописування "КМ" odometer++;//нарощення одометра

    Другий прилад, поточна швидкість, є формулою - 1000/швидкість оновлення консолі. Швидкість вимірюється за кілометри на секунду. Таким чином, спочатку корабель рухається зі швидкістю 12км/с і через деякий час досягає позначки в 40 км/с.


    speed = 1000 / timer; // оновлення спідометра int speedBuf = speed; for (int i = 42; speed != 0; i--, scr[i] = speed % 10 + "0", speed /= 10); // промальовування спідометра на приладову панель scr = "К"; scr = "М"; scr = "/"; scr = "С"; / / Дописування "КМ / С"

    Третій прилад відображає кількість спроб, що залишилися, спочатку їх 3. Спроби відображаються символом «&».


    for (int i = 50; lifes > 0; i--, lifes--, scr[i] = "&");


    Панель приладів на початку ігрового сеансу


    Наступні 2 рядки, як і останні 2 – поля гри. Декорації полів вибираються випадковим чином, можуть складатися з 3 символів або пробілу. Крайні рядки завжди повністю заповнені, а другий та передостанній містить символи, відмінні від пробілу лише в тих місцях, де ці символи «ростуть» з інших.


    char borderSymbols = ("†", "‡", "¤", ""); for (int aboveBelow = 0; aboveBelow< 50; aboveBelow++)//прорисовка верхнего и нижнего полей (2 + 2) { scr = borderSymbols; if (scr == "‡") scr = "¤"; scr = borderSymbols; if (scr == "‡") scr = "¤"; }


    Приладова панель та поля на початку ігрового сеансу


    У центральному рядку ігрового простору, притиснутим до лівого краю, промальовується космічний корабель, яким належить керувати гравцю.


    scr = "\"; scr = "\"; // промальовування корабля scr = "3"; scr = "="; scr = "="; scr = "/"; scr = "/";

    Управляти ним можна стрілками вгору та вниз.


    if (_kbhit())//якщо клавіша була натиснута ( control = _getch(); // змінна прийме її значення if (control == 224) control = _getch(); ) if (control == 72) // корабля вгору if (scr == "\" || scr == "\\" && scr == "¤" || scr == "\\" && scr == "¤")//якщо корабель врізався в верхнє поле - гра закінчена if (lifes > 1) ( cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 2; i < 13; i++)//корабль смещается на элемент выше for (int j = 0; j < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos--; } if (control == 80)//при движении корабля вниз if (scr == "/" || scr == "/" && scr == "¤" || scr == "/" && scr == "¤")//если корабль врезался в нижнее поле - игра окончена if (lifes >1) (cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 12; i > < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos++; }


    Розташування корабля при дворазовому натисканні стрілки вгору


    Відійшовши від візуалізації, варто відзначити, що разом з кораблем ми зміщуємо вгору або вниз елемент масиву, який відповідає за "дуло" корабля. Відповідно, з якого можна випускати снаряди після натискання пробілу.


    Проте, ні поле, ні снаряди не рухаються, тому, щоб «оживити» ігровий процес, після закінчення таймера перемальовки екрану «світ» зміщуватиметься однією стовпець вліво, а снаряди однією стовпець вправо. Корабель залишається на місці, поки гравець не захоче іншого. Але після перемальовування тепер виникає один порожній стовпець – заповнимо його випадковим чином полями та «космічним сміттям», яке можна збивати снарядами чи бічними відбійниками корабля.


    for (int i = 1; i< 14; i++)//все "космические" элементы смещаются на элемент влево for (int j = 0; j < 49; j++) { if (scr[i][j] == "\\" && scr[i] == "¤" || scr[i][j] == "=" && scr[i] == "¤" || scr[i][j] == "/" && scr[i] == "¤") if (lifes >1) (cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); if (scr[i][j] != "3" && scr[i][j] != "\\" && scr[i][j] != "=" && scr[i][j] != "/" && scr[i][j] != "-" && scr[i] != "-") scr[i][j] = scr[i]; if (scr[i][j] == "¤") scr[i] = " "; } for (int i = 1; i < 14; i++)//все снаряды смещаются на элемент вправо for (int j = 48; j > < 12; i++)//рандомное появление космического мусора { if (rand() % 10 == 1) scr[i] = "¤"; }

    Під час руху корабля вгору чи вниз у цей момент космічний сміття буде знищений без шкоди кораблю, все завдяки відбійникам



    Якщо в даний момент не ухилитись від сміття стрілкою вниз – корабель буде розбитий


    Снаряди, що випускаються кораблем, сконструйовані так, що змітають усе на шляху свого прямування. Отже, випустивши один снаряд, коридор розчищається в один рядок.


    Втім, хоч поля складаються з матеріалів, схожих на космічний сміття, їх не можна зруйнувати відбійниками. Дотик будь-якої частини корабля з полями призводить до неминучого краху. Так само, як і потрапляння космічного сміття до лицьової частини корабля. Якщо в такі моменти на панелі приладів є позначення ще хоча б однієї «спроби» - гра ніби починається спочатку, але зберігши набраний рахунок і втративши одну «спробу». Швидкість скидається до початкового значення 12км/с.


    Якщо ж гравець «розбився», а спроб не залишилося – ігровий сеанс закінчується, а гравцеві пропонується запровадити його ім'я, щоб зберегти свій результат у «залі слави».



    Пропозиція гравцеві ввести ім'я, щоб зберегти свій результат у «залі слави»


    Додаток обробляє 2 файли:

    • TopChart.bin - двійковий файл для зберігання таблиці лідерів. Дані зберігаються у структурах (нік гравця, його рахунок, дата завершення ігрового сеансу). Дані записуються в кінець файлу при закінченні гри. Під час виклику пункту "Зал слави" файл відкривається для читання з можливістю редагування. Далі оголошується динамічний масив структур, який переписуються дані з файлу, після чого масив сортується і форматовано виводиться в консоль (максимально можливе число результатів – 12, якщо масив містить 13 результатів – останній відкидається після сортування). Далі файл перезаписується масивом структур результатів, після чого масив знищується.
    • "CurrentSave.bin" - двійковий файл для зберігання збереженої гри. Викликається для читання під час запуску підпункту «Продовжити» пункту «Гра». Може містити дані для відновлення одного незавершеного ігрового сеансу: номер рядка, в якому міститься ніс корабля, кількість пройдених кілометрів, кількість спроб, що залишилися, розташування об'єктів на екрані. За допомогою цих даних формується ігровий сеанс, який точно повторює незавершений. Щоб уникнути нечесної гри, під час завантаження сеансу з файлу – файл видаляється. При натисканні Escape під час гри файл створюється, і в нього записуються всі необхідні дані для успішного подальшого продовження ігрового сеансу.

    Пункт головного меню "Допомога" - функція, що приймає параметр від 0 до 22, що відображає наступні 12 рядків по 50 символів від вхідного параметра. Управління здійснюється рекурсивно за допомогою стрілок вгору та вниз.


    void Help(int switcher) (system("cls"); cout<< "ПРОКРУТКА: СТРЕЛКИ ВВЕРХ/ВНИЗ | ВЕРНУТЬСЯ: ESCAPE\n"; char arr = { " УПРАВЛЕНИЕ В МЕНЮ Передвигаться по пунктам – СТРЕЛКИ ВВЕРХ/ВНИЗ Выбрать пункт – ПРОБЕЛ или ENTER Вернуться в предыдущее меню – ESCAPE УПРАВЛЕНИЕ В ИГРЕ Передвигаться вверх/вниз – СТРЕЛКИ ВВЕРХ/ВНИЗ Сделать выстрел – ПРОБЕЛ Вернуться в меню, сохранив игру – ESCAPE БРИФИНГ Вы – пилот космического корабля, попавшего в космическую бурю. Вам необходимо не разбиться и пролететь как можно большее расстояние. Корабль оборудован динамическим управлением. Чем быстрее вы летите – тем острее поворачивает судно. Корабльавтоматически постепенно разгоняется до 40 км/с. Вы можете сбивать космический мусор с помощью магнитной пушки, встроенной в судно, а также боковыми отбойниками. При управлении кораблем на щитке приборов отображается пройденная дистанция, текущая скорость и количество оставшихся «ячеек отката» (отображаются символом «&»), изначально их 3. Если решите прекратить игру – просто нажмите ESCAPE. Игра сохранится, и вы сможете ее продолжить даже после перезапуска приложения с помощью пункта «ПРОДОЛЖИТЬ!». В главном меню можно посмотреть таблицу почетных пилотов. Добейтесь своего права там оказаться! АВТОРСТВО Svjatoslav Laskov – AUTHOR Igor Marchenko – COACH National Technical University «Kharkiv Polytechnic Institute» 2016" }; for (int i = 0, buf = switcher; i < 13; i++) { for (int j = buf * 50; j < buf * 50 + 50; j++) cout << arr[j]; if (i != 12) cout << endl; buf++; } int controller = _getch();//получить значение нажатой клавиши if (controller == 224)//если была нажата стрелка controller = _getch();//то определить какая именно if (controller == 72)//если стрелка вверх if (switcher > < 22) Help(switcher + 1); else Help(22); if (controller == 27)//если Escape StartMenu(2); }

    Пункт головного меню "Вихід" - здійснює вихід із програми.


    Інструкція користувача

    УПРАВЛІННЯ В МЕНЮ
    o Пересуватися по пунктах – СТРІЛКИ ВВЕРХ/ВНИЗ
    o Вибрати пункт – ПРОБІЛ або ENTER
    o Повернутися до попереднього меню – ESCAPE
    УПРАВЛІННЯ В ГРІ
    o Пересуватися вгору/вниз – СТРІЛКИ ВВЕРХ/ВНИЗ
    o Зробити постріл – ПРОБІЛ
    o Повернутися до меню, зберігши гру – ESCAPE
    БРИФІНГ
    Ви - пілот космічного корабля, який потрапив у космічну бурю. Вам необхідно не розбитися і пролетіти якнайбільшу відстань.


    Корабель обладнаний динамічним керуванням. Чим швидше ви летитьте – тим гостріше повертає судно. Корабель автоматично поступово розганяється до 40 км/сек.


    Ви можете збивати космічний сміття за допомогою магнітної гармати, вбудованої в судно, а також бічними відбійниками.
    При керуванні кораблем на щитку приладів відображається пройдена дистанція, поточна швидкість і кількість «комірок відкату», що залишилися (відображаються символом «&»), спочатку їх 3.


    Якщо вирішите припинити гру, просто натисніть ESCAPE. Гра збережеться, і ви зможете її продовжити навіть після перезапуску програми за допомогою пункту «ПРОДОВЖИТИ!».


    У головному меню можна переглянути таблицю почесних пілотів. Досягніть свого права там опинитися!

    Підсумок

    Особисто я отримав безліч задоволення від розробки такого дріб'язкового проекту, тим більше, що стандартна консоль призначена для виведення інформації, і ніяк не для ігор. Через це фреймрейт вийшов дуже обмежений незалежно від комп'ютера, на якому програма запускається.


    Хотілося ще розділити додаток на кілька потоків для коректнішої реакції на натискання клавіш користувачем, але треди я реалізую вже в наступному проекті на С++.


    Вихідний код

    #include "conio.h" #include "windows.h" #include "ctime" #include using namespace std; struct player//визначення структури, що зберігає дані про результати будь-якого завершеного ігрового сеансу (char name; int score; int mday; int mon; int year;); struct save//визначення структури, що зберігає дані про незавершений ігровий сеанс ( int weaponPos; int timer; int odometer; int lifes; char scr; ); void ScreenOutput(char scr)//функція поелементного виведення масиву в консоль (system("cls"); for (int i = 0; i< 14; i++) { for (int j = 0; j < 50; j++) cout << scr[i][j]; if (i != 13) cout << endl; } } //блок прототипов функций void StartMenu(int switcher);//функция, вызывающаяся из главного меню, содержит пункты "ИГРА" и "ПРОДОЛЖИТЬ" void GameMenu(int switcher);//функция главного меню void GameStart(char scr, int lifes, int *timer);//функция, определяющая начальный символьный массив при запуске нового игрового сеанса void Game(int var);//функция игровго сеанса void GameOver(int score);//функция, спрашивающая имя игрока, и записывающая его результат в бинарный файл void Help(int switcher);//функция помощи игроку void TopChart();//функция "ЗАЛ СЛАВЫ" - отображает список лидеров void Help(int switcher) { system("cls"); cout << "ПРОКРУТКА: СТРЕЛКИ ВВЕРХ/ВНИЗ | ВЕРНУТЬСЯ: ESCAPE\n"; char arr = { " УПРАВЛЕНИЕ В МЕНЮ Передвигаться по пунктам – СТРЕЛКИ ВВЕРХ/ВНИЗ Выбрать пункт – ПРОБЕЛ или ENTER Вернуться в предыдущее меню – ESCAPE УПРАВЛЕНИЕ В ИГРЕ Передвигаться вверх/вниз – СТРЕЛКИ ВВЕРХ/ВНИЗ Сделать выстрел – ПРОБЕЛ Вернуться в меню, сохранив игру – ESCAPE БРИФИНГ Вы – пилот космического корабля, попавшего в космическую бурю. Вам необходимо не разбиться и пролететь как можно большее расстояние. Корабль оборудован динамическим управлением. Чем быстрее вы летите – тем острее поворачивает судно. Корабльавтоматически постепенно разгоняется до 40 км/с. Вы можете сбивать космический мусор с помощью магнитной пушки, встроенной в судно, а также боковыми отбойниками. При управлении кораблем на щитке приборов отображается пройденная дистанция, текущая скорость и количество оставшихся «ячеек отката» (отображаются символом «&»), изначально их 3. Если решите прекратить игру – просто нажмите ESCAPE. Игра сохранится, и вы сможете ее продолжить даже после перезапуска приложения с помощью пункта «ПРОДОЛЖИТЬ!». В главном меню можно посмотреть таблицу почетных пилотов. Добейтесь своего права там оказаться! АВТОРСТВО Svjatoslav Laskov – AUTHOR Igor Marchenko – COACH National Technical University «Kharkiv Polytechnic Institute» 2016" }; for (int i = 0, buf = switcher; i < 13; i++) { for (int j = buf * 50; j < buf * 50 + 50; j++) cout << arr[j]; if (i != 12) cout << endl; buf++; } int controller = _getch();//получить значение надатой клавиши if (controller == 224)//если была нажата стрелка controller = _getch();//то определить какая именно if (controller == 72)//если стрелка вверх if (switcher >0) Help (switcher - 1); else Help(0); if (controller == 80)//якщо стрілка вниз if (switcher< 22) Help(switcher + 1); else Help(22); if (controller == 27)//если Escape StartMenu(2); } void StartMenu(int switcher) { system("cls"); switch (switcher) { case 1: cout << "\n\n\n << ИГРАТЬ! >>\n\n ДОПОМОГА!\n\n ЗАЛ СЛАВИ\n\n ВИХІД"; break; case 2: cout<< "\n\n\n ИГРАТЬ!\n\n << ПОМОЩЬ! >>\n\n ЗАЛ СЛАВИ\n\n ВИХІД"; break; case 3: cout<< "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n << ЗАЛ СЛАВЫ >>\n\n ВИХІД"; break; case 4: cout<< "\n\n\n ИГРАТЬ!\n\n ПОМОЩЬ!\n\n ЗАЛ СЛАВЫ\n\n << ВЫХОД >>"; break; ) int choice = _getch(); if (choice == 224) choice = _getch(); if (choice == 72) if (switcher != 1) StartMenu(switcher - 1); else StartMenu( 4), if (choice == 80) if (switcher != 4) StartMenu(switcher + 1); else StartMenu(1); if (choice == 13 || choice == 32) ) GameMenu(1); if (switcher == 2) Help(0); if (switcher == 3) TopChart(); system("cls"); if (switcher == 1) cout<< "\n\n\n\n\n << НОВАЯ ИГРА! >>\n\n ПРОДОВЖИТИ!"; else cout<< "\n\n\n\n\n НОВАЯ ИГРА!\n\n << ПРОДОЛЖИТЬ! >>"; int choice = _getch(); if (choice == 224) choice = _getch(); if (choice == 72 || choice == 80) GameMenu(3 - switcher); if (choice == 27) StartMenu(1); if (choice == 13 || choice == 32) Game(switcher);< 14; i++)//очищение от мусора for (int j = 0; j < 50; j++) scr[i][j] = " "; for (int i = 50; lifes >0; i--, lifes--, scr[i] = "&"); *timer = 80; char borderSymbols = ("†", "‡", "¤", ""); for (int aboveBelow = 0; aboveBelow< 50; aboveBelow++)//прорисовка верхнего и нижнего полей (2 + 2) { scr = borderSymbols; if (scr == "‡") scr = "¤"; scr = borderSymbols; if (scr == "‡") scr = "¤"; } scr = "\\"; scr = "\\";//прорисовка корабля scr = "3"; scr = "="; scr = "="; scr = "/"; scr = "/"; } void GameOver(int score) { system("cls"); player newPlayer;//объявляние структуры newPlayer.score = score;//инициализацие поля набранного счета cout << "Поздравляем Вас!\nВы продержались " << score << " километров.\n\n(Пожалуйста, не используйте кириллические символы)\n(Используйте не более 6 символов)\nОставьте свое имя и станьте примером\nдля подражания будущим игрокам: "; cin.getline(newPlayer.name, 7);//инициализацие поля имени time_t timeCur; time(&timeCur); struct tm * timeCurStruct = localtime(&timeCur); newPlayer.mday = timeCurStruct->tm_mday;//ініціалізація дати завершення гри newPlayer.mon = timeCurStruct->tm_mon; newPlayer.year = timeCurStruct->tm_year; FILE *topChart; fopen_s(&topChart, "TopChart.bin", "ab+"); fwrite(&newPlayer, 1, sizeof(player), topChart);//дозапис результату у файл fclose(topChart); TopChart(); ) void TopChart() ( FILE *topChart; fopen_s(&topChart, "TopChart.bin", "rb+"); system("cls"); if (topChart == NULL)//якщо сталася помилка при відкритті файлу ( system( "cls");<< "Нет ни единого результата."; Sleep(1000); system("cls"); cout << "Нет ни единого результата.."; Sleep(1000); system("cls"); cout << "Нет ни единого результата..."; Sleep(1000); cout << "\nНажмите любую клавишу, чтобы вернуться."; _getch(); StartMenu(3); } fseek(topChart, 0L, SEEK_END); int playerAmount = ftell(topChart) / sizeof(player); player *temp = new player; fseek(topChart, 0L, SEEK_SET); for (int i = 0; i < playerAmount; i++)//копирование содержиомого файла в структкры fread(&temp[i], 1, sizeof(player), topChart); fclose(topChart); for (int i = 1; i < playerAmount; i++)//сортировка структур по спаданию итоговых счетов if (temp[i].score >temp.score) (player tempAlone; strcpy(tempAlone.name, temp[i].name); tempAlone.score = temp[i].score; tempAlone.mday = temp[i].mday; tempAlone.mon = temp[ i].mon, tempAlone.year = temp[i].year, strcpy(temp[i].name, temp.name); mday; temp[i].mon = temp.mon; temp[i].year = temp.year; strcpy(temp.name, tempAlone.name); temp.mon = tempAlone.mon; temp.year = tempAlone.year; if (i > 1) i -= 2; else i = 0; ) if (playerAmount > 12) playerAmount = 12; cout<< "№ " << "Имя" << "\t" << "Счет" << "\t" << "Дата" << endl;//вывод таблицы лидеров в консоль for (int i = 0; i < playerAmount; i++) { cout << i + 1 << ")" << "\t" << temp[i].name << "\t" << temp[i].score << "\t"; if (temp[i].mday / 10 == 0) cout << "0" << temp[i].mday; else cout << temp[i].mday; cout << " "; switch (temp[i].mon) { case 0: cout << "января"; break; case 1: cout << "февраля"; break; case 2: cout << "марта"; break; case 3: cout << "апреля"; break; case 4: cout << "мая"; break; case 5: cout << "июня"; break; case 6: cout << "июля"; break; case 7: cout << "августа"; break; case 8: cout << "сентября"; break; case 9: cout << "октября"; break; case 10: cout << "ноября"; break; case 11: cout << "декабря"; break; } cout << " " << 1900 + temp[i].year << endl; } fopen_s(&topChart, "TopChart.bin", "wb+"); for (int i = 0; i < playerAmount; i++)//запись таблицы лидеров в бинарный файл fwrite(&temp[i], 1, sizeof(player), topChart); fclose(topChart); delete temp; _getch(); StartMenu(3); } int main() { setlocale(LC_ALL, "Rus");//задание кодировки system("mode con cols=51 lines=14");//задание размеров окна консоли system("title Space Invader");//задание описания окна консоли system("color 0A");//задание цвета консоли (0-задний фон; А-передний фон) HANDLE hCons = GetStdHandle(STD_OUTPUT_HANDLE);//получение хендла CONSOLE_CURSOR_INFO cursor = { 100, false };//число от 1 до 100 размер курсора в процентах; false\true - видимость SetConsoleCursorInfo(hCons, &cursor);//применение заданных параметров курсора int timer = 200; cout << " (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\";//вступительная заставка Sleep(timer); system("cls"); cout << " \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /";//вступительная заставка Sleep(timer); system("cls"); cout << " / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << " ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << "\n ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n\n\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка Sleep(timer); system("cls"); cout << "\n\n ____ ____ __ ___ ____\n / ___)(_ \\ / _\\ / __)(__)\n \\___ \\) __// \\((__) _)\n (____/(__) \\_/\\_/ \\___)(____)\n __ __ _ _ _ __ ____ ____ ____\n ()((\\/)(\\ / _\\ (\\(__)(_ \\\n)(/ /\\ \\/ // \\) D () _)) /\n (__)\\_)__) \\__/ \\_/\\_/(____/(____)(__\\_)";//вступительная заставка cout << "\a"; Sleep(10 * timer);//задержка заставки StartMenu(1); return 0; } void Game(int var) { int weaponPos;//позиция строки дула в массиве int timer;//задержка между перерисовками экрана int odometer;//количество перерисовок экрана, они же итоговые очки int lifes;//количество жизней char control = "&";//переменная управления кораблем int shotPause = 4;//задержка между выстрелами (указывать на одну перерисовку больше) int speed;//скорость корабля char scr; if (var == 1) { weaponPos = 7;//позиция строки дула в массиве odometer = 1;//количество перерисовок экрана, они же итоговые очки lifes = 3;//количество жизней GameStart(scr, lifes, &timer); } else//при восстановлении игрового сеанса из сохранения { FILE *saveBin; fopen_s(&saveBin, "CurrentSave.bin", "rb"); if (!saveBin) { system("cls"); cout << "Нет сохранения."; Sleep(1000); system("cls"); cout << "Нет сохранения.."; Sleep(1000); system("cls"); cout << "Нет сохранения..."; Sleep(1000); Game(1); } fread(&weaponPos, 1, sizeof(int), saveBin); timer = 80; fread(&odometer, 1, sizeof(int), saveBin); fread(&lifes, 1, sizeof(int), saveBin); fread(&scr, 14 * 50, sizeof(char), saveBin); fclose(saveBin); remove("CurrentSave.bin"); } while (true) { int odometerBuf = odometer, odometerDigitLength; for (odometerDigitLength = 0; odometerBuf != 0; odometerBuf /= 10, odometerDigitLength++);//вычисление количества цифр на одометре for (int i = odometerDigitLength, odometerBuf = odometer; i >= 0; i--, scr[i] = odometerBuf % 10 + "0", odometerBuf /= 10); // промальовування одометра на приладову панель scr = "К"; scr = "М"; // дописування "КМ" odometer++; // нарощення одометра speed = 1000 / timer; for (int i = 42; speed != 0; i--, scr[i] = speed % 10 + "0", speed /= 10); // промальовування спідометра на приладову панель scr = "К"; scr = "М"; scr = "/"; scr = "С";//дописування "КМ/С" if (_kbhit())//якщо клавіша була натиснута ( control = _getch(); // змінна прийме її значення if (control == 224) control = _getch( ); ) if (control == 13 && shotPause == 4 || control == 32 && shotPause == 4)//при натисканні на курок якщо гармата перезаряджена ( scr = "-"; shotPause = 0; ) if (shotPause< 4)//перезарядка shotPause++; if (control == 27)//при выходе { FILE *saveBin; fopen_s(&saveBin, "CurrentSave.bin", "wb"); fwrite(&weaponPos, 1, sizeof(int), saveBin); fwrite(&odometer, 1, sizeof(int), saveBin); fwrite(&lifes, 1, sizeof(int), saveBin); fwrite(&scr, 14 * 50, sizeof(char), saveBin); fclose(saveBin); GameMenu(2); } if (control == 72)//при движении корабля вверх if (scr == "\\" || scr == "\\" && scr == "¤" || scr == "\\" && scr == "¤")//если корабль врезался в верхнее поле - игра окончена if (lifes >1) (cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 2; i < 13; i++)//корабль смещается на элемент выше for (int j = 0; j < 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos--; } if (control == 80)//при движении корабля вниз if (scr == "/" || scr == "/" && scr == "¤" || scr == "/" && scr == "¤")//если корабль врезался в нижнее поле - игра окончена if (lifes >1) (cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); else { for (int i = 12; i >= 2; i--)//корабель зміщується на елемент вниз for (int j = 0; j< 49; j++) if (scr[i][j] == "3" || scr[i][j] == "\\" || scr[i][j] == "=" || scr[i][j] == "/") { scr[j] = scr[i][j]; scr[i][j] = " "; } weaponPos++; } for (int i = 1; i < 14; i++)//все "космические" элементы смещаются на элемент влево for (int j = 0; j < 49; j++) { if (scr[i][j] == "\\" && scr[i] == "¤" || scr[i][j] == "=" && scr[i] == "¤" || scr[i][j] == "/" && scr[i] == "¤") if (lifes >1) (cout<< "\a"; lifes--; weaponPos = 7; GameStart(scr, lifes, &timer); Sleep(1000); } else GameOver(odometer); if (scr[i][j] != "3" && scr[i][j] != "\\" && scr[i][j] != "=" && scr[i][j] != "/" && scr[i][j] != "-" && scr[i] != "-") scr[i][j] = scr[i]; if (scr[i][j] == "¤") scr[i] = " "; } for (int i = 1; i < 14; i++)//все снаряды смещаются на элемент вправо for (int j = 48; j >= 0; j--) if (scr[i][j] == "-") if (j != 48) ( scr[i] = "-"; scr[i][j] = " "; ) else scr [i][j] = ""; char borderSymbols = ("†", "‡", "¤", ""); scr = " ";//рандомне заповнення нових елементів країв scr = borderSymbols; if (scr == "‡") scr = "¤"; scr = ""; scr = borderSymbols; if (scr == "‡") scr = "¤"; for (int i = 3; i< 12; i++)//рандомное появление космического мусора { if (rand() % 10 == 1) scr[i] = "¤"; } ScreenOutput(scr);//вывод экрана if (control != "&")//"обнуление" управляющей переменной control = "&"; if (timer >25) // прискорення корабля timer--; Sleep(timer);// затримка перемальовки))


    Завантажити виконуваний файл.exe можна тут.

    Комп'ютерні ігри – це великий бізнес. Сумарний виторг індустрії відеоігор у США досяг 23,5 мільярдів доларів минулого року, що на 5% більше, ніж у 2014. За кожною великою грою стоять програмісти, які роблять істотний внесок у кінцевий продукт. Звичайно, для створення різних ігор використовують різні мови програмування. У цій статті ми представимо вам кілька найпопулярніших.

    Мова асемблера

    Багато ігор для Sega та Dendy були написані на різних діалектах мови асемблера, включаючи Super Mario Brothers.

    Ігри серії Super Mario були продані тиражем понад 70 мільйонів копій. IGN назвала третину Super Mario Brothers найбільшою грою всіх часів.

    Мова Сі

    Мова Сі досі залишається однією з найпопулярніших мов програмування через свою відносну простоту і чітку структуру. Компанія id Software використала Сі для створення гри Doom, вперше випущеної 1993 року.

    Doom була названа найвпливовішою FPS-грою, ставши прообразом багатьох інших ігор від першої особи та 3D-ігор загалом. За приблизними оцінками Doom набрав близько 10 мільйонів установок 1995 року.

    С++

    Мова С++ використовувався для створення багатьох сучасних операційних систем, софту, ігор та ігрових двигунів. Завдяки його гнучкості, ігри можна відносно нескладно портувати з ПК на консолі та у зворотному напрямку. Однією з найпопулярніших ігор, написаних С++, є World of Warcraft.

    З моменту запуску було продано 14 мільйонів копій. 48% передплатників проживають в азіатському регіоні, 22% із США. На вікі WoW міститься більше 100 000 статей.

    C#

    Розроблений компанією Microsoft у 2000 році, С# став досить популярним серед розробників ігор. Двигун Unity, що широко використовується при створенні ігор для ПК, консолей та мобільних пристроїв, написаний переважно на С#. Одна з найпомітніших ігор у даному класі – Angry Birds.

    Angry Birds знаходиться на третьому місці за популярністю серед усіх ігор для iOS всіх часів, відразу за Candy Crush Saga і Fruit Ninja. Вартість розробки першої версії гри склала близько $140 000, що є дуже скромним числом свого роду. Чотири людини працювали над грою сумарно близько восьми місяців.

    Java

    Java є певною мірою родичем C#. Вони розвиваються під впливом один одного, обидва мають збирачі сміття та об'єктно-орієнтовані. Але Java спочатку позиціонується як платформонезалежна мова, що означає, що він (за задумом) працює абсолютно однаково на всіх пристроях. Історії успішних ігор, написаних на Java, включають RuneScape і Minecraft.

    Альфа-версія гри була створена лише за 6 днів. Minecraft - друга найпопулярніша гра у світі. Спочатку вона називалася Cave Game.

    Хочете знайти більше матеріалів з розробки ігор і, можливо, навіть розробити одну свою? Загляньте в .