/* * Copyright Daniel Jones 2018 * qtminesweeper.cpp is part of qtminesweeper, a simple minesweeper clone. * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #include #include #include #include #include "qtminesweeper.h" qtminesweeper::qtminesweeper() { this->setStyleSheet("background-color: black;"); /* seed rand */ srand(time(NULL)); /* setup function */ blackpen = QPen(Qt::black); whitepen = QPen(Qt::white); redpen = QPen(Qt::red); greenpen = QPen(Qt::green); bluepen = QPen(Qt::blue); /* create cells */ cells.reserve(NUMBEROFCELLS); for (int c = 0; c < NUMBEROFCELLS; c++) { cells.push_back(generatecell()); } generatecellpos(); generatemines(); revealallcells(); cursor.movetogridpos(0, 0); } void qtminesweeper::paintEvent(QPaintEvent *event) { QPainter painter(this); painter.setPen(whitepen); drawgrid(&painter); painter.setPen(redpen); drawcursor(&painter); painter.setPen(greenpen); drawcells(&painter); } void qtminesweeper::drawgrid(QPainter *painter) { int i, c; painter->drawRect(BORDEROFFSET, BORDEROFFSET, GRIDWIDTH, GRIDHEIGHT); i = c = 0; i = BORDEROFFSET; for (c = 0; c < GRIDHEIGHT-SQUARESIZE; c+=SQUARESIZE) { i+=SQUARESIZE; painter->drawLine(BORDEROFFSET, i, BORDEROFFSET+GRIDWIDTH, i); } i=BORDEROFFSET; for (c = 0; c < GRIDWIDTH-SQUARESIZE; c+=SQUARESIZE) { i+=SQUARESIZE; painter->drawLine(i, BORDEROFFSET, i, BORDEROFFSET+GRIDHEIGHT); } } void qtminesweeper::drawcursor(QPainter *painter) { painter->drawRect(cursor.getrealx(), cursor.getrealy(), SQUARESIZE, SQUARESIZE); } void qtminesweeper::drawcells(QPainter *painter) { std::vector::size_type c; QString f; for (c = 0; c < cells.size(); c++) { int tf = cells[c].getflags(); f = ""; if (tf & cell::REVEALED && tf & cell::MINE) f = "M"; painter->drawText(cells[c].getrealx()+(SQUARESIZE/4), cells[c].getrealy()+(SQUARESIZE/2+5), f); } } void qtminesweeper::keyPressEvent(QKeyEvent *event) { switch(event->key()) { case Qt::Key_W: if (cursor.getrealy() > BORDEROFFSET) { cursor.movetogridpos(cursor.getgridx(), cursor.getgridy()-1); } break; case Qt::Key_S: if (cursor.getrealy() < GRIDHEIGHT-BORDEROFFSET) { cursor.movetogridpos(cursor.getgridx(), cursor.getgridy()+1); } break; case Qt::Key_D: if (cursor.getrealx() < GRIDWIDTH-BORDEROFFSET) { cursor.movetogridpos(cursor.getgridx()+1, cursor.getgridy()); } break; case Qt::Key_A: if (cursor.getrealx() > BORDEROFFSET) { cursor.movetogridpos(cursor.getgridx()-1, cursor.getgridy()); } break; case Qt::Key_Space: revealcell(getcellindexfrompos(cursor.getgridx(), cursor.getgridy())); break; default: break; } update(); } void qtminesweeper::generatecellpos() { int x, y, z; x = y = 0; int target = 0; for (z = 0; z < GRIDHEIGHT/SQUARESIZE; z++) { for (x = 0; x < GRIDWIDTH/SQUARESIZE; x++) { cells[target].movetogridpos(x, y); target++; } y++; x = 0; } } void qtminesweeper::revealcell(int index) { cells[index].reveal(); } int qtminesweeper::getcellindexfrompos(int gridx, int gridy) { return gridx + GRIDWIDTH/SQUARESIZE*gridy; } cell qtminesweeper::generatecell() { int flags = 0; cell tmp(flags); return tmp; } void qtminesweeper::generatemines() { // rand() %NUMBEROFCELLS int c, randcell; while (c < NUMBEROFMINES) { randcell = rand() %NUMBEROFCELLS; if (cells[randcell].getflags() & cell::MINE) break; else { cells[randcell].makemine(); c++; } } } void qtminesweeper::revealallcells() { unsigned int c = 0; for(c = 0; c < cells.size(); c++) { cells[c].reveal(); } }