Nieruchome menu/podmenu

0

witam,
jestem w trakcie pisania prostego roguelika'a i napotkałem problem. wiadomo że chciałoby się zobaczyć co nasza postać zebrała w czasie wędrówek po labiryntach i tu zaczyna się mój problem. na początku wyświetlałem zawartość ekwipunku na ekranie obok planszy za pomocą gotoxy ale kiedy postać schodzi niżej i plansza się przesuwa zapis ucieka z ekranu. chciałbym zbudować coś na zasadzie nieruchomego bloku który byłby widoczny zawsze w w tym samym miejscu ekranu bez względu na pozycję planszy ewentualnie wywoływać jakimś klawiszem nowy ekran gdzie będzie można obejrzeć zasoby i wrócić do poprzedniego (oczywiście z uwzględnieniem progresu w grze:)). bardzo proszę o pomoc i wskazówki.
Umieszczam kod gdybym coś niejasno wytłumaczył:

//#include "stdafx"
#include "windows.h"
#include "iostream.h"
#include "conio.h"
#include "process.h"
//----------------------------------------------------------------
#define MAX_X 20
#define MAX_Y 37
char PlayerASCII         = 0x01;    // ASCII Man
char DuckASCII           = 0x44;    // ASCII Duck
char VerticalWallASCII   = 0xBA;    // Vertical wall piece
char HorizontalWallASCII = 0xCD;    // Horizontal wall piece
char TopRightCornerASCII = 0xBB;    // Top right wall piece
char TopLeftCornerASCII  = 0xC9;    // Top left wall piece
char BotLeftCornerASCII  = 0xC8;    // Bottom right wall piece
char BotRightCornerASCII = 0xBC;    // Bottom left wall piece
char FloorTileASCII      = 0x2E;    // Floor tile 
//----------------------------------------------------------------


HANDLE DDTxDefaultConsoleHandle=NULL;
void set(void)
{
DDTxDefaultConsoleHandle=GetStdHandle(STD_OUTPUT_HANDLE);
SMALL_RECT tRozmiar={0,0,200,70}; COORD tWymiary={200,71};
SetConsoleWindowInfo(DDTxDefaultConsoleHandle,true ,&tRozmiar);
SetConsoleScreenBufferSize(DDTxDefaultConsoleHandle,tWymiary);
}


void gotoxy(int x, int y) {
HANDLE hConsoleOutput;
COORD dwCursorPosition;
cout.flush();
dwCursorPosition.X = x;
dwCursorPosition.Y = y;
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput,dwCursorPosition);
}

int wherey()
{
      CONSOLE_SCREEN_BUFFER_INFO info;

      GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
      return info.dwCursorPosition.Y;
}

class Ludzik{
private:
	int energia;
	int skarby;
	int pos_x;
	int pos_y;
public:
	Ludzik(int x,int y){
		pos_x=x;
		pos_y=y;
		energia=1;
		skarby=0;
	}
    void SkarbyPlus(){ skarby++; } 
    void EnergiaPlus(){ energia++; } 
	void EnergiaMinus(){ energia--; } 
	void IdzWPrawo(){ pos_x++; }
	void IdzWLewo(){ pos_x--; }
	void IdzWGore(){ pos_y--; }
	void IdzWDol(){ pos_y++; }
	int ZwrocEnergie(){return energia;}
	int Y(){return pos_y;}
	int X(){return pos_x;}
	void Info(){
		cout<<"Pozycja: ("<<pos_x<<","<<pos_y<<") Skarby:"<<skarby<<" Energia:"<<energia;
	}
	bool moznaWPrawo(char p[MAX_Y][MAX_X]);
	bool moznaWLewo(char p[MAX_Y][MAX_X]);
	bool moznaWGore(char p[MAX_Y][MAX_X]);
	bool moznaWDol(char p[MAX_Y][MAX_X]);
};



bool Ludzik::moznaWPrawo(char p[MAX_Y][MAX_X]){
	if(pos_x+1==MAX_X){
	
		return false;
	}
	if(p[pos_y][pos_x+1]=='#'){
	
		return false;
	}
	return true;
}

bool Ludzik::moznaWGore(char p[MAX_Y][MAX_X]){
	if(pos_y-1==MAX_Y){
	
		return false;
	}
	if(p[pos_y-1][pos_x]=='#'){
	
		return false;
	}
	return true;
}

bool Ludzik::moznaWDol(char p[MAX_Y][MAX_X]){
	if(pos_y+1==MAX_Y){
		
		return false;
	}
	if(p[pos_y+1][pos_x]=='#'){
		
		return false;
	}
	return true;
}

bool Ludzik::moznaWLewo(char p[MAX_Y][MAX_X]){
	if(pos_x-1==MAX_X){
		
		return false;
	}
	if(p[pos_y][pos_x-1]=='#'){
		return false;
	}
	return true;
}

//----------------------------------------------------------------
void clrscr(){
	system("cls");
}
//----------------------------------------------------------------
bool wczytajPlansze(char *nazwaPliku,char *p){
	FILE *plik = fopen(nazwaPliku,"r");
	if(plik==NULL) return false;
	char znaczek;
	while(!feof(plik)){
		znaczek = fgetc(plik);
		if(znaczek!='\n') *(p++) = znaczek;
	}
	fclose(plik);
	return true;
}
//----------------------------------------------------------------
void wyswietlPlansze(char p[MAX_Y][MAX_X],Ludzik *m){
	clrscr();
	for(int i=0;i<MAX_Y;i++){
		for(int j=0;j<MAX_X;j++) printf("%c",p[i][j]);
		printf("\n");
	}  
}
//----------------------------------------------------------------
Ludzik* poszukajLudzika(char p[MAX_Y][MAX_X]){
	for(int i=0;i<MAX_Y;i++) for(int j=0;j<MAX_X;j++){
		if(p[i][j]=='L'){
			Ludzik *stworek = new Ludzik(j,i);
			return stworek;
		}
	}
	return NULL;
}
//----------------------------------------------------------------
int main(int argc, char* argv[]){
    set();
	char mapa[MAX_Y][MAX_X]={{' '}};
	Ludzik *mietek;

	if(wczytajPlansze("labirynt1.txt",*mapa)==false){
		cout<<"Brak pliku z planszą lub uszkodzony plik.";
		getch();
		return 1;
	}

	mietek = poszukajLudzika(mapa);
	if(mietek==NULL){
		cout<<"Wadliwa plansza - brakuje ludzika.";
		getch();
		return 2;
	}
	int kierunek;
	int i=1;
	wyswietlPlansze(mapa,mietek);
	while(true){
                                                                  
                gotoxy(25,3);
                mietek->Info();
                gotoxy(mietek->X(),mietek->Y());
                
		//wyswietlPlansze(mapa,mietek);
		if(mietek->ZwrocEnergie()<=0){
        gotoxy(25,2);
        printf("Zginales");
        gotoxy(25,3);                             
        printf("Game over !!!");
		break;}
		kierunek=_getch();
		if(kierunek==113) break;
		else if(kierunek==111){
			wczytajPlansze("labirynt1.txt",*mapa);
			mietek = poszukajLudzika(mapa);
		}
		else if(kierunek==77){
			if(mietek->moznaWPrawo(mapa)==true){
				mapa[mietek->Y()][mietek->X()]=' ';
				mietek->IdzWPrawo();
				if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
				else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
			//	else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
				mapa[mietek->Y()][mietek->X()]='L';
				gotoxy(mietek->X()-1,mietek->Y());
				cout<<" ";
                gotoxy(mietek->X(),mietek->Y());
				cout<<"L";
				gotoxy(mietek->X()+1,mietek->Y());
			}
		}
		
		else if(kierunek==75){
			if(mietek->moznaWLewo(mapa)==true){
				mapa[mietek->Y()][mietek->X()]=' ';
				mietek->IdzWLewo();
				if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
				else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
				else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
				mapa[mietek->Y()][mietek->X()]='L';
				gotoxy(mietek->X()+1,mietek->Y());
				cout<<" ";
                gotoxy(mietek->X(),mietek->Y());
				cout<<"L";
				gotoxy(mietek->X()-1,mietek->Y());
			}
		}
		
		else if(kierunek==72){
			if(mietek->moznaWGore(mapa)==true){
				mapa[mietek->Y()][mietek->X()]=' ';
				mietek->IdzWGore();
				if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
				else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
				else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
				mapa[mietek->Y()][mietek->X()]='L';
				gotoxy(mietek->X(),mietek->Y()+1);
				cout<<" ";
                gotoxy(mietek->X(),mietek->Y());
				cout<<"L";
				gotoxy(mietek->X(),mietek->Y()-1);
			}
		}
		
		else if(kierunek==80){
			if(mietek->moznaWDol(mapa)==true){
				mapa[mietek->Y()][mietek->X()]=' ';
				mietek->IdzWDol();
				if(mapa[mietek->Y()][mietek->X()]=='*') mietek->SkarbyPlus();
				else if(mapa[mietek->Y()][mietek->X()]=='J') mietek->EnergiaPlus();
				else if(mapa[mietek->Y()][mietek->X()]=='%') mietek->EnergiaMinus();
				//mapa[mietek->Y()][mietek->X()]='L';
				gotoxy(mietek->X(),mietek->Y()-1);
				cout<<" ";
                gotoxy(mietek->X(),mietek->Y());
				cout<<"L";
				gotoxy(mietek->X(),mietek->Y()+1);
			}
		}
	}
gotoxy(25,4);
	printf("Do zobaczenia !!!");
	getch();
	return 0;
}

0

zapomniałem jeszcze dodać pliku planszy do sprawdzenia:

labirynt1.txt
http://odsiebie.com/pokaz/3610550---6c2e.html

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