Skocz do zawartości
Pecet256

[C++] busy wait

Rekomendowane odpowiedzi

Zamień int wzrost; na int wzrost=0;, wtedy powinno działać

Nie wiem, jak wkradł mi się ten błąd.

Co do pliku, to myślałem nad tekstowym. Czy jest jakaś biblioteka z funkcjmi do odczytu/zapisu liczb i napisów do takich plików?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pewnie są ale przy tak prostych rzeczach można to ogarnąć przy pomocy fscanf i fpritnf (w końcu i tak masz bardziej C niż C++ ;)).
Formatowanie jest takie samo jak przy scanf, printf, dochodzi jedynie pierwszy argument z uchwytem do pliku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

 A funkcja z zamianą ciągu cyfr-znaków na liczbę int i na odwrót. (atoi czy jakoś tak)  - jak używać?

Sprawdź, czy wzrost =0 na początku zadziała.(Patrrz  mój poprzedni post)

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Działa.

Używać zgodnie z opisem funkcji ;)
Doprecyzuj pytanie, bo nie bardzo wiem co odpowiedzieć.

Jeszcze taka uwaga o losowaniu pokarmu mi się pojawiła.
Co się stanie, jeżeli plansza będzie na tyle zapełniona, że nie znajdzie się wolne pole 3x3?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Co do odczytu to wykombinowałem coś takiego:

 


    //Odczyt pliku z tablica wynikow
    int znak;
    int tryb_odczytu_znakow = 0; //0-liczby 1-napis
    int licznik_znakow;
    char napispunktow[10];
    char tempimie[63];
    int licznik_zerowania=0;
    int licznik_struktur=0;

    tabelawynikowa tablica_wynikow[11];

    licznik_zerowania=0;
        while(licznik_zerowania<10){
            napispunktow[licznik_zerowania]=0;
            licznik_zerowania=licznik_zerowania+1;
        }

    licznik_zerowania=0;
    while(licznik_struktur<11){
        while(licznik_zerowania<63){
            tablica_wynikow[licznik_struktur].nazwisko[licznik_zerowania]=0;
            licznik_zerowania=licznik_zerowania+1;
        }
        licznik_struktur=licznik_struktur+1;
        licznik_zerowania=licznik_zerowania+1;
    }
    licznik_zerowania=0;
    licznik_struktur=0;


    FILE *plik = fopen( "wyniki.txt", "r" );
    while(znak != EOF){
        if(znak=='|'){
            tryb_odczytu_znakow=1;
            licznik_zerowania=0;
            while(licznik_zerowania<63){
                tempimie[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }
            licznik_znakow=0;
        }
        if(znak=='/'){
            tryb_odczytu_znakow=0;
            licznik_znakow=0;
        }
        if(znak=='\n'){
            licznik_znakow=0;
            while(licznik_znakow<63){
                tablica_wynikow[licznik_struktur].nazwisko[licznik_znakow]=tempimie[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
            tablica_wynikow[licznik_struktur].punkty=atoi(napispunktow);
            licznik_struktur=licznik_struktur+1;
            licznik_zerowania=0;
            while(licznik_zerowania<10){
                napispunktow[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }

        }else{

            if(tryb_odczytu_znakow==0){
                znak=napispunktow[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
            if(tryb_odczytu_znakow==1){
                znak=tempimie[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
        }
    }

    fclose( plik );

    cout<<endl<<"Tablica wynikow"<<endl;

    licznik_struktur=0;
    while(licznik_struktur<10){
        cout<<"struktura NO"<<licznik_struktur<<endl;
        cout<<tablica_wynikow[licznik_struktur].nazwisko<<"   " <<tablica_wynikow[licznik_struktur].punkty<< "punktow"<<endl;
        licznik_struktur=licznik_struktur+1;
    }

Korzysta ze struktury

struct tabelawynikowa
{
    char nazwisko[63];
    int punkty;
};

Dla przypomienia plik do odczytu narazie wygląda tak:

12|gracz1/
24|gracz2/
56|gracz3/
90|gracz4
122|gracz5/
91|gracz6/
13|gracz7/
99|gracz8/
223|gracz9/
100|gracz10/

Niestety, gdy normalnie uruchamiam program to nie wyświetla nic ( w momencie, w którym powinien wyświtlić tablicę wyników wpada w pętlę nieskończoną), a jak uruchomię prze debug/countinue (czerona ikona w edytorze Code::Blocks) to nie wyświetla nazw graczy i do każdego daje 0 punktów:(

Gdzie mam błąd?

Z sotrowanie tablicy po dodaniu wyniku gracza to sobie poradzę.

PS: A jak zrobić zapis liczby int do pliku tekstowego?

Edytowane przez Pecet256

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dziwne, żeby cokolwiek czytało jak nie czytasz z pliku. Otwierasz go i trzymasz uchwyt w zmiennej 'plik', potem wchodzisz w pętlę po niezainicjowanej zmiennej 'znak'.
Nie masz w żadnym momencie operacji odczytu z pliku, a przynajmniej jej nie widzę.

Jak dla mnie jest to mocno przekombinowane, jakieś tryby odczytu znaków, próby odczytu czegoś z wyzerowanych tablic...
W pętli od zerowania tablicy wyników jest błąd, bo zamiast wyzerować licznik od nazwiska przechodząc do kolejnego gracza, to zwiększasz go.

 

Zapis poleciałbym funkcją fprintf. Składnia jak w printf, tylko dochodzi na początku uchwyt do pliku. Nie trzeba kombinować z konwersją liczb na tekst, można kilka zmiennych na raz wrzucić, dorzucić dodatkowe znaki i całość zakończyć znakiem nowej linii.

Do odczytu też bym spróbował podobnie, czyli fscanf. Pętla wczytująca dane powinna się zamknąć w kilku liniach, zamiast 30. Chyba, że koniecznie chcesz się bawić w czytanie po znaku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Dostawiłem getc. Dalej nie działa.

V

FILE *plik = fopen( "wyniki.txt", "r" );
    znak = getc( plik );
    while(znak != EOF){
        if(znak=='|'){
            tryb_odczytu_znakow=1;
            licznik_zerowania=0;
            while(licznik_zerowania<63){
                tempimie[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }
            licznik_znakow=0;
        }
        if(znak=='/'){
            tryb_odczytu_znakow=0;
            licznik_znakow=0;
        }
        if(znak=='\n'){
            licznik_znakow=0;
            while(licznik_znakow<63){
                tablica_wynikow[licznik_struktur].nazwisko[licznik_znakow]=tempimie[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
            tablica_wynikow[licznik_struktur].punkty=atoi(napispunktow);
            licznik_struktur=licznik_struktur+1;
            licznik_zerowania=0;
            while(licznik_zerowania<10){
                napispunktow[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }

        }else{

            if(tryb_odczytu_znakow==0){
                znak=napispunktow[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
            if(tryb_odczytu_znakow==1){
                znak=tempimie[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
        }
        znak = getc( plik );
    }

    fclose( plik );

Wstawiłem tylko tą cześć kodu, gdzie dostawiłem getc.

 

PS. W przypadku braku mozliwości wygenerowania pokarmu, to będzie zakończenie gry. Co do plansz, to zamierzam zrobić odczyt plansz z pliku, oraz możliwość przejścia węża na drugą stronę ekranu, gdy nie ma tych ścian dookoła planszy (ruch jak po powierzhni torusa - bryły geometrycznej przypominającej idealnie gładki precel).

Edit:

Przerobiłem kod programu tak, że teraz można chodzić wężem na ukos. Gdy wyświetlanie i zapisywanie wyników będzie gotowe, to Ci pokaże.

Edytowane przez Pecet256

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No w takiej formie nie będzie działać.

Prześledź co robisz ze zmienną 'znak':
- przed pętlą odczyt z pliku - ok
- sprawdzenie jaki to znak i w razie co przełączasz tryb odczytu - dla mnie nieeleganckie ale ok
- jeżeli to nie jest znak specjalny, to na znak zapisujesz zawartość z buforu cyfr punktów lub liter imienia gracza - zdecydowanie źle
- na koniec pętli wczytujesz kolejny znak - ok

W skrócie, wczytujesz znak ale nie odkładasz go do bufora.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Poprawiłem.

Nie wiem jak mogłem popełnić tak prosty błąd.

Mam jednak dalej problem z przepisaniem liczby z napisu na zmienną typu int.

Kod:

    FILE *plik = fopen( "wyniki.txt", "r" );
    znak = getc( plik );
    while(znak != EOF){
        if(znak=='|'){
            tryb_odczytu_znakow=1;
            licznik_zerowania=0;
            while(licznik_zerowania<63){
                tempimie[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }
            licznik_znakow=0;
        }
        if(znak=='/'){
            tryb_odczytu_znakow=0;
            licznik_znakow=0;
        }
        if(znak=='\n'){
            licznik_znakow=0;
            while(licznik_znakow<63){
                tablica_wynikow[licznik_struktur].nazwisko[licznik_znakow]=tempimie[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
            tablica_wynikow[licznik_struktur].punkty=atoi(napispunktow);
            licznik_struktur=licznik_struktur+1;
            licznik_zerowania=0;
            while(licznik_zerowania<10){
                napispunktow[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }

        }else{

            if(tryb_odczytu_znakow==0){
                napispunktow[licznik_znakow]=znak;
                licznik_znakow=licznik_znakow+1;
            }
            if(tryb_odczytu_znakow==1){
                tempimie[licznik_znakow]=znak;
                licznik_znakow=licznik_znakow+1;
            }
        }
        znak = getc( plik );
    }

    fclose( plik );

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

A jakie są objawy? Same zera?

Chyba widzę w czym rzecz ale dobrze jakbyś sam też do tego doszedł.
Na początek proponuję przyjrzeć się co jest w buforze/napisie przed próbą konwersji na liczbę. Najlepiej na dwa sposoby: wypisać na ekran cały bufor na raz (jakaś funkcja wypisująca stringi, tablice charów), wypisać znak po znaku całą zawartość tej tablicy.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

No to najprawdopodobniej jest coś nie tak napisem, który dajesz do atoi().

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Udało mi się naprawić:

FILE *plik = fopen( "wyniki.txt", "r" );
    znak = getc( plik );
    licznik_znakow=0;
    while(znak != EOF){
        if(znak=='|'){
            tryb_odczytu_znakow=1;
            licznik_zerowania=0;
            while(licznik_zerowania<63){
                tempimie[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }
            licznik_znakow=0;
        }else
        if(znak=='/'){
            tryb_odczytu_znakow=0;
            licznik_znakow=0;
        }else
        if(znak=='\n'){
            licznik_znakow=0;
            while(licznik_znakow<63){
                tablica_wynikow[licznik_struktur].nazwisko[licznik_znakow]=tempimie[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
            tablica_wynikow[licznik_struktur].punkty=atoi(napispunktow);
            licznik_struktur=licznik_struktur+1;
            licznik_zerowania=0;
            while(licznik_zerowania<10){
                napispunktow[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }
            licznik_znakow=0;

        }else{

            if(tryb_odczytu_znakow==0){
                napispunktow[licznik_znakow]=znak;
                licznik_znakow=licznik_znakow+1;
            }
            if(tryb_odczytu_znakow==1){
                tempimie[licznik_znakow]=znak;
                licznik_znakow=licznik_znakow+1;
            }
        }
        znak = getc( plik );
    }

    fclose( plik );

Co sądzisz o takim rozwiązaniu?

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zrobiłem funkcje

1:Wczytanie pliku wyników do programu.

void wczytajwyniki(tabelawynikowa tablica_wynikow[11],int tryb,int punkty){
    //Odczyt pliku z tablica wynikow
    int znak;
    int tryb_odczytu_znakow = 0; //0-liczby 1-napis
    int licznik_znakow;
    char napispunktow[10];
    char tempimie[63];
    int licznik_zerowania=0;
    int licznik_struktur=0;

    licznik_zerowania=0;
        while(licznik_zerowania<10){
            napispunktow[licznik_zerowania]=0;
            licznik_zerowania=licznik_zerowania+1;
        }

    licznik_zerowania=0;
    while(licznik_struktur<11){
        while(licznik_zerowania<63){
            tablica_wynikow[licznik_struktur].nazwisko[licznik_zerowania]=0;
            licznik_zerowania=licznik_zerowania+1;
        }
        licznik_struktur=licznik_struktur+1;
        licznik_zerowania=licznik_zerowania+1;
    }
    licznik_zerowania=0;
    licznik_struktur=0;


    FILE *plik = fopen( "wyniki.txt", "r" );
    znak = getc( plik );
    licznik_znakow=0;
    while(znak != EOF){
        if(znak=='|'){
            tryb_odczytu_znakow=1;
            licznik_zerowania=0;
            while(licznik_zerowania<63){
                tempimie[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }
            licznik_znakow=0;
        }else
        if(znak=='/'){
            tryb_odczytu_znakow=0;
            licznik_znakow=0;
        }else
        if(znak=='\n'){
            licznik_znakow=0;
            while(licznik_znakow<63){
                tablica_wynikow[licznik_struktur].nazwisko[licznik_znakow]=tempimie[licznik_znakow];
                licznik_znakow=licznik_znakow+1;
            }
            tablica_wynikow[licznik_struktur].punkty=atoi(napispunktow);
            licznik_struktur=licznik_struktur+1;
            licznik_zerowania=0;
            while(licznik_zerowania<10){
                napispunktow[licznik_zerowania]=0;
                licznik_zerowania=licznik_zerowania+1;
            }
            licznik_znakow=0;

        }else{

            if(tryb_odczytu_znakow==0){
                napispunktow[licznik_znakow]=znak;
                licznik_znakow=licznik_znakow+1;
            }
            if(tryb_odczytu_znakow==1){
                tempimie[licznik_znakow]=znak;
                licznik_znakow=licznik_znakow+1;
            }
        }
        znak = getc( plik );
    }

    fclose( plik );

    if(tryb==1){
        cout <<endl << "Podaj swoje imie" << endl;
        cin.get(tablica_wynikow[10].nazwisko,63);
        tablica_wynikow[10].punkty=punkty;
    }else{
    ;
    }

}

2: Wyświetlenie tablicy struktur:


void wyswietlwyniki(tabelawynikowa tablica_wynikow[11],int tryb){

    cout<<endl<<"Tablica wynikow"<<endl;
    int licznik_struktur=0;
    int limit;
    if(tryb==0){
        limit=10;
    }
    if(tryb==1){
        limit=11;
    }
    cout<<"gracz-------wynik"<<endl;
    while(licznik_struktur<limit){
        cout<<tablica_wynikow[licznik_struktur].nazwisko<<"   " <<tablica_wynikow[licznik_struktur].punkty<< "punktow"<<endl;
        licznik_struktur=licznik_struktur+1;

    }
    cout<<endl;
    cout<<endl;


}

No i mam mały problem - nie wczytuje 10 pozycji z pliku. Jak to naprawić?

Pozostało mi jeszcze do napisania funkcja sortowania oraz zapisu do pliku.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
2 godziny temu, Pecet256 napisał:

Co sądzisz o takim rozwiązaniu?

Ok. Chodziło o to zerowanie licznika po wyczyszczeniu tablicy z imieniem gracza.
Warto pamiętać o zakresach indeksów tablicy, bo na moje oko pisałeś mocno poza rozmiar 'napispunktow'.
Nie wiem na ile znasz właściwości ciągów znaków w C. Warto pamiętać, że char jest liczbą, więc 0 odpowiada znakowi '\0', który oznacza koniec ciągu znaków. Np. char tab[11]={"Ala ma kota"); tab[5]=0; wtedy przy wypisie wyjdzie tylko "Ala m".

56 minut temu, Pecet256 napisał:

No i mam mały problem - nie wczytuje 10 pozycji z pliku. Jak to naprawić?

Na różne sposoby ;)  Można poprawić plik z wynikami lub dopisać trochę kodu w funkcji.
Spróbuj przeanalizować co się dzieje przy czytaniu tej ostatniej linii. Co jest wczytane, w jakie warunki program wchodzi, kiedy bufor jest przepisywany to tabeli wyników i kiedy kończy się pętla.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Tamten problem rozwiązałem dodając taki kod przed fclose:

//Rozwiazanie tymczasowe
    tablica_wynikow[licznik_struktur].punkty=atoi(napispunktow);
    licznik_znakow=0;
    while(tempimie[licznik_znakow]!=0 ){
        tablica_wynikow[licznik_struktur].nazwisko[licznik_znakow]=tempimie[licznik_znakow];
        licznik_znakow=licznik_znakow+1;
    }
    //Koniec rozwiazania tymczasowego

Jak widać jest to tzw. "quick and dirty solution" jak mawiają amerykanie.

 

Teraz mam problem z sortowaniem tablicy struktur wyników:

void sortujwyniki(tabelawynikowa tablica_wynikow[11]){
    tabelawynikowa kopia[11];
    int wykorzystanie[11];
    int licznik=0;
    //Skopiowanie struktury wynikow
    while(licznik<11){
        kopia[licznik]=tablica_wynikow[licznik];
        wykorzystanie[licznik]=0;
        licznik=licznik+1;
    }
    licznik=0;

    int licznik2=0;
    int najwieksza=-1;
    int numer=-1;

    while(licznik2<11){
        licznik=0;
        while(licznik<11){
            if((kopia[licznik].punkty>najwieksza)&&(wykorzystanie[licznik]==0)){
                najwieksza=kopia[licznik].punkty;
                numer=licznik;
            }
            licznik=licznik+1;
        }
        tablica_wynikow[licznik2]=kopia[numer];
        wykorzystanie[numer]=1;

        licznik2=licznik2+1;
    }
}

Wydaje same bajwyższe wyniki i nazwy gracza, który je uzyskał. Kopiowanie na pewno działa dobrze - sprawdziłem.

Edytowane przez Pecet256

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach
18 godzin temu, Pecet256 napisał:

Jak widać jest to tzw. "quick and dirty solution" jak mawiają amerykanie.

Podstawowe pytanie, czy wiesz dlaczego był problem? Jak opiszesz, to mogę podpowiedzieć jak sprawę załatwić od strony pliku z wynikami.
Kierunek rozwiązania jak najbardziej słuszny.

18 godzin temu, Pecet256 napisał:

Wydaje same bajwyższe wyniki i nazwy gracza, który je uzyskał. Kopiowanie na pewno działa dobrze - sprawdziłem.

Jaki to algorytm sortowania? Przypomina bąbelkowe ale implementacja jest nieszablonowa.
Prześledź jak zmienia się wartość zmiennej  'najwieksza'.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

To ma być sortowanie poprzez wybieranie zewnętrzne.

 

Robiłem już takie dla zwykłych zmiennych (int, double) i algorytm był następujący:

1) Utworzenie tablicy dwuwymiarowej o wymiarach [wymiar tablicy jednowymiarowej do posortowanie][2] - drugi wiersz sygnalizuje wykorzystanie elementów.

2) Zerowanie drugiego wiersza tablicy i przepisanie oryginału do pierwszego wiersza.

3) Utworzenie licznika pozycji =0;

4) Utworzenie licznika wewnętrznego;

5) Utworzenie zmiennej największa= wartość mniejsza od najmniejszej spodiewanej w tablicy;

6) Pętla wykonywana tyle razy, ile ma elementów tablica do posortowania While (licznik<rozmiar):

{

1P) licznik wewnętrzny  = 0;

2P) Pętla while(licznik wewnętrzny <rozmiar):

{

1P) Jeżeli tablica dwuwymiarowa [licznik wewnętrzny][0]>największa && tablica dwuwymiarowa [licznik wewnętrzny][1]==0

{

1J) największa=tablica dwuwymiarowa [licznik wewnętrzny][0];

2J) licznik wewnętrzny =licznik wewnętrzny +1;

}

3P) tablica oryginalna [licznik] = największa;

4P) licznik=licznik+1;

}

tutaj ta dodatkowa tablica pełni rolę drugiego wiersza tablicy.

Ogólnie wiem, że nie jest to najszybszy algorytm, ale jest wg. mnie najbardziej intuicyjny (dla poj. zmiennych).

 

PS. Jakbyś chciał, to mogę wkleić cały kod gry.

 

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Możesz dać, tylko spróbuj jak złącznik, plik tekstowy. Będzie łatwiej przerzucić do kompilacji niż kopiować z wstawki w poście.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Coś mi się wiesza. Gdzieś jest pisane poza tablicę lub mam nawalone w systemie (bardziej prawdopodobne). W pewnym momencie program czyści ekran i nic się nie dzieje, a w systemie znika pamięć aż do jej skończenia.

Co udało mi się zobaczyć:
- przy wyświetlaniu planszy tuż pod nią wyświetlają się jakieś śmieci, czasem też pojawia się systemowy dźwięk (pewnie jest wypisywany tzw. znak 'bell' https://en.wikipedia.org/wiki/Bell_character) - prawdopodobnie wychodzi brak inicjacji tablicy 'ekran'
- po wpisaniu swojego imienia do wyników tabela zawiera jakieś bzdury, wszystkie punkty i gracze takie same - pewnie sortowanie działa niepoprawnie

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Kompilujesz na linuksie? Tu jest w użyciu kilka stricte Windowsowy funkcji ( system("cls"), odczyt klawiszy)

 

Co do znaku alarmu (\a) to zapewne źle jest ustalony licznik wierszy/kolumn i odczytuje jakieś bajty za tablicą.

Te "bzdury". Problemem jest sortowanie. Jeszcze raz wyjaśnię, co chciałem zrobić - po kopiowaniu ma najpierw wybrać strukturę z największą niewykorzystaną wartością, potem wstawić ją do pierwszego/kolejnego (w zależności od iteracji pętli) miejsca w głównej tablicy i odznaczyć jako wykorzystaną.

W użytku są 3 tablice:

Główna tablica struktur z maina

Kopia tablicy struktur (w funkcji)

Tablica wykorzystanie (int 0/1 w funkcji - tak wiem, można zastosować _bool czy coś w tym stylu)

 

Jeżeli dałem dobry plik, to w tej wersjimożna chodzić wężem na ukos - klawisze qezc

 

PS. Plik wykonywalny oraz plik wyniki.txt mają być w tym samym katalogu.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Pod Win. Mogę mieć coś nawalone w systemie, bo mam kilka innych programów co się podobnie wywala (zżera całą pamięć).
Może kwestia rozmiarów ona z konsolą, bo u mnie normalnie startuje z szerokością 80 znaków, a plansza ma 90.
Ciężko mi powiedzieć, bo dzisiaj jak na razie chodzi ok. Poprawka, znowu się wywaliło - awaryjnie odpaliłem maszynę wirtualną z XP i tam chodzi ok, choć są problemy z opóźnieniem i ciężko się steruje.

Co do sortowania, to powtórzę się

W dniu 16.10.2020 o 08:33, Bono[UG] napisał:

Prześledź jak zmienia się wartość zmiennej  'najwieksza'.

Chodzenie na ukos jest nieintuicyjne. Ciężko je opanować i ma średni sens.

2 godziny temu, Pecet256 napisał:

Co do znaku alarmu (\a) to zapewne źle jest ustalony licznik wierszy/kolumn i odczytuje jakieś bajty za tablicą.

Według mnie problemem jest niewyczyszczona tablica 'ekran'.
Chyba już o tym pisałem, że jeżeli wypisuje się ciąg znaków (tablica char, string z C), to koniec napisu jest rozpoznawany po wartości znaku 0 (jako liczba, a nie znak zera). Jeżeli w tablicy są losowe wartości, to będzie próba ich wypisania na ekran aż trafi się na 0 lub koniec struktury. Szczegóły do doczytania.

 

Z innych rzeczy. Po zakończeniu gry, przy wpisywaniu imienia gracza, bufor jest zapchany znakami od sterowania wężem, np.: adwadwwsasaawdsa
Nie za bardzo mam pomysł jak sobie z tym poradzić. Próbowałem różnych rzeczy ale nie działało tak jak chciałem. Koniec końców przerobiłem sterowanie na kbhit() i getch(), do tego na wszelki wypadek jeszcze fflush(stdin) (do doczytania co robi). Przy okazji nie mam już problemów z podwójnym sterowaniem (np. chcę zrobić szybkie przejście do niższej linii: 's' 'd', to na twoim sterowaniu potrafiło mi powtórzyć manewr, teraz trudniej się pomylić (kwestia obsługi klawiatury, twoja jest szybsza i przytrzymanie po wciśnięciu jest praktycznie od razu łapane, u mnie musi się załączyć systemowe powtarzanie klawiszy)).

Kosmetyka przy wyświetlaniu wyników.
Spacje lepiej zastąpić tabem (kilkoma), można dzięki temu równo w kolumnach wyświetlić:

Tablica wynikow
gracz           wynik

gracz9          223
gracz10         100
gracz8          99
gracz6          91
gracz4          90
gracz3          56
gracz2          24
gracz7          13
gracz1          12
gracz5          0
Bonon           0

Ograniczyłbym też możliwą długość wpisania imienia. 63 znaki to zdecydowanie za dużo i będzie rozjeżdżać tabelę. 15-20 powinno spokojnie wystarczyć na ksywkę. Do wytestowania ile znaków i iloma tabami wtedy trzeba rozdzielić kolumny.
"punktów" na końcu według mnie zupełnie zbędne, niepotrzebnie zaśmieca ekran i psuje czytelność tabeli.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Naprawiłem sortowanie:

void sortujwyniki(tabelawynikowa tablica_wynikow[11]){
    tabelawynikowa kopia[11];
    int wykorzystanie[11];
    int licznik=0;
    //Skopiowanie struktury wynikow
    while(licznik<11){
        kopia[licznik]=tablica_wynikow[licznik];
        wykorzystanie[licznik]=0;
        licznik=licznik+1;
    }
    licznik=0;

    int licznik2=0;
    int najwieksza;
    int numer=-1;;

    while(licznik2<11){
        licznik=0;
        najwieksza=-1;
        while(licznik<11){
            if((kopia[licznik].punkty>najwieksza)&&(wykorzystanie[licznik]==0)){
                najwieksza=kopia[licznik].punkty;
                numer=licznik;
            }
            licznik=licznik+1;
        }
        wykorzystanie[numer]=1;
        tablica_wynikow[licznik2]=kopia[numer];


        licznik2=licznik2+1;
    }
}

Teraz muszę zrobić czyszcznie wiersza wejścia.

Potem zapis do pliku, pauza, menu i instrukcja obsługi. (Ale to powinno być łatwiejsze).

Być może zrobię odczyt plansz z plików.

Udostępnij tę odpowiedź


Odnośnik do odpowiedzi
Udostępnij na innych stronach

Zrobiłem udoskonaloną wersję z menu, pauzą oraz z zapisem wyników do pliku

Gra jest prawie gotowa.

Co sądzicz?

 

PS. Przepraszam za double post.

main.cpp

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ę...