#define TOWER_H #include namespace Ui { class TowerWindow; } struct Vez; class TowerWindow : public QMainWindow { Q_OBJECT public: explicit TowerWindow(QWidget *parent = 0); ~TowerWindow(); void resizeEvent (QResizeEvent * event); private: void nakresliVez (int relx, const Vez & U); void nakresli (int k); private slots: void on_actionRun_triggered(); void on_horizontalScrollBar_valueChanged(int value); private: Ui::TowerWindow *ui; }; #endif // TOWER_H #include "tower.h" #include "ui_towerwindow.h" #include #include #include #include using namespace std; void uloz (); // predbezna deklarace - zaznamenej stav vezi const int Max = 20; int n = 10; struct Vez { int v; int p [Max]; }; Vez A, B, C; void nuluj (Vez & X) { X.v=0; for(int i=0; i1) hraj (X, Z, Y, k-1); krok (X, Z); uloz (); if (k>1) hraj (Y, X, Z, k-1); } void run () { init(A); nuluj(B); nuluj(C); uloz (); hraj (A, B, C, n); } /* ----------------------------------------------------------------------- */ void zobraz (Vez & X) { for (int i = 0; i < X.v; i++) cout << X.p[i]; for (int i = X.v; i <= n; i++) cout << ' '; } void tiskni (Vez & X, Vez & Y, Vez & Z) { zobraz (X); cout << " : "; zobraz (Y); cout << " : "; zobraz (Z); cout << endl; } /* ----------------------------------------------------------------------- */ struct TriVeze { Vez AA; Vez BB; Vez CC; }; QList zaznam; void uloz () { TriVeze t; t.AA = A; t.BB = B; t.CC = C; zaznam.append (t); } /* ----------------------------------------------------------------------- */ TowerWindow::TowerWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::TowerWindow) { ui->setupUi(this); QGraphicsScene * scene = new QGraphicsScene; ui->graphicsView->setScene (scene); ui->spinBox->setMinimum (1); ui->spinBox->setMaximum (Max); ui->spinBox->setValue (n); } TowerWindow::~TowerWindow() { delete ui; } QColor color (int i, int saturation) { return QColor::fromHsv ((i*360/n) % 360, saturation, 240); } void TowerWindow::nakresliVez (int relx, const Vez & U) { int h = ui->graphicsView->height(); int w = ui->graphicsView->width(); int xpos = w / 4 * (2+relx); int xstep = w / (4 * (n+2)); int ystep = h / (n+2); int ysize = ystep * 9 / 10; for (int i = 0; i < U.v; i++) { int ypos = h - (i+1) * ystep; int xsize = xstep * U.p[i]; QGraphicsRectItem * r = new QGraphicsRectItem; r->setRect (xpos-xsize/2, ypos, xsize, ysize); r->setPen (color (U.p[i], 200)); r->setBrush (color (U.p[i], 120)); ui->graphicsView->scene()->addItem (r); } } void TowerWindow::nakresli (int k) { ui->graphicsView->scene()->clear(); if (k >= 0 && k < zaznam.count ()) { TriVeze t = zaznam [k]; nakresliVez (-1, t.AA); nakresliVez ( 0, t.BB); nakresliVez ( 1, t.CC); } } void TowerWindow::on_actionRun_triggered() { n = ui->spinBox->value(); assert (n > 0 && n <= Max); zaznam.clear (); // vymaz predchozi zaznamy run (); ui->horizontalScrollBar->setMaximum (zaznam.count() - 1); // indexy od 0 ui->horizontalScrollBar->setValue (zaznam.count() - 1); ui->lineEdit->setText (QString::number(zaznam.count())); } void TowerWindow::on_horizontalScrollBar_valueChanged (int value) { nakresli (value); } void TowerWindow::resizeEvent (QResizeEvent * event) { nakresli (ui->horizontalScrollBar->value()); }