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

Program nie rysuje części X-a

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
151 wizyt
pytanie zadane 9 stycznia 2020 w C i C++ przez Tawka Nowicjusz (200 p.)

Hej, piszę program, który ma rysować X za pomocą znaku ASCII z klawiatury. Wszystko działa jak należy, poza jednym aspektem- jakkolwiek nie kombinuję, program nie rysuje prawego dolnego ramienia X-a. Wcześniej natomiast nie rysował lewego dolnego, ale gdy udało mi się je uzyskać, prawe przestało się pokazywać. Jakiś pomysł co robię nie tak?

#include <iostream>
#include <windows.h>
#include <conio.h>

using namespace std;

void czytaj_dane(int &rozmiar, char &znak);   //funkcja wczytujaca dane od użytkownika
void gotoxy(int x, int y);    // funkcja przesunięcia elementu
void rysuj(int x, int y, int rozmiar, char znak);   // funkcja rysująca figurę
void przesun(int x, int y, int rozmiar, char znak);   //funkcja odczytująca kierunek przesunięcia
void HideCursor();    //ukrycie kursora
void SetWindow(int Width, int Height);    // funcka ustawiająca rozmiar okna
void poczatek();    // funkcja wyświetlająca informacje początkowe

int main(){
  int rozmiar = 0;    // deklaracja zmiennej rozmaru
  char znak;    // deklaracja zmiennej znaku ktorym będzie rysowana figura
  int x = 60;   // ustawienie środka dla x
  int y = 8;    // ustawienie środka dla y


  poczatek();
  czytaj_dane(rozmiar, znak);
  SetWindow(124,35);    //ustawienie wielkości okna
  gotoxy(x, y);
  HideCursor();
  rysuj(x, y, rozmiar, znak);
  przesun(x, y, rozmiar, znak);
}

//================================================================================================//
void czytaj_dane(int &rozmiar, char &znak){

  system("CLS");

  cout << "Podaj rozmiar ramienia X-a (1-14)" << endl;
  do {
while(!(cin>>rozmiar)){ //dopóki strumień jest w stanie błędu -> dopóki podawane są błędne dane

  cout << "Proszę podać wartość liczbową w zakresie 1-14" << endl;
  cin.clear(); //kasowanie flagi błędudu strumienia
  cin.sync(); //kasowanie zbędnychh znaków z bufora
}
    if(rozmiar <= 0 || rozmiar > 14){
      cout << "Rozmiar nie moze być mniejszy niz 1, ani większy niz 14" << endl;
    }
  } while(rozmiar <= 0 || rozmiar > 14);

  cout << "Podaj znak"<< endl;
  cin >> znak;
}

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

void rysuj(int x, int y, int rozmiar, char znak){
  int x1 = x;
  int y1 = y;
  int rozmiar1 = rozmiar;

  system("cls");
  gotoxy(x, y); // Ustawienie punktu zaczepienia

  for (int i = 0; i<rozmiar; i++){    //rysowanie gornej prawej czeęści figury
    gotoxy(x1, y1);
    x1--;
    y1++;
    cout << znak << endl;
  }
  for (int i = 0; i<rozmiar; i++){    //rysowanie gornej lewej czeęści figury
    gotoxy(x1, y1);
    x1--;
    y1--;
    cout << znak << endl;
  }
for (int i = 0; i<rozmiar ; i++){    //rysowanie dolnej prawej czeęści figury
    gotoxy(x1, y1);
    x1++;
    y1++;
    cout << znak << endl;
  }
 for (int i = 0; i<rozmiar ; i++){  //rysowanie lewej dolnej części figury
    gotoxy(x1, y1);
    x1--;
    y1++;
    cout << znak << endl;
  }

}
void przesun(int x, int y, int rozmiar, char znak){   //definicja funkcji odpowiedzialna za ruch figury

  int rozmiar1 = rozmiar;
  int x1 = x;
  int y1 = y;


  char klawisz;
  do {
    gotoxy(0,0);
    cout << "Klawisz Esc kokończy pracę programu";

    rysuj(x1, y1, rozmiar1, znak);

    //Ograniczenia ekranu
    int xmin = rozmiar1 + 1;
    int ymin = 1;
    int xmax = 123;
    int ymax = 33 - (rozmiar1*2);


    klawisz = _getch();
    switch (klawisz) {
      case '+' :{   //zwiększanie rozmiaru figury
        if(rozmiar1 < 14){
          rozmiar1++;
        }
        break;
      }
      case '-' :{   //zmniejszanie rozmiaru figury
        if(rozmiar1 > 1){
        rozmiar1--;
      }
        break;
      }
      case 77:{  // Przesunięcie w prawo
        if(x1 < xmax){
          x1++;
        }
        break;
      }
      case 75:{  // Przesunięcie w lewo
        if(x1 >= xmin){
          x1--;
        }
        break;
      }
      case 72:{  // Przesunięcie w gore
        if(y1 >= ymin){
          y1--;
        }
        break;
      }
      case 80:{  // Przesunięcie w dol‚
        if(ymax >= y1){
          y1++;
        }
        break;
      }
    }

  } while(klawisz != 27);   //zakończenie pracy programu przez klawisz esc
}

void HideCursor(){  //definicja funkcji na ukrycie kursora

    ::HANDLE hConsoleOut = ::GetStdHandle(STD_OUTPUT_HANDLE);
    ::CONSOLE_CURSOR_INFO hCCI;
    ::GetConsoleCursorInfo(hConsoleOut, &hCCI);
    hCCI.bVisible = FALSE;
    ::SetConsoleCursorInfo(hConsoleOut, &hCCI);
}

void SetWindow(int Width, int Height){  // definicja funkcji ustawienia rozmiaru okna
    _COORD coord;
    coord.X = Width;
    coord.Y = Height;

    _SMALL_RECT Rect;
    Rect.Top = 0;
    Rect.Left = 0;
    Rect.Bottom = Height - 1;
    Rect.Right = Width - 1;

    HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);      // Hak
    SetConsoleScreenBufferSize(Handle, coord);            // Ustawienie rozmiaru bufora
    SetConsoleWindowInfo(Handle, TRUE, &Rect);            // Ustawienie rozmiaru okna
}

void poczatek(){  // definicja funkcji ekranu poczatkowego

std::cout << "Napisz program rysowania znakiem ponizszej figury:\n";
    std::cout << "    *    * \n";
    std::cout << "     *  *  \n";
    std::cout << "      **   \n";
    std::cout << "     *  *  \n";
    std::cout << "    *    * \n";

    std::cout << std::endl;

    std::cout << "Program powinien umozliwiac:\n"
        << " - Wybor znaku kodu ASII,\n"
        << " - Wczytanie poczatkowych rozmiarow figury,\n"
        << " - Zmiane wielkosci figury klawiszami '+' i '-',\n"
        << " - Przesuwanie figury w czterech kierunkach za pomoca kursorow,\n"
        << " - Ograniczenie przesuwania i rozmiarow figury do obszaru ekranu.\n";

    std::cout << "\n Aby rozpoczac, kliknij dowolny klawisz \n";
    _getch();

    return;

  _getch();
}

 

1 odpowiedź

0 głosów
odpowiedź 10 stycznia 2020 przez k222 Nałogowiec (30,150 p.)
edycja 10 stycznia 2020 przez k222

Problem dotyczy funkcji rysuj i tego, że te dwa fory:

 for (int i = 0; i<rozmiar; i++){    //rysowanie gornej lewej czeęści figury
    gotoxy(x1, y1);
    x1--;
    y1--;
    cout << znak << endl;
  }
for (int i = 0; i<rozmiar ; i++){    //rysowanie dolnej prawej czeęści figury
    gotoxy(x1, y1);
    x1++;
    y1++;
    cout << znak << endl;
  }

rysują ten sam odcinek. Zauważ, że zmienne x1, y1 ustawiasz na początku, potem je tylko przesuwasz, przez co następny for zaczyna tam gdzie ostatni skończył. Obecnie:

1 for rysuje od prawego górnego wierzchołka do środka X
2 for rysuje od środka X do lewego górnego wierzchołka
3 for wraca do środka
4 for rysuje od środka do lewego dolnego wierzchołka

Ostatecznie dostajesz X bez prawej dolnej nogi. Musisz więc albo pozmieniać te fory, albo po każdym forze ustawiać x1, y1, na środku (coś w stylu x1 = y1 = rozmiar/2) i rysować od środka do wierzchołków.

Podobne pytania

0 głosów
2 odpowiedzi 138 wizyt
pytanie zadane 2 listopada 2019 w C i C++ przez someone11 Nowicjusz (120 p.)
+1 głos
3 odpowiedzi 610 wizyt
pytanie zadane 16 kwietnia 2015 w C i C++ przez Wiktor Stary wyjadacz (11,120 p.)
0 głosów
0 odpowiedzi 174 wizyt

93,187 zapytań

142,203 odpowiedzi

322,017 komentarzy

62,513 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 2365p. - dia-Chann
  2. 2326p. - Łukasz Piwowar
  3. 2315p. - Łukasz Eckert
  4. 2301p. - CC PL
  5. 2269p. - Tomasz Bielak
  6. 2235p. - Łukasz Siedlecki
  7. 2232p. - rucin93
  8. 2169p. - Marcin Putra
  9. 2006p. - Michal Drewniak
  10. 1946p. - Adrian Wieprzkowicz
  11. 1901p. - Mikbac
  12. 1744p. - rafalszastok
  13. 1734p. - Anonim 3619784
  14. 1586p. - Dawid128
  15. 1487p. - Michał Telesz
Szczegóły i pełne wyniki

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

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...