Kompletne początki z C# - banalne pytania

0

Witam i z gory przepraszam za moje banalne dla wielu pytanie. Postawilem sobie za cel nauczyc sie (lub na poczatek przynajmniej "zalapac") programowania w C# z ksiazek i innych publikacji szerokodostepnych w sieci. Wpadla mi w rece, a raczej w monitor ksiazka Adama Boducha Wstep Do Programowania C# i chcialem o cos zapytac.

Pytanie dotyczy prostej gry zaprezentowanej przez autora, w ktorej komputer losuje liczbe, a dwoje graczy "strzela" odgadujac liczbe czytajac jednoczesnie podpowiedzi komputera czy szukana liczba jest wyzej, czy nizej.

konkretnie chodzi o ten kawalek kodu:

Console.WriteLine(player + ", strzelaj!");
// należy przekonwertować tekst na liczbę
Number = Convert.ToInt32(Console.ReadLine());

pytanie: dlaczego nalezy przekonwertowac tekst na liczbe, jesli juz na poczatku zadeklarowalismy ze Number bedzie liczba?

int Number;

Jest pozno w nocy i moze nie mysle juz zbyt trzezwo :-)

0

Pobierasz z konsoli tekst. Musisz przekonwertować go na inta, bo w zmiennej int możesz przechowywać tylko liczby.... Nie można tak po prostu przypisać innego typu do inta. Idź spać...

0

Co prawda nie znam C#, ale kiedyś pisałem w C++ oraz PHP i wydaje mi się, że:

Skoro zmienną "Number" zadeklarowałeś jako "int", to teraz nie masz wyjścia i możesz w niej zapisywać tylko liczby. Deklaracja jako "int" nie sprawia, że zmienna automatycznie będzie przerabiać wszystko co otrzyma na liczbę. Przeciwnie, tylko liczby będzie przyjmować, a jak nie, to wyskoczy błąd.

Istnieje też coś takiego jak dynamiczne typowanie zmiennych (w przeciwieństwie do statycznego, w którym z góry określasz charakter zmiennej). Nie wiem, jak jest w C#, ale w PHP ono występuje. Wtedy nie deklarujesz "int Number", tylko po prostu "Number", a tak właściwie to "$Number". Taka zmienna automatycznie dostosuje się do materiału, który chcesz w niej zapisać (dasz inta, będzie intem; dasz stringa, to będzie stringiem itd...), ale sama też go nie przerabia (w sumie nawet nie wiadomo na co by miała, bo nie określiłeś w deklaracji). Od tego (zmiany typu zmiennej) nawet w PHP są osobne funkcje.

Przepraszam za miejscami mało profesjonalny język, ale wydaje mi się, że język potoczny ma miejscami większe walory edukacyjne, zwłaszcza w dziale Newbie.

0

Dzieki za obie odpowiedzi. Wszystko co piszecie ma oczywiscie sens, to ja tu czegos nie rozumiem. Napisze moze jak ja to widze.
Zadeklarowalismy na poczatku ze Number bedzie intem. Komunikat konsoli dla grajacego playera bedzie STRZELAJ!. Skoro gracz zna zasady gry to wie, ze musi podac liczbe czyli jak ja to rozumiem inta. Wiec skoro program oczekuje ze do konsoli zostanie wpisana liczba (w innym przypadku gra nie mialaby sensu) to dlaczego musimy mimo wszystko deklarowac konwersje tekstu na liczbe? Wcale nie spodziewamy sie tam przeciez tekstu.
Sorry za taka dociekliwosc szczegolnie wynikajaca z niezrozumienia. Jestem w pracy na nocnej zmianie i to w sumie jedyny czas kiedy moge poswiecic kilka godzin na nauke.

0

program oczekuje ze do konsoli zostanie wpisana liczba (w innym przypadku gra nie mialaby sensu)

Wcale nie spodziewamy sie tam przeciez tekstu.

Nie widziałem reszty kodu, ale być może to nieprawda. Być może program oczekuje właśnie stringa, a nie inta. Ma to taką zaletę, że jeżeli użytkownik wpisze coś innego niż inta (np. przez pomyłkę), to program nie zgłupieje od przypisywania zmiennej liczbowej tekstu. Możesz wtedy sprawdzić jej zawartość przed dalszą obróbką i wyświetlić ładny komunikat o błędzie, ewentualnie poprosić o ponowne wpisanie.

Sorry za taka dociekliwosc szczegolnie wynikajaca z niezrozumienia

Nic się nie stało ;). Przeciwnie, to się chwali. Właśnie tak się nauczysz.

0

Ma to taką zaletę, że jeżeli użytkownik wpisze coś innego niż inta (np. przez pomyłkę), to program nie zgłupieje od przypisywania zmiennej liczbowej tekstu.

I prawdopodobnie o to wlasnie chodzi. To w sumie rozwiewa wszystkie moje dotychczasowe watpliwosci. Dzieki bardzo za odpowiedz i do nastepnego pytania :-)

Ponizej zamieszczam caly kod gry:

 using System;
 
class Program
{
    static void Main(string[] args)
    {
        // imiona graczy
        string player1, player2;
        // gra zakończona (true) czy nie (false)
        bool Done = false;
        // liczba podana przez użytkownika
        int Number;
 
        Console.Write("Podaj imię gracza nr 1:  ");
        player1 = Console.ReadLine();
 
        Console.Write("Podaj imię gracza nr 2:  ");
        player2 = Console.ReadLine();
 
        // tworzenie nowej instancji klasy
        Random RandomObj = new Random();
 
        // wylosowanie liczby z zakresu 0-999
        int X = RandomObj.Next(1000);
 
        // zmienna przechowuje imię gracza, który wykonuje „ruch”
        string player = player1;
 
        while (!Done)
        {
            // zamiana graczy
            player = player == player1 ? player2 : player1;
 
            Console.WriteLine(player + ", strzelaj!");
            // należy przekonwertować tekst na liczbę
            Number = Convert.ToInt32(Console.ReadLine());
 
            if (X > Number)
            {
                Console.WriteLine("Strzelaj wyżej!");
            }
            else if (X < Number)
            {
                Console.WriteLine("Strzelaj niżej!");
            }
            else
            {
                Console.WriteLine("Gratulacje! Wygrał gracz " + player);
                Console.Beep();
 
                Done = true;
            }
        }        
        Console.Read();
    }
}
1

Jak już wspomniałem, w C# nigdy nie pisałem, ale wydaje mi się , że metoda Console.ReadLine() domyślnie zwraca stringa.

0

Masz w 100% racje. Console.ReadLine oczekuje stringa, wlasnie wrocilem do poczatku i doczytalem. Dziekuje jeszcze raz za naprowadzenie.

0

Jeśli mogę się podkleić pod temat.
Ja za to nie rozumiem linijki dot. zamiany graczy. Może mnie ktoś oświecić? 0_o

player = player == player1 ? player2 : player1;

dodanie znacznika <code class="csharp"> - @furious programming

0

To jest taki "cukier skladniowy" i jest rownoznaczny z:

if(player == player1)
{
    player = player2;
}
else
{
    player = player1;
}

wiecej info -> https://msdn.microsoft.com/pl-pl/library/ty67wk28.aspx

0

Ale gracze są rozpoznawani po imieniu więc jeśli wprowadzi się takie same imiona to pomijając że ciężko by było rozróżnić graczy to program nie będzie ich nawet zmieniał

0

Dzięki za odpowiedź.
Pozdrawiam.

1 użytkowników online, w tym zalogowanych: 0, gości: 1