#include <iostream>
#include <stdlib.h>
#include <ctype.h>
using namespace std;
class Card {
protected:
int id;
// int listnum;
// char *name;
Card *next;
Card *prev;
public:
// Designers
Card (int);
Card () { next=prev=NULL; };
// Methods of obtain private field
int GetId() { return id; };
// int GetListNum() { return listnum; };
// char* GetName() { return name; };
Card* GetNext() { return next; };
Card* GetPrev() { return prev; };
// Methods of obtain some element from list
Card* GetFirst();
Card* GetByNum (int);
// Delete functions
void RemoveThis();
void RemoveNum(int);
void RemoveList();
// Paste functions
void InsertBefore(Card*);
void InsertAfter(Card*);
// Print functions
void PrintToFinish();
void PrintId();
// Edit functions
Card* CreatNewList();
Card* Mix();
};
class Player {
protected:
Card* First;
const char *name;
public:
Player() { First = NULL; };
void PrintToFinish() { First->PrintToFinish(); };
void Distribution(Card*);
void PrintName() { cout << name; };
virtual int move();
};
class Man: public Player {
public:
Man(const char* n): Player() { name = n; };
virtual int move();
};
class PC: public Player {
public:
PC(const char* n): Player() { name = n; };
virtual int move();
};
//--------------------------------------------------------------------- //
Card::Card(int i) {
id=i;
// listnum=n;
next=prev=NULL;
}
void Card::InsertBefore(Card *q) {
q->next=this;
q->prev=prev;
if (prev!=NULL)
prev->next=q;
prev=q;
}
void Card::PrintToFinish() {
Card *p;
Card *q;
p=this;
while (p!=NULL) {
cout << p->id << " ";
p=p->next;
}
cout << endl;
}
Card* Card::GetByNum (int n) {
Card* q;
q=this;
int i=0;
if (n>=0)
while (i!=n) {
if (q->next == NULL)
return q;
q=q->next;
i++;
}
else
while (i!=n) {
if (q->prev == NULL)
return q;
q=q->prev;
i--;
}
return q;
}
Card* Card::GetFirst() {
Card* q;
q=this;
while (q->prev!=NULL)
q=q->prev;
return q;
}
void Card::RemoveThis() {
if (prev!=NULL)
prev->next=next;
if (next!=NULL)
next->prev=prev;
next=prev=NULL;
}
void Card::PrintId() {
cout << id << endl;
}
void Card::InsertAfter(Card *q) {
q->next=next;
if (next!=NULL)
next->prev=q;
next=q;
q->prev=this;
}
Card* Card::Mix() {
srand(time(NULL));
int i, k;
Card *q, *NewStart;
NewStart = new Card(0);
for (i=0; i<35; i++) {
k=rand()%(35-i)+1;
q=this->GetByNum(k);
q->RemoveThis();
NewStart->InsertAfter(q);
}
k=rand()%35+1;
q=NewStart->GetByNum(k);
q->InsertAfter(this);
q=NewStart->next;
NewStart->RemoveThis();
delete NewStart;
return q;
}
Card* Card::CreatNewList() {
Card *Finish;
Finish = new Card(0);
Card *Start;
int i, j;
int N=6;
Card *p;
for (i = 0; i < 36; i += 4) {
for (j = i; j < 4 + i; j++) {
p = new Card(N * 10 + j - i);
Finish->InsertBefore(p);
}
N++;
}
Start = Finish->GetFirst();
delete Finish;
Finish->RemoveThis();
return Start;
}
void Card::RemoveList() {
Card *p, *q;
p=q=this;
while (p!=NULL) {
q=p->next;
delete p;
p->RemoveThis();
p=q;
}
}
//--------------------------------------------------------------------- //
void Player::Distribution(Card* Start) {
Card *q, *NewList;
NewList = new Card();
int i, k;
srand(time(NULL));
for (i=0; i<6;i++) {
k=rand()%(36-i);
q=Start->GetByNum(k);
if (k==0)
Start=Start->GetNext();
q->RemoveThis();
NewList->InsertAfter(q);
}
q=NewList->GetNext();
delete NewList;
NewList->RemoveThis();
First=q;
}
//--------------------------------------------------------------------- //
int main () {
Card *Start;
Start=Start->CreatNewList();
Start=Start->Mix();
Start->PrintToFinish();
Man *Human;
PC *Asus;
Human = new Man("Human");
Asus = new PC("Asus");
Human->Distribution(Start);
Asus->Distribution(Start);
Asus->PrintToFinish();
Human->PrintToFinish();
Start->PrintToFinish();
Start->RemoveList();
return 0;
}