Tak na szybko, to możesz zmienić kolejnością te dwa if'y i dodać continue:
Przed:
if (mapa[i][j]=='p')
cout<<" ";
if (i==a && j==b)
{
mapa[a][b]='g';
cout<<"@";
}
Po:
if (i==a && j==b)
{
mapa[a][b]='g';
cout<<"@";
continue;
}
if (mapa[i][j]=='p') {
cout<<" ";
continue;
}
Z wysokopoziomowych rad i widzimisiów, to pewnie bym zrobił jeszcze jeden bufor wielkości mapy, i przy rysowaniu robił tak:
- kopiował (memcpy) cały bufor mapa do tego nowego buforu
- rysował w odpowiednim miejscu tego nowego buforu gracza
- linia po linii buforu robił cout << bufor[n] << "\n";
To trochę ułatwia sprawę, bo nie musisz pamiętać o "czyszczeniu" miejsca w którym gracz stał po jego ruchu.