• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

question-closed Nietypowy problem z tablicami dwuwymiarowymi

Object Storage Arubacloud
0 głosów
404 wizyt
pytanie zadane 15 października 2018 w C i C++ przez Mr.Kebab Użytkownik (700 p.)
zamknięte 15 października 2018 przez draghan

Witam serdecznie ostatnio podczas małego szkolnego projektu w ramach doskonalenia umiejętności pisania programów w konsoli stwierdziłem że ciekawym pomysłem byłoby zrobienie gry w konsoli napisanej w c++.

Korzystam z środowiska Code Blocks i podzczas tworzenia minigierki opartej na znalezieniu skarbu ukrytego we mgle na planszy pojawił się problem którego nie potrafię rozwiązać samodzielnie ani z pomocą kolegów z klasy. Celem gry jest dotarcie gracza do skarbu którego pozycja jest losowo generowana podobnie jak i pozycja gracza oznaczonego na planszy literką "[P]". Plansza stworzona jest za pomocą dwóch pętli for() oraz tablicy dwuwymiarowej której każde pole posiada unikatowe id które jest przypisywane mu dzięki zmiennej 'gridnr'. Gracz porusza się literkami A W S D a jego ruchy są liczone i wyświetlane przez program. W zamierzeniu pola nieodkryte mają posiadać symbol [#] zaś odkryte [ ] niestety nie udało mi się tego poprawnie dokonać. Pola mają zmieniać wygląd w oparciu o tablice dwuwymiarową typu bool której każde pole jest przypisane do pola tablicy dwuwymiarowej wypisującej plansze do grania. Osobiście uważam że kod nie posiada żadnego błędu o podłożu logicznym dlatego skierowałem się z prośbą o wyjaśnienie następnie występujących problemów do was.

Kod źródłowy gry:

#include <iostream>
#include <windows.h>
#include <cstdlib>
#include <time.h>

using namespace std;

int player, grid[9][9], gridnr, steps=1, treasure=1;
bool visited[9][9];
char movement;

int main()
{
    //Ustawianie pozycji gracza oraz skarbu
    srand(time(NULL));
    treasure = rand()%100+1;
    player = rand()%100+1;

    //Zerowanie miejsc odwiedzonych przez gracza z poprzednich gier
    for(int y=0; y<10; y++)
    {
        for(int x=0; x<10; x++)
        {
            visited[y][x] = 0;
        }
    }

    //Wlasciwa rozgrywka
    while(player!=treasure)
    {
        system("cls");
        cout << ">> [JESTES POSZUKIWACZEM PRZYGOD ZNAJDZ SKARB UKRYTY WE MGLE] "<<endl;
        cout << ">> [ZROB TO WYKONUJAC JAK NAJMNIEJSZA LICZBE RUCHOW]"<<endl<<endl;
        gridnr = 1;
        //Rysowanie planszy
        for(int y=0; y<10; y++)
        {
            for(int x=0; x<10; x++)
            {
                grid[y][x] = gridnr;

                if(grid[y][x] == player)//Pokazuje gracza
                {
                    cout << " [P]";
                    visited[y][x] = 1;
                }
                else if(grid[y][x] != player && visited[y][x]==1)//Pokazuje odwiedzone przez gracza miejsca
                {
                    cout << " [ ]";
                }
                else if(grid[y][x] != player && visited[y][x]==0)//Pokazuje miejsca nieodwiedzone
                {
                    cout << " [#]";
                }

                gridnr++;
            }
            cout << endl;
        }

        //Informacje/tablica wydarzen
        cout << endl;
        cout << ">> POZYCJA GRACZA:" << player << endl;
        cout << ">> LICZBA RUCHOW :" << steps << endl;
        cout << ">>   S"    << endl;
        cout << ">>   ^"    << endl;
        cout << ">> A< >D"  << endl;
        cout << ">>   v"    << endl;
        cout << ">>   S"    << endl;
        cout << ">> PORUSZ SIE :";

        //Ruch gracza
        cin >> movement;
        switch(movement)
        {
            case 's':
            case 'S':
                {
                    player = player + 10;
                    steps++;
                }
            break;
            case 'w':
            case 'W':
                {
                    player = player - 10;
                    steps++;
                }
            break;
            case 'a':
            case 'A':
                {
                    player = player - 1;
                    steps++;
                }
            break;
            case 'd':
            case 'D':
                {
                    player = player + 1;
                    steps++;
                }
            break;
            default:{ cout << ">> NIE ROBISZ NICZEGO I CZEKASZ"; Sleep(1000);};
        }
        cout << endl<<endl;
    }
    cout << "BRAWO ZNALAZLES SKARB!";
    Sleep(10000);
    return 0;
}

WYGLĄD PLANSZY PO ZAŁADOWANIU OBRAZU:

Błąd 1) Polega na tym że po wykonaniu pierwszego ruchu gracz zamiast odkryć 1 pole wraz z tym na którym zaczyna odkrywa kilka pól na raz które nawet z nim nie sąsiadują.

Błąd 2) Gdy gracz porusza się przy lewej lub prawej krawędzi planszy odkrywają się dwa pola po lewej i po prawej stronie zamiast jednego.

Błąd 3) Poza dwoma wcześniej przytoczonymi błędami występuje jeszcze 1 którego całkowicie nie jestem zdolny wytłumaczyć. Niektóre pola na górnej części planszy nie są w stanie być nadpisane przez gracza pustym polem i pozostają pełne do końca gry.

komentarz zamknięcia: Problem został rozwiązany.
komentarz 15 października 2018 przez mokrowski Mędrzec (155,460 p.)
Wstaw to w blok listingu a nie tak zwymiotowane.
komentarz 15 października 2018 przez Mr.Kebab Użytkownik (700 p.)
Nie do końca rozumiem o co chodzi. Czy mógłbyś rozwinąć ?

1 odpowiedź

+1 głos
odpowiedź 15 października 2018 przez monika90 Pasjonat (22,940 p.)
wybrane 15 października 2018 przez Mr.Kebab
 
Najlepsza
Twoje tablice mają rozmiar 9x9 a plansza jest 10x10.
komentarz 15 października 2018 przez Mr.Kebab Użytkownik (700 p.)
Racja! Zapomniałem że miejsca tabel rezerwuje się od jedynki a nie od 0.

Bardzo Dziękuje !!!
komentarz 15 października 2018 przez mhdv Obywatel (1,580 p.)
Dokładnie tak jest. Dlatego Twoja tablica ma miejsca 0, 1, 2, 3, 4, 5, 6, 7, 8.

A w pętlach używasz wartości <10, czyli dochodzisz do 9 indeksu.

Podobne pytania

0 głosów
1 odpowiedź 428 wizyt
pytanie zadane 31 sierpnia 2022 w C i C++ przez benny13 Obywatel (1,150 p.)
0 głosów
2 odpowiedzi 179 wizyt
pytanie zadane 23 stycznia 2023 w C i C++ przez Dani Obywatel (1,450 p.)

92,550 zapytań

141,392 odpowiedzi

319,520 komentarzy

61,935 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...