Kod sprawdzający, czy wąż wszedł w ścianę planszy

0
 #include <iostream>
using namespace std;

class Plansza
{
    public:
    char tablica[25][70];

    void rysuj()
    {
        for(int i = 0; i < 25;i++)
        {
            for(int j = 0; j < 70;j++)
            {
                tablica[i][j] = 0;
            }
        }

        int i = 0,j = 0;
        for(int j = 0; j < 70; j++)
        {
             tablica[i][j] = (char) 219;
        }

        for(int i = 1 ;i < 25; i++)
        {
            tablica[i][0] = (char) 219;
            tablica[i][69] = (char) 219;
        }

        for(j = 0; j < 70; j++)
        {
            i = 24;
            tablica[i][j] = (char) 219;
        }
        for(int i = 0;i < 25;i++)
        {
            for(int j = 0; j < 70;j++)
            {
               cout << tablica[i][j] ;
            }
            cout << endl;
        }
    }
};

int main()
{
    Plansza mapa;
    mapa.rysuj();
    return 0;
}

Stworzyłem planszę do gry. Teraz chcę stworzyć klasę potwory i stworzyć obiekt wąż. Mógłby ktoś podpowiedzieć jak potem napisać fragment kodu, który będzie sprawdzać czy wąż nie wszedł w ściany planszy ? Nie bardzo wiem jak się dostać z obiektu wąż do pól obiektu mapa aby sprawdzić ten warunek.

0

Teraz ok ?

#include <iostream>
using namespace std;

class Plansza
{
    private:
    char tablica[25][70];

    public:
    void wypelnij()
    {
        for(int i = 0; i < 25;i++)
        {
            for(int j = 0; j < 70;j++)
            {
                tablica[i][j] = 0;
            }
        }

        int i = 0,j = 0;
        for(int j = 0; j < 70; j++)
        {
             tablica[i][j] = (char) 219;
        }

        for(int i = 1 ;i < 25; i++)
        {
            tablica[i][0] = (char) 219;
            tablica[i][69] = (char) 219;
        }

        for(j = 0; j < 70; j++)
        {
            i = 24;
            tablica[i][j] = (char) 219;
        }
    }
    void rysuj() const
    {
        for(int i = 0;i < 25;i++)
        {
            for(int j = 0; j < 70;j++)
            {
               cout << tablica[i][j] ;
            }
            cout << endl;
        }
    }
};

int main()
{
    Plansza mapa;
    mapa.wypelnij();
    mapa.rysuj();
    return 0;
}
 
2
  1. Niepotrzebne rzutowania.
  2. Magiczne liczby.
  3. Nadmiar pętli.
  4. Potworki związane z iteracją w pętlach.
  5. Makaronizm - polskie i angielskie nazwy nie idą w parze; Angielski narzuca Ci sam język, więc polski możesz sobie darować.

//EDIT: Co do pytania - sprawdź, czy tam, gdzie wąż ma głowę nie ma ściany, wszystko.

0

Teraz właśnie udało mi się wstawić początek węża na planszę. Jednak to chyba nie jest dobre rozwiązanie. Za każdym razem czyścić ekran ? I czy to dobrze jeśli pola mam publiczne ?

class Potwor
{
public:

    char znak = 219;
    int poz_x;
    int poz_y;

public:

    Potwor(int x, int y) : poz_x(x), poz_y(y) {};

};

int main()
{
    Plansza mapa;
    mapa.wypelnij();
    mapa.rysuj();
    Potwor waz(14,30);
    mapa.tablica[waz.poz_x][waz.poz_y] = waz.znak;
    system("cls");
    mapa.rysuj();
    return 0;
}
0

pomoże ktoś ?

0

skoro masz konsolę to po prostu sprawdzaj czy w miejscu, w które chcesz się ruszyć/jesteś jest ściana i nie pozwól mu tam iść/zabij go. prostszej wersji nie widzę

0

Teraz mam coś takiego, nie wiem co zrobić w momencie gdy wąż natrafi na jedzenie czyli w tym momencie:

 if(waz.poz_y == jablko.poz_y && waz.poz_x == jablko.poz_x) 

Dodać 1 jednostkę do węża lecz nie wiem jak to zrobić.

#include <iostream>
#include <windows.h>
#include<stdlib.h>
#include<conio.h>

using namespace std;

class Plansza
{
private:
    char sciana = 219;

public:
    char tablica[23][70];

    void wypelnij()
    {
        for(int i = 0; i < 23;i++)
        {
            for(int j = 0; j < 70;j++)
            {
                tablica[i][j] = 0;
            }
        }


        for(int j = 0; j < 70; j++)
        {
             tablica[0][j] = sciana;
        }

        for(int i = 1 ;i < 23; i++)
        {
            tablica[i][0] = sciana;
            tablica[i][69] = sciana;
        }

        for(int j = 0; j < 70; j++)
        {
            tablica[22][j] = sciana;
        }
    }
    void rysuj() const
    {
        for(int i = 0;i < 23;i++)
        {
            for(int j = 0; j < 70;j++)
            {
               cout << tablica[i][j];
            }
            cout << endl;
        }
    }
};
class Potwor
{
private:
    int wynik=0;

public:
    char znak = 219;
    int poz_x;
    int poz_y;

    Potwor(int x, int y) : poz_x(x), poz_y(y) {};
    void dodaj()
    {
        wynik += 1;
    }

};

class Jedzenie
{
public:
    char znak = '@';
    int poz_x;
    int poz_y;
    Jedzenie(int x, int y) : poz_x(x), poz_y(y) {};
};

int main()
{
    Plansza mapa;
    mapa.wypelnij();
    Jedzenie jablko(40,15);
    Potwor waz(30,20);
    mapa.tablica[jablko.poz_y][jablko.poz_x] = jablko.znak;
    mapa.tablica[waz.poz_y][waz.poz_x] = waz.znak;
    mapa.rysuj();
    for(;;)
    {
    if(getch()==224)
        {
          //  mapa.tablica[waz.poz_y][waz.poz_x] = ' ';
            switch(getch())
            {
                case 80 : waz.poz_y++;break;
                case 72 : waz.poz_y--;break;
                case 75 : waz.poz_x--;break;
                case 77 : waz.poz_x++;break;
            }
            if(waz.poz_y == 22 || waz.poz_y == 0 || waz.poz_x == 0 || waz.poz_x == 69)
                {
                    system("cls");
                    cout << "KONIEC GRY";
                    exit(0);
                }
                if(waz.poz_y == jablko.poz_y && waz.poz_x == jablko.poz_x)
                {

                }
            mapa.tablica[waz.poz_y][waz.poz_x] = waz.znak;
            system("cls");
            mapa.rysuj();
        }
    }

    return 0;
}
 
1

... no według mnie to najłatwiej to możesz dać sobie dynamiczną tablicę/wektor który będzie kawałkiem węża i jak on będzie się ruszał to na miejscu gdzie był dany kawałek stawiasz znak planszy, a jak trafisz na jedzenie to dodajesz kawałek do węża

0

Zakładając, że mam w wektorze 3 jednostki lub więcej węża, to jak 3 jednostkami tymi na raz ruszać ?
Teraz tak główkuje jak stworzę wektor to jak potem wyświetlić pierwszy punkt węża. Bo teraz robiłem to tym kodem:

mapa.tablica[waz.poz_y][waz.poz_x] = waz.znak;

A wektora nie da się wyświetlić w tym określonym miejscu w tablicy z klasy Plansza?

1

no po pierwsze rysujesz na ekranie w każdym miejscu gdzie jest część węża część planszy potem sprawdzasz, czy możesz się ruszyć, potem przesuwasz pozycję ostatniego elementu(np o numerze n) na pozycję wcześniejszego elementu(n-1) i tak aż dojdziesz do przesunięcia pierwszego elementu(głowa) i w tedy przesuwasz go na miejsce, gdzie chciałeś się poruszyć(jeśli możesz). coś jeszcze? i dałbyś plusa za odpowiedź :P

0

Jak wyświetlić np. 1 element wektora w określonym indeksie tablicy z klasy Plansza ? Ten wektor stworzyć w klasie Potwór czy w mainie ?

0
mapa.talbica[waz[n].x,waz[n].y]=waz[n].znak; 
0

tylko w moim przykładzie waz jest wektorem klasy, która jest segmentem węża z gry

0

jak w klasie potwor mam wektor np o nazwie waz to tak po prostu waz[nr indeksu] mozna do tego indeksu z wektora waz sie odwolywac? tak w Twoim kodzie chyba jest. tylko gdzie jest obiekt?

0

jak masz wektor w klasie to musisz:

klasa.wektor[n] 

a nie:klasa[n]

 chyba, że przeciążysz operator [] ale lepiej nie komplikować sobie życia :)
0

to w moim przypadku bedzie potwor. wektor [n ]?

0

tak... tylko pamiętaj, że w moim przykładzie potwor.wektor[0] to głowa

0

jednak nie rozumiem miales w swoim przykladzie weza a teraz potwor?

0

ja to widzę tak:robisz sobie klasę/strukturę segment z 2 zmiennymi x,y robisz sobie klasę np waz która ma vector segmentów oraz znak(znak do wyświetlania) i w tedy rysowanie wygląda tak:

mapa.tablica[waz.segment[n].x][waz.segment[n].y]=waz.znak; 
0

Tylko jak bezpośrednio odwołuję się do klasy to skąd wziąć wartość x jak nie ma obiektu tej klasy ?
Chyba nie można tak bezpośrednio do klasy się odwoływać trzeba mieć obiekt danej klasy.
Tym sposobem

mapa.tablica[waz.segment[n].x][waz.segment[n].y]=waz.znak;  

Pokazuje błąd expected primary-expression before '_' token

Czyli nadal jestem w tym samym miejscu bo nie wiem jak powiększać jednostki węża :(.

Jest mi ktoś w stanie pomóc ?

0

dobra od początku... masz klasę(wszystkie rzeczy w klasach mają być publiczne, a przynajmniej te co ci podaje) wąż, w niej masz char znak i wektor klas segment a w nich masz int x,y. teraz rozumiesz?

0

Nie bardzo wiem jak w wektorze ma być zmienna x i y ? Bo pola klasy to zmienne x i y, ale jak je upakować do wektora to nie wiem. Konstruktora nie użyje dla klasy tylko dla obiektu, więc nie wiem jak nadać wartości dla zmiennych x i y ?
Kod:

 #include <iostream>
#include <windows.h>
#include<stdlib.h>
#include<conio.h>
#include<vector>

using namespace std;

class Plansza
{
private:
    char sciana = 219;

public:
    char tablica[23][70];

    void wypelnij()
    {
        for(int i = 0; i < 23;i++)
        {
            for(int j = 0; j < 70;j++)
            {
                tablica[i][j] = 0;
            }
        }


        for(int j = 0; j < 70; j++)
        {
             tablica[0][j] = sciana;
        }

        for(int i = 1 ;i < 23; i++)
        {
            tablica[i][0] = sciana;
            tablica[i][69] = sciana;
        }

        for(int j = 0; j < 70; j++)
        {
            tablica[22][j] = sciana;
        }
    }
    void rysuj() const
    {
        for(int i = 0;i < 23;i++)
        {
            for(int j = 0; j < 70;j++)
            {
               cout << tablica[i][j];
            }
            cout << endl;
        }
    }
};
class waz
{
private:
    int wynik=0;

public:
    char znak = 219;
    int x;
    int y;
    vector <int> tab;
    waz(int x, int y) : x(x), y(y) {};
    void dodaj()
    {
        wynik += 1;
    }
};

int main()
{
    Plansza mapa;
    Jedzenie jablko(40,15);
    mapa.wypelnij();
    
    mapa.tablica[jablko.y][jablko.x] = jablko.znak;
    mapa.tablica[waz.tab[0].x][waz.tab[0].y]=waz.znak; 
    system("cls");
    mapa.rysuj();
0

a po co ci vector charów? zrób wektor klasy segment

0

Teraz jeszcze jedno pytanie co mogę zrobić aby zmienna znak działała jak by była prywatna ?

0

w sensie, że chcesz zmienić zmienną znak na prywatną? tylko po co? jak masz zmienną prywatną to musisz mieć funkcję która ci pozwoli ją odczytać. lepiej nie komplikować kodu i zostawić na public.

radzę chwilę posiedzieć i pomyśleć nad tym co robisz, bo masz podstawowe problemy raczej logiczne niż programistyczne

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