Verse wykorzystuje wartość int
jako typ do przechowywania i obsługi liczb całkowitych. Wartość int
w Verse może zawierać liczbę dodatnią, liczbę ujemną lub zero i nie zawiera żadnego komponentu ułamkowego. Obsługiwane są liczby całkowite z zakresu od -9,223,372,036,854,775,808 do 9,223,372,036,854,775,807 włącznie.
Wstępnie zdefiniowane wartości int
można uwzględnić w kodzie jako literały int
. Literał int
jest w kodzie liczbą całkowitą.
Poniżej przedstawiono przykładowe sposoby tworzenia stałych i zmiennych zawierających liczby całkowite za pomocą literałów int
:
# Ta zmienna nigdy nie ulegnie zmianie, ponieważ jest uniwersalnie poprawna.
AnswerToTheQuestion : int = 42
# Tyle monet kosztuje kołczan strzał i wartość ta nie podlega zmianie:
CoinsPerQuiver : int = 100
# Tyle strzał zawiera kołczan strzał i wartość ta nie podlega zmianie:
ArrowsPerQuiver : int = 15
# Gracz ma obecnie 225 monet i 3 strzały. Te wartości mogą ulec zmianie.
var Coins : int = 225
var Arrows : int = 3
# Gra śledzi całkowitą liczbę zakupów dokonanych przez gracza.
# Jak dotąd, gracz nic nie kupił.
var TotalPurchases : int = 0
Operacje z użyciem typu int
Typ int
obsługuje operacje matematyczne i porównania z innymi liczbami całkowitymi.
Operacje matematyczne
W Verse można użyć czterech podstawowych operacji matematycznych z wykorzystaniem liczb całkowitych: +
do dodawania, -
do odejmowania, *
do mnożenia i /
do dzielenia.
W przypadku liczb całkowitych operator /
jest operatorem zawodnym, a w przypadku powodzenia typ wyniku jego zastosowania to liczba wymierna.
Typ liczby wymiernej (rational) można wykorzystać jako parametr tylko w następujących funkcjach:
Floor()
: Zaokrągla wartość wyrażoną liczbą wymierną w dół do najbliższej liczby całkowitej.Ceil()
: Zaokrągla wartość wyrażoną liczbą wymierną w górę do najbliższej liczby całkowitej.
Poniższy kod wykorzystuje dzielenie liczby całkowitej do ustalenia liczby strzał, jakie gracz może kupić za posiadane monety. W wyrażeniu if
zastosowano dzielenie liczby całkowitej, ponieważ takie dzielenie jest zawodne, więc musi się znajdować w kontekście niepowodzenia:
if (NumberOfQuiversYouCanBuy : int = Floor(Coins / CoinsPerQuiver)):
NumberOfArrowsYouCanBuy : int = NumberOfQuiversYouCanBuy * ArrowsPerQuiver
Można również łączyć operatory podstawowych operacji matematycznych (dodawania, odejmowania i mnożenia) oraz aktualizować wartość zmiennej. Takie połączone operatory działają tak samo, jak przypisanie wyniku do pierwszego operandu operacji matematycznej. W poniższym kodzie wykorzystano wyrażenie matematyczne int
do sprzedaży strzał graczowi w zamian za monety:
# Weź monety od gracza. Jeśli z wyprzedzeniem nie sprawdzi się, czy gracz
# ma dostateczną liczbę monet, wypadkowa liczba jego monet może być ujemna.
set Coins -= CoinsPerQuiver
# Daj graczowi strzały.
set Arrows += ArrowsPerQuiver
# Zalicz to jako zakup. Nie mamy na to zmiennej.
set TotalPurchases += 1
Wartość int
nie obsługuje operatora /=
, ponieważ typem wyniku dzielenia liczby całkowitej jest liczba wymierna, dlatego nie można go przypisać do wartości int
.
Liczby całkowite ze znakiem
Liczba całkowita ze znakiem może przyjmować wartość dodatnią, ujemną lub zerową. Za pomocą operatora -
można utworzyć ujemną liczbę całkowitą. W tym celu trzeba wstawić operator -
przed liczbą całkowitą, np. -3
.
Wstawianie przed liczbą całkowitą operatora +
pozwala wizualnie uporządkować kod, jednak nie powoduje zmiany wartości liczby całkowitej.
# Oto alternatywny sposób sprzedaży strzał graczowi. Pod względem
# funkcjonalnym jest on identyczny z kodem przedstawionym w sekcji Operacje matematyczne powyżej.
set Coins += -CoinsPerQuiver
set Arrows += +ArrowsPerQuiver
set TotalPurchases += +1
Porównanie
Za pomocą zawodnego operatora =
można przetestować, czy dwie liczby całkowite są równe, natomiast zawodny operator <>
pozwala stwierdzić brak równości.
Liczby są uporządkowane, więc za pomocą zawodnego operatora <
można sprawdzić, czy jedna liczba całkowita jest mniejsza od innej liczby całkowitej, a zawodny operator >
pozwala sprawdzić, czy jedna liczba całkowita jest większa od innej liczby całkowitej.
Za pomocą zawodnego operatora <=
można sprawdzić, czy jedna liczba całkowita jest równa innej liczbie całkowitej lub mniejsza, a zawodny operator >=
pozwala sprawdzić, czy jedna liczba całkowita jest równa innej liczbie całkowitej lub większa.
# Sprawdź, czy gracz może sobie pozwolić na ten zakup.
if (Coins >= CoinsPerQuiver):
# Tak, może! Kontynuuj zakup
set Coins -= CoinsPerQuiver
set Arrows += ArrowsPerQuiver
set TotalPurchases += 1
Biblioteka standardowa
Biblioteka standardowa zawiera funkcje, które ułatwiają tworzenie i stosowanie liczb całkowitych oraz często spotykanych konstrukcji i funkcji matematycznych. Więcej szczegółów na temat tych funkcji zawiera sekcja Odwołania do interfejsu API Verse.
Alternatywne reprezentacje liczb całkowitych
Do reprezentacji liczb całkowitych można wykorzystać również system szesnastkowy, którego podstawą jest 16, zamiast systemu dziesiętnego bazującego na podstawie 10. Oznacza to, że wartości szesnastkowe reprezentowane są za pomocą cyfr 0-9
i liter A-F
. Na przykład zapis 0x7F
oznacza to samo, co 127
, za zapis 0xFACE
odpowiada zapisowi 64206
.
Szczegóły dotyczące implementacji
W planowanej aktualizacji wartość int
będzie semantyczną reprezentacją liczby całkowitej dowolnej wielkości, jednak obecnie w Verse wartość int
implementowana jest jako 64-bitowa liczba całkowita ze znakiem. Do czasu wprowadzenia wspomnianej aktualizacji wartość int
musi się mieścić w zakresie [-2^63
, … , -1
, 0
, 1
, … , 2^63 - 1
], a liczby całkowite, w tym wyniki operacji matematycznych, które wykraczają poza ten zakres wielkości wartości int, będą zwracać błąd środowiska uruchomieniowego nazywany przepełnieniem liczby całkowitej.
Choć na chwilę obecną liczby całkowite są objęte wskazanymi ograniczeniami, napisany dzisiaj kod Verse zawierający liczby całkowite pod względem semantycznym będzie taki sam jak wówczas, gdy liczby całkowite będą mogły mieć dowolną dokładność.
Typ możliwy do persystencji
Wartości całkowite mogą być persystentne, co oznacza, że możesz ich użyć w zmiennych weak_map
o zasięgu modułowym i zachować ich wartości podczas sesji gry. Więcej informacji na temat persystencji w Verse znajdziesz w artykule Używanie persystentnych danych w Verse.