Subaru Napisano Wrzesień 24, 2008 Zgłoszenie Share Napisano Wrzesień 24, 2008 Witam Temat wyjaśnia częściowo o co się rozchodzi, otóż postanowiłem napisać w ramach "szkolnego projektu" grę Saper na Nintendo DS (jest to wciąż pisane w C++ jedynie polecenia są deczko inne, aczkolwiek wciąż można stosować te "zwyczajne" typu cout cin itd.) Sprawę graficzną umiem rozwiązać samodzielnie, problem sprawa część mechaniki gry Otóż nie mam pojęcia do dnia dzisiejszego, jak nadać danemu polu sprawdzanie czy dookoła niego nie ma min... czy komuś są wiadome takie sposoby??? Będę bardzo wdzięczny za wszelką pomoc Pozdrawiam Subaru Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Adi1981 Napisano Wrzesień 24, 2008 Zgłoszenie Share Napisano Wrzesień 24, 2008 Zakładając że bomba to wartość pola=1, to na około każdego pola masz macierz 3x3 pól. Wystarczy w prostej pętli for odpytywać każde z tych pól czy ma ustawioną wartość 1. Pewnie jest jakieś zgrabniejsze rozwiązanie, ale na szybko takie mi do głowy przyszło. Macierz wygląda dość prosto ('x' i 'y' to współrzędne jak się można domyślić) (x-1,y-1) (x,y-1) (x+1,y-1) (x-1,y) (x,y) (x+1,y) (x-1,y+1)(x,y+1)(x+1,y+1) Co prawda nie pamiętam nic już z programowania, ale byłoby to chyba coś w ten deseń int tab[x][y]; for (int i,x-1<i<x+1,i++) { for (int j, y-1<j<y+1,y++) { if tab[x][y]==1 //mamy minę ! { cout >> "na polu" >> tab[x][y] >> "jest mina: boom"; } else cout >> "pole jest puste"; } } Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
sanji Napisano Wrzesień 25, 2008 Zgłoszenie Share Napisano Wrzesień 25, 2008 Można jeszcze prościej, arytmetycznie, łopatologicznie. Zakładając, że mina to wartośc pola = 1, a brak miny to 0, wystarczy zsumować wszystkie pola wokół i sprawdzić wynik: int tab[x][y]; if( tab[x-1][y-1]+tab[x][y-1]+tab[x+1][y-1]+tab[x-1][y]+tab[x+1][y]+tab[x-1][y+1]+tab[x][y+1]+tab[x+1][y+1]>0)... <co tam chcesz zrobić, jak jest mina> Wbrew pozorom, to nie jest więcej obliczeń niż w algorytmie Adi1981. Musisz tyko pamiętać o warunkach brzegowych (w algorytmie autorstwa Adi1981 podobnie), bo, jak mina będzie na brzegu, to wskaźniki x i y wyjdą poza granicę tablicy tab[x][y]. Możesz to zrobić na "if-ach" sprawdzając, gdzie jest kursor, ale to aż 5 różnych przypadków wychodzi. Możesz też dołożyć z każdej strony na "bokach" tabilcy po kolumnie/wierszu pozbawionym min, opisującym nic nie znaczące pola leżące poza ekranem. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
menth0l Napisano Wrzesień 25, 2008 Zgłoszenie Share Napisano Wrzesień 25, 2008 Po to istnieją klasy w C++ żeby ich używać. Nie odwołuj się bezpośrednio do tablicy tylko stwórz kilka metod dostępowych, które same będą eliminowały wskaźniki spoza zakresu. Przykład (w C# ale o ideę bardziej chodzi): public class MinerGame { protected boolean[][] field; protected int dimension; public MinerGame( int _dimension ) { dimension = _dimension; field = new boolean[_dimension, _dimension]; } public int isBombPlanted( int _x, int _y ) { if (_x < 0 || _x >= dimension || _y < 0 || _y >= dimension) { return 0; } else { return field[_x, _y] == true ? 1 : 0; } } public int getBombCount(int _x, int _y) { return this.isBombPlanted(_x - 1, _y - 1) + this.isBombPlanted(_x, _y - 1) + this.isBombPlanted(_x + 1, _y - 1) + this.isBombPlanted(_x - 1, _y) + this.isBombPlanted(_x, _y) + this.isBombPlanted(_x + 1, _y) + this.isBombPlanted(_x - 1, _y + 1) + this.isBombPlanted(_x, _y + 1) + this.isBombPlanted(_x + 1, _y + 1); } } Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Subaru Napisano Wrzesień 27, 2008 Autor Zgłoszenie Share Napisano Wrzesień 27, 2008 O rany rany to brzmi bardzo...hmmm ciekawie " nieno nie sądziłem, że to będzie wymagać tyle kodu...jednak nie poddam się ot co hah Pogdybam nad tym trochę, wczytam się w te pomysły i myślę, że coś się uda zrobić Najlepsze jest to, że aby dodać grafikę (np. tych pól) na DS wystarczy załadować paletę z kolorami, załadować sprite i go poprostu wyświetlić w wybranym miejscu (x,y) Aha zakładam, że przy tych fragmentach kodu nic po za <iostream> i using namespace std; nie jest potrzebne??? (w sumie ewentualnie math.h) Badzo dziękuję za pomoc zaraz się zabieram do, że tak powiem, przepisania to na kartkę w formie szkicu a potem w komputer jako kod...no takie mam dziwne metody już =D Pozdrawiam Subaru EDIT Co do tablicy zawsze można tak myślę zrobić ją większą a losować na mniejszym obszarze dzięki czemu nie będziemy mieli błędu...chyba " EDIT #2 - do postu poniżej Menth0l - postaram się dzisiaj coś z tym zrobić i wrzucić trochę kodu ale tak jak już wspomniałem, ta gra ma być na Nintendo DS, owszem można używać standardowych poleceń C++ (C# pewnie też) ale w większości są to polecenia, które niewiele ludziom powiedzą, niby można je przetłumaczyć z eng na pl ale np. polecenie wyłączenia DS'a jest dla mnie do dziś niezrozumiałe, wiem tylko tyle, że jest to chyba bezpośrednie odwołanie się do procesora ARM7 bowiem ARM9 nie zajmuje się takimi rzeczami, prawdopodobnie dlatego, że ARM7 jest dla kompatybilności wstecznej z GBA więc gdyby nie miał tej funkcji to programowanie na GBA by w momencie zbrzydło użytkownikom DS'a Jeny czy ja zawsze muszę takie długie posty pisać?? za dużo RPG Aha cały kod jest stukany poprostu w KWrite i kompilowany w konsoli poprzez make więc nie ma to chyba wiele wspólnego z GTK czy Qt A jeszcze coś, pomęczę się z tym kodem dzisiaj na "Programowaniu" (lekcji) i pomęczę nauczycielkę może jej nie doprowadzę do psychiatryka swoimi szczerymi chęciami ;] Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
menth0l Napisano Wrzesień 28, 2008 Zgłoszenie Share Napisano Wrzesień 28, 2008 Temat tak naprawdę jest bardzo prosty ale jeśli weźmiesz się już za pisanie to pamiętaj o dwóch rzeczach: 1) korzystaj z klas bo one naprawdę istnieją po to by życie ułatwiać 2) wyraźnie oddziel logikę gry od interfejsu (tzn. pisz tak by w łatwy sposób dało się przeportować grę np. z GTK do Qt). Co do fragmentu kodu przeze mnie napisanego to jest to C# a nie C++ więc nie ma tu mowy o plikach nagłówkowych. Dobrze by było gdybyś pisząc wrzucał na forum kawałki kodu- jedni by się poduczyli a inni komentowali i pomagali. Przydało by się rozruszać dział "Programowanie" bo nieco przysycha Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Subaru Napisano Grudzień 6, 2008 Autor Zgłoszenie Share Napisano Grudzień 6, 2008 Przepraszam, że tak późno piszę ale miałem małe "pauzy" w tym projekcie plus nauczycielka zażyczyła sobie chwilowo czegoś innego co wykonałem jakoś...kartkówki pomijam xD Były to np. Inicjalizacja trybu graficznego w Pascalu (znalazłem łatwą automatyczną metodę i "była pod wrażeniem" i nawet piątkę wstawiła ) Automat do kawy - konkretniej taki mały symulator, wykonane ale jeszcze troszkę wybrzydza to poprawię ale brakuje mi jednej rzeczy o której za chwilkę* Algorytm kupowania butów zimowych (XD) No to czas wznowić projekt saper ale zanim to jeszcze jedna sprawa odnośnie tej kawy *Profesorka chciała by automat również informował, że wydaje kubek, nalewa wody i te sprawy... a zapomniałem na śmierć jak się robi opóźnianie w C/C++ znaczy tak by wywalił napis, poczekał chwilkę wywalił następny itd... Z góry dziękuję za pomoc Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
morsik Napisano Grudzień 6, 2008 Zgłoszenie Share Napisano Grudzień 6, 2008 sleep 1; // gdzie 1 oznacza liczbę sekund Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
FC4B Napisano Grudzień 6, 2008 Zgłoszenie Share Napisano Grudzień 6, 2008 w C++ trzeba dodać nawias sleep(1); Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Subaru Napisano Grudzień 7, 2008 Autor Zgłoszenie Share Napisano Grudzień 7, 2008 A jeszcze chciałbym zapytać w jakim pliku nagłówkowym to będzie bowiem mam w trakcie również projekt, do którego standardowo nie dołącza się żadnych iostream czy innych tego typu bo jest tam jeden duży plik nagłówkowy odpowiedzialny za polecenia podobne do tych z C...tzn. wciąż jest to C ale używa "swoich" poleceń jak np OutputText jednak struktura ogólna jest niemalże identyczna Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
@WalDo Napisano Grudzień 7, 2008 Zgłoszenie Share Napisano Grudzień 7, 2008 A jeszcze chciałbym zapytać w jakim pliku nagłówkowym to będzie"man 3 sleep" Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Subaru Napisano Grudzień 7, 2008 Autor Zgłoszenie Share Napisano Grudzień 7, 2008 Yeah znalazlem, dzięki WalDo Czasami zapominam o tym man i szukam standardowo na Google a tam często znajduję rozwiązania typu dos.h czy windows.h Jeszcze raz dzięki, biorę się do testowania (mam nadzieję, że znajdzie ten plik .h i włączy) EDIT Hmm plik nagłówkowy zjadł ale sleep już nie... popróbuję jeszcze, może wystarczy napisać z dużej litery czy coś tędy Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
@WalDo Napisano Grudzień 7, 2008 Zgłoszenie Share Napisano Grudzień 7, 2008 [waldo@waldo test]$ cat ./sleep.cpp #include <iostream> using namespace std; int main() { cout << "czekam..." << endl; sleep (2); } [waldo@waldo test]$ g++ sleep.cpp -o spij [waldo@waldo test]$ ./spij czekam... #no i tu 2 sek. czekania Wygląda na to, ze w C++ to jest w nieco inaczej niż w C. Nie w unistd.h tylko w iostream. Ale nie jestem pewien, bo nie znam C++ i tak trochę "na czuja" to zrobiłem Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
FC4B Napisano Grudzień 7, 2008 Zgłoszenie Share Napisano Grudzień 7, 2008 Jest tak jak mówi Waldo. A sleep i Sleep różnią się tym że ten drugi występuje tylko w bibliotekach windowsa i wartości są podawane w milisekundach. Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Subaru Napisano Grudzień 7, 2008 Autor Zgłoszenie Share Napisano Grudzień 7, 2008 Spróbuję więc dołączyć i iostream, może to coś zmieni Zaraz zdam raport z misji (za dużo RPG) EDIT Z kolei Iostream i Iostream.h wcale nie znajduje... do licha... znaczy w normalnym programie owszem ale w tym drugim co ma ten inny plik nagłówkowy, już nie... hmmm może da się inaczej, jakimś czekaniem w stylu pętli czy coś??? EDIT No ja nie mogę no... <ściana> sprawdzę po internecie może coś wiedzą i w razie czego zamieszczę rozwiązanie Póki co dziękuję za dotychczasową pomoc Jesteście wspaniali EDIT Znalazłem na początek Wait For, to czeka na wykonanie danej akcji znaczy tak myślę spełnienie warunku typu wciśnięcie klawisza i te sprawy Odnośnik do komentarza Udostępnij na innych stronach More sharing options...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się