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

Rysowanie mapy w konsoli, co robię nie tak?

Object Storage Arubacloud
0 głosów
277 wizyt
pytanie zadane 9 sierpnia 2015 w C i C++ przez SageDark Nowicjusz (240 p.)

Witam, próbuję narysowac w konsoli mapę 15x15 wypełnioną znakami "I", "o" oraz "_" która będzie się losowo generować za każdym razem. Prosiłbym o jakieś wskazówki które doprowadzą mnie do rozwiązania tego zadania :) 

Oto dotychczasowy kod: 

#include <iostream>
#include <cstdlib>
#include <time.h>
using namespace std;

int mapa_wys = 15;
int mapa_szr = 15;

int mapa[mapa_wys][mapa_szr];

int main()

{
    for(int i = 0, i < mapa_wys; i++)
    {

        for(int j = 0; j < mapa_szr; j++)
        {
            srand(time(NULL));
            mapa[i][j] = rand()%3+1;
        }
    }
    cout<<mapa;
    return 0;
}

 

5 odpowiedzi

0 głosów
odpowiedź 9 sierpnia 2015 przez SageDark Nowicjusz (240 p.)
wybrane 13 sierpnia 2015 przez SageDark
 
Najlepsza

UPDATE

Program odpala się juz bez błędów! :) Poprawiłem wszystko tak jak zostało mi doradzone. Teraz pozostał tylko ostatni krok czyli narysowanie mapy przy użyciu znaków.

Poprawiony kod:

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


using namespace std;
HANDLE g_hConsol = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy (const int x, const int y)
{
    COORD coord = {x, y};
    SetConsoleCursorPosition(g_hConsol, coord);
}
const int mapa_wys = 15;
const int mapa_szr = 15;

int mapa[mapa_wys][mapa_szr];

int main(){
    srand(time(NULL));
    for(int y = 0; y < mapa_wys; y++)
    {

        for(int x = 0; x < mapa_szr; x++)
        {
            mapa[x][y] = rand()%3+1;
        }
    }
    return 0;
}

 

komentarz 9 sierpnia 2015 przez Kmycic Nowicjusz (160 p.)

A przy pomocy mojej funckcji powinno to wyglądać tak:
 

#include <iostream>
#include <cstdlib>
#include <time.h>
#include <windows.h>
 
 
using namespace std;
HANDLE g_hConsol = GetStdHandle(STD_OUTPUT_HANDLE);
void gotoxy (const int x, const int y)
{
    COORD coord = {x, y};
    SetConsoleCursorPosition(g_hConsol, coord);
}
const int mapa_wys = 15;
const int mapa_szr = 15;
 
int mapa[mapa_wys][mapa_szr];
 
int main(){
    srand(time(NULL));
    for(int y = 0; y < mapa_wys; y++)
    {
 
        for(int x = 0; x < mapa_szr; x++)
        {
            gotoxy(x,y);
            cout<<rand()%3+1;
        }
    }
    return 0;
}

Myślę że to powinno rozwiązać problem ;)

komentarz 11 sierpnia 2015 przez Lafoniz Gaduła (4,370 p.)

Nie podoba mi się włączanie do tego zadania jakichś dodatkowych funkcji, dlatego chciałbym zaprezentować mój sposób rozwiązania problemu:

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

using namespace std;

string mapa[15];

void wypelnij(string* mapa, unsigned szerokosc, unsigned wysokosc)
{
    for(unsigned y=0; y<wysokosc; ++y)
    {
        for(unsigned x=0; x<szerokosc; ++x)
        {
            // ten fragment mozna rozbudowac, czy tez zmienic
            // aby uzyskac inne losowe elementy na mapie
            char znak = rand() % 3 + 33;
            // to juz lepiej zostawic w spokoju
            mapa[y] += znak;
        }
    }
}

void narysuj(string* mapa, unsigned wysokosc)
{
    for(unsigned i=0; i<wysokosc; ++i)
        cout << mapa[i] << endl;
}

int main()
{
    srand(time(NULL));
    wypelnij(mapa, 15, 15);
    narysuj(mapa, 15);
    return 0;
}

Zauważ, że narysowanie mapy jest teraz bardzo proste oraz, że możesz dowolnie zmieniać szerokość danej linijki (do granic szerokości konsoli znakowej).

Gdybyś czegoś nie rozumiał, pisz śmiało.

komentarz 13 sierpnia 2015 przez SageDark Nowicjusz (240 p.)
Dziękuję bardzo za świetną odpowiedź! Skróciłeś oraz sprawiłeś, że kod jest przejrzysty :) Oto jest końcowa odpowiedź!
+3 głosów
odpowiedź 9 sierpnia 2015 przez Adrian1999 Nałogowiec (34,570 p.)

Zgaduje że masz błąd w 

int mapa_wys = 15;
int mapa_szr = 15;

Ponieważ tablice można definiować jedynie stałymi, więc by działała musisz zrobić z tego const inty

komentarz 9 sierpnia 2015 przez Patrycjerz Mędrzec (192,320 p.)

Dobrze, że szerzysz dobre nawyki wink W niektórych kompilatorach sztuczka ze zmienną zadziała, ale należy używać stałych.

+1 głos
odpowiedź 9 sierpnia 2015 przez Kmycic Nowicjusz (160 p.)

Witaj! :)

Jest to moja pierwsza odpowiedź na owym forum więc mam nadzieję że będzie pomocna :P Ok, do rzeczy.

Więc na początek programu dopisz taką funkcję:
 

#include <windows.h>

HANDLE g_hConsol = GetStdHandle(STD_OUTPUT_HANDLE);

void gotoxy(const int x, const int y)
{
	COORD coord = {x, y};
	SetConsoleCursorPosition(g_hConsol, coord);
}

I spróbuj ją do tego wykorzystać. W razie czego pisz :) 

komentarz 9 sierpnia 2015 przez SageDark Nowicjusz (240 p.)

Jesteśmy coraz bliżej rozwiązania :D Tak jak powiedział  Adrian1999 zamieniłem inty na const inty i zniknął jeden z błędów. Teraz tylko jak wykorzystać tą funkcję którą ty napisałeś? 

+1 głos
odpowiedź 9 sierpnia 2015 przez Dorion300 Szeryf (90,250 p.)
Srand przenieś przed pętla, najlepiej na samym początku main'a
0 głosów
odpowiedź 9 sierpnia 2015 przez adrian17 Ekspert (345,160 p.)
srand trzeba wywołać tylko raz, na początku programu.

"cout << mapa" nie zadziała, musisz ręcznie iterować po mapie i drukować kolejne elementy.

Mała rada: jeśli to ma być mapa 2D, często bardziej intuicyjne jest używanie indeksów y, x zamiast i, j.

Podobne pytania

0 głosów
1 odpowiedź 711 wizyt
pytanie zadane 9 października 2017 w C i C++ przez amited Początkujący (470 p.)
+1 głos
2 odpowiedzi 186 wizyt
pytanie zadane 16 stycznia 2016 w C i C++ przez LostInUSA Nowicjusz (130 p.)
0 głosów
1 odpowiedź 162 wizyt

92,631 zapytań

141,498 odpowiedzi

319,869 komentarzy

62,011 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!

...