761 lines
25 KiB
C++
761 lines
25 KiB
C++
|
#include <stdio.h>
|
||
|
#include <iomanip>
|
||
|
#include <iostream>
|
||
|
#include <string.h>
|
||
|
#include <cstdlib>
|
||
|
|
||
|
struct Card_Node{
|
||
|
char color;
|
||
|
char suit;
|
||
|
int value; // Value = 1 for A, 11 for J, 12 for Q, 13 for K
|
||
|
bool isup; // true for UP, false for DOWN
|
||
|
Card_Node *next;
|
||
|
};
|
||
|
|
||
|
struct List_Node{
|
||
|
int listno;//board and foundation lists have indexes
|
||
|
List_Node *next;
|
||
|
Card_Node *cards;
|
||
|
};
|
||
|
|
||
|
struct List{
|
||
|
Card_Node *top_head;//Top list head
|
||
|
List_Node *foundation_head;//points first foundation list
|
||
|
List_Node *board_head;//points first board list
|
||
|
FILE *fptr;
|
||
|
|
||
|
void create();// Includes create toplist, boardlists and foundlists
|
||
|
void create_toplist();
|
||
|
void create_boardlists();
|
||
|
void create_foundlists();
|
||
|
void printkart(Card_Node *kart);// prints datas of one kart node
|
||
|
void printlists();// Prints all lists
|
||
|
void printmenu();//Prints choice menu
|
||
|
bool addcardtolist(List_Node *selectedlist, Card_Node *transferedcard, int whichlisttype);//Adds transferedcard to selectedlist, whichlisttype is entered by program
|
||
|
void goster_TopToFoundation();//Gets input and calls related function
|
||
|
void TopToFoundation(char s_color, char s_suit, int s_value);// Moves a card top list to foundation list
|
||
|
void goster_TopToBoard();//Gets input and calls related function
|
||
|
void TopToBoard(int listindex, char s_color, char s_suit, int s_value);//Moves a card from top list to board list
|
||
|
void goster_BoardToBoard();//Gets input and calls related function
|
||
|
void BoardToBoard(int fromwhere, int towhere, char s_color, char s_suit, int s_value);//Moves a card(s) from a fromwhere.list to towhere.list
|
||
|
void goster_BoardToFoundation();//Gets input and calls related function
|
||
|
void BoardToFoundation(int fromwhere);//Moves a last card in fromwhere.list of boardlist to foundation list
|
||
|
void islem_yap();//Wants user to select choice from menu, and calls related functions
|
||
|
bool istopempty, isboardempty;// For controlling end of game
|
||
|
void clear_screen();//Clears screen both windows and linux system
|
||
|
void close();//Deletes all linked lists and linkedlists's all nodes, closes read txt file
|
||
|
};
|
||
|
|
||
|
List islem;
|
||
|
using namespace std;
|
||
|
|
||
|
int main()
|
||
|
{
|
||
|
char secim;
|
||
|
islem.create();
|
||
|
if(!islem.fptr)//If cannot find solitaire.txt file, close the program
|
||
|
return 0;
|
||
|
|
||
|
islem.istopempty = false;//If the top list is empty, this value will be true
|
||
|
islem.isboardempty = false;//If the board list is empty, this value will be true
|
||
|
|
||
|
while(1){
|
||
|
islem.printlists();
|
||
|
islem.printmenu();
|
||
|
cin >> secim;
|
||
|
cin.ignore(10000, '\n');
|
||
|
|
||
|
if(secim == '1'){
|
||
|
islem.goster_TopToFoundation();
|
||
|
cin.ignore(10000, '\n');
|
||
|
getchar();
|
||
|
}
|
||
|
else if(secim == '2'){
|
||
|
islem.goster_TopToBoard();
|
||
|
cin.ignore(10000, '\n');
|
||
|
getchar();
|
||
|
}
|
||
|
else if(secim == '3'){
|
||
|
islem.goster_BoardToBoard();
|
||
|
cin.ignore(10000, '\n');
|
||
|
getchar();
|
||
|
}
|
||
|
else if(secim == '4'){
|
||
|
islem.goster_BoardToFoundation();
|
||
|
cin.ignore(10000, '\n');
|
||
|
}
|
||
|
else if(secim == '9'){
|
||
|
islem.close();
|
||
|
printf("\n\nThe game is closed and all cards are deleted from memory.Press enter to exit");
|
||
|
cin.ignore(10000, '\n');
|
||
|
getchar();
|
||
|
break;
|
||
|
}
|
||
|
|
||
|
else
|
||
|
cout << "Invalid choice" << endl;
|
||
|
|
||
|
if(!islem.top_head)// checking top list empty or not
|
||
|
islem.istopempty = true;
|
||
|
|
||
|
List_Node *traverse;
|
||
|
traverse = islem.board_head;
|
||
|
int counter = 0;
|
||
|
while(traverse){//checking board lists is empty or not
|
||
|
if(!traverse->cards)
|
||
|
counter++;
|
||
|
traverse = traverse->next;
|
||
|
if(counter == 7)// counter is 7 if all of 7 boardlists are empty
|
||
|
islem.isboardempty = true;
|
||
|
}
|
||
|
|
||
|
/*When game is completed prints message to user*/
|
||
|
if(islem.isboardempty && islem.istopempty){//Stop while loop when board and top lists are empty
|
||
|
printf("\n\n\n\t\t\tYOU WIN!!!! THE GAME IS FINISHED! CONGRATULATIONS!\n");// game over message
|
||
|
printf("\t\t\tYOU WIN!!!! THE GAME IS FINISHED! CONGRATULATIONS!\n");
|
||
|
printf("\t\t\tYOU WIN!!!! THE GAME IS FINISHED! CONGRATULATIONS!\n");
|
||
|
printf("\nAll cards are deleted from memory.Press enter to exit");
|
||
|
cin.ignore(1000, '\n');
|
||
|
islem.close();
|
||
|
getchar();
|
||
|
break;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return 0;
|
||
|
}
|
||
|
|
||
|
void List::create(){
|
||
|
fptr = fopen("solitaire.txt", "r+");
|
||
|
if(!fptr){
|
||
|
cout << "The 'solitaire.txt' file cannot be found. Program will be closed."<< endl;
|
||
|
getchar();
|
||
|
return;
|
||
|
}
|
||
|
fseek(fptr, 0, SEEK_SET);
|
||
|
create_toplist();
|
||
|
create_boardlists();
|
||
|
create_foundlists();
|
||
|
}//end create function
|
||
|
|
||
|
void List::create_toplist(){
|
||
|
Card_Node *newnode, *final;
|
||
|
char tempcolor, tempsuit, tempvalue[4], tempisup[4], garbage[10];//temporary values of color,suit,isup. value will be changed to integer and isup(Up or Down) will be changed to boolean variables
|
||
|
top_head = NULL;
|
||
|
|
||
|
while(1){//This while creates top_list with linked list
|
||
|
newnode = new Card_Node;
|
||
|
newnode->next = NULL;
|
||
|
fscanf(fptr, "%c", &tempcolor);
|
||
|
if(tempcolor == '*'){//first star has read
|
||
|
fscanf(fptr, "%6c", garbage);//passes other five stars and goes new line
|
||
|
break;
|
||
|
}
|
||
|
else
|
||
|
newnode->color = tempcolor;
|
||
|
|
||
|
fscanf(fptr, " %c %s %s ", &tempsuit, tempvalue, tempisup);
|
||
|
newnode->suit = tempsuit;
|
||
|
|
||
|
/*Changing type of value char array to integer*/
|
||
|
if(tempvalue[0] == 'A') newnode->value = 1;
|
||
|
else if(tempvalue[0] == 'J')newnode->value = 11;
|
||
|
else if(tempvalue[0] == 'Q')newnode->value = 12;
|
||
|
else if(tempvalue[0] == 'K')newnode->value = 13;
|
||
|
else
|
||
|
sscanf(tempvalue, "%d", &newnode->value);
|
||
|
|
||
|
/*Changing type of isup char array to boolean*/
|
||
|
if(strcmp(tempisup, "Up") == 0)
|
||
|
newnode->isup = true;
|
||
|
if(strcmp(tempisup, "Down") == 0)
|
||
|
newnode->isup = false;
|
||
|
|
||
|
if(top_head == NULL){//add first node to empty top list
|
||
|
top_head = newnode;
|
||
|
final = top_head;
|
||
|
}
|
||
|
else{// add node to not empty list
|
||
|
final->next = newnode;
|
||
|
final = final->next;
|
||
|
}
|
||
|
}//end while
|
||
|
}
|
||
|
|
||
|
void List::create_boardlists(){
|
||
|
Card_Node *newnode, *final;// final points to last node of card list
|
||
|
List_Node *newboardlist, *boardlist_final;// boardlist_final points to last node of board list
|
||
|
char tempcolor, tempsuit, tempvalue[4], tempisup[8], garbage[10];
|
||
|
|
||
|
int index = 1;// This index represents nth board list
|
||
|
|
||
|
newboardlist = new List_Node;// creating first boardlist node
|
||
|
board_head = newboardlist;
|
||
|
boardlist_final = newboardlist;
|
||
|
newboardlist->listno = index++;
|
||
|
newboardlist->next = NULL;
|
||
|
newboardlist->cards = NULL;
|
||
|
|
||
|
while(!feof(fptr)){//This while creates board multi linked lists
|
||
|
newnode = new Card_Node;
|
||
|
newnode->next = NULL;
|
||
|
fscanf(fptr, "%c", &tempcolor);
|
||
|
if(tempcolor == '*'){//first star has read
|
||
|
fscanf(fptr, "%6c", garbage);//passes other five stars and goes new line
|
||
|
newboardlist = new List_Node;
|
||
|
newboardlist->listno = index++;
|
||
|
newboardlist->next = NULL;
|
||
|
newboardlist->cards = NULL;
|
||
|
boardlist_final->next = newboardlist;
|
||
|
boardlist_final = boardlist_final->next;
|
||
|
continue;
|
||
|
}
|
||
|
else
|
||
|
newnode->color = tempcolor;
|
||
|
|
||
|
fscanf(fptr, " %c %s %s ", &tempsuit, tempvalue, tempisup);
|
||
|
newnode->suit = tempsuit;
|
||
|
if(tempvalue[0] == 'A') newnode->value = 1;
|
||
|
else if(tempvalue[0] == 'J')newnode->value = 11;
|
||
|
else if(tempvalue[0] == 'Q')newnode->value = 12;
|
||
|
else if(tempvalue[0] == 'K')newnode->value = 13;
|
||
|
else
|
||
|
sscanf(tempvalue, "%d", &newnode->value);
|
||
|
|
||
|
if(strcmp(tempisup, "Up") == 0)
|
||
|
newnode->isup = true;
|
||
|
if(strcmp(tempisup, "Down") == 0)
|
||
|
newnode->isup = false;
|
||
|
|
||
|
if(boardlist_final->cards == NULL){//add first node to empty board list
|
||
|
boardlist_final->cards = newnode;
|
||
|
final = boardlist_final->cards;
|
||
|
}
|
||
|
else{// add to not empty board list
|
||
|
final->next = newnode;
|
||
|
final = final->next;
|
||
|
}
|
||
|
}//end while
|
||
|
}
|
||
|
|
||
|
void List::create_foundlists(){
|
||
|
foundation_head = NULL;
|
||
|
List_Node *newfoundlist, *foundlist_final;
|
||
|
int index = 1;// Spades list index = 1, Hearts index = 2, Diamonds = 3, Clubs = 4
|
||
|
|
||
|
/*Initializing Spades list*/
|
||
|
newfoundlist = new List_Node;
|
||
|
newfoundlist->cards = NULL;
|
||
|
newfoundlist->next = NULL;
|
||
|
newfoundlist->listno = index++;
|
||
|
foundation_head = newfoundlist;
|
||
|
foundlist_final = newfoundlist;
|
||
|
|
||
|
/*Initializing other three lists*/
|
||
|
for(int i = 0 ; i <3; i++) {
|
||
|
newfoundlist = new List_Node;
|
||
|
newfoundlist->cards = NULL;
|
||
|
newfoundlist->next = NULL;
|
||
|
newfoundlist->listno = index++;
|
||
|
foundlist_final->next = newfoundlist;
|
||
|
foundlist_final = foundlist_final->next;
|
||
|
}//end for
|
||
|
}// end function
|
||
|
|
||
|
void List::printkart(Card_Node *kart){//prints datas of kart node
|
||
|
if(!kart->isup ){//Hide card if it is down
|
||
|
printf("X");
|
||
|
return;
|
||
|
}
|
||
|
char a;
|
||
|
if(kart->value == 1) a='A';
|
||
|
else if(kart->value == 11) a='J';
|
||
|
else if(kart->value == 12) a='Q';
|
||
|
else if(kart->value == 13) a='K';
|
||
|
else a = '\0';
|
||
|
|
||
|
if(!a)printf("%c,%c,%d", kart->color, kart->suit, kart->value);
|
||
|
else printf("%c,%c,%c", kart->color, kart->suit, a);
|
||
|
}
|
||
|
|
||
|
void List::printlists(){
|
||
|
clear_screen();
|
||
|
Card_Node *ct[7];// Board List Card Node Traverser; ct[0] for 1.list, ct[1] for 2.list ....
|
||
|
Card_Node *foundct[4];//Found List Card Node Traverser, foundct[0] = Spades, foundct[1] = Hearts, foundct[2] = Diamonds, foundct[3] = Clubs
|
||
|
Card_Node *topct;// TopList Card Traverser
|
||
|
List_Node *listtraverse;// List Node Traverser
|
||
|
|
||
|
|
||
|
cout << "Top List:" << endl;
|
||
|
topct = top_head;
|
||
|
while(topct){
|
||
|
printkart(topct);
|
||
|
printf("|");
|
||
|
topct = topct->next;
|
||
|
}
|
||
|
|
||
|
cout << endl << "\nBoard Lists:" << endl;
|
||
|
for(int i=1; i <8; i++)
|
||
|
cout << i << ".List\t";
|
||
|
cout <<endl;
|
||
|
|
||
|
listtraverse = board_head;
|
||
|
for(int i = 0; i < 7; i++){// Initalizing ct[] pointers
|
||
|
ct[i] = listtraverse->cards;
|
||
|
listtraverse = listtraverse->next;
|
||
|
}
|
||
|
|
||
|
/*Printing Board List's Cards*/
|
||
|
for(int i = 0; i < 19; i++){//this for loop traverses lists and goes 19 times down, a list can include cards up to 19 (6 down cards + 13 up cards)
|
||
|
for(int j = 0; j < 7; j++)
|
||
|
{
|
||
|
if(ct[j]){// if ct[j] is not null, print it and go to next node
|
||
|
printkart(ct[j]);
|
||
|
printf("\t");
|
||
|
ct[j] = ct[j]->next;
|
||
|
}
|
||
|
else// if ct[j] is null, print a tab
|
||
|
printf("\t");
|
||
|
}
|
||
|
if(ct[0] || ct[1] || ct[2] || ct[3] || ct[4] || ct[5] || ct[6])// After printing a line;
|
||
|
printf("\n");//if at least one card is not null: go new line
|
||
|
else
|
||
|
break;// if all cards in line are null: break outer for loop
|
||
|
}//end outer for
|
||
|
|
||
|
cout << endl << "Foundation Lists:" << endl;
|
||
|
cout << "Spades\tHearts\tDiamnds\tClubs" << endl;
|
||
|
|
||
|
listtraverse = foundation_head;
|
||
|
for(int i = 0; i < 4; i++){// Initalizing foundct[] pointers
|
||
|
foundct[i] = listtraverse->cards;
|
||
|
listtraverse = listtraverse->next;
|
||
|
}
|
||
|
|
||
|
for(int i = 0; i < 13; i++){//this for loop traverses foundation lists (max 13 cards can be in a foundation list)
|
||
|
for(int j = 0; j < 4; j++)
|
||
|
{
|
||
|
if(foundct[j]){// if ct[j] is not null, print it and go to next node
|
||
|
printkart(foundct[j]);
|
||
|
printf("\t");
|
||
|
foundct[j] = foundct[j]->next;
|
||
|
}
|
||
|
else// if foundct[j] is null, print a tab
|
||
|
printf("\t");
|
||
|
}
|
||
|
if(foundct[0] || foundct[1] || foundct[2] || foundct[3])// After printing a line;
|
||
|
printf("\n");//if at least one card is not null: go new line
|
||
|
else
|
||
|
break;// if all cards in line are null: break outer for loop
|
||
|
}//end outer for
|
||
|
printf("\n\n");
|
||
|
}//end function
|
||
|
|
||
|
void List::printmenu(){
|
||
|
cout << "Choose an operation:" << endl;
|
||
|
cout << "\t1. Select from Top List to Foundation Lists" << endl;
|
||
|
cout << "\t2. Select from Top List to Board Lists" << endl;
|
||
|
cout << "\t3. Move on the Board Lists" << endl;
|
||
|
cout << "\t4. Move from Board List to Foundation List" << endl;
|
||
|
cout << "Please enter your choice (1, 2, 3, or 4), (enter 9 to exit):" ;
|
||
|
}
|
||
|
|
||
|
bool List::addcardtolist(List_Node *selectedlist, Card_Node *transferedcard, int whichlisttype){//whichlisttype is not related with user, it is automatically entered by progra
|
||
|
Card_Node *cardtraverser;
|
||
|
cardtraverser= selectedlist->cards;
|
||
|
if(whichlisttype == 1){//whichlisttype is 1 for top to board list
|
||
|
if(cardtraverser == NULL && transferedcard->value == 13){// if list is empty card's value must be K=13
|
||
|
selectedlist->cards = transferedcard;
|
||
|
transferedcard->next = NULL;
|
||
|
return true;
|
||
|
}
|
||
|
if(!cardtraverser)// cardtraverse cannot be null here, can be null only for value K=13
|
||
|
return false;
|
||
|
while(cardtraverser->next)
|
||
|
cardtraverser = cardtraverser->next;
|
||
|
|
||
|
if(!cardtraverser->isup){// if the card is down, color and value between two cards are not important
|
||
|
cardtraverser->next = transferedcard;
|
||
|
transferedcard->next = NULL;
|
||
|
return true;
|
||
|
}
|
||
|
if(cardtraverser->isup)// if the card is up, color and value between two cards are important
|
||
|
if(!(transferedcard->color == cardtraverser->color))// if colors between two adjacent cards are different
|
||
|
if(cardtraverser->value - transferedcard->value == 1 ){//list's last value - transfered card's value - must be 1
|
||
|
cardtraverser->next = transferedcard;
|
||
|
transferedcard->next = NULL;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(whichlisttype == 2){// whichlisttype is 2 for moving top to foundation list
|
||
|
if(cardtraverser == NULL && transferedcard->value == 1){// if list is empty card's value must be A=1
|
||
|
selectedlist->cards = transferedcard;
|
||
|
transferedcard->next = NULL;
|
||
|
return true;
|
||
|
}
|
||
|
if(!cardtraverser)// cardtraverse cannot be null here, can be null only for value A=1
|
||
|
return false;
|
||
|
|
||
|
while(cardtraverser->next)
|
||
|
cardtraverser = cardtraverser->next;
|
||
|
if(transferedcard->value - cardtraverser->value == 1){//if list is not empty, list's last value - card's value must be 1
|
||
|
cardtraverser->next = transferedcard;
|
||
|
transferedcard->next = NULL;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
if(whichlisttype == 3){//whichlisttype is 3 for board to board list
|
||
|
if(cardtraverser == NULL && transferedcard->value == 13){// if list is empty card's value must be K=13
|
||
|
selectedlist->cards = transferedcard;
|
||
|
return true;
|
||
|
}
|
||
|
if(!cardtraverser)// cardtraverse cannot be null here, can be null only for value K=13
|
||
|
return false;
|
||
|
while(cardtraverser->next)
|
||
|
cardtraverser = cardtraverser->next;
|
||
|
|
||
|
if(!cardtraverser->isup){// if the card is down, color and value between two cards are not important
|
||
|
cardtraverser->next = transferedcard;
|
||
|
return true;
|
||
|
}
|
||
|
if(cardtraverser->isup)// if the card is up, color and value between two cards are important
|
||
|
if(!(transferedcard->color == cardtraverser->color))// if colors between two adjacent cards are different
|
||
|
if(cardtraverser->value - transferedcard->value == 1 ){//list's last value - transfered card's value - must be 1
|
||
|
cardtraverser->next = transferedcard;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
if(whichlisttype == 4){// whichlisttype is 4 for moving board to foundation list
|
||
|
if(cardtraverser == NULL && transferedcard->value == 1){// if list is empty card's value must be A=1
|
||
|
selectedlist->cards = transferedcard;
|
||
|
transferedcard->next = NULL;
|
||
|
return true;
|
||
|
}
|
||
|
if(!cardtraverser)// cardtraverse cannot be null here, can be null only for value A=1
|
||
|
return false;
|
||
|
|
||
|
while(cardtraverser->next)
|
||
|
cardtraverser = cardtraverser->next;
|
||
|
if(transferedcard->value - cardtraverser->value == 1){//if list is not empty, list's last value - card's value must be 1
|
||
|
cardtraverser->next = transferedcard;
|
||
|
transferedcard->next = NULL;
|
||
|
return true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
return false;
|
||
|
}
|
||
|
|
||
|
void List::goster_TopToFoundation(){// wants input from use
|
||
|
char Symbol_of_colors, Symbol_of_suits, tempvalue[4];
|
||
|
int Symbol_of_numbers;
|
||
|
cout << endl << "Select a card from Top List:";
|
||
|
scanf("%c %c %s", &Symbol_of_colors, &Symbol_of_suits, tempvalue);
|
||
|
|
||
|
if(tempvalue[0] == 'A') Symbol_of_numbers = 1;
|
||
|
else if(tempvalue[0] == 'J')Symbol_of_numbers = 11;
|
||
|
else if(tempvalue[0] == 'Q')Symbol_of_numbers = 12;
|
||
|
else if(tempvalue[0] == 'K')Symbol_of_numbers = 13;
|
||
|
else
|
||
|
sscanf(tempvalue, "%d", &Symbol_of_numbers);
|
||
|
|
||
|
TopToFoundation(Symbol_of_colors, Symbol_of_suits, Symbol_of_numbers);
|
||
|
}
|
||
|
|
||
|
void List::TopToFoundation(char s_color, char s_suit, int s_value){
|
||
|
List_Node *listtraverse;
|
||
|
Card_Node *willbemoved = NULL, *cardtraverse, *cardtail, *temptop_head = top_head;
|
||
|
|
||
|
if(top_head == NULL){
|
||
|
cout << "Top list is empty, you cannot make this move." << endl;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
cardtraverse = top_head;
|
||
|
cardtail = top_head;
|
||
|
|
||
|
while(cardtraverse){
|
||
|
if(cardtraverse->color == s_color && cardtraverse->suit == s_suit && cardtraverse->value == s_value){//checking if card's datas are same with user entered datas
|
||
|
willbemoved = cardtraverse;
|
||
|
break;
|
||
|
}
|
||
|
cardtail = cardtraverse;
|
||
|
cardtraverse = cardtraverse->next;
|
||
|
}//end while
|
||
|
|
||
|
if(willbemoved == NULL){
|
||
|
cout << "Entered card is not in the top list!" << endl;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
int number;
|
||
|
listtraverse = foundation_head;
|
||
|
if(willbemoved->suit == 'S') number = 0;
|
||
|
if(willbemoved->suit == 'H') number = 1;
|
||
|
if(willbemoved->suit == 'D') number = 2;
|
||
|
if(willbemoved->suit == 'C') number = 3;
|
||
|
|
||
|
for(int i = 0; i < number; i++)//Moving to foundation list according to card's suit
|
||
|
listtraverse=listtraverse->next;
|
||
|
|
||
|
/*Cutting the connection of willbemoved node with other nodes in list*/
|
||
|
if(cardtraverse == cardtail)//willbemoved node is first node
|
||
|
temptop_head = temptop_head->next;
|
||
|
else // willbemoved node is not first node
|
||
|
cardtail->next = cardtraverse->next;
|
||
|
|
||
|
if(addcardtolist(listtraverse, willbemoved, 2)){// if movement successful, top_head points second card node
|
||
|
top_head = temptop_head;
|
||
|
cout << "Movement is successful!" << endl;
|
||
|
}
|
||
|
else{// if not successful
|
||
|
if(!(cardtraverse == cardtail))// if not first node, the connection between cardtail and willbemoved is recovered
|
||
|
cardtail->next = willbemoved;
|
||
|
cout << "Wrong Movement!" << endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void List::goster_TopToBoard(){// wants input from user for moving card top list to board lis
|
||
|
char Symbol_of_colors, Symbol_of_suits, tempvalue[4];
|
||
|
int Symbol_of_numbers, a;
|
||
|
cout << "Select a card from Top List:";
|
||
|
scanf("%c %c %s", &Symbol_of_colors, &Symbol_of_suits, tempvalue);
|
||
|
|
||
|
if(tempvalue[0] == 'A') Symbol_of_numbers = 1;
|
||
|
else if(tempvalue[0] == 'J')Symbol_of_numbers = 11;
|
||
|
else if(tempvalue[0] == 'Q')Symbol_of_numbers = 12;
|
||
|
else if(tempvalue[0] == 'K')Symbol_of_numbers = 13;
|
||
|
else
|
||
|
sscanf(tempvalue, "%d", &Symbol_of_numbers);
|
||
|
|
||
|
cout << "Select the number of the destination Board List:";
|
||
|
scanf("%d", &a);
|
||
|
TopToBoard(a, Symbol_of_colors, Symbol_of_suits, Symbol_of_numbers);
|
||
|
|
||
|
}
|
||
|
|
||
|
void List::TopToBoard(int listindex, char s_color, char s_suit, int s_value){
|
||
|
List_Node *listtraverse;
|
||
|
Card_Node *willbemoved = NULL, *cardtraverse, *cardtail, *temptop_head = top_head;
|
||
|
|
||
|
if(top_head == NULL){
|
||
|
cout << "Top list is empty, you cannot make this move." << endl;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
cardtraverse = top_head;
|
||
|
cardtail = top_head;
|
||
|
|
||
|
while(cardtraverse){
|
||
|
if(cardtraverse->color == s_color && cardtraverse->suit == s_suit && cardtraverse->value == s_value){
|
||
|
willbemoved = cardtraverse;
|
||
|
break;
|
||
|
}
|
||
|
cardtail = cardtraverse;
|
||
|
cardtraverse = cardtraverse->next;
|
||
|
}//end while
|
||
|
|
||
|
if(willbemoved == NULL){
|
||
|
cout << "Entered card is not in the top list!" << endl;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
listtraverse = board_head;
|
||
|
for(int i = 1; i < listindex; i++)//Moving to board list according to listindex entered by user
|
||
|
listtraverse = listtraverse->next;
|
||
|
|
||
|
/*Cutting the connection of willbemoved node with other nodes in list*/
|
||
|
if(cardtraverse == cardtail)//willbemoved node is first node
|
||
|
temptop_head = temptop_head->next;
|
||
|
else // willbemoved node is not first node
|
||
|
cardtail->next = cardtraverse->next;
|
||
|
|
||
|
if(addcardtolist(listtraverse, willbemoved, 1)){// if movement successful, top_head points second card node
|
||
|
top_head = temptop_head;
|
||
|
cout << "Movement is successful!" << endl;
|
||
|
}
|
||
|
else{// if not successful
|
||
|
if(!(cardtraverse == cardtail))// if not first node, the connection between cardtail and willbemoved is recovered
|
||
|
cardtail->next = willbemoved;
|
||
|
cout << "Wrong Movement!" << endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void List::goster_BoardToBoard(){
|
||
|
char Symbol_of_colors, Symbol_of_suits, tempvalue[4];
|
||
|
int Symbol_of_numbers, source, destination;
|
||
|
|
||
|
cout << "Select the number of the source Board List:";
|
||
|
scanf("%d", &source);
|
||
|
cout << "Select the number of the destination Board List:";
|
||
|
scanf("%d", &destination);
|
||
|
|
||
|
cin.ignore(1000, '\n');
|
||
|
cout << "Select a card from the selected source Board List to move:";
|
||
|
scanf("%c %c %s", &Symbol_of_colors, &Symbol_of_suits, tempvalue);
|
||
|
|
||
|
if(tempvalue[0] == 'A') Symbol_of_numbers = 1;
|
||
|
else if(tempvalue[0] == 'J')Symbol_of_numbers = 11;
|
||
|
else if(tempvalue[0] == 'Q')Symbol_of_numbers = 12;
|
||
|
else if(tempvalue[0] == 'K')Symbol_of_numbers = 13;
|
||
|
else
|
||
|
sscanf(tempvalue, "%d", &Symbol_of_numbers);
|
||
|
BoardToBoard(source, destination, Symbol_of_colors, Symbol_of_suits, Symbol_of_numbers);
|
||
|
}
|
||
|
|
||
|
void List::BoardToBoard(int fromwhere, int towhere, char s_color, char s_suit, int s_value){
|
||
|
List_Node *sourcelisttraverse = board_head, *targetlisttraverse = board_head;
|
||
|
Card_Node *willbemoved = NULL, *cardtraverse, *cardtail, *temp_head;
|
||
|
|
||
|
for(int i = 1; i < fromwhere; i++)// list goes fromwhere times next
|
||
|
sourcelisttraverse = sourcelisttraverse->next;
|
||
|
temp_head = sourcelisttraverse->cards;
|
||
|
cardtraverse = temp_head;
|
||
|
cardtail = temp_head;
|
||
|
|
||
|
|
||
|
while(cardtraverse){
|
||
|
if(cardtraverse->isup)// Dont move cards if the entered card is down
|
||
|
if(cardtraverse->color == s_color && cardtraverse->suit == s_suit && cardtraverse->value == s_value){
|
||
|
willbemoved = cardtraverse;
|
||
|
break;
|
||
|
}
|
||
|
cardtail = cardtraverse;
|
||
|
cardtraverse = cardtraverse->next;
|
||
|
}//end while
|
||
|
|
||
|
if(willbemoved == NULL){
|
||
|
cout << "Wrong Movement!" << endl;
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
for(int i = 1; i < towhere; i++)// list goes towhere times next
|
||
|
targetlisttraverse = targetlisttraverse->next;
|
||
|
|
||
|
/*Cutting the connection of willbemoved node with other nodes in list*/
|
||
|
if(cardtraverse == cardtail)//willbemoved node is first node
|
||
|
temp_head = NULL;
|
||
|
else // willbemoved node is not first node
|
||
|
cardtail->next = NULL;
|
||
|
|
||
|
if(addcardtolist(targetlisttraverse, willbemoved, 3)){// if movement successful, top_head points second card node
|
||
|
sourcelisttraverse->cards = temp_head;
|
||
|
if(!cardtail->isup)// if the card behind of the moved card in source is DOWN, turn it to UP
|
||
|
cardtail->isup = true;
|
||
|
cout << "Movement is successful!" << endl;
|
||
|
return;
|
||
|
}
|
||
|
if(!(cardtraverse == cardtail)){// if not first node, the connection between cardtail and willbemoved is recovered
|
||
|
cardtail->next = willbemoved;
|
||
|
cout << "Wrong Movement!" << endl;
|
||
|
}
|
||
|
|
||
|
}
|
||
|
|
||
|
void List::goster_BoardToFoundation(){
|
||
|
int source;
|
||
|
cout << "Select the number of the source Board List:";
|
||
|
scanf("%d", &source);
|
||
|
cin.ignore(1000, '\n');
|
||
|
BoardToFoundation(source);
|
||
|
}
|
||
|
|
||
|
void List::BoardToFoundation(int fromwhere){
|
||
|
List_Node *sourcelisttraverse = board_head, *targetlisttraverse = foundation_head;
|
||
|
Card_Node *willbemoved = NULL, *cardtraverse, *cardtail, *temp_head;
|
||
|
for(int i = 1; i < fromwhere; i++)//goes to list user wants
|
||
|
sourcelisttraverse = sourcelisttraverse->next;
|
||
|
temp_head = sourcelisttraverse->cards;
|
||
|
cardtraverse = temp_head;
|
||
|
cardtail = temp_head;
|
||
|
|
||
|
while(cardtraverse->next){// go to last card
|
||
|
cardtail = cardtraverse;
|
||
|
cardtraverse = cardtraverse->next;
|
||
|
}//end while
|
||
|
|
||
|
willbemoved = cardtraverse;// last card in card list
|
||
|
|
||
|
|
||
|
int number;
|
||
|
if(willbemoved->suit == 'S') number = 0;
|
||
|
if(willbemoved->suit == 'H') number = 1;
|
||
|
if(willbemoved->suit == 'D') number = 2;
|
||
|
if(willbemoved->suit == 'C') number = 3;
|
||
|
|
||
|
for(int i = 0; i < number; i++)//Moving between foundation lists according to card's suit
|
||
|
targetlisttraverse=targetlisttraverse->next;
|
||
|
|
||
|
/*Cutting the connection of willbemoved node with other nodes in list*/
|
||
|
if(cardtraverse == cardtail)//willbemoved node is first node
|
||
|
temp_head = NULL;
|
||
|
else // willbemoved node is not first node
|
||
|
cardtail->next = NULL;
|
||
|
|
||
|
if(addcardtolist(targetlisttraverse, willbemoved, 4)){// if movement successful, board list's card head points second card node
|
||
|
sourcelisttraverse->cards = temp_head;
|
||
|
if(!cardtail->isup)// if the card behind of the moved card in source is DOWN, turn it to UP
|
||
|
cardtail->isup = true;
|
||
|
cout << "Movement is successful!" << endl;
|
||
|
return;
|
||
|
}
|
||
|
if(!(cardtraverse == cardtail)){// if moving not successful and card is not first node, the connection between cardtail and willbemoved is recovered
|
||
|
cardtail->next = willbemoved;
|
||
|
cout << "Wrong Movement!" << endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void List::clear_screen(){//Clears the system
|
||
|
#ifdef _WIN32//If the operation system is windows use "cls"
|
||
|
std::system("cls");
|
||
|
#else//for other systems use "clear"
|
||
|
std::system ("clear");
|
||
|
#endif
|
||
|
}
|
||
|
|
||
|
void List::close(){//Deletes all linked lists and linkedlists's all nodes
|
||
|
List_Node *listtraverse;
|
||
|
Card_Node *cardtraverse;
|
||
|
|
||
|
/*Deleting top list nodes*/
|
||
|
cardtraverse = top_head;
|
||
|
while(top_head){
|
||
|
cardtraverse = top_head;
|
||
|
top_head = top_head->next;
|
||
|
delete cardtraverse;
|
||
|
}
|
||
|
|
||
|
/*Deleting board list nodes*/
|
||
|
listtraverse = board_head;
|
||
|
while(board_head){
|
||
|
cardtraverse = board_head->cards;
|
||
|
while(board_head->cards){
|
||
|
cardtraverse = board_head->cards;
|
||
|
board_head->cards = board_head->cards->next;
|
||
|
delete cardtraverse;
|
||
|
}
|
||
|
listtraverse = board_head;
|
||
|
board_head = board_head->next;
|
||
|
delete listtraverse;
|
||
|
}
|
||
|
|
||
|
/*Deleting foundation list nodes*/
|
||
|
listtraverse = foundation_head;
|
||
|
while(foundation_head){
|
||
|
cardtraverse = foundation_head->cards;
|
||
|
while(foundation_head->cards){
|
||
|
cardtraverse = foundation_head->cards;
|
||
|
foundation_head->cards = foundation_head->cards->next;
|
||
|
delete cardtraverse;
|
||
|
}
|
||
|
listtraverse = foundation_head;
|
||
|
foundation_head = foundation_head->next;
|
||
|
delete listtraverse;
|
||
|
}
|
||
|
|
||
|
fclose(fptr);//Closing reading txt file
|
||
|
}
|
||
|
|