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

C++ Projekt, przesuwanie kształtu w konsoli

Object Storage Arubacloud
+1 głos
249 wizyt
pytanie zadane 17 stycznia 2023 w C i C++ przez Wikus841 Początkujący (370 p.)
edycja 17 stycznia 2023 przez Wikus841

Siema!

Jakis czas temu prosiłem was o pomoc w zadaniu z projektu gdzie miałem wypisać określony kształt w konsoli. Dziś wracam do tego zadania, gdyż niestety kompletnie nie mam pomyslu na to jak zaimplementować przesuwanie danego kształtu/obiektu. Wiem że istnieją zmienne typu COORD, ale nie mogłem znaleźć zbyt wielu informacji o nich. Jeśli ktoś byłby w stanie jakoś to klarownie wytłumaczyć bądź też podrzucić linka do poradnika, (oczywiście anglojęzyczne też wchodzą w gre) byłbym bardzo wdzięczny. Fragment kodu próbowałem użyć z podobnego projektu który znalazłem na jednym forum, ale niezbyt mi wychodziło

Podrzucam mój kod i zadanie.

Z góry dzięki!

 

#include <iostream>
using namespace std;
//const int GORA=72, DOL=80, LEWO=75, PRAWO=77;


/*
 void gotoxy(int x,int y)
{
    COORD c;
    c.X=x;
    c.Y=y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
int wherex()
{

    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    return csbi.dwCursorPosition.X;
}
int wherey()
{
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &csbi);
    return csbi.dwCursorPosition.Y;
}

  */ // te dziwne funkcje niby od kordow

void rysuj(int w, char z, int x, int y)
{
    for (int i = x; i <w; ++i) {
        for (int j = x; j <w; ++j) {
            if ((j == x) || (j == (w - 1)) || (i == j && j > w / 2) || (j + i - (w - 1) == x && j < (w - 1) / 2))
                cout << z;
            else
                cout << " ";
        }

        cout << endl;
    }
}
int main()
{

    int n=0;
    char znak;
    int x=0;
    int y=0;
    cout<<"Podaj rozmiar figury: ";
    cin>>n;
    cout<<"Podaj znak z klawiatury z ktorego ma sie skladac figura:";
    cin>>znak;
    cout<<"aby powiekszyc figure wcisnij +, by zmniejszyc -"<<endl;


    rysuj(n, znak, 1, 1);
    // w1.przesun(n, x, y, znak);


    return 0;
}

 

 

2 odpowiedzi

+1 głos
odpowiedź 17 stycznia 2023 przez Gynvael Coldwind Nałogowiec (27,530 p.)
COORD to po prostu x i y, koordynaty - https://learn.microsoft.com/en-us/windows/console/coord-str

Generalnie nie ma czegoś takiego jak "przesuwanie" obiektów w konsoli. Jeśli chcesz coś przesunąć, to musisz to sobie zaimplementować na jeden z dwóch sposobów:

1) Skopiować dany fragment bitmapy konsoli w docelowe miejsce i wyczyścić różnice.

2) Wyczyścić stare miejsce i narysować na nowo dany obiekt w nowym miejscu.

Sugeruje na początek to drugie - jest dużo łatwiejsze w implementacji.

Wyczyszczenie starego miejsca to po prostu użycie FillConsoleOutputCharacter (i ew FillConsoleOutputAttribute) w pętli na podanych koordynatach.

Jak narysować coś w nowym miejscu to pewnie wiesz. Możesz użyć albo WriteConsoleOutputAttribute + WriteConsoleOutputCharacter żeby linia po linii coś narysować, albo zmieniać położenie kursora i używać normalnego cout/printf z flushem na końcu. Osobiście bym pewnie użył tego pierwszego zestawu.

Wszystkie funkcje / etc masz dokładnie opisane w MSDN: https://learn.microsoft.com/en-us/windows/console/console-reference - poprzeglądaj je sobie i spróbuj zrozumieć do czego są używane. Część z nich Ci się nie przyda, ale część w tym czy innym zadaniu okaże się pomocna.
komentarz 17 stycznia 2023 przez Wikus841 Początkujący (370 p.)
Widzę że nie dodał się plik z zadaniem do treści pytania, eh
komentarz 18 stycznia 2023 przez Wikus841 Początkujący (370 p.)

@Gynvael Coldwind, a zamiast tych wymienionych skryptów nie można użyc zwykłego system("cls")?

1
komentarz 18 stycznia 2023 przez Gynvael Coldwind Nałogowiec (27,530 p.)
system("cls") to generalnie mega zły pomysł, którego nie powinno się nigdy używać – głównie dlatego, że to odpala kilka procesów tylko po to, żeby zrobić to samo co robi zwykły FillConsoleOutputCharacter dużo dużo szybciej.

Zresztą na MSDN są gotowe funkcje do czyszczenia ekranu: https://learn.microsoft.com/en-us/windows/console/clearing-the-screen

Btw jeśli masz aktualny Windows 10 to inną opcją są jeszcze kody ucieczki konsoli. Tj. https://learn.microsoft.com/en-us/windows/console/console-virtual-terminal-sequences

Przykładowo, cout << "\x1b[2J" wyczyści ekran.

Kody ucieczki nie działają na pierwszych wersjach Windows 10 ani na wcześniejszych Windowsach (aż do 98 i wcześniejszych gdzie znowu działają).
0 głosów
odpowiedź 2 lutego 2023 przez Wikus841 Początkujący (370 p.)

@Gynvael Coldwind, A mógłbyś podać przykład zastosowania podanych funkcji? W sensie w kodzie

Podobne pytania

+2 głosów
0 odpowiedzi 1,202 wizyt
0 głosów
1 odpowiedź 145 wizyt
pytanie zadane 6 stycznia 2020 w C i C++ przez lenzo1 Początkujący (360 p.)
+1 głos
4 odpowiedzi 1,072 wizyt
pytanie zadane 1 czerwca 2016 w C i C++ przez b00ny Mądrala (6,050 p.)

92,572 zapytań

141,423 odpowiedzi

319,645 komentarzy

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

...