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

C++, Konsola. Ustawianie kursora w wybrane miejsce (pozory mylą)

Object Storage Arubacloud
0 głosów
3,976 wizyt
pytanie zadane 18 stycznia 2018 w C i C++ przez Jakub 0 Pasjonat (23,120 p.)

Witam serdecznie, pisze w C++ mini gierkę Snake w konsoli dla "rozluźnienia". Napisałem już dość sporo, praktycznie najważniejsze elementy programu już istnieją, daje screen'a by podkreślić co mam na myśli:

Prócz samej mapy zrobiłem również iteracyjnie jakby ramki, tu planuje umieścić sumę punktów, ważne skróty klawiszowe, logo itd... Początkowo te wolne miejsca miały być tablicą 2D typu char gdzie będę mógł wyświetlać znaki (litery) tworzące tekst ale z tego zrezygnowałem. Dochodzimy do sedna, chce tam umieścić tekst przez przeniesienie kursora (który ukryłem) na tamtą pozycje. Niby banalnie proste bo przenoszenie kursora mogę napisać nawet tak: 

for(int i=0; i<y; i++){
        std::cout<<std::endl;
}for(int i=0; i<x; i++){
        std::cout<<" ";
}

Sprawa jednak nie jest taka prosta bo w ten sposób nie tylko bym przeniósł kursor ale też zaburzył całą mapę. Szukałem wielu funkcji zwłaszcza z modułu "windows.h" ale nie mogę nic znaleźć (znalazłem funkcje która przenosi kursor myszy a nie ten w konsoli). Jaką  funkcję powinienem użyć, zaznaczam że jedyne co chce zrobić to wypisać tekst w danym miejscu i do tego nie zaburzyć mapy ani tych tabelek gierki. Z góry dziękuje za pomoc i pozdrawiam smiley

1
komentarz 18 stycznia 2018 przez 10kw10 Pasjonat (22,880 p.)
Powiem tyle: ucz sie jakiejś biblioteki graficznej i nie marnuj czasu.
komentarz 18 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)

Co prawda wiem że wypisanie jakiś znaków zawsze przesunie mi cały wiersz do przodu:

//dla pewności jak ktoś nie wie o czym mowa...

std::cout<<"       ";
std::cout<<"|"<<endl;

//minie 7 kolumn (znaków pustych), wobec czego znak '|' nie pojawi się tuż przy lewej krawędzi okna 

Problemu jednak uniknę gdy w pętli gry najpierw wyrenderuje napisy itd a potem dopiero mapę :)

komentarz 18 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)

@10kw10

Uwierz mi, bardzo bym chciał. Ale to nie jest takie proste, kiedyś wspominałem o tym wszystkim: https://forum.pasja-informatyki.pl/318306/w-jaki-sposob-uczyc-sie-programowania#c318596

1
komentarz 18 stycznia 2018 przez 10kw10 Pasjonat (22,880 p.)

Wiele pozapominałem... 

Tzn ze uczysz sie na pamiec? Od tego masz internet i dokumentacje. Poruszanie kursorem po konsoli chyba nie podchodzi pod nauke OOP :D

Rob jak uważasz. 

komentarz 18 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)
Dziękuje za słuszny i szczery komentarz ;) Ale szczerze to co mam robic? Jeszcze w książce trochę mi zostało do OOP, nie chce się wyrywać tak do przodu bo coś tam z obiektówki też wiem ale nie na tyle żeby pisać sensowny większy kod. Już nawet na poziomie funkcji dowiaduje się z książki mnóstwo nowych rzeczy. Ale nie mogę tylko czytać, żeby zachować jaką taką kondycje w programowaniu to muszę też coś pisać. Pisze takie gierki żeby coś robić w cpp ( ćwiczyć jakieś algorytmy) po dziennym studium nowego materiału. Co byś robił na moim miejscu?
1
komentarz 19 stycznia 2018 przez 10kw10 Pasjonat (22,880 p.)
Pisal takie gierki ale bez zbędnych bajerow, ktore w bibliotece sa duzo łatwiejsze do zrobienia. Jak sam napisales cwiczysz algorytmy wiec nie przejmowal bym sie zbytnio wygladem. Twoj kod nigdy nie będzie idealny, zawsze będzie cos do poprawy. Ja swojego pierwszego snake w sfmlu napisalem proceduralnie bez żadnych klas i obiektow. Dopiero potem nauczylem się je wykorzystywac. Wydaje mi się ze nauka OOP w sfmlu jest dużo prostsza bo od razu widzisz jakiś efekt ( poruszajacy się kwadrat) a nie jakis sluchy algorytm jak w konsoli.

3 odpowiedzi

+2 głosów
odpowiedź 19 stycznia 2018 przez Patrycjerz Mędrzec (192,320 p.)
Moim zdaniem nie warto tworzyć oddzielnego kodu specjalnie pod zmianę pozycji kursora. Lepiej zdefiniować gotową tablicę całej ramki obrazu i tylko modyfikować odpowiednie jej elementy, aby później wypisać ją w całości.
komentarz 19 stycznia 2018 przez Eryk Andrzejewski Mędrzec (164,260 p.)
Tylko, że w przypadku konsoli będzie mocno widoczne odświeżanie obrazu.
komentarz 19 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)
Ale i tak sama mapa z wężykiem i tak musi sie co chwile odświeżać, ramki nie zawierają jakoś dużo elementów wiec chyba jakość cie powinna sie bardzo pogorszyć. ( po za ty używam funkcji czyszczenia ekanu bez migania )
+1 głos
odpowiedź 19 stycznia 2018 przez Sebastian Fojcik Nałogowiec (43,020 p.)

Spróbuj użyć: 

#include<windows.h>

void setCursor(int x, int y)
{
     COORD c;
     c.X = x-1;
     c.Y = y-1;
     SetConsoleCursorPosition (GetStdHandle (STD_OUTPUT_HANDLE), c);
}

Wywołanie: 

setCursor( 1,1 ); // początek konsoli (górny lewy róg)

Jeśli chcesz mieć początek w (0,0) to usuń z funkcji odejmowanie "x-1", "y-1" i zostaw samo "x", "y".

Zanim rozpoczniesz skok, aby wypisać zawartość tabel warto, abyś wcześniej zapisał sobie obecne współrzędne kursora, można je również pobrać za pomocą funkcji WinAPI "GetConsoleCursorInfo".

W razie pytań, pytaj :-)

komentarz 19 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)
Dziekuje, spróbuje to kiedy będę miał komputer przy sobie bo na razie w szkole jestem  :)
komentarz 19 stycznia 2018 przez Jakub 0 Pasjonat (23,120 p.)

Nie wiem tylko jak użyć funkcji  GetConsoleCursorInfo(), myślałem że robimy to tak: GetConsoleCursorInfo().x lub GetConsoleCursorInfo().y. Szukałem informacji w internecie: https://source.winehq.org/WineAPI/GetConsoleCursorInfo.html ale przyznam że nie wiele z tego rozumiem, z tego wynika że funkcja zwraca albo true albo false :/

0 głosów

Podobne pytania

0 głosów
0 odpowiedzi 313 wizyt
+1 głos
0 odpowiedzi 115 wizyt
pytanie zadane 12 grudnia 2016 w JavaScript przez Filip31411 Dyskutant (8,820 p.)
0 głosów
1 odpowiedź 813 wizyt
pytanie zadane 16 lipca 2016 w C i C++ przez Nightmare43 Użytkownik (630 p.)

92,576 zapytań

141,426 odpowiedzi

319,651 komentarzy

61,961 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!

...