Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Liczby losowe, saper oraz rozmieszczanie bomb.

Ostatnio zmodyfikowano 2015-12-30 01:41
Autor Wiadomość
Knayder
Temat założony przez niniejszego użytkownika
Liczby losowe, saper oraz rozmieszczanie bomb.
» 2015-12-30 00:07:04
C/C++
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <windows.h>

using namespace std;


class Field
{
    int zawartosc;
    char wartosc;
   
public:
    Field( int a = 0, char b = ' ' )
    {
        zawartosc = a;
        wartosc = b;
    }
   
    void wypisz()
    {
        cout << "|" << wartosc;
    }
   
    void minowanie()
    {
        zawartosc = 1;
        wartosc = '*';
    }
};

void wypelnijKlase( Field przycisk[ 10 ][ 10 ] )
{
    cout << "Loading..." << endl;
    int check[ 10 ];
    srand( time( NULL ) );
    for( int i = 0; i <= 9; i++ )
    {
        int x =( rand() % 10 ), y =( rand() % 10 );
        for( int g = 0; g <= 9; g++ )
        {
            if(( y * 10 + x ) == check[ g ] )
            {
                while(( y * 10 + x ) == check[ g ] )
                {
                    x =( rand() % 10 );
                    y =( rand() % 10 );
                }
            }
        }
        check[ i ] =( y * 10 + x );
        przycisk[ y ][ x ].minowanie();
        Sleep( 99 );
    }
    system( "cls" );
}

void wypiszKlase( Field przycisk[ 10 ][ 10 ] )
{
   
    cout << "\n\n\n                    X";
    for( int i = 0; i <= 9; i++ ) cout << "|" << i;
   
    for( int y = 0; y <= 9; y++ )
    {
        cout << "\n                    -+-+-+-+-+-+-+-+-+-+-\n                    " << y;
       
        for( int x = 0; x <= 9; x++ )
        {
            przycisk[ y ][ x ].wypisz();
        }
    }
    cout << "\n\n\n";
}
int main()
{
    Field przycisk[ 10 ][ 10 ];
    wypelnijKlase( przycisk );
    wypiszKlase( przycisk );
}

Chciałem napisać konsolową wersję sapera.
Chodzi mi o funkcję wypelnijKlase, ma ona ustawić w losowych miejscach 10 bomb, bez powtórek. Jednak problem polega na tym, że bomby są w takich jakby "grupach", nie są rozłożone po całej planszy. Chciałem naprawić to za pomocą Sleep, ale nie dało to większego efektu. Gdy skompilujecie program, to gwiazdką zostały oznaczone bomby, tak w ramach testu.
P-142571
carlosmay
» 2015-12-30 01:41:25
Może użyj lepszego narzędzia do losowania. Mała poprawa jest, ale to jest za mała plansza na mocne rozsianie bomb.
Jak nie chcesz aby bomby sąsiadowały to sprawdzaj po losowaniu czy pozycja ma sąsiada
(choć systemowy saper też tak układa bomby dość często).

C/C++
#include <random>

using namespace std;
random_device rd;
mt19937 gen( rd() );
uniform_int_distribution < int > dist( 1, 10 );

//....

void wypelnijKlase( Field przycisk[ 10 ][ 10 ] )
{
    cout << "Loading..." << endl;
    int check[ 10 ];
    for( int i = 0; i <= 9; i++ )
    {
        int x = dist( gen ), y = dist( gen );
        for( int g = 0; g <= 9; g++ )
        {
            if(( y * 10 + x ) == check[ g ] )
            {
                while(( y * 10 + x ) == check[ g ] )
                {
                    x = dist( gen );
                    y = dist( gen );
                }
            }
        }
        check[ i ] =( y * 10 + x );
        przycisk[ y ][ x ].minowanie();
        Sleep( 99 );
    }
    system( "cls" );
}
P-142573
« 1 »
  Strona 1 z 1