Skocz do zawartości
Bljek

C#, split, przypisywanie wartośći

Rekomendowane odpowiedzi

Witajcie!

 

Jako, że gram w RPGi to stwierdziłem, że napiszę sobie program, który będzie mi rolował kości za mnie. Wymyśliłem kod, który odpowiada za losowanie liczby od 1 do X, gdzie X jest dowolną wartością.

 

Chciałbym móc wpisać w konsolę tekst w stylu: 3d8+2d6, i po tym tekście konsola powinna mi zwrócić sumę 3 losowych wartości z przedziału od 1 do 8 i 2 losowych wartości z przedziału 1-6. Udało mi się splitem rozdzielić to na dwie osobne kości i wypluwa mi <3d8> i <2d6>.

 

Pytanie moje jak mógłbym zrobić, aby rozdzielić 3d8 i przypisać 3 do INTa Y i 8 do INTa X?

 

EDIT: Po rozdzieleniu na 3 i 8, chciałbym przypisać INTowi Y wartość 3 a INTowi X wartość 8

 

P.S.

Kod, który nabazgrałem podrzucę jak wrócę do domu. Programowania dopiero się uczę i próbuję sam do wszystkiego dojść, ale tutaj nie mam pojęcia jak to zrobić :(

Edytowane przez Bljek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

C# nie znam ale tak na logikę to te rozdzielone rzuty musisz znowu potraktować splitem, tylko z innym znakiem rozdzielającym.

Schemat masz liczbadliczba, nie powinno to być trudne.

 

W C/C++ do sparsowania stringa na liczbę służyła np. funkcja atoi(). Dla C# na szybko znalazłem int.Parse(string), być może są jeszcze inne metody.

Edytowane przez Bono[UG]

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli udało ci się już rozdzielić poszczególne kostki, to teraz musisz zrobić to samo z "d" pomiędzy wartościami. Używałeś funkcji "Split"?

 

Najłatwiej będzie ci operować na stringach. Użyj wbudowanej w C# funkcji Split, jako argument podaj wartość, która będzie oddzielać poszczególne części, czyli w pierwszym przypadku "+", w drugim "d". Wynik ze Split musisz sobie zapisać w string[], czyli tablicy stringów.

Oczywiście pewnie chcesz umożliwić dodanie dowolnej liczby kostek, więc będziesz musiał sobie też po rozdzieleniu ich zrobić jakąś pętlę w której znów podzielisz string wg. "d" i odczytasz już konkretne wartości. Polecam foreach. :)

 

A i nie zapomnij przekonwertować ostatecznych wartości ze stringów na int. Do tego też masz już stosowne funkcje w C#.

Edytowane przez Isharoth

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Nie doprecyzowałem :D

 

Problem w tym, że nie wiem jak miałbym zrobić, aby liczba przed znakiem rozdzielającym "d" została przypisana jako INT Y a liczba po znaku "d" jako INT X, który później podstawię pod funkcję wyciągającą liczbę i odpowiednio pętle zrobię, aby powtórzyć całość Y razy

 

CustomClass custClass = new CustomClass();

Console.WriteLine("Jakie kości rzucić?");

string dices = Console.ReadLine();

string[] throws = dices.Split("+", System.StringSplitOptions.RemoveEmptyEntries);

 

foreach (var throwing in throws)

{

Console.WriteLine(throws);

string[] rzut = throwing.Split("d", System.StringSplitOptions.RemoveEmptyEntries);

foreach (var rzuty in rzut)

{

int a = Convert.ToInt32(rzuty);

Console.WriteLine(a);

}

}

Edytowane przez Bljek

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Masz rozwiązanie w tym co napisałem, przeczytaj jeszcze raz dokładnie i zastanów się. Polecam zerknąć jak działają tablice (arrays). :)

 

Dobrze jakbyś sam do tego doszedł, ale jak ci się nie uda to poniżej masz rozwiązanie.

 

 

Jak dla mnie to ten drugi foreach nie jest potrzebny, bo do pojedynczej kostki zawsze masz 2 liczby, które od razu możesz wyciągnąć do osobnych zmiennych prosto z listy, która u ciebie nazywa się "rzut". Na upartego też można zrobić to tak, że w drugiej pętli foreach rozdzielisz to do dwóch zmiennych, ale nie ma to zbytnio sensu. :)

 

Edytowane przez Isharoth

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dla potomnych!

 

CustomClass custClass = new CustomClass();

Console.WriteLine("Jakie kości rzucić?");

string dices = Console.ReadLine();

string[] throws = dices.Split("+", System.StringSplitOptions.RemoveEmptyEntries);

 

foreach (var throwing in throws)

{

Console.WriteLine(throws);

string[] rzut = throwing.Split("d", System.StringSplitOptions.RemoveEmptyEntries);

var diceCount = rzut[0];

var diceSides = rzut[1]

 

}

 

Stworzy 2 zmienne: "diceCount", która będzie pierwszą wartością z tablicy "rzut" oraz "diceSides", która będzie drugą wartością z tablicy "rzut".

 

Dzięki za pomoc panowie! :D

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się

  • Ostatnio przeglądający   0 użytkowników

    Brak zarejestrowanych użytkowników przeglądających tę stronę.

×
×
  • Dodaj nową pozycję...