BoardSetupDialog::BoardSetupDialog(QWidget* parent, Qt::WindowFlags f) : QDialog(parent, f), m_wheelCurrentDelta(0), m_selectedPiece(Empty), inDrag(false) { setObjectName("BoardSetupDialog"); ui.setupUi(this); QPushButton *pasteButton = ui.buttonBox->addButton(tr("Paste FEN"), QDialogButtonBox::ActionRole); copyButton = ui.buttonBox->addButton(tr("Copy FEN"), QDialogButtonBox::ApplyRole); btCopyText = ui.buttonBox->addButton(tr("Copy Text"), QDialogButtonBox::ApplyRole); restoreLayout(); ui.boardView->configure(); ui.boardView->setFlags(BoardView::IgnoreSideToMove | BoardView::SuppressGuessMove | BoardView::AllowCopyPiece); ui.boardView->showMoveIndicator(false); ui.boardView->showCoordinates(true); m_minDeltaWheel = AppSettings->getValue("/Board/minWheelCount").toInt(); for(int piece = Empty; piece <= BlackPawn; piece++) { BoardSetupToolButton* button = new BoardSetupToolButton(this); button->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); button->setMinimumSize(QSize(10, 10)); button->m_piece = (Piece)piece; if(piece == Empty) { button->m_pixmap = QPixmap(0, 0); ui.buttonLayout->addWidget(button, 6, 0); } else { button->m_pixmap = ui.boardView->theme().piece(Piece(piece)); ui.buttonLayout->addWidget(button, (piece - 1) % 6, piece >= BlackKing); } connect(button, SIGNAL(signalDragStarted(QWidget*, QMouseEvent*)), this, SLOT(startDrag(QWidget*, QMouseEvent*))); connect(button, SIGNAL(signalClicked(Piece)), this, SLOT(labelClicked(Piece))); connect(this, SIGNAL(signalClearBackground(Piece)), button, SLOT(slotClearBackground(Piece))); } emit signalClearBackground(Empty); ui.buttonBoxTools->button(QDialogButtonBox::RestoreDefaults)->setText(tr("Clear")); connect(ui.buttonBoxTools->button(QDialogButtonBox::RestoreDefaults), SIGNAL(clicked()), SLOT(slotClear())); connect(ui.buttonBoxTools->button(QDialogButtonBox::Reset), SIGNAL(clicked()), SLOT(slotReset())); connect(ui.boardView, SIGNAL(clicked(Square, int, QPoint, Square)), SLOT(slotSelected(Square, int))); connect(ui.boardView, SIGNAL(moveMade(Square, Square, int)), SLOT(slotMovePiece(Square, Square))); connect(ui.boardView, SIGNAL(copyPiece(Square, Square)), SLOT(slotCopyPiece(Square, Square))); connect(ui.boardView, SIGNAL(invalidMove(Square)), SLOT(slotInvalidMove(Square))); connect(ui.boardView, SIGNAL(wheelScrolled(int)), SLOT(slotChangePiece(int))); connect(ui.boardView, SIGNAL(pieceDropped(Square, Piece)), SLOT(slotDroppedPiece(Square, Piece))); connect(ui.toMoveButton, SIGNAL(clicked()), SLOT(slotToggleSide())); connect(ui.wkCastleCheck, SIGNAL(stateChanged(int)), SLOT(slotCastlingRights())); connect(ui.wqCastleCheck, SIGNAL(stateChanged(int)), SLOT(slotCastlingRights())); connect(ui.bkCastleCheck, SIGNAL(stateChanged(int)), SLOT(slotCastlingRights())); connect(ui.bqCastleCheck, SIGNAL(stateChanged(int)), SLOT(slotCastlingRights())); connect(ui.epCombo, SIGNAL(currentIndexChanged(int)), SLOT(slotEnPassantSquare())); connect(ui.halfmoveSpin, SIGNAL(valueChanged(int)), SLOT(slotHalfmoveClock())); connect(ui.moveSpin, SIGNAL(valueChanged(int)), SLOT(slotMoveNumber())); connect(ui.btFlipBoard, SIGNAL(clicked()), ui.boardView, SLOT(flip())); ui.btFlipBoard->setCheckable(true); connect(copyButton, SIGNAL(clicked()), SLOT(slotCopyFen())); connect(pasteButton, SIGNAL(clicked()), SLOT(slotPasteFen())); connect(btCopyText, SIGNAL(clicked()), SLOT(slotCopyText())); connect(ui.btFlipVertical, SIGNAL(clicked()), SLOT(mirrorVertical())); connect(ui.btFlipHorizontal, SIGNAL(clicked()), SLOT(mirrorHorizontal())); connect(ui.btSwapColor, SIGNAL(clicked()), SLOT(swapColors())); ui.tabWidget->setCurrentIndex(0); }
void tetrisSinglePlayer(bool** ledArray) { /*Setting values of the global variables for Tetris:*/ TOP_MARGIN = 0.0; BOT_MARGIN = 0.0; LEFT_MARGIN = 26.0; RIGHT_MARGIN = 26.0; BOT_END = ARRAY_HEIGHT - BOT_MARGIN - 1.0; RIGHT_END = ARRAY_WIDTH - RIGHT_MARGIN - 1.0; /*Tetris-specific constants:*/ const int PIECE_WIDTH = 8; /*Must be evenly divisible by 4*/ const int SQUARE_WIDTH = PIECE_WIDTH / 4; const int LEFT_BORDER = 2; /*Should be a multiple of SQUARE_WIDTH*/ const int RIGHT_BORDER = 2; const int TOP_BORDER = 0; const int BOT_BORDER = 2; const int INIT_X = LEFT_MARGIN + (RIGHT_END - LEFT_MARGIN - PIECE_WIDTH) / 2 + 1; const int INIT_Y = TOP_BORDER; srand(time(NULL)); /*"Bag" of upcoming piece types: ("double" indicating two sets)*/ int* doubleBag = make1DArray(14); refillBag(doubleBag, true); /*Tetris-specific variables:*/ float curX = INIT_X; float curY = INIT_Y; float projX = curX; float projY = curY; float shadY = curY; int curType = pluckBag(doubleBag); int pieceOrien = 1; /*1-4 corresponds to north, east, south, west*/ int score = 0; int input = 0; int timer = 1; int dropTime = 15; /*Should be > 1; may be decreased for difficulty, but decreasing it might also reduce responsiveness*/ int garbageLines = 0; /*Solid borders:*/ drawCheckerboard(ledArray, TOP_MARGIN, LEFT_MARGIN, BOT_END - TOP_MARGIN + 1, LEFT_BORDER); drawCheckerboard(ledArray, TOP_MARGIN, RIGHT_END + 1 - RIGHT_BORDER, BOT_END - TOP_MARGIN + 1, RIGHT_BORDER); drawCheckerboard(ledArray, TOP_MARGIN, LEFT_MARGIN, TOP_BORDER, RIGHT_END - LEFT_MARGIN + 1); drawCheckerboard(ledArray, BOT_END + 1 - BOT_BORDER, LEFT_MARGIN, BOT_BORDER, RIGHT_END - LEFT_MARGIN + 1); /*Current piece state and its next projected state:*/ bool** curPiece = make2DArray(PIECE_WIDTH, PIECE_WIDTH); importPiece(curPiece, curType, pieceOrien, PIECE_WIDTH); bool** projPiece = make2DArray(PIECE_WIDTH, PIECE_WIDTH); copyPiece(projPiece, curPiece, PIECE_WIDTH); while(checkOverlap(ledArray, projPiece, curPiece, shadY + SQUARE_WIDTH, curX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false) == 0) { shadY += SQUARE_WIDTH; } while(1) { drawPiece(ledArray, curPiece, curType, false, curY, curX, PIECE_WIDTH); drawShadow(ledArray, curPiece, curType, false, shadY, curX, PIECE_WIDTH); drawPiece(ledArray, projPiece, curType, true, projY, projX, PIECE_WIDTH); copyPiece(curPiece, projPiece, PIECE_WIDTH); curX = projX; curY = projY; shadY = curY; while(checkOverlap(ledArray, projPiece, curPiece, shadY + SQUARE_WIDTH, curX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false) == 0) { shadY += SQUARE_WIDTH; } drawShadow(ledArray, curPiece, curType, true, shadY, curX, PIECE_WIDTH); frameTest(ledArray, TOP_MARGIN, LEFT_MARGIN, BOT_MARGIN, RIGHT_MARGIN ); input = getLeftInput(); if (input == 1) { /*Hard drop*/ while(checkOverlap(ledArray, projPiece, curPiece, projY + SQUARE_WIDTH, projX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false) == 0) { projY += SQUARE_WIDTH; drawPiece(ledArray, curPiece, curType, false, curY, curX, PIECE_WIDTH); copyPiece(curPiece, projPiece, PIECE_WIDTH); curX = projX; curY = projY; drawPiece(ledArray, curPiece, curType, true, curY, curX, PIECE_WIDTH); frameTest(ledArray, TOP_MARGIN, LEFT_MARGIN, BOT_MARGIN, RIGHT_MARGIN ); } score = checkLines(ledArray, LEFT_MARGIN + LEFT_BORDER, RIGHT_END - RIGHT_BORDER, BOT_END - BOT_BORDER - garbageLines * SQUARE_WIDTH, TOP_MARGIN + TOP_BORDER, score, curY, PIECE_WIDTH, SQUARE_WIDTH); /* if(some measure of time has passed) { if (addGarbage(ledArray, LEFT_MARGIN + LEFT_BORDER, RIGHT_END - RIGHT_BORDER, BOT_END - BOT_BORDER, TOP_MARGIN + TOP_BORDER, SQUARE_WIDTH)) { break; //Game loss } else { garbageLines++; } } */ projX = INIT_X; projY = INIT_Y; curX = projX; curY = projY; shadY = curY; curType = pluckBag(doubleBag); pieceOrien = 1; timer = 1; importPiece(curPiece, curType, pieceOrien, PIECE_WIDTH); copyPiece(projPiece, curPiece, PIECE_WIDTH); if(checkOverlap(ledArray, projPiece, curPiece, projY, projX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, true)) { break; /*Game loss*/ } } else if(input == 5 || timer++ % dropTime == 0) { /*Soft drop*/ if(checkOverlap(ledArray, projPiece, curPiece, projY + SQUARE_WIDTH, projX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { score = checkLines(ledArray, LEFT_MARGIN + LEFT_BORDER, RIGHT_END - RIGHT_BORDER, BOT_END - BOT_BORDER - garbageLines * SQUARE_WIDTH, TOP_MARGIN + TOP_BORDER, score, curY, PIECE_WIDTH, SQUARE_WIDTH); /* if(some measure of time has passed) { if (addGarbage(ledArray, LEFT_MARGIN + LEFT_BORDER, RIGHT_END - RIGHT_BORDER, BOT_END - BOT_BORDER, TOP_MARGIN + TOP_BORDER, SQUARE_WIDTH)) { break; //Game loss } else { garbageLines++; } } */ projX = INIT_X; projY = INIT_Y; curX = projX; curY = projY; shadY = curY; curType = pluckBag(doubleBag); pieceOrien = 1; timer = 1; importPiece(curPiece, curType, pieceOrien, PIECE_WIDTH); copyPiece(projPiece, curPiece, PIECE_WIDTH); if(checkOverlap(ledArray, projPiece, curPiece, projY, projX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, true)) { break; /*Game loss*/ } } else { projY += SQUARE_WIDTH; timer = 1; } } else if(input == 9) { /*Spin clockwise*/ pieceOrien++; if(pieceOrien > 4) { pieceOrien -= 4; } importPiece(projPiece, curType, pieceOrien, PIECE_WIDTH); if(checkOverlap(ledArray, projPiece, curPiece, projY, projX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { if(!checkOverlap(ledArray, projPiece, curPiece, projY, projX + SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX += SQUARE_WIDTH; } else if(curType == 0 && !checkOverlap(ledArray, projPiece, curPiece, projY, projX + 2 * SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX += 2 * SQUARE_WIDTH; } else if(!checkOverlap(ledArray, projPiece, curPiece, projY, projX - SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX -= SQUARE_WIDTH; } else if(curType == 0 && !checkOverlap(ledArray, projPiece, curPiece, projY, projX - 2 * SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX -= 2 * SQUARE_WIDTH; } else { pieceOrien--; if(pieceOrien < 1) { pieceOrien += 4; } importPiece(projPiece, curType, pieceOrien, PIECE_WIDTH); } } } else if(input == 10) { /*Spin counterclockwise*/ pieceOrien--; if(pieceOrien < 1) { pieceOrien += 4; } importPiece(projPiece, curType, pieceOrien, PIECE_WIDTH); if(checkOverlap(ledArray, projPiece, curPiece, projY, projX, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { if(!checkOverlap(ledArray, projPiece, curPiece, projY, projX + SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX += SQUARE_WIDTH; } else if(curType == 0 && !checkOverlap(ledArray, projPiece, curPiece, projY, projX + 2 * SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX += 2 * SQUARE_WIDTH; } else if(!checkOverlap(ledArray, projPiece, curPiece, projY, projX - SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX -= SQUARE_WIDTH; } else if(curType == 0 && !checkOverlap(ledArray, projPiece, curPiece, projY, projX - 2 * SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false)) { projX -= 2 * SQUARE_WIDTH; } else { pieceOrien++; if(pieceOrien > 4) { pieceOrien -= 4; } importPiece(projPiece, curType, pieceOrien, PIECE_WIDTH); } } } else if(input == 3) { /*Move right*/ if(checkOverlap(ledArray, projPiece, curPiece, projY, projX + SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false) == 0) { projX += SQUARE_WIDTH; } } else if(input == 7) { /*Move left*/ if(checkOverlap(ledArray, projPiece, curPiece, projY, projX - SQUARE_WIDTH, curY, curX, PIECE_WIDTH, SQUARE_WIDTH, false) == 0) { projX -= SQUARE_WIDTH; } } } drawPiece(ledArray, curPiece, curType, true, curY, curX, PIECE_WIDTH); frameTest(ledArray, TOP_MARGIN, LEFT_MARGIN, BOT_MARGIN, RIGHT_MARGIN ); free(doubleBag); free2DArray(curPiece, PIECE_WIDTH); free2DArray(projPiece, PIECE_WIDTH); return; }