• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

C# Odczytywanie danych z pliku

Object Storage Arubacloud
0 głosów
1,628 wizyt
pytanie zadane 16 kwietnia 2019 w C# przez WojMen Początkujący (330 p.)
edycja 17 kwietnia 2019 przez WojMen

A więc stworzyłem prostę grę i chciałbym dodać do niej top15. Wiem jak zrobić aby zapisać same liczby w pliku i je odczytać, ale nie wiem jak bym miał to połączyć z nickami jakie wymyślą gracze. W skrócie jak odczytać z pliku string i inta w tej samej lini? Czy jest to możliwe lub czy jest na to jakiś inny sposób?

Tutaj kod gry:

Jak znajdziecie coś mogę ulepszyć/poprawić to z góry dziękuje:

using System;
using System.IO;

namespace Gra_0_00
{
    class Program
    {
        //program losujący znaki od 1 do 32
        public static string GuidString(int numOfCharsNeeded)
        {
            return Guid.NewGuid().ToString("n").Substring(0, numOfCharsNeeded);
        }
        //---------------------------------------------------------------------------------
        static void Main(string[] args)
        {
            
           
            //tworzenie timera oraz liczby losowej
            TimeSpan godzinaTeraz1;
            TimeSpan godzinaTeraz2;
            Random rnd = new Random();

            //punkty,rundy,poziom trudnośći,ranking
            
            int points = 0;
            int minDifficult = 1;
            int maxDifficult = 3;
            int time = 5;
            int rounds;
            do
            {
                //Sprawdzanie ile jest miejsc w pliku
                int liczbaLinijek = 0;
                foreach (string line in File.ReadLines("Ranking.txt"))
                {
                    if (line != String.Empty) ++liczbaLinijek;
                }
                int[] ranking = new int[liczbaLinijek + 1];
                //+1 ponieważ to bedzie miejsce dla gracza aktualnego


                for (rounds = 1; ; rounds++)
                {
                    

                    
                    //tworzenie losowej ilosci znakow
                    int numbers = rnd.Next(minDifficult, maxDifficult);
                    Console.Clear();
                    Console.WriteLine("Ile jest znaków?" + " masz {0} sekund na odpowiedź", time);
                    Console.WriteLine(": " + GuidString(numbers));

                    //ilosc czasu na odpowiedz
                    godzinaTeraz1 = DateTime.UtcNow.ToLocalTime().TimeOfDay;
                    Console.Write("\n Ilośc punktów: {0}   |   runda: {1}\n\n: ", points, rounds);
                    //wczytanie zmiennej xDDD

                    char player_wczytanie = Console.ReadKey().KeyChar;
                    string y = player_wczytanie.ToString();
                    int player = int.Parse(y);
                    godzinaTeraz2 = DateTime.UtcNow.ToLocalTime().TimeOfDay; ;

                    //sprawdzanie odpowiedzi
                    if (godzinaTeraz2.TotalSeconds - godzinaTeraz1.TotalSeconds > time)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkRed;
                        Console.WriteLine("\nSkonczył ci się czas");
                        break;
                    }
                    if (player != GuidString(numbers).Length)
                    {
                        Console.ForegroundColor = ConsoleColor.DarkRed;
                        Console.WriteLine("\nNie było tyle znaków");
                        break;
                    }

                    //zwiekszanie punktów,rund i poziomu trudnosci
                    if (minDifficult <= 3) minDifficult++;
                    if (maxDifficult <= 8) maxDifficult++;
                    if (rounds == 3) time--;
                    if (rounds == 6) time--;
                    points += rounds;
                }

                //Wynik
                Console.WriteLine("\n    Wasted\n");
                Console.ForegroundColor = ConsoleColor.Green;
                Console.WriteLine("Zdobyłeś tyle punktów: {0}", points);
                Console.WriteLine("Przetrwałeś aż tyle rund: {0}", rounds);
                Console.ResetColor();

                
                Console.Write("\n Jeśli chcesz zobaczyć ranking napisz r/lub\n kliknij enter aby zagrac jeszcze raz: ");
                string x = Console.ReadLine();
                if (x == "r")
                {
                    Ranking(points, ranking);
                    Console.ReadKey();
                }
                Console.ResetColor();

            } while (true);
        }
        
        static void Ranking(int rank, int[] ranking)
        {
            //zapisywanie do pliku punktow gracza
            try
            {
                using (StreamWriter file = new StreamWriter("Ranking.txt", true))
                {
                    file.WriteLine(rank);
                }
                using (StreamReader file = new StreamReader("Ranking.txt"))
                {
                    //zapisywanie do tablicy punktow
                    string line;
                    int i = 0;
                    while ((line = file.ReadLine()) != null)
                    {
                        ranking[i] = int.Parse(line);
                        i++;
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(e.Message);
            }
            //Sortowanie rankingu
            Array.Sort(ranking);
            Array.Reverse(ranking);
            
            //Sprawdzanie ktore ma miejsce gracz
            int miejsceWRankingu = 0;
            while (rank != ranking[miejsceWRankingu])
            {
                miejsceWRankingu++;
            }
            //Wypisywanie wynikow
            
            for (int i = 0; i < 15; i++)
            {
                if (i == miejsceWRankingu)
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("      Ty Miejsce: {0}  Punkty:{1}", i + 1, ranking[i]);
                    Console.ResetColor();
                   
                }
                else
                    Console.WriteLine("         Miejsce: {0}  Punkty:{1}", i + 1, ranking[i]);
                if ((miejsceWRankingu>15)&&(i==14))
                {
                    Console.ForegroundColor = ConsoleColor.Green;
                    Console.WriteLine("      Ty Miejsce: {0}  Punkty:{1}", miejsceWRankingu, ranking[miejsceWRankingu]);
                    Console.ResetColor();
                }
            }
            

        }
    }
}

 

2 odpowiedzi

+2 głosów
odpowiedź 17 kwietnia 2019 przez Ilmefy Obywatel (1,950 p.)
wybrane 17 kwietnia 2019 przez WojMen
 
Najlepsza

Jak rozumiem chcesz zrobić plik zapisu dla gry, właśnie w postaci top listy. Na Twoim miejscu skorzystałbym z Newtonsoft.Json bo wtedy nie musisz się bawić w skryptowanie tego. Zrobiłbyś to w ten sposób:

Deklarujesz klasę w której przechowujesz dane na temat miejsca. Na przykład:

      Class Wynik
{

        public string NickGracza { get; set;}
        public TimeSpan CzasGry { get; set;}
        public DateTime Data { get; set; }
        public int Runda { get; set; }
        public int PoziomTrudnosci { get; set; }
        public int IloscPunktow { get; set; }
}

Gdy już mamy klasę to stworzymy sobie kolejną klasę, która będzie przetrzymywała listę typu Wynik.

   class WynikiKolekcja
    {
        private List<Wynik> _Wyniki;

        public List<Wynik> Wyniki
        {
            get { return _Wyniki; }
            set { _Wyniki= value; }
        }

    }

Następnie w Nuget Manager dodajesz sobie: Newtonsoft.Json

Gdy już to zainstalujesz, to w momencie, gdy chcesz wczytać wyniki robisz to w ten sposób:

private void WczytajWyniki()
{
            string SciezkaDoPlikuZapisu="";
            string Data = System.IO.File.ReadAllText(SciezkaDoPlikuZapisu);
            WynikiKolekcja wynikiKolekcja = Newtonsoft.Json.JsonConvert.DeserializeObject<WynikiKolekcja>(Data);
            
//Mozesz sobie to gdzies przypisac, zeby nie musiec wczytywac danych ponownie. 


}

Nastpępnie możesz sortować wszystko za pomocą LINQ.

Pamiętaj, żeby dodać :

using System.Linq;

 

Robisz to w ten sposób:

private void SortujWedlugLiczbyPunktow()
{
//
//KolekcjaWynikow to zmienna do ktorej jak wczesniej wspomnialem warto przypisac wynik, zeby nie musiec odczytywac wszystkiego ponownie.
//
var Wyniki=KolekcjaWynikow.Wyniki;
var WynikiPosortowaneWedlugLiczbyPunktow=Wyniki.OrderBy(c => c.IloscPunktow).ToList();
}

Jeśli chodzi o zapis danych, bo wiadomo, że po grze będzie więcej danych to robisz to następująco:

private void ZapiszDane()
{
            string SciezkaPlikuZapisu="";
            var Data = Newtonsoft.Json.JsonConvert.SerializeObject(KolekcjaWynikow, Newtonsoft.Json.Formatting.Indented);
            System.IO.File.WriteAllText(SciezkaPlikuZapisu, Data);
}

 

komentarz 17 kwietnia 2019 przez WojMen Początkujący (330 p.)
Mam bardzo dużo informacji do przanalizowania, Bardzo Tobie dziękuje cały materiał postaram się zrozumieć do wieczora. Jeśli mi sie wszystko uda to jeszcze raz tobie podziekuje!
komentarz 17 kwietnia 2019 przez Ilmefy Obywatel (1,950 p.)
Jeśli będziesz miał pytania to pisz
+2 głosów
odpowiedź 17 kwietnia 2019 przez Bondrusiek Maniak (61,370 p.)

Witam,

W skrócie jak odczytać z pliku string i inta w tej samej lini

Dobrym pomysłem byłoby rozdzielenie stringu(linii pliku) poprzez wskazany separator. Musisz odczytać ten string i użyć metody split aby wyodrębnić dane podstringi. Możesz je później rzutować na int itp.

Console.WriteLine("Comma separated strings");  
// String of line
string line= "Jan Kowalski, 10";  
// Split line separated by a comma followed by space  
string[] dataList = line.Split(", ");  
foreach (string data in dataList)  
Console.WriteLine(data); 

 

komentarz 17 kwietnia 2019 przez WojMen Początkujący (330 p.)
A czy mógłbyś napisać kod który pobiera z pliku np 3 wyniki i nicki graczy. Ktory posortuje ich według punktów? Bo nie jestem w stanie wpaść na to jak to mógłbym zrobić.
1
komentarz 17 kwietnia 2019 przez Bondrusiek Maniak (61,370 p.)

W tym przykładzie imituje zawartość pliku:

        static void Main(string[] args)
        {
            string[] lines = { "Jan Kowalski, 10", "Piotr Nowak, 2", "Jan Iksinski, 33" };
            var accounts = new Dictionary<string, int>();

            foreach(string line in lines)
            {
                string[] dataList = line.Split(',');
                accounts[dataList[0]] = int.Parse(dataList[1]);
            }

            var val = from ele in accounts orderby ele.Value ascending select ele;

            foreach(KeyValuePair<string, int> ele in val)
            {
                Console.WriteLine("{0} = {1}", ele.Key, ele.Value);
            }

            Console.ReadKey();
        }

 

komentarz 17 kwietnia 2019 przez WojMen Początkujący (330 p.)
Bardzo dziękuje za pomoc.

Podobne pytania

0 głosów
1 odpowiedź 165 wizyt
pytanie zadane 27 grudnia 2016 w C i C++ przez PatrykPlusPlus Początkujący (320 p.)
0 głosów
1 odpowiedź 364 wizyt
0 głosów
3 odpowiedzi 665 wizyt

92,550 zapytań

141,394 odpowiedzi

319,522 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...