Литература

подскажите прогу как самому сделать пазл пол дня в инете копался ни че не нашел ))

#include <cstdlib>#include <qapplication.h>#include <qwidget.h>#include <qpainter.h>#include <qpixmap.h>#include <vector>#include <algorithm>class Piece{ private: int x_,y_; QPixmap piece_; public: Piece(int x, int y, const QPixmap& pm): x_ (x), y_ (y), piece_ (pm) {} void draw(QPainter& p) const { p.drawPixmap(x_,y_,piece_); } bool is_it(int x, int y) const { return true && x >= x_ && x < x_+piece_.width() && y >= y_ && y < y_+piece_.height() ; } void move(int dx, int dy) { x_+= dx; y_ += dy; }};class Puzzle : public QWidget{ private: typedef std::vector<piece*> piece_cont; piece_cont pieces; piece_cont::iterator current; bool drag_on; int x,y; public: Puzzle(); ~Puzzle(); void paintEvent(QPaintEvent*); void mousePressEvent(QMouseEvent*); void mouseReleaseEvent(QMouseEvent*); void mouseMoveEvent(QMouseEvent*);};int main(int ac, char** av){ QApplication a(ac,av); Puzzle p; a.setMainWidget(&p); p.show(); return a.exec();}struct DrawPiece{ QPainter& painter; DrawPiece(QPainter& p):painter(p){} void operator()(const Piece* p) const {p->draw(painter);}};void Puzzle::paintEvent(QPaintEvent*){ QPixmap tmp(width(),height()); tmp.fill(Qt::white); QPainter p(&tmp); std::for_each(pieces.begin(),pieces.end(),DrawPiece(p)); bitBlt(this,0,0,&tmp);}struct IsIt{ int x,y; IsIt(int x_, int y_):x(x_),y(y_){} bool operator()(const Piece* p) const { return p->is_it(x,y); }};void Puzzle::mousePressEvent(QMouseEvent* e){ piece_cont::iterator it = std::find_if(pieces.begin(),pieces.end(),IsIt(e->x(),e->y())); if(it != pieces.end()) { drag_on = true; current = it; x = e->x(); y = e->y(); }}void Puzzle::mouseReleaseEvent(QMouseEvent*){ drag_on = false; current = pieces.end();}void Puzzle::mouseMoveEvent(QMouseEvent* e){ if(drag_on) { (*current)->move(e->x()-x,e->y()-y); x = e->x(); y = e->y(); update(); }}struct Delete{ void operator()(Piece* p ) const { delete p; }};Puzzle::~Puzzle(){ std::for_each(pieces.begin(),pieces.end(),Delete());}#include "puzzle.xpm"Puzzle::Puzzle() : QWidget(0){ setWFlags(Qt::WRepaintNoErase); QPixmap whole(puzzle_xpm); for(int x = 0; x < 6; ++x) for(int y = 0; y < 4; ++y) { QPixmap piece(100,100); QPainter p(&piece); p.drawPixmap(0,0,whole,100*x,100*y,100,100); p.end(); pieces.push_back(new Piece(rand()`0,rand()@0,piece)); } drag_on = false; current = pieces.end(); setFixedSize(700,450);}
Kарина Bомко
Kарина Bомко
18 724

Похожие вопросы