Nowe posty

Autor Wątek: przejście z dev c++ i cmd na g++ i konsolę  (Przeczytany 5307 razy)

314

  • Gość
przejście z dev c++ i cmd na g++ i konsolę
« dnia: 2009-06-12, 21:02:16 »
#include  
#include
#include "conio.h"


//*****************RYSOWANIE RAMKI**********************************************

void gotoxy(int, int);

void ramka() //rysuje ramke na ekranie
{ int c;

  gotoxy(1, 2);
  for (int i=0; i<70; ++i)
    printf("%c", 205);
  printf(" %c", 30);
  gotoxy(1, 22);
  for (int j=0; j<70; ++j)
    printf("%c", 205);
  printf(" %c", 31);
  }

//*****************OBSLUGA KURSORA**********************************************

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

//******************DEKLAROWANIE STRUKTURY**************************************

struct struktura
{
   int w;
   int x;
   int y;
};


static struktura snake[1000];

int p;

//******************DEKLAROWANIE STRUKTURY**************************************

struct strukt
{
   int x;
   int y;
   int ok;
};

static strukt biji;

int opt_cor;
int a;
int b;
char znak;

//*********************CIA�O FUNKCJI********************************************
int main()
{
   int z,zz;
   int speed;
   char speed1[3];
   int x;
   int y;
   char opt_ex='n';
   char opt;
   cout <<"\\n\\n";
   ramka();
   gotoxy(32,5);
    cout<<"Jak grac?"<    gotoxy(15,8);
   cout<<"Kierujesz weza za pomoca tych 4 klawiszy"<   gotoxy(15,11);
    cout<<"[W] - w gore"<    gotoxy(15,12);
    cout<<"[S] - w dol"<   gotoxy(15,13);
    cout<<"[A] - w lewo"<    gotoxy(15,14);
   cout<<"[D] - w prawo"<   gotoxy(15,16);
   cout<<"Kontroluj weza by rosl jak najdluzszy  "<   gotoxy(15,17);
    cout<<""<    cout<<"                  Press any key to continue game ... ";
       
      getch();
   do
   {
      p=0;
      system("cls");
      for(a=2;a<73;a++)
      {
         gotoxy(a,1); cout<         gotoxy(a,21); cout<      }
      gotoxy(1,1); cout<      gotoxy(1,21); cout<      gotoxy(73,1); cout<      gotoxy(73,21); cout<
      for(a=2;a<21;a++)
      {
         gotoxy(1,a); cout<         gotoxy(73,a); cout<      }
      gotoxy(37,1); cout<
      do
      {
          gotoxy(25,8); cout<<"Wybierz poziom trudnosci";        
         gotoxy(30,10); cout<<"Level (1-5) : "<         gotoxy(44,10); speed1[0]=getch(); putch(speed1[0]); //brak zrozumienia
         speed=atoi(speed1);
      }while(speed>5&&speed<=0);
      gotoxy(25,8); cout<<"                                "<      gotoxy(30,10); cout<<"                   "<
      opt='0';
      opt_ex='n';
      biji.ok=1;

      znak='w';
      b=0;
      for(a=0;a<1000;a++)
      {
         snake[a].w=0;
         snake[a].x=0;
         snake[a].y=0;
      }
      snake[b].w=1;

      x=23;
      y=20;
      do
      {
         if(biji.ok==1)
         {
            biji.x=(rand() % 70)+2;
            biji.y=(rand() % 18)+2;
            biji.ok=0;
         }
         for(a=0;a<1000;a++)
         {
            if(snake[a].w==1)
            {
               gotoxy(snake[a].x,snake[a].y); cout<            }
         }
         for(a=999;a>0;a--)
         {
            if(snake[a].w==1&&snake[a-1].w==1)
            {
               snake[a].x=snake[a-1].x;
               snake[a].y=snake[a-1].y;
            }
         }
         snake[0].x=x;
         snake[0].y=y;

         for(a=0;a<1000;a++)
         {
            if(snake[a].w==1)
            {
               gotoxy(snake[a].x,snake[a].y); cout<            }
         }
         gotoxy(biji.x,biji.y); cout<
         if(kbhit())
         {
            opt=getch();
         }

         if(opt=='w')
         {
            if(znak=='s')
            {
               opt=znak;
            }
            else
            {
               y=y-1;
            }
         }
         if(opt=='s')
         {
            if(znak=='w')
            {
               opt=znak;
            }
            else
            {
               y=y+1;
            }
         }
         if(opt=='d')
         {
            if(znak=='a')
            {
               opt=znak;
            }
            else
            {
               x=x+1;
            }
         }
         if(opt=='a')
         {
            if(znak=='d')
            {
               opt=znak;
            }
            else
            {
               x=x-1;
            }
         }
         znak=opt;

         for(a=1;a<1000;a++)
         {
            if(snake[a].w==1)
            {
               if(x==snake[a].x&&y==snake[a].y)
               {
                  for(zz=0;zz<10;zz++)
                  {
                     if(zz%2==0)
                     {
                        for(z=0;z<1000;z++)
                        {
                           if(snake[z].w==1)
                           {
                              gotoxy(snake[z].x,snake[z].y); cout<<' '<                           }
                        }
                     }
                     else
                     {
                        for(z=0;z<1000;z++)
                        {
                           if(snake[z].w==1)
                           {
                              gotoxy(snake[z].x,snake[z].y); cout<                           }
                        }
                     }
                     Sleep(200);
                  }
                  gotoxy(30,15); cout<<"Gra skonczona !!!"<                  cout<                  opt=char(27);

               }
            }
         }

         if(x==1||x==73||y==21||y==1)
         {
            for(zz=0;zz<10;zz++)
                  {
                     if(zz%2==0)
                     {
                        for(z=0;z<1000;z++)
                        {
                           if(snake[z].w==1)
                           {
                              gotoxy(snake[z].x,snake[z].y); cout<<' '<                           }
                        }
                     }
                     else
                     {
                        for(z=0;z<1000;z++)
                        {
                           if(snake[z].w==1)
                           {
                              gotoxy(snake[z].x,snake[z].y); cout<                           }
                        }
                     }
                     Sleep(100);
                  }
            gotoxy(30,15); cout<<"Gra skonczona !!!"<            cout<            opt=char(27);
         }
         if(x==biji.x&&y==biji.y)
         {

            gotoxy(x,y); cout<<' '<            biji.ok=1;
            p=p+speed;
            b=b+1;
            gotoxy(37,1);
            cout<            snake[b].w=1;
         }

         Sleep(170/speed);
      }while(opt!=char(27));

      do
      {
          system("cls");
          gotoxy(30,12);
          cout<<"Zdobyles "<         gotoxy(27,23); cout<<"Replay? [Y]es / [N]o : "<         gotoxy(50,23); opt_ex=getch();
         if(opt_ex=='y'||opt_ex=='Y'||opt_ex=='n'||opt_ex=='N')
         {
            opt_cor=1;
         }
         else
         {
            opt_cor=0;
         }
      }while(opt_cor==0);


   }while(opt_ex=='y'||opt_ex=='Y');
   cout<   MessageBox(NULL,"                 \\n Koniec\\n","             Gry",
                     MB_OK | MB_SYSTEMMODAL|MB_ICONINFORMATION|MB_SERVICE_NOTIFICATION|MB_RTLREADING);
   }
Kompilacja w Dev c++ jest bezproblemowa, używanie pod cmd również.
W g++ pojawia się problem z bibliotekami, a nawet jak się otworzy skompilowaną wersję
(w cmd dostępnym dzięki wine), program nie działa poprawnie.

Jakimi bibliotekami zastąpić te które są. Jakie funkcje zastąpią mi te z Windowsa?
Podobny temat już się pojawił http://forum.linux.pl/viewtopic.php?id=2548 ale z nieco prostszym programem.
Może unistd albo ncurses?

ZipoKing

  • Gość
przejście z dev c++ i cmd na g++ i konsolę
« Odpowiedź #1 dnia: 2009-06-12, 21:56:10 »
Zacznijmy od tego, iż ten program nie ma prawa skompilować się pod Linuksem z dwóch powodów
a) używa winapi
b) korzysta ze specyficznego dla windowsa pliku nagłówkowego conio.h
Operacje na terminalu z powodzeniem zastąpisz biblioteką ncurses - dosyć rozbudowany przykład jak z niej korzystać znajdziesz pod adresem http://kasperd.net/~kasperd/comp.os.linux.development/ncurses2.txt

314

  • Gość
przejście z dev c++ i cmd na g++ i konsolę
« Odpowiedź #2 dnia: 2009-06-12, 22:16:19 »
Z wyświetlaniem nie będzie problemu. Na http://www.opcode.eu.org/c_cpp/  też znalazłem opis tej biblioteki.
Zostaje jeszcze dla mnie trudniejsza sprawa przechwytywania sygnałów, czyli getch();

  • Gość
przejście z dev c++ i cmd na g++ i konsolę
« Odpowiedź #3 dnia: 2009-06-14, 17:47:33 »
O ile dobrze pamiętam, to getch() służy do wczytywania znaków ze standardowego wejścia (z konsoli), więc możesz zamiast tego użyć standardowego cin z C++ (w przeciwieństwie do cout używa się z operatorem >>) albo standardowego scanf() z C.

taka uwaga nie do końca związana z Twoim problemem, ale przydatna na przyszłość:
używając standardowych bibliotek C++ powinno się załączać ich nagłówki bez przyrostka .h, czyli w powyższym kodzie zamiast
#include 
napisz
#include 
a pod listą includów dodaj
using namespace std;
(sam kompilator pewnie Cię o tym informuje wyrzucając warningi na ten temat).

BTW. korzystając z Dev-C++ najprawdopodobniej także kompilowałeś przy użyciu g++ (Dev-C++ domyślnie używa właśnie tego kompilatora wraz z biblioteką mingw32), więc na g++ już dawno "przeszedłeś";)

314

  • Gość
przejście z dev c++ i cmd na g++ i konsolę
« Odpowiedź #4 dnia: 2009-06-20, 11:26:19 »
Udało się, trzeba było zastosować timeout(0); które działa tak jak kbhit, tylko wystarczy raz napisać na początku i argumentem jest czas jaki czekamy na naciśnięcie klawisza.
W moim przypadku problemem było to, że jak się nic nie wcisnęło to wąż się nie ruszał.

Dzięki za pomoc :)