Skocz do zawartości
Pecet256

[C++] busy wait

Rekomendowane odpowiedzi

W dniu 23.10.2020 o 17:30, Pecet256 napisał:

Co sądzicz?

Kompiluje sie - jest dobrze :E

powiedz, w jakim kierunku ci pomoc. w programie mozna poprawic naprawde wiele.

jak pisal kolega wyzej - zacznij od usuniecia goto. goto jest archaicznym sposobem pisania i wprowadza niemale zamieszanie. 

da sie zrobic szybki zwrot snejkiem o 180 stopni? cos mi nie wychodzi

denerwuje mnie to mruganie. zminimalizuj czysczenie konsoli ("system("CLS")") oraz czyszczenie bufora (std::endl). Jezeli chcesz dodawac nowe linie nie powodujac mrugrania dopisuj 

std::cout << costam << '\n'; // zamiast costam << std::endl;
  • w grach tekstowych std::endl powinien raz na koncu - w twoim przypadku na koncu funkcji wyswietl(...)
  • system("CLS") czysci konsole wiec powinno byc robione jak "najblizej" nastepnego printa 
  • while (running) {
      logika programu...
      system("CLS");
      std::cout << przygotowany_string;
      std::endl; // raz!! sleep
    }

     

    dobry rozwiazaniem minimalizujacym opoznienie w printowaniu jest uzycie podwojnego bufora
     
  • Cytat
    
    #include <sstream>
    std::stringstream tymczasowy_bufor;
    tymczasowy_bufor << "Punkty " << pkt << '\n';
    tymczasowy_bufor << "Mapa "<< mapa;
    std::cout << system("CLS"); // czyscimy ekran 
    std::cout << tymczasowy_bufor.str(); // przepisujemy caly bufor na raz, jak najszybciej po sysytem cls

jezeli interesuje cie konkretnie jezyk c++ to proponuje zaczac uzywac biblioteki standardowej - np. std::array<typ, dlugosc> zamiast tablic[dlugosc] i powoli zmierzanie w kierunku programowania obiektowego. mniej wolnych funkcji, wiecej klas i metod ale przede wszystkim ustruktoruzywanie programu uzywajac obiektow 

przyklad podejscia obiektowego:

struct Snake{
  int dlugosc_weza;
  std::array<std::pair<int, int>> zajmowane_pozycje_w_ukladzie_wspolrzednym;
};

struct Mapa
{
  const int szerokosc_mapy = 10;
  const int wysokosc_mapy = 10;
  std:array<std::array<int, szerokosc_mapy>, wysokosc_mapy> mapa;
  Snake waz;
  
  bool poruszWeza(Kierunek kier);
};

enum Kierunek{ Brak, Gora, Dol, Lewo, Prawo};

struct Sterowanie{
  Kierunek czekajNaPrzycisk();
};
  
class Game {
  bool przegrana = false;
  Mapa map;

  Sterowanie sterowanie;
  
  void graj();
  void koniec();
};

void Game::graj() {
  while (przegrana) {
    Kierunek = sterowanie.czekajNaPrzycisk();
    if (!mapa.poruszWeza()) {
      return PRZEGRALES;
    }
    usleep(16666);
  }
}    


 

Edytowane przez kepler334

Udostępnij tę odpowiedź


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

da sie zrobic szybki zwrot snejkiem o 180 stopni? cos mi nie wychodzi

Da się ale jest to trudne. Nie możesz nacisnąć obu klawiszy razem, to muszą być szybkie po sobie ale oddzielne wciśnięcia. Pisałem o tym wcześniej.

19 godzin temu, Pecet256 napisał:

Co sądzicz?

Że przydałoby się poprawić też wcześniejsze rzeczy.

Tutaj widzę takie rzeczy:
- gra zajeżdża procka, o ile podczas gry jest to do przyjęcia, tak w menu trochę bez sensu lecieć z nieskończoną pętlą
- esc tylko pauzuje grę, nie da się wcześniej wyjść
- niespójne podpisy, np. przy zatrzymanej grze wyświetla się, że return prowadzi do menu gry
- goto to zło ;)
- warto wypróbować, to co kepler pisze o czyszczeniu ekranu

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