Pomoc z projektem – figura nie przesuwa się po ekranie

0

Witam,
Na wstępie zaznaczę że jestem jeszcze mocno zielony gdy chodzi o programowanie. Mam do napisania projekt:

Napisz program rysowania znakiem ASCII poniższej figury. Program powinien umożliwić:

  • wybór znaku kodu ASCII;
  • wczytanie początkowych rozmiarów figury;
  • zmianę wielkości figury klawiszami + i -;
  • przesuwanie figury za pomocą strzałek;
  • ograniczenie przesuwania i rozmiarów figury do obszaru ekranu;

Sama figura się powiększa oraz pomniejsza, ale nie przesuwa się.
Jakby ktoś wskazał gdzie mam błąd to by było fajnie :)

#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <Windows.h>

const int GORA = 72, DOL = 80, LEWO = 75, PRAWO = 77;    

void gotoxy(int X, int Y);
int wherex();
int wherey();
void Wstep();
void WczytajDane(float &size, char &znak);
void Rysuj(float size, float x, float y, char znak);
void Przesuwanie(float size, float &x, float &y, char znak);
//---------------------------------------------------------------------------

using namespace std;

int main()
{
	float x = 1, y = 1;
	float size;
	char znak;
	system("cls");

	Wstep();
	WczytajDane(size, znak);
	Rysuj(size, x, y, znak);
	_getch();
	Przesuwanie(size, x, y, znak);

	return 0;
}
////////////////////////////////////////////////////////////////////////////////

void Wstep()
{
	
	cout <<	"\t========== Program rysowania figury znakiem ASCII ========= \n"
		"\t==================== Program umozliwia: =================== \n"
		"\t== wybor znaku kodu ASCII ================================= \n"
		"\t== wczytanie poczatkowych rozmiarow figury ================ \n"
		"\t== przesuwanie firury klawiszami strzalek ================= \n"
		"\t== powiekszanie oraz zmianiszanie figury za pomoca + i - == \n"
		"\t== ograniczenie przesuwania figury do rozmiaru ekranu ===== \n"
		"\t=========================================================== \n"
		"\t======== dowolny klawisz rozpocznie prace programu ======== \n"
		"\t=========================================================== ";
	_getch();
}

////////////////////////////////////////////////////////////////////////////////

void WczytajDane(float &size, char &znak)
{
	system("cls");
	int max = 24, min = 3, rozmiar;
	do
	{
		cout << "Podaj rozmiar figury z zakresu (5-22): ";
		cin >> rozmiar;
	} while (rozmiar < min || rozmiar > max);
	size = rozmiar;

	cout << "Podaj znak kodu ASCII: ";
	cin >> znak;

}

////////////////////////////////////////////////////////////////////////////////

void Rysuj(float size, float x, float y, char znak)
{
	
	float i, j;
	int k;

	system("cls");

	for (i = 1; i < size; i++)
	{
		gotoxy(i + size /2, 24 - size / 2), cout << znak;
	}

	for (i = size/2; i > 0; i--)
	{
		gotoxy(i, 24-i), cout << znak;
	}

	for (i = 1; i < size /2; i++)
	{
		gotoxy(i, 24 - (size)+i) , cout << znak;
	}

	
	gotoxy(10, 25), cout << "strzalki: przesuwanie; +/-: powieksz, zmniejsz; ESC: wyjscie";
}

////////////////////////////////////////////////////////////////////////////////

void Przesuwanie(float size, float &x, float &y, char znak) // przesuwanie figury klawiszami strzałek
{
	int zmiana = 0, max = 23;
	char klawisz;

	do
	{
		klawisz = _getch();

		switch (klawisz)
		{
		case GORA:
		{
			y--; zmiana = 1;
			if (y < 1)
			{
				y++;
				zmiana = 0;
			}
			break;
		}

		case DOL:
		{
			y++; zmiana = 1;
			if (y > max - (size - 2))
			{
				y--;
				zmiana = 0;
			}
			break;
		}

		case LEWO:
		{
			x--; zmiana = 1;
			if (x < 1)
			{
				x++;
				zmiana = 0;
			}
			break;
		}
		case PRAWO:
		{
			x++; zmiana = 1;
			if (x > 80 - size)
			{
				x--;
				zmiana = 0;
			}
			break;
		}

		case '+':
		{
			size++; zmiana = 1;

			if (size < 5 || size > max)
			{
				size--; y--;
				zmiana = 0;
			}

			break;
		}

		case '-':
		{
			size--;
			zmiana = 1;
			if (size < 5 || size > max)
			{
				size++;
				zmiana = 0;
			}
			break;
		}

		}

		if (zmiana)
		{
			Rysuj(size, x, y, znak); zmiana = 0;
		}

	} while (klawisz != 27);

}
void gotoxy(int X, int Y)
{
	COORD coord;
	coord.X = X;
	coord.Y = Y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
	return;
}

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;
}
0

Zacznijmy od tego, że nie napisałeś jaka to figura. ;)

Zwróć uwagę na to, że do namalowania tej ”figury” powinieneś przechowywać jej rozmiar, znak, a także dwa offsety – od lewej i od góry. I o ile faktycznie używasz zmiennych znak oraz size do przechowywania rozmiaru figury, to zmiennch dla offsetów nigdzie nie widzę – w funkcji Rysuj masz trzy pętle z hardkodowaną 1 dla iteratora. Niby u góry kodu są jakieś zmienne x i y, ale nie są używane podczas rysowania.

Poza tym, współrzędne znaków w konsoli są opisywane za pomocą liczb naturalnych, więc dlaczego zmienne size, x i yfloat-ami? Sam sobie utrudniasz życie, niepotrzebnie komplikując kod. Idąc dalej, funkcja Przesuwanie wcale nie służy tylko do przesuwania, bo można w niej również zmniejszać i zwiększać rozmiar figury. W dodatku jest potwornie długa – każdy case powinien wołać osobną funkcję Funkcje wherex i wherey absolutnie nie są do niczego potrzebne i nie powinieneś ich używać (bo program tego nie wymaga).

Do tego jeszcze kod piszesz trochę po polsku i trochę po angielsku – zdecyduj się.

0

Dokladnie chodzi mi o tą figurę w zadaniu 146. Dzieki za odpowiedz, postaram sie troche pokombinowac.

1 użytkowników online, w tym zalogowanych: 0, gości: 1