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êczny
zamieszczam 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;
          }
       }

}

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • drakonia.opx.pl
  • Copyright (c) 2009 Z pAmIÄ™TnIkA nIeGrZeCzNeGo AnIoÅ‚kA | Powered by Wordpress. Fresh News Theme by WooThemes - Premium Wordpress Themes.