Example #1
0
/* rnbqkbnr/pppppppp/8/8/8/8/PPPPPPPP/RNBQKBNR w KQkq - 0 1 */
bool Board::fromFEN(const char * fen)
{
  clear();

  if ( !fen )
    fen = stdFEN_;

  // trim left
  const char * sepr =" \t\r\n";
  for ( ; *fen && strchr(sepr, *fen); ++fen);
  
  // copy
  strncpy(fen_, fen, FENsize);
  
  // trim right
  int n = (int)strlen(fen_) - 1;
  for (; n >= 0 && strchr(sepr, fen_[n]); --n);
  fen_[n+1] = 0;

  const char * s = fen;
  int x = 0, y = 7;
  for ( ; s && y >= 0; ++s)
  {
    char c = *s;
    if ( '/' == c )
      continue;
    else if ( isdigit(c) )
    {
      int dx = c - '0';
      x += dx;
      if ( x > 7 )
      {
        --y;
        x = 0;
      }
    }
    else
    {
      Figure::Type  ftype = Figure::TypeNone;
      Figure::Color color = Figure::ColorBlack;

      if ( isupper(c) )
        color = Figure::ColorWhite;

      ftype = Figure::toFtype(toupper(c));

      if ( Figure::TypeNone == ftype )
        return false;

      Index p(x, y);
      addFigure(color, ftype, p);

      if ( ++x > 7 )
      {
        --y;
        x = 0;
      }
    }
  }

  int i = 0;
  for ( ; *s; )
  {
    char c = *s;
    if ( c <= ' ' )
    {
      ++s;
      continue;
    }

    if ( 0 == i ) // process move color
    {
      if ( 'w' == c )
        color_ = Figure::ColorWhite;
      else if ( 'b' == c )
        color_ = Figure::ColorBlack;
      else
        return false;
      ++i;
      ++s;
      continue;
    }

    if ( 1 == i ) // process castling possibility
    {
      if ( '-' == c )
      {
        ++i;
        ++s;
        continue;
      }

      for ( ; *s && *s > 32; ++s)
      {
        Field fk, fr;

        switch ( *s )
        {
        case 'k':
          set_castling(Figure::ColorBlack, 0);
          fmgr_.hashCastling(Figure::ColorBlack, 0);
          break;

        case 'K':
          set_castling(Figure::ColorWhite, 0);
          fmgr_.hashCastling(Figure::ColorWhite, 0);
          break;

        case 'q':
          set_castling(Figure::ColorBlack, 1);
          fmgr_.hashCastling(Figure::ColorBlack, 1);
          break;

        case 'Q':
          set_castling(Figure::ColorWhite, 1);
          fmgr_.hashCastling(Figure::ColorWhite, 1);
          break;

        default:
          return false;
        }
      }

      ++i;
      continue;
    }

    if ( 2 == i )
    {
      ++i;
      char cx = *s++;
      if ( '-' == cx ) // no en-passant pawn
        continue;

      if ( !*s )
        return false;

      char cy = *s++;

      Index enpassant(cx, cy);

      if ( color_ )
        cy--;
      else
        cy++;

      Index pawn_pos(cx, cy);

      Field & fp = getField(pawn_pos);
      if ( fp.type() != Figure::TypePawn || fp.color() == color_ )
        return false;

      en_passant_ = enpassant;
      fmgr_.hashEnPassant(en_passant_, fp.color());
      continue;
    }

    if ( 3 == i ) // fifty moves rule
    {
      char str[4];
      str[0] = 0;
      for (int j = 0; *s && j < 4; ++j, ++s)
      {
        if ( *s > 32 )
          str[j] = *s;
        else
        {
          str[j] = 0;
          break;
        }
      }

      fiftyMovesCount_ = atoi(str);
      ++i;
      continue;
    }

    if ( 4 == i ) // moves counter
    {
      movesCounter_ = atoi(s);
      break;
    }
  }

  if ( !invalidate() )
    return false;

  return true;
}
Example #2
0
void Zeichnung::load(std::istream &InputStream)
{
    //Oeffnen einer Datei zum lesen:
    //std::ifstream ReadDatei("MeineDatei.txt");
    //Lesen aus einer Datei
    //ReadDatei >> i;
    // Lesen eines einzelnen Zeichens
    //char c = ReadDatei.get();
    // pruefen auf Dateiende (End Of File)

    Figure *FigurePtr1 = NULL;

    while (!InputStream.eof())
    {
        int Zeichen;
        int Form;
        int i = 0;



        int Zahl[4] = {};           //Array mit 4 Eigenschaften der Objekte
        Form =  InputStream.get();  //Erkennt E, L oder R
        while(i<4)
        {

            if(i==0) Zeichen =  InputStream.get();
            Zeichen =  InputStream.get();
            while((Zeichen != 32) &&(Zeichen != -1) && (Zeichen != 10) ) //Solange kein leerschlag
            {
                Zahl[i] = (Zahl[i]*10);
                if(Zeichen != 32)
                {
                    Zahl[i] = Zahl[i] + (Zeichen-0x30);
                }

                Zeichen =  InputStream.get();

            }
            //std::cout <<  Zahl[i] <<" "<<std::endl;
            i++;
            if(Zeichen == 10)
            {
                if(Form == 'E')
                {
                    FigurePtr1 = new Ellipse(Zahl[0],Zahl[1],Zahl[2],Zahl[3]);
                    addFigure(FigurePtr1);
                }
                else if(Form == 'L')
                {
                    FigurePtr1 = new LineClass(Zahl[0],Zahl[1],Zahl[2],Zahl[3]);
                    addFigure(FigurePtr1);
                }
                else if(Form == 'R')
                {
                    FigurePtr1 = new Rectangle(Zahl[0],Zahl[1],Zahl[2],Zahl[3]);
                    addFigure(FigurePtr1);
                }
                Form =  InputStream.get();  //Erkennt E, L oder R
                i = 0;
                memset(Zahl,0, sizeof(Zahl));
            }

        }
        //std::cout <<  Zeichen <<" ";

    }
}
Example #3
0
/**
  * Pacman am Controller anmelden. Ab diesem Zeitpunkt
  * 'gehoert' Pacman dem Controller. Er ist also auch fuer das
  * Loeschen per 'delete' verantwortlich. Besser waeren Smart-Pointer.
  * Diese wurden aber in der Vorlesung nicht ausfuehrlich vorgestellt.
  * @param pacman Zeiger auf die Pacman-Figur.
  */
void GameController::setPacman(Pacman* pacman) {
	this->pacman = pacman;
	addFigure(pacman);
}
Example #4
0
int Scene::resume(unsigned delay)
{
  Event event;
  while ((event = screen->getEvent()).type != NO_MORE_EVENTS) {
    if (event.type == QUIT)
      return 0;

    if (event.type == KEYDOWN)
      switch (event.key.keysym.sym) {
      case K_ESCAPE:
        if (active != figures.end()) {
          figures.erase(active);
          active = figures.end();
        }
        break;
      case K_SLASH:
        active = figures.begin();
        step = 0;
        break;
      case K_RIGHTBRACKET:
        if (active != figures.end())
          ++active;
        break;
      case K_LEFTBRACKET:
        if (active != figures.end())
          --active;
        break;

      case K_b:
        if (event.key.keysym.mod & K_MOD_SHIFT)
          import_binary();
        else
          export_binary();
        break;
      case K_t:
        if (event.key.keysym.mod & K_MOD_SHIFT)
          import_text();
        else
          export_text();
        break;
      case K_x:
        if (event.key.keysym.mod & K_MOD_SHIFT)
          import_xml();
        else
          export_xml();
        break;

      default:
        if (Figure *figure = figures_maker.build(event.key.keysym.sym)) {
          addFigure(figure);
          step = 0;
          active = std::find(figures.begin(), figures.end(), figure);
        }
        break;
      }

    if ((active != figures.end()) && (event.type == MOUSEMOTION))
      if ((*active)->handleMotion(step, event.motion.x, event.motion.y)) {
        step = 0;
        active = figures.end();
      }

    if ((active != figures.end()) && (event.type == MOUSEBUTTONDOWN))
      if (event.button.button == 1) ++step;
      else if (event.button.button == 3) {
	step = 0;
	(*active)->handleMotion(-1, 0, 0);
	active = figures.end();
      }
  }
  screen->sleep(delay);
  return !0;
}