From b81504b267fb21094e9709aa636787b96670c23c Mon Sep 17 00:00:00 2001 From: ConLenov Date: Fri, 21 Aug 2020 16:02:49 +0000 Subject: [PATCH] Add Console Solitaire game git-svn-id: svn://kolibrios.org@8058 a494cfbc-eb01-0410-851d-a64ba20cac60 --- programs/games/solitaire/README.txt | 15 + programs/games/solitaire/compile.sh | 11 + programs/games/solitaire/solitaire.cpp | 760 +++++++++++++++++++++++++ programs/games/solitaire/solitaire.txt | 59 ++ 4 files changed, 845 insertions(+) create mode 100644 programs/games/solitaire/README.txt create mode 100644 programs/games/solitaire/compile.sh create mode 100644 programs/games/solitaire/solitaire.cpp create mode 100644 programs/games/solitaire/solitaire.txt diff --git a/programs/games/solitaire/README.txt b/programs/games/solitaire/README.txt new file mode 100644 index 0000000000..d454e3ad88 --- /dev/null +++ b/programs/games/solitaire/README.txt @@ -0,0 +1,15 @@ +# Console-Solitaire +Console solitaire game written by me with C/C++ while I was taking Data Structures course. + +### How to Use? +Put "solitaire.cpp" and "solitaire.txt" files in same folder. +Then just compile "solitaire.cpp" with any cpp compiler. + +### How to play? +Select a choice with 1,2,3,4. +Enter a card like: B S A, R D Q ... +B S A = (Black Spades A), R D Q = (Red Diamond Queen) ... + +First Attribute is card color: B (Black), R (Red) +Second Attribute is card figure: S (Spades), C (Clubs), H (Hearts), D (Diamonds) +Third Attribute is card number: A K Q J 10 9 8 7 6 5 4 3 2 \ No newline at end of file diff --git a/programs/games/solitaire/compile.sh b/programs/games/solitaire/compile.sh new file mode 100644 index 0000000000..7c27ceaa9f --- /dev/null +++ b/programs/games/solitaire/compile.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +app_name=fil + +kos32-gcc -c -U__WIN32__ -U_Win32 -U_WIN32 -U__MINGW32__ -UWIN32 -I/usr/local/kos32/sdk/sources/newlib/libc/include -I/usr/local/kos32/sdk/sources/libstdc++-v3/include -o solitaire.o solitaire.cpp + +kos32-ld -static -nostdlib -subsystem consolitairee -image-base 0 -T /usr/local/kos32/sdk/sources/newlib/static.lds -Map=solitaire.map -L /usr/local/kos32/sdk/lib -L /usr/local/kos32/lib -L /usr/local/kos32/mingw32/lib -o solitaire solitaire.o -lc -lgcc -lstdc++ -lsupc++ -lgcc -lc + +kos32-objcopy solitaire -O binary + +exit 0 diff --git a/programs/games/solitaire/solitaire.cpp b/programs/games/solitaire/solitaire.cpp new file mode 100644 index 0000000000..f550dd5b7c --- /dev/null +++ b/programs/games/solitaire/solitaire.cpp @@ -0,0 +1,760 @@ +#include +#include +#include +#include +#include + +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 <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 +} + diff --git a/programs/games/solitaire/solitaire.txt b/programs/games/solitaire/solitaire.txt new file mode 100644 index 0000000000..340bce2be9 --- /dev/null +++ b/programs/games/solitaire/solitaire.txt @@ -0,0 +1,59 @@ +R D 2 Up +B S A Up +R D A Up +B C 5 Up +B C 10 Up +R H 7 Up +R D 3 Up +B C 7 Up +R H 2 Up +R D K Up +B S 7 Up +R H 9 Up +R D 10 Up +R H 4 Up +B C A Up +B C 9 Up +R H 10 Up +B S 10 Up +B C 3 Up +B C 6 Up +R D 4 Up +B C 2 Up +R H 3 Up +R D 8 Up +****** +R H 6 Up +****** +R H 8 Down +B S 9 Up +****** +B S 2 Down +B C K Down +B S Q Up +****** +B S 3 Down +B C 4 Down +B C J Down +B S J Up +****** +R H 5 Down +R H J Down +R D 6 Down +R H A Down +B S 6 Up +****** +R D 7 Down +R D 5 Down +R D J Down +R H K Down +R H Q Down +R D Q Up +****** +B S 8 Down +R D 9 Down +B C Q Down +B S K Down +B S 5 Down +B C 8 Down +B S 4 Up