/* 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; }
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 <<" "; } }
/** * 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); }
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; }