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

[C++] Code review mojej prostej aplikacji

VPS Starter Arubacloud
0 głosów
155 wizyt
pytanie zadane 30 lipca 2018 w C i C++ przez smokolisz Mądrala (6,340 p.)
edycja 30 lipca 2018 przez smokolisz

Cześć, w ramach ćwiczeń przed pójściem do technikum napisałem prostą grę konsolową w c++.
Byłbym wdzięczny jeżeli komuś chciałoby się rzucić okiem na mój kod i wytknąć mi błędy :)

Kod na pastebin

https://pastebin.com/xhtNMBkW

 

Obrazek jak wygląda ta gra, mam nadzieje, że kogoś to zaciekawi :)

Wstawie też kod tutaj:

 

#include <iostream>
#include <cstdio>
#include <conio.h>
#include <windows.h>
#include <ctime>

using namespace std;

bool zycie = true;
bool strzal = false;

int pozycjay = 7;
int pozycjax = 1;

int pociskx;
int pocisky;
bool reload;

int pociskwrogx;
int pociskwrogy;
bool strzalwrog = true;
bool reloadwrog = true;

int wrogx = 34;
int wrogy = 7;
bool wroghp = true;

int odlegloscx;
int odlegloscy;
int ruchx;
int ruchy;

string plansza[16][36];

int main()
{
    srand( time( NULL ) );

    while(zycie&&wroghp)
    {
        system( "cls" );

        for(int i = 0; i <15; i++)
        {
            plansza[i][0] = ' ';

            for(int x = 0; x <35; x++)
            {
                plansza[i][x] = " ";
            }
        }

        plansza[pozycjay][pozycjax] = '+';


        if(reload == false)
        {
            strzal = true;
        }
        else strzal = false;

        if(strzal)
        {
            if((pociskx == pociskwrogx)&&(pocisky == pociskwrogy))
            {
                plansza[pocisky][pociskx] = ' ';
                plansza[pociskwrogy][pociskwrogx] = ' ';
                pociskwrogx = 36;
                pociskwrogy = 16;
                pociskx = 35;
                pocisky = 16;
                reload = true;
            }

            pociskx++;
            plansza[pocisky][pociskx] = '-';

            if((pociskx >= 35)||(pocisky >= 14))
            {
                strzal = false;
                reload = true;
                plansza[pocisky][pociskx] = ' ';
            }

            if((pociskx == wrogx)&&(pocisky == wrogy))
            {
                wroghp = false;
                reload = true;
            }
        }

        if((pociskx == pociskwrogx)&&(pocisky == pociskwrogy))
        {
            plansza[pocisky][pociskx] = ' ';
            plansza[pociskwrogy][pociskwrogx] = ' ';
            pociskwrogx = 36;
            pociskwrogy = 16;
            pociskx = 35;
            pocisky = 16;
            reload = true;
        }

        if(wroghp)
        {
            odlegloscx = pozycjax - wrogx;
            odlegloscy = pozycjay - wrogy;

            ruchx = rand()% 5 - 4;
            ruchy = rand()% 20 - 10;

            if((odlegloscx < ruchx)&&(wrogx > 0))
                wrogx--;
            else if ((odlegloscx > 5)&&(wrogx < 34))
                wrogx++;

            if((odlegloscy < ruchy)&&(wrogy > 0))
                wrogy--;
            else if ((odlegloscy > ruchy)&&(wrogy < 14))
                wrogy++;

            if(reloadwrog)
            {
                pociskwrogx = wrogx;
                pociskwrogy = wrogy;
                reloadwrog = false;
                strzalwrog = true;
            }

            if(strzalwrog)
            {
                pociskwrogx--;
                plansza[pociskwrogy][pociskwrogx] = 'o';

                if((pociskx == pociskwrogx)&&(pocisky == pociskwrogy))
                {
                    plansza[pocisky][pociskx] = ' ';
                    plansza[pociskwrogy][pociskwrogx] = ' ';
                    pociskwrogx = 36;
                    pociskwrogy = 16;
                    pociskx = 35;
                    pocisky = 16;
                    reload = true;
                    reloadwrog = true;
                }
            }

            if(pociskwrogx == 1)
            {
                strzalwrog = false;
                reloadwrog = true;
                plansza[pocisky][pociskx] = ' ';
            }



            plansza[wrogy][wrogx] = 'H';
        }
        else
            plansza[wrogy][wrogx] = ' ';




        /** WYSWIETLANIE PLANSZY **/

        for(int i = 0; i <15; i++)
        {

            for(int x = 0; x <35; x++)
            {
                cout << plansza[i][x];
            }
            cout<<"\n";
        }


        /** OBSŁUGA KLAWIATURY **/

        char wybor = _getch();

        switch(wybor)
        {
        case 87:
        case 119:

            if(pozycjay>0)
            {
                pozycjay--;
            }

            break;

        case 83:
        case 115:

            if(pozycjay<14)
            {
                pozycjay++;
            }

            break;

        case 65:
        case 97:

            if(pozycjax>0)
            {
                pozycjax--;
            }

            break;

        case 68:
        case 100:

            if(pozycjax<34)
            {
                pozycjax++;
            }

            break;

        case ' ':

            if(reload == true)
            {
                pociskx = pozycjax;
                pocisky = pozycjay;
                reload = false;
                strzal = true;
            }

            break;

        }

        if((pociskwrogx == pozycjax)&&(pociskwrogy == pozycjay))
        {
            zycie = false;
        }

        if((pociskx == wrogx)&&(pocisky == wrogy))
        {
            wroghp = false;
        }

    }

    /** PODSUMOWANIE **/

    system("cls");

    if(zycie==false)
    {
        cout<<"PRZEGRALES!\n";
    }

    if(wroghp==false)
    {
        cout<<"WYGRALES!\n";
    }

    Sleep(500);

    system("pause");

    return 0;
}

 

Problemy które znalazłem i nie mam na nie pomysłu

- gra odświeża się dopiero przy ruchu, a nie co np 10ms

- można wystrzelić tylko jeden pocisk, tutaj domyślam się, że najlepiej byłoby stworzyć obiekt pocisk i wtedy go klonować przy każdym strzale

- nadawanie kierunku strzału (teraz gracz strzela tylko w prawo a przeciwnik w lewo)

1 odpowiedź

+1 głos
odpowiedź 30 lipca 2018 przez adrian17 Ekspert (344,100 p.)
edycja 30 lipca 2018 przez adrian17
 
Najlepsza

Nie jestem w stanie skomentować całości, więc rzeczy które rzuciły mi się w oczy:

        {
        case 87:
        case 119:

Po prostu użyj 'w' i 'W'.

        for(int i = 0; i <15; i++)
        {
            plansza[i][0] = ' ';
 
            for(int x = 0; x <35; x++)
            {
                plansza[i][x] = " ";
            }
        }

Skoro używasz pojedyncze znaki, `plansza` nie musi przechowywać stringów, wystarczą pojedyncze znaki. (poza tym, czy to pierwsze przypisanie jest potrzebne?)

if(pozycjay<14)

Zamiast magicznych liczb, użyj stałych jak BOARD_HEIGHT.

Wrzuć kod rysujący, obsługujący klawiaturę etc do osobnych funkcji.

Zamień te wszystkie zmienne globalne na lokalne.

Skorzystaj ze struktur, żeby trzymać wszystkie informacje o graczu etc razem. Na przykład

struct Entity {
    int x;
    int y;
    int shooting;
    int reloading;
    int hp;
};

struct Bullet {
    int x;
    int y;
};

Entity player, enemy;
Bullet player_bullet, enemy_bullet;

Albo

struct Position {
    int x;
    int y;
}

struct Entity {
    Position position;
    int shooting;
    int reloading;
    int hp;
};

struct Bullet {
    Position position;
};

Jeśli dodasz funkcje/metody/operatory porównujące pozycję, można wtedy trochę kodu uprościć, np

        if(player_bullet.position == enemy.position)
        {
            enemy.hp -= 1;
        }

 

komentarz 30 lipca 2018 przez smokolisz Mądrala (6,340 p.)
Dzięki, poprawie to :)

Podobne pytania

0 głosów
2 odpowiedzi 228 wizyt
pytanie zadane 10 stycznia 2019 w HTML i CSS przez smokolisz Mądrala (6,340 p.)
0 głosów
0 odpowiedzi 166 wizyt
pytanie zadane 8 marca 2021 w JavaScript przez JWwvZVSu Nowicjusz (120 p.)
+1 głos
0 odpowiedzi 177 wizyt
pytanie zadane 10 września 2020 w JavaScript przez creend Gaduła (4,700 p.)

92,453 zapytań

141,262 odpowiedzi

319,088 komentarzy

61,854 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

Akademia Sekuraka 2024 zapewnia dostęp do minimum 15 szkoleń online z bezpieczeństwa IT oraz dostęp także do materiałów z edycji Sekurak Academy z roku 2023!

Przy zakupie możecie skorzystać z kodu: pasja-akademia - użyjcie go w koszyku, a uzyskacie rabat -30% na bilety w wersji "Standard"! Więcej informacji na temat akademii 2024 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!

...