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();
}