kulki
Mariusz:
http://www.gamesforthebrain.com/game/colorlines/
Macie pomysł jak oprogramować taką gierkę
Myślę że planszę do gry można reprezentować za pomocą tablicy wskaźników na liczbę całkowitą
NULL oznaczałby puste pole w przeciwnym przypadku wskazywalibyśmy na liczbę całkowitą
z numerem RGB koloru
Licznik zbić kulek mógłby być liczbą całkowitą
Pozostaje jeszcze napisać funkcje rysujące planszę z kulkami
i zajmujące się logiką rozgrywki
21 lis 12:53
jc: Kiedyś napisałem jawie, znajdziesz w sieci.
21 lis 13:05
Mariusz:
Tę gierkę łatwo znaleźć w sieci jednak nie widziałem aby był udostępniany kod źródłowy
21 lis 13:21
jc: Ja akurat udostępniłem. Kod źródłowy spakowałem razem z bytcodem w pliku jar.
21 lis 13:41
Filip: a w czym chcesz to pisac? Sadzac po wygladzie da sie napisac te gierke w C++/SFML max w 3 dni
21 wrz 17:47
Filip: nie wiem jaki jest warunek zakonczenie gry −−− zalozmy ze jak gracz zdobedzie 100 punktow gra
sie konczy, glowna petla moze tak wygladac:
auto score = 0;
while (score != 100) {
// pobieramy wspolrzedne x i y klikniecia myszka
if (canMoveBallToPosition(grid, x, y)) {
moveBallToPosition(grid, x, y);
}
// sprawdzamy czy nastepuje zbicie
if (moreThanFourBallsInARowOrACol(grid)) {
removeBalls(grid);
score += ...;
}
}
wiekszej filozofii tu nie widze
21 wrz 17:59
Filip: no i jeszcze tam trzeba dodac pomiedyz tymi ifami dodawanie kulek na planszy
21 wrz 18:02
Filip:
takiego grida latwo przedstawic −−− zalozmy ze nasze okienko do gry ma wymiary 550x550 i jest
to plansza10x10 kwadratow o dlugosci wektora 55 (to graficznie)
Od zaplecza mozna to uznac, ze bedziemy miec przykladowo:
std::array<std::array<sf::CircleShape, 10>, 10>> grid;
I teraz przykladowo jak wykryc w ktore miejsce klika nam myszka. Kliknieciem myszki dostaniemy
wspolrzedne, czyli np klikniecie zwroci nam wspolrzedne (x, y) −> (329, 400)
Indeksy w naszej tablicy otrzymamy nastepujaco (grid[a][b]) (x i y to inty)
a −> y / 55 + 1 −> 400 / 55 + 1 −> 8
b −> x / 55 + 1; −> 329 / 55 + 1 −> 6
czyli wiemy juz ktore "kolko" przesuwamy −−−> grid[8][6]
21 wrz 22:18
Filip: I jak Mariusz, cos napisales?
25 wrz 13:08
Mariusz:
" nie wiem jaki jest warunek zakonczenie gry"
Liczba wolnych pól równa zero
Nie lepiej byłoby dać jako planszę tablicę liczb całkowitych
int grid[9][9]; //liczba pól na planszy jest stała równa 81
Jeśli chodzi o losowanie to można by kulkę reprezentować jako dwie liczby całkowite
(jedna liczba całkowita to pozycja kulki na planszy , a druga odpowiedzialna za kolor kulki)
Na początku myślałem aby planszę reprezentować jako tablicę 9x9 liczb całkowitych
a wyszukiwanie drogi dla kulki zrealizować jakimś algorytmem grafowym
Wprowadzenie licznika wolnych pól też byłoby niezłym pomysłem
Jakoś nie bardzo mi idzie poza tym oprócz tzw logiki gry zostało
jeszcze wybranie jakiejś biblioteki graficznej
Jaką proponowałbyś bibliotekę graficzną dla języka C ?
25 wrz 19:09
Filip:
Nie wiem jak jest w C, w C++/SFML to bardzo prosto mógłbyś to zrobić, bo jest sf::CircleShape,
które ma metody takie jak:
void setRadius(float radius);
void setFillColor(const Color& color);
void setPosition(float x, float y);
Kolor mógłbyś nawet losować, bo jest tam opcja RGB.
no i po ustaleniu tych danych na naszym "kole" (docelowo kulce) dostaniemy taka kulke jak w
grze (2D)
Tak, przy szukaniu najkrótszej drogi można zinterpretować planszę jako graf, o 81
wierzchołkach, gdzie przejście z wi −> wj ma wagę 1 i jest stałę dla wszystkich i, j .
Kiedyś pisałem kilka takich algorytmów, nie są aż tak skomplikowane − jeden opierał się na
algorytmie DFS(int i).
Co do losowania, trzeba uwzględnić, aby współrzędne kulki losowały się dopóki pole o tych
współrzędnych będzie puste − z czego co pamiętam jc wrzucał raz tutaj taki mechanizm.
(oczywiście nie jest to nic trudnego, ale jc miał jakiś fajny sposób na to).
Ja już tak dobrze nie pamiętam C i C++ bo dawno w nich nie siedziałem, aktualnie od kilku
miesięcy pracuje w Javie, ale głównie pod testy automatyczne. Do "stricte" programowania może
wrócę w kolejnej przerwie wakacyjnej. Aktualnie nie mam czasu, gdyż mam prace + studia.
25 wrz 19:34
Filip:
Zawsze w C możesz pójść na łatwiznę i zrobić coś takiego:
int grid[9][9] = {0};
I się umówić, że gdy grid[i][j] == 0 to tam nie ma kulki, a gdy grid[i][j] > 0 to jest tam
kulka, i grid[i][j] to jej kolor.
25 wrz 19:36
Filip:
A funkcje sprawdzające zbicie można zrobić "chamsko", np:
void checkRows(int grid[gridSize][gridSize]) {
for (int i = 0; i < gridSize; i++) {
for (int j = 0; j < gridSize − 5; j++) {
if (grid[i][j] == grid[i][j + 1] && grid[i][j] == grid[i][j + 2] &&
grid[i][j + 2] == grid[i][j + 3] && grid[i][j + 3] == grid[i][j + 4] &&
grid[i][j + 4] == grid[i][j + 5]) {
for (int k = j; k < 5; k++) {
grid[i][k] = 0;
}
}
}
}
}
25 wrz 20:04
Filip: (k < j − 5)*
25 wrz 20:07