lenrokskate Temat założony przez niniejszego użytkownika |
[C++, Allegro, Std::Vector]Powtarzające się wyniki (gra karciana) » 2010-09-17 16:10:36 Napisałem algorytm który losuje karty z talii tak żeby się nie powtarzały (czyli np. ktoś nie dostał 2 asów kier), a te skubane się powtarzają. Pliki: talia.bmpKod: #include <allegro.h> #include <vector> #include <iostream> #include <cstdlib> #include <conio.h>
using namespace std;
bool good( BITMAP *& sprawdz ) { if( !sprawdz ) { set_gfx_mode( GFX_TEXT, 0, 0, 0, 0 ); allegro_message( "nie mogę załadować obrazka Ludek !" ); allegro_exit(); return 0; } return 1; }
int retX( int q ) { if( q >= 0 && q <= 12 ) return q * 44; if( q >= 13 && q <= 25 ) return( q - 13 ) * 44; if( q >= 26 && q <= 38 ) return( q - 26 ) * 44; if( q >= 39 && q <= 51 ) return( q - 39 ) * 44; return 0; }
int retY( int q ) { if( q >= 0 && q <= 12 ) return 0; if( q >= 13 && q <= 25 ) return 60; if( q >= 26 && q <= 38 ) return 120; if( q >= 39 && q <= 51 ) return 180; return 0; }
int rnd( int min, int max ) { if( max >= min ) { max -= min; } else { int tmp = min - max; min = max; max = tmp; } return max ? rand() % max + min : min; }
BITMAP * bTalia = NULL;
int main( int argc, char ** argv ) { srand( time( NULL ) ); allegro_init(); install_keyboard(); set_color_depth( 32 ); set_gfx_mode( GFX_AUTODETECT_WINDOWED, 800, 600, 0, 0 ); set_palette( default_palette ); clear_to_color( screen, makecol( 255, 255, 255 ) ); vector < int > talia( 52 ); vector < int > reka( 2 ); vector < int > board( 5 ); bTalia = load_bitmap( "talia.bmp", default_palette ); if( !good( bTalia ) ) return 0; while( true ) { talia.resize( 52 ); for( int i = 0; i < 52; i++ ) talia[ i ] = i; int x = 20; int y = 20, y2 = 20; int lt = talia.size(); textprintf_ex( screen, font, 600, y2, makecol( 200, 200, 200 ), - 1, "Size of talia: %d | %d", talia.size(), lt ); y2 += 10; for( int i = 0; i < 2; i++ ) { int los = rnd( 0, talia.size() ); reka[ i ] = los; vector < int >::iterator it = talia.begin() += los; talia.erase( it ); lt--; textprintf_ex( screen, font, 600, y2, makecol( 200, 200, 200 ), - 1, "Size of talia: %d | %d", talia.size(), lt ); y2 += 10; } for( int i2 = 0; i2 < 5; i2++ ) { int los2 = rnd( 0, talia.size() ); board[ i2 ] = los2; vector < int >::iterator it2 = talia.begin() += los2; talia.erase( it2 ); lt--; textprintf_ex( screen, font, 600, y2, makecol( 200, 200, 200 ), - 1, "Size of talia: %d | %d", talia.size(), lt ); y2 += 10; } for( int i3 = 0; i3 < 2; i3++ ) { blit( bTalia, screen, retX( reka[ i3 ] ), retY( reka[ i3 ] ), x, y, 44, 60 ); x += 49; } x = 20; y += 70; for( int i4 = 0; i4 < 3; i4++ ) { blit( bTalia, screen, retX( board[ i4 ] ), retY( board[ i4 ] ), x, y, 44, 60 ); x += 49; } x += 10; blit( bTalia, screen, retX( board[ 3 ] ), retY( board[ 3 ] ), x, y, 44, 60 ); x += 59; blit( bTalia, screen, retX( board[ 4 ] ), retY( board[ 4 ] ), x, y, 44, 60 ); readkey(); } talia.clear(); reka.clear(); board.clear(); destroy_bitmap( bTalia ); allegro_exit(); return 0; } END_OF_MAIN()
|