Subversion Repositories Kolibri OS

Compare Revisions

Regard whitespace Rev 8057 → Rev 8058

/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
/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
/programs/games/solitaire/solitaire.cpp
0,0 → 1,760
#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
}
 
/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