#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.
라고 에러떠요 ㅠㅠ 해결 가능하신 능력자 계신가요 ㅠ
대가리만 있는 함수는 뽑고 디버깅해라
형 제가 대가리가 빠가라 자세히 설명좀 ㅠㅠ 대가리만 있는 함수가 멀 가르키는거에여?
선언만 있는거 빼라고