Переделал лаб, доделал автопрохождение:
#include <iostream>
#include <fstream>
#include <cstdio>
#include "/home/user/Исходники/C++/universal.h"
#include <unistd.h>
#include <termios.h>
#include <sys/select.h>
using namespace std;
const int nado_sobrat=4; // всего вишней в лабиринте
int sobrano_vishney;
int sobrano[nado_sobrat]; // какие вишни собраны
int vishnia_x[4] = {4,10,14,22};
int vishnia_y[4] = {10,1,11,18};
int x = 1, y = 1; // начальная позиция в лабиринте
int d = 22, s = 1; // координаты двери
enum direction {Left, Up, Right, Down};
direction w = Down;
int a[25][20] = {{1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
{1,2,1,0,0,1,0,1,0,0,0,1,1,1,1,0,0,0,0,1,},
{1,0,1,1,0,1,0,1,0,1,0,0,0,0,1,0,1,1,0,1,},
{1,0,0,0,0,0,0,1,0,1,1,1,1,0,1,0,0,1,0,1,},
{1,1,1,1,1,1,0,1,0,1,4,0,1,0,1,1,0,1,0,1,},
{1,0,0,1,0,0,0,0,0,1,1,0,0,0,0,0,0,1,0,1,},
{1,0,1,1,0,1,1,1,1,1,0,0,1,0,1,1,1,1,0,1,},
{1,0,0,0,0,0,0,0,0,1,1,1,1,0,1,0,0,0,0,1,},
{1,1,1,1,1,1,0,1,1,1,0,0,0,0,1,0,1,1,1,1,},
{1,1,0,0,0,1,0,0,1,1,0,1,1,1,1,0,0,0,0,1,},
{1,4,0,1,0,0,0,0,0,1,0,0,0,0,1,1,1,1,0,1,},
{1,1,1,1,1,1,1,1,1,1,1,1,1,0,1,0,0,0,0,1,},
{1,0,0,0,0,0,0,0,0,0,0,0,0,0,1,0,1,1,1,1,},
{1,0,1,1,0,1,1,1,1,1,1,1,1,1,1,0,0,0,0,1,},
{1,0,1,0,0,0,0,0,0,0,1,4,0,0,0,0,1,1,0,1,},
{1,0,1,1,1,1,1,0,1,0,1,1,1,0,1,0,0,0,0,1,},
{1,0,1,0,0,0,1,0,1,0,0,0,1,1,1,1,1,1,1,1,},
{1,0,1,0,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,1,},
{1,0,1,0,1,0,1,0,1,0,1,1,1,1,1,1,1,1,0,1,},
{1,1,1,0,1,0,1,0,1,0,0,0,0,0,0,0,0,0,0,1,},
{1,0,1,0,1,0,0,0,1,0,1,1,1,1,1,1,0,1,0,1,},
{1,0,0,0,1,1,1,1,1,0,0,0,1,0,1,0,0,1,0,1,},
{1,1,1,0,0,0,0,0,1,1,1,0,0,0,1,0,1,1,4,1,},
{1,0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,},
{1,3,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,}}; //игровое поле
void print_a() // выводим полезную информацию и лабиринт на экран
{
for (int i=0; i<24; i++)
{
for (int m=0; m<20; m++)
{
if (i==22 && m==1 && a[i][m] != 0) cout<<"--";
else
{
if (a[i][m]==1) cout<<"░░";
}
if (a[i][m]==0 || a[i][m]==3) cout<<" ";
if (a[i][m]==2) cout<<"╠╣";
if (a[i][m]==4) cout<<"••";
if (a[i][m]==6) cout<<"::";
}
cout<<endl;
}
cout<<"Собрано вишен: "<<sobrano_vishney<<"/4"<<endl;
if (sobrano_vishney==nado_sobrat) cout<<"Дверь открыта"<<endl;
// если собрали все вишни сообщаем, что дверь открыта
}
bool try_left()
{
switch (w)
{
case Left : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
case Up : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
case Right : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
case Down : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
}
return false;
}
bool try_forward()
{
switch (w)
{
case Left : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
case Up : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
case Right : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
case Down : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
}
return false;
}
bool try_right()
{
switch (w)
{
case Left : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
case Up : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
case Right : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
case Down : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
}
return false;
}
bool try_back()
{
switch (w)
{
case Left : if (a[x][y+1] != 1) { y++; w = Right; return true; } break;
case Up : if (a[x+1][y] != 1) { x++; w = Down; return true; } break;
case Right : if (a[x][y-1] != 1) { y--; w = Left; return true; } break;
case Down : if (a[x-1][y] != 1) { x--; w = Up; return true; } break;
}
return false;
}
bool motion_auto()
{
a[x][y] = 6;
if (try_left()==false)
{
if (try_forward()==false)
{
if (try_right()==false)
{
try_back();
}
}
}
if (a[x][y]==3) return true;
a[x][y] = 2;
return false;
}
void motion()
{
char m;
m = getch();
a[x][y] = 0;
switch (m)
{
case 65 :
case 'w' : x--; break;
case 66 :
case 's' : x++; break; // обрабатываем ход
case 68 :
case 'a' : y--; break;
case 67 :
case 'd' : y++; break;
}
if (a[x][y]==0 || a[x][y]==3 || a[x][y]==4 || a[x][y]==6) a[x][y] = 2;
else // а если стенка ?
{
switch (m)
{
case 65 :
case 'w' : x++; break;
case 66 :
case 's' : x--; break; // возвращаем всё как было
case 68 :
case 'a' : y++; break;
case 67 :
case 'd' : y--; break;
}
a[x][y] = 2;
}
}
int main()
{
int re;
cout<<"Выберите режим (1-прохождение, 2-играть) ";
cin>>re;
clear_scr();
for (;;) // основной цикл игры
{
if (sobrano_vishney==nado_sobrat) a[d][s] = 0;
// собрали все вишни? откроем дверь
for (int i=0; i<nado_sobrat; i++)
{
if (sobrano[i]!=1) // что бы 1 вишню не брали 2 раза
if (x==vishnia_x[i] && y==vishnia_y[i])
{
sobrano_vishney++; sobrano[i]=1; // подобрали вишню
}
}
if (re==2)
{
if (a[x][y]==3) break;
print_a();
motion();
clear_scr();
}
if (re==1)
{
print_a();
if (motion_auto()==true) { cout << "Ready" << endl; break; }
getch();
clear_scr();
}
}
print_a();
if (re==2) cout << endl << "Ты выиграл!" << endl;
return 0;
}