ref: 813fe6b1cb4403729a4a3c31c8ad7e8cf0ffa1dd
dir: /mainwindow.cpp/
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QMessageBox> /* errors, infos */ #include <QInputDialog> /* getting len */ #include <QApplication> /* seems to be needed in all qt programs */ #include <QTreeWidgetItem> /* guessTree */ #include <QClipboard> int len = 0, goal = 0, guess = 0, lives = 0; bool win; /* generates a goal, n digits long */ ulong gengoal(ulong n) { ulong num = 0; /* it's technically legal, but we get a int that's shorter than n */ do num = random() % 10; while (num == 0); /* we have already generated one digit */ while(n > 1) { num *= 10; num += random() % 10; n--; } return num; } /* counts from 1 */ int length(ulong n) { ulong t = 0; while(n > 0) { n /= 10; t++; } return t; } /* we could also use arrays for this, alas, that would a can of worms digit(number, index) = number[index] counts from 0 btw */ int digit(long number, int index) { if((index > length(number)) || (index < 0)) return -1; int i = 0, j; while(i <= index) { j = number % 10; number /= 10; i++; } return j; } MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { /* dear Qt, with all due respect, why you on earth * you try to make my life so misearable? */ if(!action_newgame()) { /* one might wonder, why we didn't used QApplication::exit(), * or MainWindow's close(), destory() etc. * because, we don't have acess to original QApplicaiton * nor MainWindow has fully created to be able to exit it. * and since it's not an error (valid choice it is) * we consider it a great SUCCESS, hence the following: */ std::exit(EXIT_SUCCESS); } } MainWindow::~MainWindow() { delete ui; } // help menu void MainWindow::action_aboutqt() { QApplication::aboutQt(); } void MainWindow::action_about() { QMessageBox::about(this, "about", "MasterMind-qt r2"); } // XXX void MainWindow::action_guide() { QMessageBox m; m.setWindowTitle("Help? there is no help"); m.setText("you fell for this this trap? lol. " "seriously, remind me to write one"); m.setIcon(QMessageBox::Information); m.addButton(":(", QMessageBox::AcceptRole); m.exec(); } // cheats menu void MainWindow::action_showgoal() { QMessageBox m; QAbstractButton *copy; m.setWindowTitle("Cheat"); m.setText(QString::fromStdString("It's " + std::to_string(goal) + " you cheater")); m.setIcon(QMessageBox::Information); copy = m.addButton("i'm too lazy to remember that, please copy that to clipboard", QMessageBox::YesRole); m.addButton("k", QMessageBox::AcceptRole); m.exec(); if(m.clickedButton() == copy) { QClipboard *cb = QGuiApplication::clipboard(); cb->setText(QString::fromStdString(std::to_string(goal))); } } void MainWindow::action_inflives(){ if(lives > 9) { QMessageBox m; m.setWindowTitle("Cheat"); m.setText("Oi mate, it is already enabled!"); m.setIcon(QMessageBox::Information); m.addButton("oh huh", QMessageBox::AcceptRole); m.exec(); return; } else if(win) return; lives = 999; ui->lcdLives->display(9); /* if the game was over */ ui->buttonGuess->setEnabled(true); ui->spinGuess->setEnabled(true); ui->textChecked->setEnabled(true); } // file menu bool MainWindow::action_newgame() { bool res; len = QInputDialog::getInt(this, "MasterMind", "Enter Length of number:", 2, 2, 9, 1, &res); if(res) { lives = len; goal = gengoal(len); win = false; ui->setupUi(this); ui->lcdLives->display(lives); ui->spinGuess->setMaximum(pow(10, len) - 1); ui->spinGuess->setMinimum(pow(10, len - 1)); } /* you pressed cancel "by mistake" ? too bad! your fault. */ return res; } void MainWindow::action_giveup() { QMessageBox m; QAbstractButton *y; m.setText("B-but... are you really totally completely 100% sure about it?"); m.setIcon(QMessageBox::Question); y = m.addButton("Yea", QMessageBox::AcceptRole); m.addButton("Nay!", QMessageBox::RejectRole); m.exec(); if(m.clickedButton() == y) { action_newgame(); } } // main window void MainWindow::action_guess() { QString s; guess = ui->spinGuess->text().toInt(); if(guess == goal) { win = true; s = '#'; ui->textChecked->setText(s.repeated(len)); ui->buttonGuess->setEnabled(false); ui->spinGuess->setEnabled(false); ui->textChecked->setEnabled(false); ui->treeHistory->setEnabled(false); QMessageBox m; m.setWindowTitle("YOU WIN!"); m.setText("I am, as your servent pleased " "to assure you, that; you have managed to win."); m.setIcon(QMessageBox::Information); m.addButton("oh yeah", QMessageBox::AcceptRole); m.exec(); } else if(lives == 1) { /* :( */ ui->lcdLives->display(--lives); ui->buttonGuess->setEnabled(false); ui->spinGuess->setEnabled(false); ui->textChecked->setEnabled(false); ui->treeHistory->setEnabled(false); QMessageBox m; QAbstractButton *retry, *newgame, *leave; m.setWindowTitle("INSERT COIN"); m.setText("I'm afraid you have failed to acheive what" " you had to do, and now we are all in" " brink of impading doom..."); m.setIcon(QMessageBox::Critical); retry = m.addButton("another chance?", QMessageBox::AcceptRole); newgame = m.addButton("dices were packed! new game and i shall win!", QMessageBox::RejectRole); leave = m.addButton("God has forsaken me, *leaving in shame*", QMessageBox::DestructiveRole); m.exec(); /* fun(?) fact: switch doesn't work with non numerical types! */ if(m.clickedButton() == retry) { /* maybe we should move these into a funcation? * or maybe we should not... carry on */ ui->lcdLives->display(++lives); ui->buttonGuess->setEnabled(true); ui->spinGuess->setEnabled(true); ui->textChecked->setEnabled(true); ui->treeHistory->setEnabled(true); } else if(m.clickedButton() == newgame) action_newgame(); else if(m.clickedButton() == leave) close(); } else { /* len counts from 1, digit counts from 0 */ int i = len - 1; while(i >= 0) { if(digit(goal, i) == digit(guess, i)) s += "<font color=darkgreen>#</font>"; else s += "<font color=darkred>X</font>"; // s += digit(goal, i); i--; } ui->textChecked->setHtml(s); ui->lcdLives->display(--lives); QTreeWidgetItem *n = new QTreeWidgetItem(); n->setText(0, QString::fromStdString(std::to_string(len - lives))); n->setText(1, QString::fromStdString(std::to_string(guess))); n->setText(2, ui->textChecked->toPlainText()); ui->treeHistory->addTopLevelItem(n); } }