1
/* Common routines & arrays. */
13
#include <sys/types.h>
18
/* These two routines make and unmake moves. */
23
void Mod3Solver::make_move(MOVE *m)
26
if ( m->totype == O_Type )
27
fprintf( stderr, "\nmake move %d from %d out %d (at %d)\n\n", m->card_index, m->from, m->to, m->turn_index );
29
fprintf( stderr, "\nmake move %d from %d to %d (%d)\n\n", m->card_index, m->from, m->to, m->turn_index );
41
int len = m->card_index;
44
for ( int i = 0; i < len; i++ )
46
card_t card = *Wp[deck];
50
card = ( card & PS_SUIT ) + RANK( card );
63
card_t card = *Wp[from];
75
if ( m->turn_index == 1 )
77
card_t card2 = *Wp[deck];
85
*Wp[from] = RANK( card2 ) + ( SUIT( card2 ) << 4 );
95
void Mod3Solver::undo_move(MOVE *m)
98
if ( m->totype == O_Type )
99
fprintf( stderr, "\nundo move %d from %d out (at %d)\n\n", m->card_index, m->from, m->turn_index );
101
fprintf( stderr, "\nundo move %d from %d to %d (%d)\n\n", m->card_index, m->from, m->to, m->turn_index );
113
int len = m->card_index;
116
for ( int i = len; i >= 0; i-- )
118
card_t card = *Wp[24+i];
121
*Wp[deck] = ( 1 << 7 ) + card;
134
if ( m->turn_index == 1)
136
card_t card = *Wp[from];
139
*Wp[deck] = ( 1 << 7 ) + card;
160
/* Get the possible moves from a position, and store them in Possible[]. */
162
int Mod3Solver::get_possible_moves(int *a, int *numout)
175
int first_empty_pile = -1;
176
bool foundone = false;
178
for (int i = 0; i < 32; ++i )
184
if ( RANK( card ) == PS_ACE )
190
mp->pri = 127; /* unused */
192
if ( i >= 24 && Wlen[i] == 1 && Wlen[deck] )
196
Possible[0] = mp[-1];
201
for ( int j = 0; j < 32; ++j )
206
int current_row = i / 8;
209
if ( Wlen[j] && RANK( *Wp[j] ) != row + 2 + ( Wlen[j] - 1 ) * 3 )
211
//fprintf( stderr, "rank %d %d\n", i, j );
217
int min = ( card & PS_SUIT ) + row + 2;
219
if ( RANK( *Wp[j] ) > 10 )
221
min = ( *Wp[j] & PS_SUIT ) + row + 2 + Wlen[j] * 3;
226
// and now we figure if this makes sense at all
227
if ( current_row == row )
229
// if the only difference between i and j is the card,
230
// then it's not worth it
231
if ( Wlen[i] == Wlen[j] + 1 )
234
mp->pri = 12 + 20 * Wlen[j] - current_row * 2;
237
if ( i >= 24 && Wlen[i] == 1 && Wlen[deck] )
240
if ( Wlen[j] > 0 && !foundone )
243
// we want to make sure we do not get useless moves
244
// if there are target moves
248
if ( Possible[index].pri == 0 )
250
Possible[index] = Possible[n-1];
263
if ( Wlen[j] || ( Wlen[i] > 1 && current_row != 3 ) )
266
if ( current_row == 3 && Wlen[i] == 1 )
269
if ( RANK( card ) == current_row + 2 && current_row != 3 )
272
if ( first_empty_pile != -1 && first_empty_pile != j )
275
if ( first_empty_pile == -1 )
276
first_empty_pile = j;
291
if ( n == 0 && Wlen[deck] )
298
mp->pri = 0; /* unused */
300
mp->card_index = Wlen[deck];
308
void Mod3Solver::unpack_cluster( int )
312
bool Mod3Solver::isWon()
314
return getOuts() == 52 * 2;
317
int Mod3Solver::getOuts()
319
int ret = Wlen[aces];
320
for ( int i = 0; i < 8 * 3; i++ )
325
Mod3Solver::Mod3Solver(const Mod3 *dealer)
328
// 24 targets, 8 playing fields, deck, aces
329
setNumberPiles( 34 );
333
/* Read a layout file. Format is one pile per line, bottom to top (visible
334
card). Temp cells and Out on the last two lines, if any. */
336
void Mod3Solver::translate_layout()
338
/* Read the workspace. */
342
for ( int row = 0; row < 4; ++row )
344
for ( int col = 0; col < 8; ++col )
346
int i = translate_pile(deal->stack[row][col], W[w], 52);
347
Wp[w] = &W[w][i - 1];
355
int i = translate_pile(deal->aces, W[w], 52);
361
i = translate_pile(Deck::deck(), W[w], 104);
366
int Mod3Solver::getClusterNumber()
371
MoveHint *Mod3Solver::translateMove( const MOVE & m )
373
if ( m.from == deck )
376
Pile *frompile = deal->stack[m.from / 8][m.from % 8];
377
Card *card = frompile->top();
381
return new MoveHint( card, deal->aces, m.pri );
383
return new MoveHint( card, deal->stack[m.to / 8][m.to % 8], m.pri );
387
void Mod3Solver::print_layout()
391
fprintf(stderr, "print-layout-begin\n");
392
for ( int row = 0; row < 3; ++row )
394
fprintf( stderr, "Row%d: ", row );
395
for (int col = 0; col < 8; col++)
398
printcard(*Wp[w], stderr);
400
fprintf( stderr, " " );
401
fprintf( stderr, "(%02d) ", w );
407
for (int col = 0; col < 8; col++)
409
fprintf( stderr, "Play%02d: ", w );
410
for (i = 0; i < Wlen[w]; i++) {
411
printcard(W[w][i], stderr);
417
fprintf( stderr, "Aces: " );
418
for (o = 0; o < Wlen[aces]; o++) {
419
printcard(W[aces][o], stderr);
421
fputc( '\n', stderr );
423
fprintf( stderr, "Deck: " );
424
for (o = 0; o < Wlen[deck]; o++) {
425
printcard(W[deck][o], stderr);
428
fprintf(stderr, "\nprint-layout-end\n");