Skocz do zawartości

Saper...


Subaru

Rekomendowane odpowiedzi

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

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

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

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

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 :D

Jeny czy ja zawsze muszę takie długie posty pisać?? za dużo RPG :lol:

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 :D

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

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

  • 2 months later...

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 :lol: )

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

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

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 :lol:

Odnośnik do komentarza
Udostępnij na innych stronach

[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

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

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ę
×
×
  • Dodaj nową pozycję...