Blokada poruszania oraz odświeżanie w tle

0

Tworzę prostą minigierkę w konsoli. Chciałbym by "@" czyli gracz nie przechodził poza "#" oznaczające ścianę. Niestety nie mam innego pomysłu jak to zrobić a chciałbym dodać ściany wewnątrz planszy. Drugim problemem jest to że za każdym razem jak się postać porusza odświeża mapę. Czy jest możliwość by to odbywało się tak by nie było tego widać? Jeśli ktoś ma jeszcze jakieś inne porady to z chęcią wysłucham.

#include <iostream>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
using namespace std;
/*
(0,0)           (10,0)



(0,10)          (10,10)
*/
void rysuj(const int X, const int Y, const int x, const int y, const char mapa[30][31])
{
    system("cls");
    cout  << x << ", " << y << endl;
    for(int ry=0; ry<Y; ry++)
    {
        for(int rx=0; rx<X; rx++)
        {
            if(rx==x && ry==y)
            {
                cout << '@';
            }
            else
            {
                cout << mapa[ry][rx];
            }
        }
        cout << endl;
    }
}
int main()
{
    srand(time(NULL));
    //mapa
    const int X=30;
    const int Y=15;
    char mapa[30][30+1] =
    {
        "############################",
        "#                          #",
        "#                          #",
        "#                          #",
        "#                          #",
        "#                          #",
        "#                          #",
        "#         *                #",
        "############################"
    };
    //klawiatura
    int kod=0, kodPoprzedni=0;
    //pozycja gracza
    int x=1, y=1;
    //licznik punktów
    int pkt=0;
    rysuj(X, Y, x, y, mapa);
    while(true)
    {
        kodPoprzedni = kod;
        kod = getch();
        if(kodPoprzedni==224)
        {
            switch(kod)
            {
            case 72:
                cout << "G";
                y--;
                break;
            case 80:
                cout << "D";
                y++;
                break;
            case 77:
                cout << "P";
                x++;
                break;
            case 75:
                cout << "L";
                x--;
                break;
            }
            if(mapa[y][x] == '*')
            {
                mapa[y][x] = ' ';
                mapa[(rand() % 7)+1][(rand() % 26)+1] = '*';
                pkt+=1;
            }
            if(mapa[y][x] == '#')
            {

            }
            if(y==8) y-=1;           // Ustawienie granicy planszy
            if(y==0) y+=1;
            if(x==27) x-=1;
            if(x==0) x+=1;

            rysuj(X, Y, x, y, mapa);
        }
    cout<<"Punkty: "<<pkt<<endl;

    }
    return 0;
}

0

Nie zmieniaj x,y tylko wylicz następną pozycję nx,ny wtedy if(mapa[ny][nx]!='#') { x=nx; y=ny; }

Zamiast cls użyj:
https://docs.microsoft.com/en-us/windows/console/setconsolecursorposition

Rozważ:

kod=getch();
if(kod==0xE0) kod=0x100|getch();
switch(kod)
   {
      case 0x1B: // 27 (ESC)
      case 0x148: // 72
      case 0x150: // 80
      case 0x14D: // 77
      case 0x14B: // 75
...
0

Tutaj masz krotka serie (3 filmy) z gra snake w konsoli. Powinienes je obejrzec, zeby we wlasciwy sposob podzielic kod na "podprogramy", to pomoze nam i tobie rozeznac sie w tym kodzie (docenisz to za pare miesiecy,jesli do kodu wrocisz). W ktoryms z tych 3 filmow, ale juz niestety nie pamietam, w ktorym dokladnie, jest rozwiazanie twojego problemu ze scianami

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