#include <iostream>

#include <ctime>

#include <fstream>

#include <string>

using namespace std;


class Node

{

friend class List;

int num;

int shp;

bool open;

public:

Node* next;

Node* prev;

Node(){}

Node(int n, int s, bool o): num(n),shp(s),open(o){}

~Node(){}

int GetShape();

int GetNumber();

bool IsOpen();

void Open(bool o);


void Set(int n, int s, bool o);

};


class List : public Node

{

friend class Game;

Node *head;

Node *now;

Node *top;

public:

List(){}

~List(){}

};


class Game : public List

{

List Bottom[7];

List Stack[4];

List Top;

List Card;

int score;

public:

Game(){}

~Game(){}


void NewGame();

void Initiate();

void Mix();

void Print();

void EndGame();

void Strategy();

void TopToStack();

void BottomToStack();

void BottomToStack(int s);

void OpenTop();

void Arrange();

void Arrange(int s, int e);

void Arrange(int s, char o);

void TopToBottom();

void TopToBottom(int e);

void StackToBottom();

void Score();

};


void Game::Initiate()

{

score = 0;


for(int i=0; i<7; i++)

{

Bottom[i].head = new Node;

}

for(int i = 0 ; i < 4 ; i++)

{

Stack[i].head = new Node (0, i+1 , false);

Stack[i].head->next = Stack[i].head;

Stack[i].top = Stack[i].head;

}

Top.head = new Node;

Card.head = new Node;

Card.now = Card.head;


for(int i = 1; i <= 4 ; i++)

{

for(int j = 1; j <= 13; j++)

{

Node* temp = new Node(j,i,false);

Card.now->next=temp;

Card.now=temp;

}

}

Card.now->next=Card.head;

}


void Game::NewGame()

{

score -=52;

}


void Game::Mix()

{

Node *curr;

srand((unsigned int)time(NULL));

int r = 52;

for(int i = 0; i < 7; i ++)

{

for(int k = 0; k<=i; k++)

{

int ran = rand()%r;

r--;

Card.now = Card.head;

for(int j = 0; j <ran; j++)

{

Card.now = Card.now->next;

}

if(k==0)

{

Bottom[i].now = Card.now->next;

Bottom[i].now->Open(true);

Bottom[i].top=Bottom[i].now;


curr= Bottom[i].now;

}

else

{

curr->next=Card.now->next;

curr=curr->next;

}

Card.now->next=Card.now->next->next;

}

curr->next=Bottom[i].head;

Bottom[i].head->next=Bottom[i].now;

}


for(int i = 0; i <24 ; i++)

{

int ran = rand()%r;

r--;

Card.now=Card.head;

for(int j = 0; j<ran ; j++)

{

Card.now = Card.now->next;

}

if(i==0)

{

Top.head->next=Card.now->next;

Top.now=Top.head;

Top.head->next->prev=Top.head;


curr=Top.head->next;

}

else

{

curr->next=Card.now->next;

curr->next->prev=curr;

curr=curr->next;

}

Card.now->next=Card.now->next->next;

}

curr->next=Top.head;

Top.now=Top.head->next;

for(int i = 0;i <4; i++)

Stack[i].top=Stack[i].head;

}


void Game::Print()

{

int count = 0;

Node *curr = Card.head->next;

while(curr!=Card.head)

{

cout<<"Shape "<<curr->GetShape()<<" Number "<<curr->GetNumber()<<" Open? "<<curr->IsOpen()<<endl;

curr=curr->next;

}

cout<<"Top"<<endl;

curr = Top.head->next;


while(curr!=Top.head)

{

cout<<"Shape "<<curr->GetShape()<<" Number "<<curr->GetNumber()<<" Open? "<<curr->IsOpen()<<endl;

curr=curr->next;

count++;

}

for(int i =0 ; i < 7; i++)

{

cout<<endl<<"Bottom "<<i+1<<endl;

curr=Bottom[i].head->next;

while(curr!=Bottom[i].head)

{

cout<<"Shape "<<curr->GetShape()<<" Number "<<curr->GetNumber()<<" Open "<<curr->IsOpen()<<endl;

curr=curr->next;

count++;

}

}

}


void Game::EndGame()

{

Node* curr = Card.head;

while(Top.head->next!=Top.head->next->next)

{

curr->next=Top.head->next;

Top.head->next = Top.head->next->next;

curr=curr->next;

curr->Open(false);

}

for(int i=0; i<7; i++)

{

while(Bottom[i].head->next != Bottom[i].head)

{

curr->next=Bottom[i].head->next;

Bottom[i].head->next=Bottom[i].head->next->next;

curr=curr->next;

curr->Open(false);

}

}

for(int i=0; i<4; i++)

{

while(Stack[i].head->next!=Stack[i].head)

{

curr->next=Stack[i].head->next;

Stack[i].head->next=Stack[i].head->next->next;

curr=curr->next;

curr->Open(false);

}

}

curr->next=Card.head;

}



void Game::Score()

{

cout<<"Now Score : "<<score<<endl<<endl;

}


void Game::Strategy()

{

BottomToStack();

TopToStack();

TopToBottom();

Arrange();


while(1)

{

TopToStack();

TopToBottom();

Top.now=Top.now->next;

if(Top.now==Top.head)

break;

}

}


void Game::TopToStack()

{

bool event = false;

int num= Top.now->GetNumber();

int shp= Top.now->GetShape();


if(num-1 == Stack[shp-1].top->GetNumber() && Top.now!=Top.head)

{

cout<<"TopToStack "<<shp<<" "<<num<<" "<<endl;

Stack[shp-1].head->next=Top.now;

Top.now->prev->next=Top.now->next;

Top.now->next->prev=Top.now->prev;

Top.now->next=Stack[shp-1].top;

Stack[shp-1].top=Top.now;

Top.now=Top.now->prev;


event=true;

}

if(event)

{

score+=5;

TopToStack();

BottomToStack();

TopToBottom();

}

}


void Game::BottomToStack(int i)

{

bool event = false;

int shp = Bottom[i].now->GetShape();

int num = Bottom[i].now->GetNumber();


if(num-1 == Stack[shp-1].top->GetNumber())

{

cout<<"BottomToStack "<<shp<<" "<<num<<" "<<i<<endl;

Stack[shp-1].head->next=Bottom[i].now;

Bottom[i].now=Bottom[i].now->next;

Bottom[i].head->next=Bottom[i].now;


if(Bottom[i].top->next == Bottom[i].now)

{

Bottom[i].top =Bottom[i].now;

Bottom[i].now->Open(true);

}

Stack[shp-1].head->next->next=Stack[shp-1].top;

Stack[shp-1].top=Stack[shp-1].head->next;

event=true;

}


if(event)

{

score+=5;

BottomToStack();

TopToStack();

TopToBottom(i);

Arrange(i,'e');

Arrange(i,'s');

}

}


void Game::TopToBottom(int i)

{

bool event = false;

int shp = Top.now->GetShape();

int num = Top.now->GetNumber();


int shp2 = Bottom[i].now->GetShape();

int num2 = Bottom[i].now->GetNumber();


if(num==13 && Bottom[i].head->next == Bottom[i].head && Top.now != Top.head)

{

cout<<"TopToBottom"<<shp<<" "<<num<<" "<<i<<endl;

Bottom[i].head->next=Top.now;

Top.now->prev->next=Top.now->next;

Top.now->next->prev=Top.now->prev;


Bottom[i].now=Bottom[i].head->next;

Bottom[i].top=Bottom[i].now;

Bottom[i].now->next=Bottom[i].head;

Bottom[i].now->Open(true);


Top.now=Top.now->prev;


event=true;

}

else if((shp%2 != shp2%2) && (num+1 ==num2) && Top.now!=Top.head)

{

cout<<"TopToBottom"<<shp<<" "<<num<<" "<<i<<endl;

Top.now->prev->next=Top.now->next;

Top.now->next->prev=Top.now->prev;

Top.now->next=Bottom[i].now;

Bottom[i].head->next=Top.now;

Bottom[i].now=Top.now;

Bottom[i].now->Open(true);


Top.now=Top.now->prev;


event=true;

}


if(event)

{

TopToStack();

TopToBottom();

Arrange(i,'e');

}

}


void Game::Arrange(int i, int j)

{

bool event = false;

if(i!=j && Bottom[i].now !=Bottom[i].head)

{

int num1 = Bottom[i].top->GetNumber();

int shp1 = Bottom[i].top->GetShape()%2;

int num2 = Bottom[j].now->GetNumber();

int shp2 = Bottom[j].now->GetShape()%2;


if(num1 ==13 && num2 ==0 && Bottom[i].top ->next !=Bottom[i].head)

{

cout<<"Arrange "<<Bottom[i].top->GetShape()<<" "<<num1<<" "<<i<<" to "<<Bottom[j].now->GetShape()<<" "<<num2<<" "<<j<<endl;

Bottom[j].head->next=Bottom[i].now;

Bottom[j].now=Bottom[i].now;

Bottom[i].now=Bottom[i].top->next;

Bottom[j].top=Bottom[i].top;

Bottom[j].top->next=Bottom[j].head;

Bottom[i].top=Bottom[i].now;

Bottom[i].head->next=Bottom[i].now;

Bottom[i].now->Open(true);


event =true;

}

else if(num1+1 == num2 && shp1 !=shp2)

{

cout<<"Arrange "<<Bottom[i].top->GetShape()<<" "<<num1<<" "<<i<<" to "<<Bottom[j].now ->GetShape()<<" "<<num2<<" "<<j<<endl;

Bottom[j].head->next=Bottom[i].now;


Bottom[i].now=Bottom[i].top->next;

Bottom[i].top->next=Bottom[j].now;

Bottom[i].head->next=Bottom[i].now;

Bottom[i].top=Bottom[i].now;

Bottom[j].now=Bottom[j].head->next;

if(Bottom[i].now != Bottom[i].head)

{

Bottom[i].now->Open(true);

}

event = true;

}

}

if(event)

{

BottomToStack();

TopToBottom(i);

Arrange(i, 's');

Arrange(i, 'e');

}

}


int main(int argc, const char *argv[])

{

Game a;

a.Initiate();

a.NewGame();

a.Mix();

a.Strategy();

a.EndGame();

a.Score();

return 0;

}


디버깅 했는데 

1>solitaire.obj : error LNK2019: unresolved external symbol "public: void __thiscall Node::Open(bool)" (?Open@Node@@QAEX_N@Z) referenced in function "public: void __thiscall Game::Mix(void)" (?Mix@Game@@QAEXXZ)

1>solitaire.obj : error LNK2019: unresolved external symbol "public: int __thiscall Node::GetShape(void)" (?GetShape@Node@@QAEHXZ) referenced in function "public: void __thiscall Game::Print(void)" (?Print@Game@@QAEXXZ)

1>solitaire.obj : error LNK2019: unresolved external symbol "public: int __thiscall Node::GetNumber(void)" (?GetNumber@Node@@QAEHXZ) referenced in function "public: void __thiscall Game::Print(void)" (?Print@Game@@QAEXXZ)

1>solitaire.obj : error LNK2019: unresolved external symbol "public: bool __thiscall Node::IsOpen(void)" (?IsOpen@Node@@QAE_NXZ) referenced in function "public: void __thiscall Game::Print(void)" (?Print@Game@@QAEXXZ)

1>solitaire.obj : error LNK2019: unresolved external symbol "public: void __thiscall Game::Arrange(void)" (?Arrange@Game@@QAEXXZ) referenced in function "public: void __thiscall Game::Strategy(void)" (?Strategy@Game@@QAEXXZ)

1>solitaire.obj : error LNK2019: unresolved external symbol "public: void __thiscall Game::TopToBottom(void)" (?TopToBottom@Game@@QAEXXZ) referenced in function "public: void __thiscall Game::Strategy(void)" (?Strategy@Game@@QAEXXZ)

1>solitaire.obj : error LNK2019: unresolved external symbol "public: void __thiscall Game::BottomToStack(void)" (?BottomToStack@Game@@QAEXXZ) referenced in function "public: void __thiscall Game::Strategy(void)" (?Strategy@Game@@QAEXXZ)

1>solitaire.obj : error LNK2019: unresolved external symbol "public: void __thiscall Game::Arrange(int,char)" (?Arrange@Game@@QAEXHD@Z) referenced in function "public: void __thiscall Game::BottomToStack(int)" (?BottomToStack@Game@@QAEXH@Z)

1>C:\Users\Cho\Desktop\host\coding\Solitaire\Debug\Solitaire.exe : fatal error LNK1120: 8 unresolved externals

1>

1>Build FAILED.


라고 에러떠요 ㅠㅠ 해결 가능하신 능력자 계신가요 ㅠ