void Board::showHint() { undrawConnection(); if(getHint_I(connection)) drawConnection(1000); }
void Board::marked(int x, int y) { // make sure that the last arrow is correctly undrawn undrawArrow(); if(getField(x, y) == EMPTY) return; if(x == mark_x && y == mark_y) { // unmark the piece mark_x = -1; mark_y = -1; updateField(x, y); return; } if(mark_x == -1) { mark_x = x; mark_y = y; updateField(x, y); return; } else { int fld1 = getField(mark_x, mark_y); int fld2 = getField(x, y); // both field same? if(fld1 != fld2) { emit markError(); return; } // trace if(findPath(mark_x, mark_y, x, y)) { emit madeMove(mark_x, mark_y, x, y); drawArrow(mark_x, mark_y, x, y); setField(mark_x, mark_y, EMPTY); setField(x, y, EMPTY); mark_x = -1; mark_y = -1; int dummyx; History dummyh[4]; // game is over? if(!getHint_I(dummyx,dummyx,dummyx,dummyx,dummyh)) { time_for_game = (int)time((time_t)NULL) - starttime; emit endOfGame(); } } else { clearHistory(); emit markError(); } } }
void Board::makeHintMove() { Path p; if(getHint_I(p)) { mark_x = -1; mark_y = -1; marked(p.front().x, p.front().y); marked(p.back().x, p.back().y); } }
void Board::getHint() { int x1, y1, x2, y2; History h[4]; if(getHint_I(x1, y1, x2, y2, h)) { undrawArrow(); for(int i = 0; i < 4; i++) history[i] = h[i]; int old_delay = getDelay(); setDelay(1000); drawArrow(x1, y1, x2, y2); setDelay(old_delay); } }
void Board::undrawConnection() { if(grav_col_1 != -1 || grav_col_2 != -1) { gravity(grav_col_1, true); gravity(grav_col_2, true); grav_col_1 = -1; grav_col_2 = -1; } // is already undrawn? if(connection.empty()) return; // Redraw all affected fields Path oldConnection = connection; connection.clear(); // Path.size() will always be >= 2 Path::const_iterator pathEnd = oldConnection.end(); Path::const_iterator pt1 = oldConnection.begin(); Path::const_iterator pt2 = pt1; ++pt2; while(pt2 != pathEnd) { if(pt1->y == pt2->y) { for(int i = std::min(pt1->x, pt2->x); i <= std::max(pt1->x, pt2->x); i++) updateField(i, pt1->y); } else { for(int i = std::min(pt1->y, pt2->y); i <= std::max(pt1->y, pt2->y); i++) updateField(pt1->x, i); } ++pt1; ++pt2; } Path dummyPath; // game is over? if(!getHint_I(dummyPath)) { time_for_game = (int)difftime( time((time_t)0), starttime); emit endOfGame(); } }
void Board::finish() { int x1, y1, x2, y2; History h[4]; bool ready=FALSE; while(!ready && getHint_I(x1, y1, x2, y2, h)) { mark_x = -1; mark_y = -1; if(tilesLeft() == 2) ready = TRUE; marked(x1, y1); marked(x2, y2); kapp->processEvents(); usleep(250*1000); } }
void Board::finish() { Path p; bool ready=false; while(!ready && getHint_I(p)) { mark_x = -1; mark_y = -1; if(tilesLeft() == 2) ready = true; marked(p.front().x, p.front().y); marked(p.back().x, p.back().y); kapp->processEvents(); usleep(250*1000); } }
bool Board::solvable(bool norestore) { int *oldfield = 0; if(!norestore) { oldfield = new int [x_tiles() * y_tiles()]; memcpy(oldfield, field, x_tiles() * y_tiles() * sizeof(int)); } Path p; while(getHint_I(p)) { kdFatal(getField(p.front().x, p.front().y) != getField(p.back().x, p.back().y)) << "Removing unmateched tiles: (" << p.front().x << ", " << p.front().y << ") => " << getField(p.front().x, p.front().y) << " (" << p.back().x << ", " << p.back().y << ") => " << getField(p.back().x, p.back().y) << endl; setField(p.front().x, p.front().y, EMPTY); setField(p.back().x, p.back().y, EMPTY); //if(gravityFlag()) //{ // gravity(p.front().x, false); // gravity(p.back().x, false); //} } int left = tilesLeft(); if(!norestore) { memcpy(field, oldfield, x_tiles() * y_tiles() * sizeof(int)); delete [] oldfield; } return (bool)(left == 0); }
bool Board::solvable(bool norestore) { int x1, y1, x2, y2; History h[4]; int *oldfield = 0; if(!norestore) { oldfield = (int *)malloc(x_tiles() * y_tiles() * sizeof(int)); memcpy(oldfield, field, x_tiles() * y_tiles() * sizeof(int)); } while(getHint_I(x1, y1, x2, y2, h)) { setField(x1, y1, EMPTY); setField(x2, y2, EMPTY); } int left = tilesLeft(); if(!norestore) { memcpy(field, oldfield, x_tiles() * y_tiles() * sizeof(int)); free(oldfield); } return (bool)(left == 0); }