Beispiel #1
0
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;
}
Beispiel #2
0
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();
}
Beispiel #3
0
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 );
	}
}