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

tworzenie poziomów w grze Arkanoid

Ostatnio zmodyfikowano wczoraj o godz. 18:35
Autor Wiadomość
AP1994
Temat założony przez niniejszego użytkownika
tworzenie poziomów w grze Arkanoid
» 2025-11-22 17:41:38
C/C++
//w grze za poziomy odpowiada zmienna
std::vector < std::vector < std::vector < int >> > levels;
//chciałbym jakąś funkcją uzyskać efekt podobny do:
const std::vector < std::vector < std::vector < int >> > levels =
{
   
    {
        {
1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 },
       
{ 9, 9, 9, 9, 3, 3, 9, 9, 9, 9 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    }
,
   
{
        {
1, 1, 3, 3, 1, 1, 3, 3, 1, 1 },
       
{ 5, 5, 1, 1, 4, 4, 1, 1, 5, 5 },
       
{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 9, 9, 9, 9, 0, 0, 9, 9, 9, 9 }, ///9 nie zniszczalne
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    }
,
   
{
        {
1, 1, 3, 3, 1, 1, 3, 3, 1, 1 },
       
{ 5, 5, 1, 1, 4, 4, 1, 1, 5, 5 },
       
{ 4, 4, 2, 2, 4, 4, 2, 2, 4, 4 },
       
{ 1, 1, 3, 3, 1, 1, 3, 3, 1, 1 },
       
{ 5, 5, 5, 5, 9, 9, 5, 5, 5, 5 }, ///9 nie zniszczalne
       
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 },
       
{ 0, 0, 1, 1, 0, 0, 1, 1, 0, 0 },
       
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    }
,
   
{
        {
5, 5, 0, 0, 5, 5, 0, 0, 5, 5 },
       
{ 5, 5, 0, 0, 5, 5, 0, 0, 5, 5 },
       
{ 0, 0, 4, 4, 0, 0, 4, 4, 0, 0 },
       
{ 0, 0, 4, 4, 0, 0, 4, 4, 0, 0 },
       
{ 3, 3, 0, 0, 3, 3, 0, 0, 3, 3 },
       
{ 3, 3, 0, 0, 3, 3, 0, 0, 3, 3 },
       
{ 0, 0, 2, 2, 0, 0, 2, 2, 0, 0 },
       
{ 0, 0, 2, 2, 0, 0, 2, 2, 0, 0 },
       
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 },
       
{ 1, 1, 0, 0, 1, 1, 0, 0, 1, 1 }
    }
,
   
{
        {
4, 4, 0, 0, 2, 2, 0, 0, 4, 4 },
       
{ 4, 4, 0, 0, 2, 2, 0, 0, 4, 4 },
       
{ 0, 0, 3, 3, 0, 0, 3, 3, 0, 0 },
       
{ 0, 0, 3, 3, 0, 0, 3, 3, 0, 0 },
       
{ 9, 9, 0, 0, 1, 1, 0, 0, 9, 9 },
       
{ 9, 9, 0, 0, 1, 1, 0, 0, 9, 9 },
       
{ 0, 0, 5, 5, 0, 0, 5, 5, 0, 0 },
       
{ 6, 6, 0, 0, 7, 7, 0, 0, 6, 6 },
       
{ 0, 0, 8, 8, 0, 0, 8, 8, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    }
,
   
{
        {
8, 7, 6, 5, 4, 4, 5, 6, 7, 8 },
       
{ 7, 6, 5, 4, 3, 3, 4, 5, 6, 7 },
       
{ 6, 5, 4, 3, 2, 2, 3, 4, 5, 6 },
       
{ 5, 4, 3, 2, 1, 1, 2, 3, 4, 5 },
       
{ 4, 3, 2, 1, 9, 9, 1, 2, 3, 4 },
       
{ 4, 3, 2, 1, 9, 9, 1, 2, 3, 4 },
       
{ 5, 4, 3, 2, 1, 1, 2, 3, 4, 5 },
       
{ 6, 5, 4, 3, 2, 2, 3, 4, 5, 6 },
       
{ 7, 6, 5, 4, 3, 3, 4, 5, 6, 7 },
       
{ 8, 7, 6, 5, 4, 4, 5, 6, 7, 8 }
    }
,
   
{
        {
2, 2, 2, 2, 2, 2, 2, 2, 2, 2 },
       
{ 1, 9, 2, 2, 1, 1, 2, 2, 9, 1 },
       
{ 9, 1, 1, 9, 3, 3, 9, 1, 1, 9 },
       
{ 1, 9, 2, 2, 1, 1, 2, 2, 9, 1 },
       
{ 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, ///9 nie zniszczalne
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 },
       
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }
    }
}
;
//prubowałem czegoś takiego
std::vector < std::vector < std::vector < int >> > generateRandomLevels()
{
   
std::vector < std::vector < std::vector < int >> > generatedLevels;
   
   
for( int lvl = 0; lvl < NUM_LEVELS; ++lvl )
   
{
       
std::mt19937 gen( lvl * 222 + lvl * 888 ); // inne ziarno dla każdego poziomu
       
std::uniform_int_distribution < > blockDist( 0, 5 );
       
std::uniform_int_distribution < > indestructibleChance( 0, 100 );
       
       
std::vector < std::vector < int >> level;
       
       
for( int row = 0; row < ROWS; ++row )
       
{
           
std::vector < int > line;
           
for( int col = 0; col < COLS; ++col )
           
{
               
int value = blockDist( gen );
               
               
if( indestructibleChance( gen ) < 7 )
                   
 value = 9;
               
               
if( indestructibleChance( gen ) < 30 )
                   
 value = 0;
               
               
line.push_back( value );
           
}
           
level.push_back( line );
       
}
       
generatedLevels.push_back( level );
   
}
   
   
return generatedLevels;
}
//ale jest zbyt losowe
P-183517
DejaVu
» 2025-11-22 18:32:18
Zamiast losować pojedyncze bloczki to możesz losować linie, jeżeli chcesz zmniejszyć 'losowość'.
P-183518
pekfos
» 2025-11-22 18:35:16
Nie będziesz mieć sensownego wyniku stawiając losowo klocki. Stawiaj losowo struktury, jak na przykład poziomy rząd niezniszczalnych klocków. Wszystkie układy niezniszczalnych klocków powinieneś sobie zdefiniować ręcznie, bo inaczej masz ryzyko że poziomu nie da się przejść. Zwykłe klocki możesz stawiać losowo, ale w jakiś sensowny sposób (wybrany losowo), nie nadpisując niezniszczalnych bloków, na przykład:
  • stawiasz klocki w losowej pozycji na lewej połowie poziomu, w prawej stawiasz jako lustrzane odbicie by mieć symetryczny układ,
  • lub to samo tylko z podziałem na górną i dolną połowę,
  • na losowych pozycjach Y generujesz całe rzędy bloków,
  • generujesz całe pole wypełnione blokami,
  • generujesz całe pole wypełnione blokami i przerwami jak w szachownicy,
  • itp
kolory/wartości klocków możesz generować osobno w drugim przebiegu, jako jakąś funkcję f(x,y) - też możesz mieć wiele opcji wybieranych losowo.
P-183519
« 1 »
  Strona 1 z 1