Add Console Solitaire game
git-svn-id: svn://kolibrios.org@8058 a494cfbc-eb01-0410-851d-a64ba20cac60
This commit is contained in:
parent
1d69bdef68
commit
b81504b267
15
programs/games/solitaire/README.txt
Normal file
15
programs/games/solitaire/README.txt
Normal file
@ -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
|
11
programs/games/solitaire/compile.sh
Normal file
11
programs/games/solitaire/compile.sh
Normal file
@ -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
|
760
programs/games/solitaire/solitaire.cpp
Normal file
760
programs/games/solitaire/solitaire.cpp
Normal file
@ -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
|
||||||
|
}
|
||||||
|
|
59
programs/games/solitaire/solitaire.txt
Normal file
59
programs/games/solitaire/solitaire.txt
Normal file
@ -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
|
Loading…
Reference in New Issue
Block a user