Result game(int seed) { Result result = {LOSE, 0}; srand(seed); Block blocks[size*size]; int blocksLeft = 0; resetGame(blocks, &blocksLeft, &result); int index = 0; int spawn = FALSE; int quit = FALSE; while (!quit) { if (KEY_DOWN_NOW(BUTTON_UP)) { if (moveBlocks(blocks, UP, &result.score, &blocksLeft, &result.outcome) && blocksLeft) { spawn = TRUE; } while (KEY_DOWN_NOW(BUTTON_UP)); } if (KEY_DOWN_NOW(BUTTON_DOWN)) { if (moveBlocks(blocks, DOWN, &result.score, &blocksLeft, &result.outcome) && blocksLeft) { spawn = TRUE; } while (KEY_DOWN_NOW(BUTTON_DOWN)); } if (KEY_DOWN_NOW(BUTTON_LEFT)) { if (moveBlocks(blocks, LEFT, &result.score, &blocksLeft, &result.outcome) && blocksLeft) { spawn = TRUE; } while (KEY_DOWN_NOW(BUTTON_LEFT)); } if (KEY_DOWN_NOW(BUTTON_RIGHT)) { if (moveBlocks(blocks, RIGHT, &result.score, &blocksLeft, &result.outcome) && blocksLeft) { spawn = TRUE; } while (KEY_DOWN_NOW(BUTTON_RIGHT)); } if (spawn) { index = spawnBlock(blocks, blocksLeft--); result.score += 1<<blocks[index].num; waitForVblank(); drawBlock(blocks, index); updateScoreDisplay(result.score); quit = !hasMoves(blocks); spawn = FALSE; } if (KEY_DOWN_NOW(BUTTON_B)) { quit = TRUE; while (KEY_DOWN_NOW(BUTTON_B)); } if (KEY_DOWN_NOW(BUTTON_SELECT)) { resetGame(blocks, &blocksLeft, &result); while (KEY_DOWN_NOW(BUTTON_SELECT)); } } //put a while loop here to check if game ends properly return result; }
void IncSolver::splitBlocks() { #ifdef RECTANGLE_OVERLAP_LOGGING ofstream f(LOGFILE,ios::app); #endif moveBlocks(); splitCnt=0; // Split each block if necessary on min LM for(set<Block*>::const_iterator i(bs->begin()); i!=bs->end(); ++i) { Block* b = *i; Constraint* v=b->findMinLM(); if(v!=NULL && v->lm < ZERO_UPPERBOUND) { assert(!v->equality); #ifdef RECTANGLE_OVERLAP_LOGGING f<<" found split point: "<<*v<<" lm="<<v->lm<<endl; #endif splitCnt++; Block *b = v->left->block, *l=NULL, *r=NULL; assert(v->left->block == v->right->block); double pos = b->posn; b->split(l,r,v); l->posn=r->posn=pos; l->wposn = l->posn * l->weight; r->wposn = r->posn * r->weight; bs->insert(l); bs->insert(r); b->deleted=true; inactive.push_back(v); #ifdef RECTANGLE_OVERLAP_LOGGING f<<" new blocks: "<<*l<<" and "<<*r<<endl; #endif } } #ifdef RECTANGLE_OVERLAP_LOGGING f<<" finished splits."<<endl; #endif bs->cleanup(); }
void SFCaveGame :: update( int state ) { Game::update( state ); if ( state == STATE_PLAYING ) { if ( nrFrames % 3 == 0 ) score ++; if ( nrFrames % 200 == 0 ) { if ( terrain->getMaxHeight() < sHeight - 100 ) { terrain->increaseMaxHeight( 10 ); // Reduce block height if ( terrain->getMaxHeight() > sHeight - 150 ) blockHeight -= 5; } } if ( checkCollisions() ) { parent->changeState( STATE_CRASHING ); return; } if ( nrFrames % blockDistance == 0 ) addBlock(); // Game logic goes here terrain->moveTerrain( 5 ); moveBlocks( 5 ); player->move( press ); } }