void MainWindow::addRandomDir(CellList& list) { Cell* cell = list.first(); Cell* ucell = uCell(cell); Cell* rcell = rCell(cell); Cell* dcell = dCell(cell); Cell* lcell = lCell(cell); typedef QMap<Cell::Dirs, Cell*> CellMap; CellMap freecells; if(ucell && ucell->dirs() == Cell::Free) freecells[Cell::U] = ucell; if(rcell && rcell->dirs() == Cell::Free) freecells[Cell::R] = rcell; if(dcell && dcell->dirs() == Cell::Free) freecells[Cell::D] = dcell; if(lcell && lcell->dirs() == Cell::Free) freecells[Cell::L] = lcell; if(freecells.isEmpty()) return; CellMap::ConstIterator it = freecells.constBegin(); for(int i = rand() % freecells.count(); i > 0; --i) ++it; cell->setDirs(Cell::Dirs(cell->dirs() | it.key())); it.value()->setDirs(contrdirs[it.key()]); list.append(it.value()); }
bool MainWindow::updateConnections() { bool newconnection[MasterBoardSize * MasterBoardSize]; for(int i = 0; i < MasterBoardSize * MasterBoardSize; i++) newconnection[i] = false; CellList list; if(!root->isRotated()) { newconnection[root->index()] = true; list.append(root); } while(!list.isEmpty()) { Cell* cell = list.first(); Cell* ucell = uCell(cell); Cell* rcell = rCell(cell); Cell* dcell = dCell(cell); Cell* lcell = lCell(cell); if((cell->dirs() & Cell::U) && ucell && (ucell->dirs() & Cell::D) && !newconnection[ucell->index()] && !ucell->isRotated()) { newconnection[ucell->index()] = true; list.append(ucell); } if((cell->dirs() & Cell::R) && rcell && (rcell->dirs() & Cell::L) && !newconnection[rcell->index()] && !rcell->isRotated()) { newconnection[rcell->index()] = true; list.append(rcell); } if((cell->dirs() & Cell::D) && dcell && (dcell->dirs() & Cell::U) && !newconnection[dcell->index()] && !dcell->isRotated()) { newconnection[dcell->index()] = true; list.append(dcell); } if((cell->dirs() & Cell::L) && lcell && (lcell->dirs() & Cell::R) && !newconnection[lcell->index()] && !lcell->isRotated()) { newconnection[lcell->index()] = true; list.append(lcell); } list.remove(list.begin()); } bool isnewconnection = false; for(int i = 0; i < MasterBoardSize * MasterBoardSize; i++) { if(!board[i]->isConnected() && newconnection[i]) isnewconnection = true; board[i]->setConnected(newconnection[i]); } return isnewconnection; }
void MainWindow::newGame(int sk) { if (sk==Settings::EnumSkill::Novice || sk==Settings::EnumSkill::Normal || sk==Settings::EnumSkill::Expert || sk==Settings::EnumSkill::Master) { Settings::setSkill(sk); } if(Settings::skill() == Settings::EnumSkill::Master) wrapped = true; else wrapped = false; KExtHighscore::setGameType(Settings::skill()); Settings::writeConfig(); m_clickcount = 0; QString clicks = i18n("Click: %1"); statusBar()->changeItem(clicks.arg(QString::number(m_clickcount)),1); KNotifyClient::event(winId(), "startsound", i18n("New Game")); for(int i = 0; i < MasterBoardSize * MasterBoardSize; i++) { board[i]->setDirs(Cell::None); board[i]->setConnected(false); board[i]->setRoot(false); board[i]->setLocked(false); } const int size = (Settings::skill() == Settings::EnumSkill::Novice) ? NoviceBoardSize : (Settings::skill() == Settings::EnumSkill::Normal) ? NormalBoardSize : (Settings::skill() == Settings::EnumSkill::Expert) ? ExpertBoardSize : MasterBoardSize; const int start = (MasterBoardSize - size) / 2; const int rootrow = rand() % size; const int rootcol = rand() % size; root = board[(start + rootrow) * MasterBoardSize + start + rootcol]; root->setConnected(true); root->setRoot(true); while(true) { for(int row = start; row < start + size; row++) for(int col = start; col < start + size; col++) board[row * MasterBoardSize + col]->setDirs(Cell::Free); CellList list; list.append(root); if(rand() % 2) addRandomDir(list); while(!list.isEmpty()) { if(rand() % 2) { addRandomDir(list); if(rand() % 2) addRandomDir(list); list.remove(list.begin()); } else { list.append(list.first()); list.remove(list.begin()); } } int cells = 0; for(int i = 0; i < MasterBoardSize * MasterBoardSize; i++) { Cell::Dirs d = board[i]->dirs(); if((d != Cell::Free) && (d != Cell::None)) cells++; } if(cells >= MinimumNumCells) break; } for(int i = 0; i < MasterBoardSize * MasterBoardSize; i++) board[i]->rotate((rand() % 4) * 90); updateConnections(); }