Ignore:
Timestamp:
Jan 29, 2011, 1:03:38 PM (10 years ago)
Author:
sam
Message:

Give a new board when no more moves are possible.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/monsterz/board.cpp

    r307 r308  
    8080    Ticker::Ref(data->emitter);
    8181
    82     srand(rand() ^ time(NULL));
    83 
    84     /* Fill the board with a correct position */
    85     int list[8][8];
    86     do
    87     {
    88         for (int j = 0; j < 8; j++)
    89             for (int i = 0; i < 8; i++)
    90                 data->pairs[i][j].id = 1 + rand() % 7;
    91     } while (ListMashes(list) || !(data->nmoves = ListMoves(list)));
    92 
    93     /* Spawn pieces */
    94     for (int j = 0; j < 8; j++)
    95         for (int i = 0; i < 8; i++)
    96         {
    97             int2 newpos = int2(i, j + 8) * 48;
    98             int id = 80 + 20 * data->pairs[i][j].id;
    99             data->pairs[i][j].piece = new Piece(data->emitter, int2(i, j), id);
    100             data->pairs[i][j].piece->SetPos(newpos);
    101             data->pairs[i][j].piece->Move(int2(i, j) * 48);
    102             if (j)
    103                 data->pairs[i][j].piece->SetBelow(data->pairs[i][j - 1].piece);
    104             Ticker::Ref(data->pairs[i][j].piece);
    105         }
     82    Fill();
    10683
    10784    data->mashes = NULL;
     
    230207}
    231208
     209/* Fill the board with an initial position. We ensure no pieces are
     210 * aligned and at least one move is possible. */
     211void Board::Fill()
     212{
     213    srand(rand() ^ time(NULL));
     214
     215    int list[8][8];
     216    do
     217    {
     218        for (int j = 0; j < 8; j++)
     219            for (int i = 0; i < 8; i++)
     220                data->pairs[i][j].id = 1 + rand() % 8;
     221    } while (ListMashes(list) || !(data->nmoves = ListMoves(list)));
     222
     223    /* Spawn pieces */
     224    for (int j = 0; j < 8; j++)
     225        for (int i = 0; i < 8; i++)
     226        {
     227            int2 newpos = int2(i, j + 8) * 48;
     228            int id = 80 + 20 * data->pairs[i][j].id;
     229            data->pairs[i][j].piece = new Piece(data->emitter, int2(i, j), id);
     230            data->pairs[i][j].piece->SetPos(newpos);
     231            data->pairs[i][j].piece->Move(int2(i, j) * 48);
     232            if (j)
     233                data->pairs[i][j].piece->SetBelow(data->pairs[i][j - 1].piece);
     234            Ticker::Ref(data->pairs[i][j].piece);
     235        }
     236}
     237
    232238void Board::Switch(int2 cell_a, int2 cell_b)
    233239{
     
    306312            {
    307313                Piece *old = data->pairs[i][j].piece;
    308                 int id = 1 + rand() % 7;
     314                int id = 1 + rand() % 8;
    309315                data->pairs[i][j].id = id;
    310316                data->pairs[i][j].piece = new Piece(data->emitter, int2(i, j), 80 + 20 * id);
     
    331337                 * the board. */
    332338                int2 newpos = int2(i * 48, below->GetPos().y + 48);
    333                 int id = 1 + rand() % 7;
     339                int id = 1 + rand() % 8;
    334340                data->pairs[i][7].id = id;
    335341                data->pairs[i][7].piece = new Piece(data->emitter, int2(i, 7), 80 + 20 * id);
     
    348354
    349355    data->nmoves = ListMoves(list);
     356
     357    if (data->nmoves == 0)
     358    {
     359        Mash *mash = new Mash(data->emitter);
     360        Ticker::Ref(mash);
     361
     362        for (int j = 8; j--;) for (int i = 0; i < 8; i++)
     363            mash->AddPiece(data->pairs[i][j].piece);
     364
     365        mash->nextmash = data->mashes;
     366        data->mashes = mash;
     367
     368        Piece *below[8];
     369        for (int i = 0; i < 8; i++)
     370            below[i] = data->pairs[i][7].piece;
     371
     372        Fill();
     373
     374        for (int i = 0; i < 8; i++)
     375            data->pairs[i][0].piece->SetBelow(below[i]);
     376    }
    350377}
    351378
Note: See TracChangeset for help on using the changeset viewer.