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.