Назви великих чисел в idle-іграх



(Прим. пер.: наведені в статті алгоритми належать до назв ступенів тисячі за короткою шкалою.)

Деякий час тому я отримав можливість взяти участь у розробці ігри в жанрі idle. Що ж таке idle-гра? Якщо ви вперше чуєте про це що швидко розвивається жанрі, спробуйте пограти в Adventure Capitalist. На сайті Gamasutra також є кілька статей (1 2 3, 4), дозволяють розглянути жанр трохи глибше.

Одна з проблем, з якою розробник idle-ігри неминуче зіткнеться, — як розмістити всі ці величезні числа на екрані, і, що більш важливо — як гравцеві розібратися в них. У цій статті ми подивимося, як можна переписати дуже довгі числа і рядки, які будуть зручні для гравців. Можна розбити цей процес на дві основні частини:

  1. По-перше, ми представимо число у експоненційної запису. Деякі розробники ігор жанру idle зупиняються на цьому, і схоже, частини гравців це подобається. Wolfram MathWorld є дуже прямолінійний алгоритм переведення числа, його ми і будемо використовувати. Але є і інший підхід, який можна застосовувати, якщо ви віддаєте перевагу погратися з бітами. Я просто згадую його, ми не будемо розглядати в цій статті. Якщо ви хочете використовувати його в своїй грі, погляньте на папку завантаження цієї статті, в якій є простий у використанні скрипт експоненційної запису:

    ScientificNotation.FromDouble(12340000); // .significand == 1.234; .exponent == 7

  2. Знайшовши представлення числа в експоненційної запису, ми можемо підібрати назву для його порядку. Це і буде головним завданням цієї статті.
Скачування вихідного коду
Вихідний код доступний для скачування і готовий до використання в ваших idle-іграх. Використовувати його просто:

LargeNumber.ToString (12340000); // результатом буде "12.34 million"


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



Все це частина набору прикладів коду, який повинен супроводжувати деякі мої статті, написані раніше, в основному з туториалов по роботі з мережею в Unity (1 2 3). Скачивайте приклади коду, щоб перевірити, як вони працюють!

Рядка стандартного числового формату
Числа менше мільйона достатньо малі і не вимагають серйозної обробки. Можна покластися на вбудовані можливості форматування чисел C#, вони зроблять за нас більшу частину роботи:

double x = 987654.321
 
x.ToString ("N2"); // повертає "987,654.32"


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

Латинські префікси до не дуже великих чисел
При роботі з великими числами, що виражаються в мільйонах (millions), більйонах (billions), трильйони (trillions) і так далі, ми знаємо, що назви міняються через кожні три розряди. Маючи число експоненційної запису, ми знаємо, що воно виражається в мільйонах, якщо його порядок від 6 до 8, в більйонах — від 9 до 11, і в трильйонах, якщо показник від 12 до 14, і т. д. В загальному вигляді числа з експоненціальною записом:

M x 10<sup>N</sup>


Нам потрібно висловити N наступним чином:

N = 3(U+1) + V, де V < 3


Тоді кінцевої рядком числа буде:

M*(10^V) Name(U)+"llion"


де Name(U) можна отримати з цієї таблиці латинських префіксів:












U Name(U) 1 mi 2 bi 3 tri 4 quadri 5 quinti 6 sexti 7 septi 8 octi 9 noni
Наприклад, якщо ми обробляємо число 123 000 000 000 000 000 можна висловити його в експоненційної запису так:

1.23 x 10<sup>17</sup>, звідки M = 1.23 і N = 17


Переписуючи N, ми отримуємо:

17 = 3*(4+1) + 2, звідки U = 4 і V = 2


Це означає, що наше число виглядає як:

1.23*(10<sup>2</sup>) Name(4)+"llion"


Спрощуючи, отримуємо:

123 quadrillion


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

Отримавши значення U (прим. пер.: тут і далі у автора написано N, але це явно неправильно), як ми робили це в числах з латинськими префіксами, потрібно розбити його на розряди (одиниці, десятки, сотні), а потім сформулювати назву наступним чином:

(префікс одиниць) + (модифікатор) + (префікс десяток) + (префікс сотень) + (видалення "a" в кінці) + "llion"


Префікси одиниць, десяток і сотень можна взяти з таблицы в статті Вікіпедії. У деяких випадках необхідно додати модифікатор, якщо крім визначених префіксів одиниць ми ставимо префікси десяток або сотень, але в більшості випадків модифікатор не потрібен. Давайте розглянемо кілька прикладів.

Якщо U = 12, то для одиниць цифра буде дорівнює 2, що відповідає «duo», а для десятків — 1, відповідна «deci». При переході від «duo» «deci» модифікатор не потрібен. За наведеною вище формулою ми отримуємо «duodecillion».

Якщо U = 27, для одиниць цифра дорівнює 7 (відповідає «septe»), для десятків — 2 (відповідає «viginti»). Згідно таблиці, перехід від «septe» «viginti» вимагає модифікатора «m». Поєднуючи всі разом, отримуємо «septemvigintillion».

І нарешті, якщо U = 30, то цифра для десятків дорівнює 3, що відповідає «triginta», що має закінчення «». Тому ми відкидаємо її і отримуємо «trigintillion».

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

Файли вихідного коду містять працюючу реалізацію, обробну всі випадки до U = 999. Вона була протестована на всіх назвах, включених у список великих чисел. Я закликаю вас завантажити їх, якщо вам потрібний готовий до використання код, який можна легко вставити у власні проекти, або якщо ви хочете порівняти свою реалізацію з працюючою версією.

А якщо U = 1000?
Тоді число називається миллиллионом (прим. пер.: у довгій шкалою — квингентиллиардом).

Великі числа недостатньо великі
Числа з рухомою комою дозволяють працювати з числами до 10308, або U=101. Якщо у вашій грі потрібні числа більшої величини, то можна спробувати зберігати числа довільною точністю. Таким чином можна зробити гравців миллиллионерами.

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

Чи стане ваша гра цікавіше від виходу за межі чисел подвійної точності? Для деяких ігор відповідь може бути позитивним, але в більшості випадків я раджу вам подумати ще раз про баланс і дизайні гри1, 2, 3 4).

Якщо вам сподобалася стаття, не забудьте завантажити папку з проектом! Сподіваюся, вона буде корисна при розробці вашої власної гри. Спасибі за прочитання!
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.