Tengo 2 errores y no encuentro la manera de solucionarlos (juego de asteroides)


30 de Agosto del 2016

Hola estoy haciendo un juego de asteroides en c++ (visual studio 2015), y me salen estos dos errores :

Error C3867 'AST::Y': non-standard syntax; use '&' to create a pointer to member

Error C2296 '+': illegal, left operand has type 'int (__thiscall AST::* )(void)'

El codigo es el siguiente:

#include<stdio.h>
#include<windows.h>
#include<conio.h>
#include<stdlib.h>
#include<list>
#include <string>
#include <iostream>

using namespace std;

#define ARRIBA 72
#define IZQUIERDA 75
#define DERECHA 77
#define ABAJO 80

void gotoxy(int x, int y) {

HANDLE hCon;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
COORD dwPos;
dwPos.X = x;
dwPos.Y = y;

SetConsoleCursorPosition(hCon, dwPos);

}

void OcultarCursor() {
HANDLE hCon;
hCon = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_CURSOR_INFO cci;
cci.dwSize = 0;
cci.bVisible = FALSE;

SetConsoleCursorInfo (hCon,&cci);

}

void pintar_limites() {
for (int i = 2; i < 78; i++) {
gotoxy(i, 3); printf("%c",205);
gotoxy(i, 33); printf("%c",205);
}

for (int i = 4; i < 33; i++) {
gotoxy(2, i); printf("%c", 186);
gotoxy(77, i); printf("%c", 186);
}
gotoxy(2, 3); printf("%c", 201);
gotoxy(2,33 ); printf("%c", 200);
gotoxy(77, 3); printf("%c", 187);
gotoxy(77, 33); printf("%c", 188);
}

 


class NAVE {
int x, y;
int corazones;
int vidas;
public:
NAVE(int _x, int _y, int _corazones,int _vidas): x(_x),y(_y),corazones(_corazones), vidas(_vidas){}
int X() { return x; }
int Y() { return y; }
int VID() { return vidas; }
void COR() { corazones--; }
void pintar();
void borrar();
void mover();
void pintar_corazones();
void morir();
};

 


void NAVE::pintar() {
gotoxy(x, y); printf(" %c",30);
gotoxy(x, y + 1);printf(" %c%c%c",40,207,41);
gotoxy(x, y + 2);printf("%c%c %c%c",30,190,190,30);

 


}

void NAVE::borrar() {
gotoxy(x, y); printf (" ");
gotoxy(x, y+1); printf(" ");
gotoxy(x, y+2); printf(" ");
}


void NAVE::mover() {
if (_kbhit()) {
char tecla = _getch();
borrar();

if (tecla == IZQUIERDA && x>3) x--;
if (tecla == DERECHA && x+6 < 76) x++;
if (tecla == ARRIBA && y > 4 ) y--;
if (tecla == ABAJO && y + 3 < 33) y++;
if (tecla == 'e') corazones--;
pintar();
pintar_corazones();
}

 

 

}

void NAVE::pintar_corazones() {
gotoxy(50, 2); printf("VIDAS %d", vidas);

gotoxy(64, 2); printf("Salud");
gotoxy(70, 2); printf(" ");
for (int i = 0; i < corazones; i++) {

gotoxy(70 + i, 2); printf("%c", 3);


}
}

void NAVE::morir() {
if (corazones == 0) {
borrar();
gotoxy(x, y); printf(" * ");
gotoxy(x, y+1); printf("* * *");
gotoxy(x, y+2); printf(" * ");
Sleep(200);

borrar();
gotoxy(x, y); printf("* *");
gotoxy(x, y + 1); printf(" * ");
gotoxy(x, y + 2); printf("* *");
Sleep(200);
borrar();

vidas--;
corazones = 3;
pintar_corazones();
pintar();


}

 

 


}

class AST {
int x, y;
public:
AST(int _x, int _y) :x(_x), y(_y) {}
void pintar();
void mover();
void choque(class NAVE &N);
int X() { return x; }
int Y() { return y; }


};

void AST::pintar() {
gotoxy(x, y); printf("%c", 184);

}

void AST::mover() {
gotoxy(x, y); printf(" ");
y++;
if (y > 32) {
x = rand() % 71 + 4;
y = 4;

}
pintar();
}

void AST::choque(class NAVE &N) {
if (x >= N.X() && x < N.X() + 6 && y >= N.Y() && y <= N.Y() + 2)
{
N.COR();
N.borrar();
N.pintar();
N.pintar_corazones();
x = rand() % 71 + 4;
y = 4;


}
}

class BALA {
int x, y;
public:
BALA(int _x, int _y) : x(_x), y(_y) {}
int X() { return x; }
int Y() { return y; }
void mover();
bool fuera();
};

void BALA::mover() {
gotoxy(x, y); printf(" ");
y--;
gotoxy(x, y); printf("*");


}


bool BALA::fuera() {
if (y == 4) return true;
return false;

 


}
int main() {

OcultarCursor();
pintar_limites();
NAVE N(37, 30, 3, 5);
N.pintar();
N.pintar_corazones();

list <AST*> A;
list<AST*>::iterator itA;
for (int i = 0; i < 5; i++) {
A.push_back(new AST(rand() % 75 + 3, rand() % 5 + 4));


}

list <BALA*> B;
list <BALA*>::iterator it;

bool game_over = false;
int puntos = 0;
while (!game_over) {

gotoxy(4, 2); printf("Puntos%d", puntos);
if (_kbhit())
{

char tecla = _getch();
if (tecla == 'a')
B.push_back(new BALA(N.X() + 2, N.Y() - 1));

}

for (it = B.begin(); it != B.end();)
{
(*it)->mover();
if ((*it)->fuera()) {
gotoxy((*it)->X(), (*it)->Y()); printf(" ");
delete(*it);
it = B.erase(it);

}
else
{
it++;
}


}

for (itA = A.begin(); itA != A.end(); itA++) {
(*itA)->mover();
(*itA)->choque(N);

}

for (itA = A.begin(); itA != A.end(); itA++) {
for (it = B.begin(); it != B.end(); it++) {
if ((*itA)->X() == (*it)->X() && ((*itA)->Y + 1 == (*it)->Y() || (*itA) ->Y () == (*it)->Y()));
{
gotoxy((*it)->X(), (*it)->Y());
printf(" ");
delete(*it);
it = B.erase(it);

A.push_back(new AST(rand() % 74 + 3, 4));
gotoxy((*itA)->X(), (*it)->Y());
printf(" ");
delete(*itA);
itA = A.erase(itA);


puntos += 5;
}


}


}
if (N.VID() == 0) game_over = true;
N.morir();
N.mover();
Sleep(30);

PD: si alguien sabe que estoy haciendo mal o como solucionarlo se lo agradeceria un monton, gracias por adelantado.

}

_getch();
return 0;
}