#include
#include
#include
#define LEN_SIZE 7 //
#define HEI_SIZE 4 //
#define INIT_X 20 //
#define INIT_Y 8 //
using namespace std;
void gotoxy(int x, int y); //(x,y)
class Person
{
private:
int len, hei; //,
string name; //
int color; //
public:
int x, y; //
Person(int l, int h, int x_, int y_, const char* name_, int color_):
len(l), hei(h), x(x_), y(y_), name(name_), color(color_){} //
Person(const Person ren); //
void display(); //
void move_(char dir); //dir()
friend class Round; //
};
class Round //
{
private:
Person* ren[10]; //
bool iscontinue(); //
bool xyPerson(int x, int y); //(x,y)
bool ismove(const Person ren, char dir); //dir
public:
static const int EXIT_X = 1; //
static const int EXIT_Y = 3; //
Round(Person* ren_){for(int i = 0; i x == EXIT_X ren[0]->y == EXIT_Y) return false; //ren[0]
system("cls"); //
return true;
}
bool Round::xyPerson(int x, int y)
{
for(int i = 0; i =ren[i]->x y>=ren[i]->y xx+ren[i]->len yy+ren[i]->hei)
return true;
return false;
}
bool Round::ismove(const Person ren, char dir)
{
switch(dir)
{
case 'a':
if(ren.x == 0) return false;
if(ren.hei == 1 xyPerson(ren.x-1, ren.y)) return false;
else if(ren.hei == 2 (xyPerson(ren.x-1, ren.y) || xyPerson(ren.x-1, ren.y+1))) return false;
else return true;
case 'd':
if(ren.hei == 1)
{
if(ren.len == 1 (ren.x == 3 || xyPerson(ren.x+1,ren.y))) return false;
else if(ren.len == 2 (ren.x == 2 || xyPerson(ren.x+2,ren.y))) return false;
else return true;
}
if(ren.hei == 2)
{
if(ren.len == 1 (ren.x == 3|| xyPerson(ren.x+1,ren.y) || xyPerson(ren.x+1,ren.y+1))) return false;
else if(ren.len == 2 (ren.x == 2 || xyPerson(ren.x+2,ren.y) || xyPerson(ren.x+2,ren.y+1))) return false;
else return true;
}
case 'w':
if(ren.y == 0) return false;
if(ren.len == 1 xyPerson(ren.x, ren.y-1)) return false;
else if(ren.len == 2 (xyPerson(ren.x, ren.y-1) || xyPerson(ren.x+1, ren.y-1))) return false;
else return true;
case 's':
if(ren.len == 1)
{
if(ren.hei == 1 (ren.y == 4 || xyPerson(ren.x,ren.y+1))) return false;
else if(ren.hei == 2 (ren.y == 3 || xyPerson(ren.x,ren.y+2))) return false;
else return true;
}
if(ren.len == 2)
{
if(ren.hei == 1 (ren.y == 4 || xyPerson(ren.x,ren.y+1) || xyPerson(ren.x+1,ren.y+1))) return false;
else if(ren.hei == 2 (ren.y == 3 || xyPerson(ren.x,ren.y+2) || xyPerson(ren.x+1,ren.y+2))) return false;
else return true;
}
}
}
void Round::game()
{
do
{
gotoxy(0, 0);
//"\033[37m"
cout'9') tmp = getch();
int cro;
label:cro = tmp - '0';
gotoxy(10, 4);
coutname;
label2:tmp = getch();
if(tmp>='0' tmp= 'A' tmp move_(tmp);
else goto label2;
}
while(iscontinue());
system("cls"); //,()
for(int i = 0; i < 10; ++i)
(*ren[i]).display();
gotoxy(0,0);
cout<<"\033[37m"<<"!"<}
Person::Person(const Person ren)
{
hei = ren.hei;
len = ren.len;
name = ren.name;
color = ren.color;
x = ren.x;
y = ren.y;
}
void Person::display()
{
int yy = INIT_Y + y*HEI_SIZE; //
gotoxy(INIT_X+x*LEN_SIZE, yy);
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), color); //,
cout<< name << " ";
if(len == 2) cout<< " ";
for(int j = 2; j <= hei*HEI_SIZE; ++j)
{
gotoxy(INIT_X + x * LEN_SIZE, ++yy);
if(len == 1) cout<<" ";
else cout<< " ";
}
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), 0);
}
void Person::move_(char dir)
{
if(dir == 'a') x--;
else if(dir == 'd') x++;
else if(dir == 'w') y--;
else y++;
}
void gotoxy(int x, int y)
{
COORD coord = {x, y};
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}