figura - problem
Z pAmIęTnIkA nIeGrZeCzNeGo AnIołkA
Napisa³em program, który rysuje figurê i za pomoc± kursorów mo¿emy j± przesuwaæ w oknie konsoli 80x25. Chcê cze¶æ kodu zawrzeæ w odrêbnej funkcji tj przesuwanie_i_kontrola. Niestety wówczas ju¿ przesuwanie po ekranie nie dzia³a. Za uwagi bêdê wdziêcznyzamieszczam kod ¼ród³owy:
Kod:
#include <iostream>
#include <conio>
using namespace std;
void wstep ();
void pobierz_znak(char &znak);
void pobierz_wymiary (int &i, int &j, char znak);
void rysowanie (int i, int j, char znak);
void main()
{
int i,j;
char znak;
_setcursortype (_NORMALCURSOR);
wstep ();
pobierz_znak(znak);
pobierz_wymiary(i, j, znak);
_setcursortype (_NOCURSOR);
rysowanie ( i, j, znak);
}
//************************* FUNKCJE **********************************
void wstep ()
{
cout<<"Napisz program rysowania znakiem ASCII ponizszej figury:\n";
cout<<" **********\n";
cout<<" * *\n";
cout<<" * *\n";
cout<<" * *\n";
cout<<" **********\n\n";
cout<<"Program powinien umozliwiac:\n";
cout<<"- wybor znaku ASCII\n- wczytanie poczatkowych rozmiarow figury\n";
cout<<"- przesuwanie figury klawiszami lewo, prawo, gora, dol\n- ograniczenie przesuwania do obszaru ekranu\n\n\n";
cout<<" -= Wcisnij dowolny klawisz aby kontynuowac =-";
getch();
}
//******************************************************************************
void pobierz_znak(char &znak)
{
int x,y;
clrscr ();
cout<<" Wybierz na klawiaturze znak ASCII,\n";
cout<<"za pomoca ktorego zostanie narysowana figura\n";
cin>>znak;
}
//******************************************************************************
void pobierz_wymiary (int &i, int &j, char znak)
{
int min_szer=3, max_szer=40, min_wys = 3, max_wys, er, x, y;
clrscr();
cout<<"Podaj szerokosc figury z przedzialu od 3 do 40: ";
x = wherex(); y = wherey();
do
{
gotoxy(x,y);
clreol();
er = 0;
cin >> i;
if (cin.fail()) // if(!cin) //kontorola wprowadzanych danych
{
er = 1;
cin.clear();
cin.ignore(0xff, (int)'\n');
}
}
while ((i < min_szer)||(i > max_szer) || er );
clrscr();
if(i>=23) max_wys = 23;
else max_wys = i;
cout<<"Podaj wysokosc figury (liczba nieparzysta) z przedzialu od 3 do "<<max_wys<<": ";
x = wherex(); y = wherey();
do
{
gotoxy(x,y);
clreol();
er = 0;
cin >> j;
if (cin.fail()) // if(!cin) //kontorola wprowadzanych danych
{
er = 1;
cin.clear();
cin.ignore(0xff, (int)'\n');
}
}
while ((j < min_wys)||(j > max_wys) || er || j%2==0);
}
//******************************************************************************
void przesuwanie_i_kontrola ( int &poziom, int &pion, int &g, int aa, int bb, int i, int j);
//******************************************************************************
void rysowanie (int i, int j, char znak)
{
int g,x,y,z;
int poziom=0;
int pion=0;
int ppoziom=0, ppion=0;
int aa = 40;
int bb = 11;
clrscr();
//========== RYSOWANIE LEGENDY ============
gotoxy(1,24);
for(x=1;x<=80;x++)cout<<"=";
cout<<" Figure przesuwamy za pomoca kursorow || Esc = wyjscie";
do{
//========== RYSOWANIE FIGURY =============
for(x=1;x<=(i-j/2);x++) // rysowanie krawedzi górnej
{
gotoxy((aa-i+x+poziom),(bb-(j/2))+pion+1);
cout<<znak;
}
for(x=(i-j/2);x<i;x++) //rysowanie krawedzi skosnej górnej
{
z = wherey();
gotoxy ((aa-i+1+poziom),z);
cout << znak;
gotoxy ((aa-i+x+poziom), z);
cout << znak << endl;
}
z=wherey(); //rysowanie srodka firgury
gotoxy ((aa-i+1+poziom),z);
cout<<znak;
gotoxy ((aa-i+x+poziom),z);
cout<< znak; /*<< endl; */
if( (aa-i+x+poziom)< 80) cout<<endl;
for (x=(i-1);x>(i-(j+1)/2+1);x--) //rysowanie krawedzi skosnej dolnej
{
z = wherey();
gotoxy ((aa-i+1+poziom),z);
cout<< znak;
gotoxy (aa-i+x+poziom, z);
cout<< znak << endl;
}
for(x=1;x<=(i-j/2);x++) //rysowanie krawedzi dolnej
{
z=wherey();
gotoxy((aa-i+x+poziom),z);
cout<<znak;
}
ppion = pion;
ppoziom = poziom;
przesuwanie_i_kontrola ( poziom, pion, g, aa, bb);
// ============ OPERACJE NA KURSORACH I KONTROLA ==========
//========= "KASOWANIE" FIGURY ===========
for(x=1;x<=(i-j/2);x++) // kasowanie krawedzi górnej
{
gotoxy((aa-i+x+ppoziom),(bb-(j/2))+ppion+1);
cout<<" ";
}
for(x=(i-j/2);x<i;x++) //kasowanie krawedzi skosnej górnej
{
z = wherey();
gotoxy ((aa-i+1+ppoziom),z);
cout << " ";
gotoxy ((aa-i+x+ppoziom), z);
cout << " " << endl;
}
z=wherey(); //kasowanie srodka firgury
gotoxy ((aa-i+1+ppoziom),z);
cout<<" ";
gotoxy ((aa-i+x+ppoziom),z);
cout<< " ";
if( (aa-i+x+ppoziom)< 80) cout<<endl;
for (x=(i-1);x>(i-(j+1)/2+1);x--) //kasowanie krawedzi skosnej dolnej
{
z = wherey();
gotoxy ((aa-i+1+ppoziom),z);
cout<< " ";
gotoxy (aa-i+x+ppoziom, z);
cout<< " " << endl;
}
for(x=1;x<=(i-j/2);x++) //kasowanie krawedzi dolnej
{
z=wherey();
gotoxy((aa-i+x+ppoziom),z);
cout<<" ";
}
}while(g!=27); //wyjscie z programu ESC
}
//******************************************************************************
void przesuwanie_i_kontrola ( int &poziom, int &pion, int &g, int aa, int bb, int i, int j)
{
g=getch();
if (g==0)
{
g=getch();
if(g==75) //kontrola i przesuniêcie w lewo
{
if(aa-i+poziom > 0) poziom = poziom--;
}
if(g==77) //kontrola i przesuniêcie w prawo
{
if (aa-i+poziom < aa+aa - i ) poziom = poziom++;
}
if(g==72) //kontrola i przesuniêcie w góre
{
if ( (bb-(j/2)+pion) > 0) pion=pion--;
}
if(g==80) //kontrola i przesuniêcie w dó³
{
if ( (bb-(j/2)+pion-1) < bb+bb -j) pion = pion++;
}
}
}
/*----------------------------------------------------------------------------*/
[ Dodano: Wto Lis 10, 2009 11:59 pm ]
ok. Rozwi±za³em problem sam. Nale¿a³o poprostu operacjê inkrementacji i dekremantacji w problematycznej funkcji zmieniæ. Zamieszczam poprawiony kod:
Kod:
void przesuwanie_i_kontrola (int &poziom,int &pion, int &g, int aa, int bb, int i, int j)
{
g=getch();
if (g==0)
{
g=getch();
if(g==75) //kontrola i przesuniêcie w lewo
{
if(aa-i+poziom > 0) poziom = --poziom ;
}
if(g==77) //kontrola i przesuniêcie w prawo
{
if (aa-i+poziom < aa+aa - i ) poziom = ++poziom;
}
if(g==72) //kontrola i przesuniêcie w góre
{
if ( (bb-(j/2)+pion) > 0) pion=--pion;
}
if(g==80) //kontrola i przesuniêcie w dó³
{
if ( (bb-(j/2)+pion-1) < bb+bb -j) pion = ++pion;
}
}
}