Battleship

1

Nie chce mi się wgryzać w logikę programu, ale isHit jest elementem struktury ShipPartType, więc jeśli zamienisz
if(player.guessBoard[row][col].isHit)
na
if(player.shipBoard[row][col].isHit)
to ten fragment się skompiluje (ale czy taki był zamiar i się pomyliłaś, to nie wiem).

Poza tym jest błąd w strcpy(player, playerName); ale może to już poprawiłaś.

Wygląda mi na to, że nie uruchamiasz kodu fragmentami i go nie rozbudowujesz, tylko piszesz w całości i potem próbujesz w całości to uruchomić.

Powodzenia, nie poddawaj się :-).

1

Szkoda trochę, że nie mam Windowsa, bo by było większe prawdopodobieństwo, że trafię na ten sam błąd. Spróbuję stworzyć nowy projekt z tymi samymi plikami i zawartością, co podałaś.


UPDATE: Spróbowałem. Nie uruchamiałem, ale udało mi się sprawić, że buduje się bez problemów. Nie wiem jak u Ciebie na Windowsie, ale u mnie na Linuksie wyskoczyło kilka błędów (zawsze były odpowiednie komunikaty w zakładce "Build log" "Build messages"). Przechodziłem po kolei w miejsca ich występowania i komentowałem całe linijki (skrót do zakomentowania linijki, na Linuksie przynajmniej: CTRL+SHIFT+C). Teraz spróbuję zrobić, żeby działało bez komentowania tych linijek.


UPDATE2:

Podam swoje poprawki (w kolejności raportowania błędów przez Code::Blocks):

Błąd nr 1: main.cpp|13|error: ‘InitializePlayer’ was not declared in this scope|
Poprawiłem, dodając w pliku Battleship.h linijkę: void InitializePlayer(Player & , const char * );

Błąd nr 2: main.cpp|18|error: ‘PlayGame’ was not declared in this scope|
Poprawiłem, dodając w pliku Battleship.h linijkę: void PlayGame(Player& , Player&);

Błąd nr 3: Battleship.cpp|16|error: cannot convert ‘Player’ to ‘char*’|
Poprawiłem tymczasowo, komentując całą linijkę (nie wiem, co chciałaś osiągnąć, więc nie mogę poprawić inaczej).

Błąd nr 4: Battleship.cpp|19|error: ‘InitializeShip’ was not declared in this scope; did you mean ‘InitializePlayer’?|
Poprawiłem, przenosząc funkcję InitializeShip przed funkcję InitializePlayer.

Błąd nr 5: Battleship.cpp|38|error: ‘SetUpBoards’ was not declared in this scope|
Poprawiłem, przenosząc funkcję SetUpBoards przed funkcję PlayGame.

Błąd nr 6: Battleship.cpp|38|error: ‘ClearBoards’ was not declared in this scope|
Poprawiłem, przenosząc funkcję ClearBoards przed funkcję SetUpBoards.

Błąd nr 7: Battleship.cpp|53|error: ‘DrawBoards’ was not declared in this scope|
Poprawiłem, przenosząc funkcję DrawBoards przed funkcję SetUpBoards.

Błąd nr 8: Battleship.cpp|52|error: ‘DrawColumnsRow’ was not declared in this scope|
Poprawiłem, przenosząc funkcję DrawColumnsRow przed funkcję DrawBoards.

Reszta zaraz...


UPDATE3:

Błąd nr 9: main.cpp|19|error: ‘WantToPlayAgain’ was not declared in this scope|
Poprawiłem, dodając w pliku Battleship.h linijkę bool WantToPlayAgain();.

Błąd nr 10: Battleship.cpp|69|error: ‘DrawSeparatorLine’ was not declared in this scope|
Poprawiłem, przenosząc funkcję DrawSeparatorLine przed funkcję DrawBoards.

Błąd nr 11: Battleship.cpp|86|error: ‘DrawShipBoardRow’ was not declared in this scope|
Poprawiłem, przenosząc funkcję DrawShipBoardRow przed funkcję DrawBoards.

Błąd nr 12: Battleship.cpp|79|error: ‘GetShipReprezentation’ was not declared in this scope|
Poprawiłem, przenosząc funkcję GetShipReprezentation przed funkcję DrawShipBoardRow.

Błąd nr 13: Battleship.cpp|74|error: request for member ‘isHit’ in ‘player.Player::guessBoard[row][col]’, which is of non-class type ‘const GuessType’|
Poprawiłem tymczasowo, komentując całą instrukcję if, w której znajduje się to wywołanie funkcji isHit (nie wiem, co chciałaś osiągnąć, więc nie mogę poprawić inaczej).

Błąd nr 14: Battleship.cpp|130|error: ‘DrawGuessBoardRow’ was not declared in this scope; did you mean ‘DrawShipBoardRow’?|
Poprawiłem, przenosząc funkcję DrawGuessBoardRow przed funkcję DrawBoards.

Błąd nr 15: Battleship.cpp|120|error: ‘GetGuessRepresentationAt’ was not declared in this scope; did you mean ‘GetShipReprezentation’?|
Poprawiłem, przenosząc funkcję GetGuessRepresentationAt przed funkcję DrawGuessBoardRow.

Błąd nr 16:

/usr/bin/ld: obj/Debug/Utils.o:[...]Utils.cpp|8|multiple definition of `INPUT_ERROR_STRING'; obj/Debug/Battleship.o:[...]Battleship.cpp:9: first defined here|

Nie jestem pewien, ale jak do tej pory to chyba jedyne miejsce, w którym występuje błąd związany z programem ld. Poprawiłem, usuwając definicję stałej INPUT_ERROR_STRING z plików: main.cpp oraz Utils.cpp.

Teraz, po zbudowaniu, otrzymuję komunikat:

...
Process terminated with status 0 (0 minute(s), 1 second(s))
0 error(s), 0 warning(s) (0 minute(s), 1 second(s))

Zobaczmy, czy się uruchomi...


UPDATE4: Uruchomiło się (nie grałem, bo z uwagi na tymczasowe zakomentowanie dwóch linijek mogą być jakieś błędy).


PS. Plik Intruction.cpp mam cały zakomentowany, tak jak Ty podałaś na forum, więc nie wiem – może to dlatego mi działa?

0

Właśnie- zadziałało mi na razie po prawnie- tylko po usunięciu deklaracji INPUT_ERROR_STRING z pliku Utils.cpp
(niestety rodzice zmusili mnie do odejścia od koputera, więc nie odpisałam wcześniej)

Myślisz, że powinnam pozmieniać też te wszystkie inne rzeczy?

1

Czy powinnaś pozmieniać to nie wiem. Znam jedynie podstawy C++, ale ogólnie w programowaniu jest tak, że definicje i deklaracje funkcji powinny być przed ich wywołaniem. Znam jeden język, który umożliwia dowolne układanie definicji funkcji w stosunku do wywołań: JavaScript (i jest to raczej uważane za niedobrą cechę). Natomiast w pliku nagłówkowym (z rozszerzeniem h) powinny być deklaracje wszystkich funkcji, które są używane tam, gdzie ten plik jest dołączany (deklaracje, czyli nagłówki tych funkcji, stąd nazwa pliku).


PS: Technicznie rzecz biorąc, deklaracja funkcji oraz jej nagłówek to chyba co innego. Więc nie sugeruj się moją wiedzą. ;) Możesz przeczytać np. ten artykuł: http://www-h.eng.cam.ac.uk/he[...]+/c++_tutorial/functions.html

0

Dobrze, a więc- to, czego nie poprawiłam juz wcześniej, a było w Twoich wskazówkach- zrobiłam teraz. Na razie nadal działa. Dziękuję bardzo za pomoc :-)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0