Autor Wątek: [C++] Snake  (Przeczytany 1863 razy)

Offline uncaer9

  • Użytkownik

# Grudzień 12, 2010, 16:22:58
Witam. Uczę się programować w C++. Poniżej umieściłem kod nie skończonej jeszcze gry Snake i chciałbym was zapytać co mogę w tym poprawić min. pod kątem optymalizacji(ale bez przesady) i programowania obiektowego. Nie chce wyrobić sobie złych nawyków.
#include <iostream>
#include <allegro.h>
#include <vector>

struct segment
{
  int x;
  int y;
  int kolor;
  int prevx;
  int prevy;
  segment(int a, int b) { x=a; y=b; kolor=makecol((rand() % 256),(rand() % 256),(rand() % 256)); }
};

void RysujSegment(segment a)
{
  rectfill(screen, a.x,a.y, a.x+29, a.y+29, a.kolor);
}
 
int ruch();

int kier=1;
int prevkier;
int tim=time(NULL);
std::vector<segment> sgm;


int main()
{
  srand ( time(NULL) );
  allegro_init();
  install_keyboard();
  set_color_depth(32);
  set_gfx_mode(GFX_AUTODETECT_WINDOWED,810,600,0,0);
  set_palette(default_palette);
  clear_to_color(screen, makecol(255,255,255));
  for(int i=0; i<600; i+=30)
  {
    sgm.push_back(segment(0, i));
  }


  if(ruch())
    while( !key[KEY_ESC])
    {
      textout_ex(screen,font,"Game Over!",20,20 ,makecol(255,0,255),-1);
    }


  allegro_exit();
  return 0;
}

int ruch()
{
  while( !key[KEY_ESC])
  {
     
    for(int i=0; i<sgm.size(); i++)
    {
      RysujSegment(sgm[i]);
    }
    if(sgm[0].x  > sgm[1].x)
      prevkier=1;
    else
    if(sgm[0].x  < sgm[1].x)
      prevkier=2;
    else
    if(sgm[0].y > sgm[1].y)
      prevkier=3;
    else
      prevkier=4;
   
      if(key[KEY_D] && prevkier!=2)
kier=1;
      else
      if(key[KEY_A] && prevkier!=1)
kier=2;
      else
      if(key[KEY_S] && prevkier!=4)
kier=3;
      else
      if(key[KEY_W] && prevkier!=3)
kier=4;
   
   
    if((time(NULL) - tim) >= 1)
    {

      tim=time(NULL);
      sgm[0].prevx=sgm[0].x;
      sgm[0].prevy=sgm[0].y;
      switch(kier)
      {
case 1:
  sgm[0].x+=30;
  break;
case 2:
  sgm[0].x-=30;
  break;
case 3:
  sgm[0].y+=30;
  break;
case 4:
  sgm[0].y-=30;
  break;
      }
      for(int i=1; i<sgm.size(); i++)
      {
sgm[i].prevx=sgm[i].x;
sgm[i].prevy=sgm[i].y;
sgm[i].x=sgm[i-1].prevx;
sgm[i].y=sgm[i-1].prevy;
      }
      if(sgm[0].x < 0)
return 1;
      else
      if(sgm[0].x > 800)
return 1;
      else
      if(sgm[0].y < 0)
return 1;
      else
      if(sgm[0].y > 570)
return 1;
      clear_to_color(screen, makecol(255,255,255));
     
    }
   
  }
 
  return 0;
 
}
END_OF_MAIN();
« Ostatnia zmiana: Grudzień 12, 2010, 16:24:50 wysłana przez uncaer9 »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline steckel

  • Użytkownik

# Grudzień 12, 2010, 18:58:59
Ja tu nie widzę nic z programowania obiektowego. Poza tym "Przedwczesna optymalizacja to źródło wszelkiego zła".

Stranger

  • Gość
# Grudzień 12, 2010, 19:03:12
Nie przekazuj struktur/klas przez wartość a przez referencję. Zamiast:
void Func(Foo foo_) {}
Daj:
void Func(const Foo& foo_) {}

Małe, a może poprawić wydajność ;).



@steckel: +1

Offline lmmilewski

  • Użytkownik
    • Łukasz Milewski - devblog

# Grudzień 12, 2010, 19:14:37
Jeżeli działa i działa wystarczająco szybko to nie optymalizuj.

Nie widzę powodu, żeby przepisywać snake na obiekty, zakładając, że działa. Jeżeli będziesz chciał dodać funkcjonalność i okażę się, że to jest trudne to przemyśl strukturę i popraw kod aby w przyszłości było łatwiej.