[c++] Ruch tylko w ustalonym prostokącie jak ?

0

Witam ! Jestem świeżo uczącym się programowania w c++. Piszę program, który za pomocą klawisza z klawiatury tworzy figurę w postaci literki Z i umożliwia jej przesuwanie i powiększanie. Chciałbym również, aby rysował mi prostokąt (który ja sam ustawie- nie będzie wczytywany od użytkownika) i aby tą figurą można było powiększa i przesuwać tylko w tym prostokącie. Czy moglibyście wyjaśnić mi jak to zrobić ? Załączam od który udało mi się zrobić.

 

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


void pobierz_znak (char &znak, int &rozm);
void wymiary(int &wym);
void rysuj(char &znak, int &x, int &y, int &rozm);
void sterowanie(int &x, int &y, int &rozm, int klaw);
void gotoxy(int x,int y)
{
	COORD c;
	c.X=x;
	c.Y=y;
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);

}


using namespace std;

int main()
{
	
	
	char znak;
	int x=20,y=10,rozm;
	int czynnosc;

	pobierz_znak(znak,rozm);
	cout<<"figura wyświetla się na obrzasze wielkosci 40x20";
	cout<<"1.Sterowanie figura za pomoca strzałek\n2.Zmienianie rozmiaru za pomoca + i -\n\n\n"; 
	cout<<"Nacisnij enter, aby kontynowac";
	_getch();
	
	
do
	{
	system("cls");
	rysuj(znak,x,y,rozm);
	czynnosc=_getch();
	if(czynnosc==77||czynnosc==75||czynnosc==80||czynnosc==72||czynnosc==43||czynnosc==45)
	sterowanie(x,y,rozm,czynnosc);
	}
while(czynnosc !=27);
	_getch();	
return 0;
}
		

void pobierz_znak(char &znak, int &rozm)
{
	cout<<" Podaj znak z kodu ASCII ktorym ma byc rysowana figura: \n";
	cin>>znak;
	cout<<"Podaj rozmiar figury:\n";
	cin>>rozm;
	
	
}
void rysuj(char &znak, int &x, int &y, int &rozm)
{
		int a=40,b=20;
	
	 for(int i=0;i<a;i++)
                cout << "_";
           
           
        cout << endl;
          
           for(int i=1;i<b;i++)
                {
                  cout << "|";
                 
                   for(int j=0;j<a;j++)
                  
                          cout << " ";
                        
                   
                  cout << "|\n";
                }
		for(int i=0;i<rozm;i++)
       {	
		   gotoxy(x-rozm+i,y);
		   cout<<znak;
		   gotoxy(x-rozm+i, y+i);
		   cout<<znak;
		   gotoxy(x-i-1,y+rozm-1);
		   cout<<znak;
		  
		} 
	  
	  
		
}
	   
   
void sterowanie( int &x, int &y, int &rozm, int klaw)
{
//w lewo
	
			if (klaw==75)
	{
		x--;
	}
	
		
//w prawo
	else
			if (klaw==77)
	{
		x++;
	}
//dol
			if (klaw==80)
	{
		y++;
	}
//gora
			if (klaw==72)
	{
		y--;
	}
//zwiekszanie
			if (klaw==43)
			{
		rozm++;
			}
//zmniejszanie			
			if (klaw==45)
			{
		rozm--;
			}

}

0

zamiast: ++x; dajesz: if(++x>=rozm) x=rozm;
zamiast: --x; dajesz: if(--x<0) x=0;
y - tak samo.

0

ok poradziłem sobie z przesuwaniem ale mam problem ze zwiększaniem. Nie wiem jak zrobić aby ograniczało się przy maksymalnym powiększeniu do prostokąta (żeby nie wyszło poza niego).

void sterowanie( int &x, int &y, int &rozm, int klaw, int &a, int &b)

{

//w lewo
       
                        if (klaw==75)
        {
               if(--x<1+rozm) 
					x=1+rozm;
        }
       
               
//w prawo
        else
                        if (klaw==77)
        {
                if(x++>=a) 
					x=a;
        }
//dol
                        if (klaw==80)
        {
                if(y++>=b-rozm) 
					y=b-rozm;
        }
//gora
                        if (klaw==72)
        {
                if(y--<=1) 
					y=1;
        }
//zwiekszanie
                        if (klaw==43)
                        {
                if(rozm++>=x) 
					rozm=x;
                        }
//zmniejszanie     
                        if (klaw==45)
                        {
              rozm-- ;
                        }
                        



0

if(x++>=a) x=a;
Chcesz mi wmówić że to działa?

0

tak ponieważ "a" jest moim ogranicznikiem prostokąta w prawą stronę, a "b" w dół.

0

Jeśli chcesz zrobić złudzenie animacji w konsoli to nie używaj system("cls") ,ponieważ ekran będzie migał. Cały zrzut ekranu zapamiętaj w stringu. Za każdym razem cofaj kursor na początek konsoli dzięki czemu stara treść ekranu zostanie nadpisana nową. Dzięki temu ekran nie będzie migał

0

ok dzięki za poradę :). Jak widać jestem początkujący. Postaram się zmienić to w stringa ;) Jakbym miał problemy to dam znać :) POZDRAWIAM !!!

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