Code Corona

نسخه کامل: بازی Solitaire
شما در حال مشاهده نسخه ساده شده مطالب هستید. نسخه کامل را به همراه قالب بندی ببینید.
سلام
هرکس بازی Solitaire رو برای درس ساختمان داده تونسته بنویسه، اینجا بزاره تا بقیه هم فیض ببرن ...
البته اینم بگم که من درس ساختمان داده رو پاس کردم ، برا نسل جوون میخوام ....
از ما که گذشت ....
توی همین بخش C++ می تونین چند نسخه ی اون رو پیدا کنین.
اینم solitare:
کد:
//SOLITAIRE CONSOLE APPLICATION WIN32
//Written by soheil setayeshi
//forum.codecorona.com
#include<iostream>
#include<stdlib.h>
#include<conio.h>
#include<stack>
#include<vector>
#include<time.h>
using namespace std;
//*********************
enum colors{black,red};
//*********************
class card{
      public:
             char kind;
             colors color;
             int num;
             int state;
      };
//*********************
class solitaire{
      public:
             solitaire();
             void display();
             void game();
      private:
              int pick_up(stack<card>*,vector<card>&,int);
              int set_up(stack<card>*,stack<card>*,vector<card>&,int);
              stack<card>* sknown1 (int);
              stack<card>* sknown2 (int);
              int isempty(stack<card>);
              void bor();
              void setdown();
              void settop();
              void setsbase();
              void t1_to_t2();
              void win();
              stack<card> s_down[7];
              stack<card> s_top[2];
              stack<card> s_base[4];
              vector<card> cards;
      };
//*********************
solitaire::solitaire()
{
     card khesht[13],del[13],pic[13],khaj[13];
     int i;
     for (i=0;i<13;i++)
     {
         khaj[i].color=black;
         khaj[i].num=i+1;
         khaj[i].kind=5;
         khaj[i].state=0;
         pic[i].color=black;
         pic[i].num=i+1;
         pic[i].kind=6;
         pic[i].state=0;
         del[i].color=red;
         del[i].num=i+1;
         del[i].kind=3;
         del[i].state=0;
         khesht[i].color=red;
         khesht[i].num=i+1;
         khesht[i].kind=4;
         khesht[i].state=0;
     }
     for (i=0;i<13;i++)
     {
         cards.push_back(khaj[i]);
         cards.push_back(del[i]);
         cards.push_back(pic[i]);
         cards.push_back(khesht[i]);
     }
     bor();
     setdown();
     settop();
     setsbase();
}
//*********************
void solitaire::win()
{
    int i;
    for (i=0;i<4;i++)
        if(s_base[i].top().num != 13)
            return;
     cout<<endl;
     for(i=0;i<905;i++,cout<<' ');
     cout<<char(3)<<char(4)<<char(5)<<char(6)<<" CONGRATULATION YOU WIN "
     <<char(6)<<char(5)<<char(4)<<char(3);
     getch();
     exit(0);
}
//*********************
int solitaire::isempty(stack<card> s)//Check empty stack
{
    return !s.size();
}
//*********************
void solitaire::t1_to_t2()//Move in help stack
{
     if (!s_top[0].size())
     {
           while (s_top[1].size())
           {
              s_top[0].push(s_top[1].top());
              s_top[1].pop();
           }
     }
     else{
          s_top[1].push(s_top[0].top());
          s_top[0].pop();
          }
}
//*********************
void solitaire::setsbase()//ARRANGE IN BASE STACKS
{
     card c1,c2,c3,c4;//ASCII code: khaj:5 pic:6 del:3 khesht:4
     c1.num=0;
     c1.kind=5;
     c2.num=0;
     c2.kind=6;
     c3.num=0;
     c3.kind=3;
     c4.num=0;
     c4.kind=4;
     s_base[0].push(c1);
     s_base[1].push(c2);
     s_base[2].push(c3);
     s_base[3].push(c4);
}    
//*********************  
void solitaire::setdown()//ARRANGE IN DOWN STACKS
{
     int i;
     vector<card>::iterator p=cards.begin();
     s_down[0].push(cards[0]);
     s_down[0].top().state=1;
     cards.erase(cards.begin());
     for (i=0;i<2;i++)
     {
         s_down[1].push(cards[0]);
         cards.erase(cards.begin());
     }
     s_down[1].top().state=1;
     for (i=0;i<3;i++)
     {
         s_down[2].push(cards[0]);
         cards.erase(cards.begin());
     }
     s_down[2].top().state=1;
     for (i=0;i<4;i++)
     {
         s_down[3].push(cards[0]);
         cards.erase(cards.begin());
     }
     s_down[3].top().state=1;
     for (i=0;i<5;i++)
     {
         s_down[4].push(cards[0]);
         cards.erase(cards.begin());
     }
     s_down[4].top().state=1;
     for (i=0;i<6;i++)
     {
         s_down[5].push(cards[0]);
         cards.erase(cards.begin());
     }
     s_down[5].top().state=1;
     for (i=0;i<7;i++)
     {
         s_down[6].push(cards[0]);
         cards.erase(cards.begin());
     }
     s_down[6].top().state=1;
}
//*********************
void solitaire::settop()//ARRANGE IN TOP STACKS
{
     while (cards.size())
     {
           cards[0].state=1;
           s_top[0].push(cards[0]);
           cards.erase(cards.begin());
     }
}    
//*********************  
void solitaire::bor()// BORING CARDS
{
     int i,place;
     vector<card> v;
     vector<card>::iterator p;
     srand(time(0));
     while (cards.size())
     {
           place=rand()%(cards.size());
           v.push_back(cards[place]);
           p=cards.begin();
           for(i=0;i!=place;i++,p++);
           cards.erase(p);
     }
     while(v.size())
     {
         cards.push_back(v[0]);
         v.erase(v.begin());
     }
}    
//*********************
stack<card>* solitaire::sknown1(int num)//KHNOW STACK FOR PICk UP CARDS
{
     switch(num)
     {
         case 1:return &s_down[0];
         case 2:return &s_down[1];
         case 3:return &s_down[2];
         case 4:return &s_down[3];
         case 5:return &s_down[4];
         case 6:return &s_down[5];
         case 7:return &s_down[6];
         case 8:return &s_top[1];
         default:return NULL;
  
     }
}
//*********************
stack<card>* solitaire::sknown2(int num)//KHNOW STACK FOR SETUP CARDS
{
     switch(num)
     {
         case 1:return &s_down[0];
         case 2:return &s_down[1];
         case 3:return &s_down[2];
         case 4:return &s_down[3];
         case 5:return &s_down[4];
         case 6:return &s_down[5];
         case 7:return &s_down[6];
         case 9:return &s_base[0];
         case 10:return &s_base[1];
         case 11:return &s_base[2];
         case 12:return &s_base[3];
         default:return NULL;
  
     }
}
//*********************
void solitaire::display()//DISPLAY CARDS
{
     int i,j,k,n;
     char ch=5,b='?';    
     stack<card> sc[7];
     vector<card> v[7];
     system("cls");
     cout<<endl;
     for (i=0;i<7;i++)
         sc[i]=s_down[i];
     for (i=0;i<7;i++)
         for (j=0;sc[i].size();j++)
         {
             v[i].push_back(sc[i].top());
             sc[i].pop();
         }
     for (i=0,n=10;i<7;i++,n+=10)
     {
         cout<<i+1<<") ";
         if(!v[i].size()) cout<<"EMPTY";
         for (j=v[i].size()-1;j>=0;j--)
         {
             if (v[i][j].state==1)
                cout<<"["<<v[i][j].kind<<v[i][j].num<<"]"<<" ";
             else if(j==0)
             {
                  cout<<"["<<v[i][j].kind<<v[i][j].num<<"]"<<" ";
                  v[i][j].state=1;
             }
             else
                 cout<<"["<<b<<"]"<<" ";
         }
         cout<<"\n";
         for (k=0;k<55;k++)
             cout<<' ';
         switch(i)
         {
                  case 0:if(s_top[0].size())
                         cout<<" HELP CARDS:[?]";
                         else cout<<" HELP CARDS: EMPTY";
                         break;
                  case 1:if(s_top[1].size())
                         cout<<" 8) HELP CARDS:"<<"["<<s_top[1].top().kind<<s_top[1].top().num<<"]";
                         else cout<<" 8) HELP CARDS: EMPTY";
                         break;
                  case 3:if(s_base[0].size()>1)
                         cout<<" 9) BASE CARDS:"<<"["<<s_base[0].top().kind<<s_base[0].top().num<<"]";
                         else cout<<" 9) BASE CARDS: "<<ch;
                         break;
                  case 4:if(s_base[1].size()>1)
                         cout<<"10) BASE CARDS:"<<"["<<s_base[1].top().kind<<s_base[1].top().num<<"]";
                         else cout<<"10) BASE CARDS: "<<char(ch+1);
                         break;
                  case 5:if(s_base[2].size()>1)
                         cout<<"11) BASE CARDS:"<<"["<<s_base[2].top().kind<<s_base[2].top().num<<"]";
                         else cout<<"11) BASE CARDS: "<<char(ch-2);
                         break;
                  case 6:if(s_base[3].size()>1)
                         cout<<"12) BASE CARDS:"<<"["<<s_base[3].top().kind<<s_base[3].top().num<<"]";
                         else cout<<"12) BASE CARDS: "<<char(ch-1);
                         break;

         }
         if (!v[i].size())
         {
            cout<<"EMPTY";
         }
         cout<<"\n\n";
     }
}
//*********************
//*********************
int solitaire::pick_up(stack<card> *s1,vector<card> &v,int n)//FOR CHECK PICUPING CARDS
{
    int i,j;
    if (!isempty(*s1))
    {
       if (s1==&s_top[1])
       {
          if (n!=1)
          {
             cout<<'\a';
             return 0;
          }
          v.push_back(s_top[1].top());
          s_top[1].pop();
          return 1;
       }
       for (i=0;i<n;i++)
       {
           v.push_back(s1->top());
           s1->pop();
       }
       for (i=0;i<n-1;i++)
           if (v[i].num!=((v[i+1].num)-1) ||( v[i].color==v[i+1].color) || v[i].state==0 || v[i+1].state==0)
           {
              for (j=n-1;j>=0;j--)
                  s1->push(v[j]);
              v.resize(0);
              return 0;
           }
       return 1;
    }//end !empty
    else//isempty
    {
        v.resize(0);
        cout<<"stack is empty\n";
        return 0;
    }
}
//*********************
//*********************
int solitaire::set_up(stack<card> *s2,stack<card> *s1,vector<card> &v,int n)//FOR CHECK DROPING CARDS
{
    int i;
    if (!isempty(*s2))//!empty
    {
       if (s2==&s_base[0] || s2==&s_base[1] || s2==&s_base[2] || s2==&s_base[3])
       {
          if (n!=1)
          {
             cout<<'\a';
             for (i=n-1;i>=0;i--)
                 s1->push(v[i]);
             v.resize(0);
             return 0;
          }
          if (v[0].num==(s2->top().num)+1 && v[0].kind==(s2->top().kind))
          {
             s2->push(v[0]);
             v.resize(0);
             return 1;
          }
          else
          {
              for (i=n-1;i>=0;i--)
                  s1->push(v[i]);
              v.resize(0);
              return 0;
          }
       }
       card temp;
       temp=s2->top();
       if (v[n-1].color==temp.color || (v[n-1].num)+1!=temp.num)
       {
          for (i=n-1;i>=0;i--)
              s1->push(v[i]);
          v.resize(0);
          return 0;
       }
       for (i=n-1;i>=0;i--)
           s2->push(v[i]);
       v.resize(0);
       return 1;
    }
    else if(v[n-1].num==13)//is empty and is knight
    {
         for (i=n-1;i>=0;i--)
             s2->push(v[i]);
         v.resize(0);
         return 1;
    }
    else
    {
        for (i=n-1;i>=0;i--)
            s1->push(v[i]);
        v.resize(0);
        return 0;//is empty
    }
}
//*********************
void solitaire::game()//STARTING THE GAME
{
     stack<card> *s1,*s2;
     s1=new stack<card>;
     s2=new stack<card>;
     vector<card> v;
     char ch;
     int num1,num2,n;
     while(1)
     {
        win();
        v.resize(0);
        while(1)
        {
             while(1)
             {
                     display();
                     cout<<"Do you want to see one of the cards in HELP stack(Y/N):";
                     cin>>ch;
                     if (ch=='y'||ch=='Y')
                     {
                        t1_to_t2();
                        display();
                     }
                     else if(ch=='n'||ch=='N')
                     {
                          display();
                          break;
                     }
                     else
                          cout<<'\a';
             }  
             while(1)
             {
                cout<<"Select your first place:";
                cin>>num1;
                if(num1<1||num1>8)
                {
                       cout<<"\aWe dont have this place\n";
                       system("pause");
                       display();
                       continue;
                }
                else{
                     s1=sknown1(num1);
                     break;
                     }
             }
             if (num1!=8)
             {    
                cout<<"Enter number of cards to pick up:";
                cin>>n;
                if (s1!=&s_top[1])
                {
                   if (n<0 || n > s1->size())
                   {
                      cout<<"\a";
                      break;
                   }
                }
             }
             else
                 n=1;
             if (!pick_up(s1,v,n))
             {
                cout<<"\a";
                continue;
             }
             else{//*
                  while(1)
                  {
                          cout<<"Select your second place:";
                          cin>>num2;
                          if(num2<1||(num2>7 && num2<9)||num2>12)
                          {
                                 cout<<"\aWe dont have this place\n";
                                 system("pause");
                                 display();
                                 continue;
                          }
                          else{
                               s2=sknown2(num2);
                               break;
                               }
                  }
                  if (set_up(s2,s1,v,n))
                     break;
                  else
                      cout<<"\a";
                  }//*
     }
}}
//*********************
int main()
{
    solitaire a;
    a.game();
    getch();
    return 0;
}
//*********************
کد:
//This header file includes class Card definition and its function prototypes

#ifndef CARD_H
#define CARD_H

typedef enum {none,heart,diamond,club,spade} suits;
typedef enum {no_color,red,black} colors;

class Card
{
public:
        Card(suits =none,int =0,bool =false,colors =no_color);            //Constructor
        void setFace(bool);
        void setValue(int);
        void setSuit(suits);
        void setColor(colors);
        colors getColor(void) const;
        bool getFace(void) const;
        suits getSuit(void) const;
        int getValue(void) const;
    
private:
        bool face;
        int value;
        suits suit;
        colors color;
};

#endif


//****************************************************************

#include "Card.h"

Card::Card(suits s,int v,bool f,colors c)
:
suit(s),value(v),face(f),color(c)
{
}
void Card::setFace(bool f)
{
    face=f;
}
bool Card::getFace(void) const
{
    return face;
}
void Card::setValue(int v)
{
    value=v;
}
void Card::setSuit(suits s)
{
    suit=s;
}
suits Card::getSuit(void) const
{
    return suit;
}
int Card::getValue(void) const
{
    return value;
}

colors Card::getColor(void) const
{
    return color;
}

void Card::setColor(colors c)
{
    color=c;
}

//**************************************************************

//Header file of class Solitaire which is the principle part of the game

#ifndef SOLITAIRE_H
#define SOLITAIRE_H

#include <stack>
#include "Card.h"
using namespace std;

class Solitaire
{
public:
    Solitaire(void);        //Constructor
    void shuffle(void);
    void play(void);
private:
    //Data members:
    Card deck[53];
    stack<Card> stacks[14];
    
    //Utility functions:
    void setStacks(void);
    bool check(int,int,int,stack<Card> &);
    void display(void);
    void move(void);
    void printCard(Card &);
    bool win(void);
    void printStack(stack<Card> &);
};

#endif

//********************************************************************

#include "Solitaire.h"

#include <stack>
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <iomanip>

using namespace std;

Solitaire::Solitaire(void)
{
    //Making cards:
    int i;
    for(i=1;i<=13;i++)
    {
        deck[i].setSuit(heart);
        deck[i].setValue(i);
        deck[i].setColor(red);
    }
    for(int j=1;i<=26;i++,j++)
    {
        deck[i].setSuit(diamond);
        deck[i].setValue(j);
        deck[i].setColor(red);
    }
    for(int j=1;i<=39;i++,j++)
    {
        deck[i].setSuit(spade);
        deck[i].setValue(j);
        deck[i].setColor(black);
    }
    for(int j=1;i<=52;i++,j++)
    {
        deck[i].setSuit(club);
        deck[i].setValue(j);
        deck[i].setColor(black);
    }
}

void Solitaire::shuffle(void)        //Shuffle the cards
{
    srand(time(0));
    for(int j=1;j<=52;j++)
        swap(deck[j],deck[1+rand()%52]);
}

void Solitaire::setStacks(void)        //put cards in the proper stacks
{
    int z=1,j=1,i=1;
    for(;i<=7;i++,z+=i)
        for(;j<=z;j++)
            stacks[i].push(deck[j]);
    for(;j<=52;j++)
        stacks[12].push(deck[j]);
    for(i=1;i<=7;i++)
        stacks[i].top().setFace(true);
}

void Solitaire::display(void)
{
    system("cls");
    cout<<"\tSOLITAIRE GAME V. 1.01  ---  Author: Mahdi Yeilaghi Ashrafi";
    cout<<endl<<"_____________________________________________________________________________"<<endl;
    cout<<endl<<endl<<endl;
    cout<<setw(2)<<"12 : STOCK 1: ";
    printStack(stacks[12]);
    cout<<endl<<endl;
    cout<<setw(2)<<"13 : STOCK 2: ";
    printStack(stacks[13]);
    cout<<endl<<endl;
    int i=1;
    for(;i<=7;i++)
    {
        cout<<endl<<endl<<setw(2)<<i<<" : ";
        printStack(stacks[i]);
    }
    cout<<endl<<endl<<endl<<endl<<"Output Pile:\n\n";
    for(;i<=11;i++)
    {
        cout<<setw(2)<<i<<" : ";
        if(!stacks[i].empty())
        {
            printCard(stacks[i].top());
            cout<<endl<<endl;
        }
        else
            cout<<"EMPTY"<<endl<<endl;
    }
    cout<<endl<<"_____________________________________________________________________________"<<endl;
}
void Solitaire::move(void)
{
    if(stacks[12].empty() && stacks[13].empty())
        cout<<"No more cards in STOCKS!"<<endl<<endl;
    else
    {
        char reply;
        do
        {
            cout<<endl<<"Do you want to see a card in STOCK 1?(Y or N or E to exit game)>";
            cin>>reply;
            cin.clear();
        }
        while(reply!='n' && reply!='N' && reply!='y' && reply!='Y' &&
          reply!='e' && reply!='E');
        if(reply=='e' || reply=='E')
            exit(1);
        else if(reply=='y' || reply =='Y')
        {
            if(stacks[12].empty())
            {
                while(!stacks[13].empty())
                {
                    stacks[12].push(stacks[13].top());
                    stacks[12].top().setFace(false);
                    stacks[13].pop();
                }
                stacks[13].push(stacks[12].top());
                stacks[13].top().setFace(true);
                stacks[12].pop();
            }
            else
            {
                stacks[13].push(stacks[12].top());
                stacks[13].top().setFace(true);
                stacks[12].pop();
            }
            return;
        }
    }
    
    int first,num,second;
    cout<<endl<<"Select the first place:";
    cin>>first;
    cin.clear();
    cout<<endl<<"How many cards do you want to pick up?";
    cin>>num;
    cin.clear();
    cout<<endl<<"Select the second place:";
    cin>>second;
    cin.clear();
    
    stack<Card> temp;

    if(check(first,num,second,temp))
    {
        for(int i=1;i<=num;i++)
        {
            stacks[second].push(temp.top());
        temp.pop();
        }
        if(!stacks[first].empty())
            stacks[first].top().setFace(true);
        
    }
}

void Solitaire::play(void)
{
    setStacks();
    while(!win())
    {
        display();
        move();
    }
    system("cls");
    cout<<setw(1250)<<"CONGRADULATION , YOU WIN!!";
    return;
}



bool Solitaire::win(void)
{
    for(int i=8;i<=11;i++)
        if(stacks[i].size()!=13)
            return false;
    return true;
}
void Solitaire::printCard(Card &card)
{
    static const char *const numbers[14]={"0","Ace","2","3","4","5","6","7","8","9",
                                   "10","Jack","Queen","King"};
    if(!card.getFace())
        cout<<"? ";
    else
        cout<<'['<<static_cast<char>(card.getSuit()+2)<<numbers[card.getValue()]<<']';
}


bool Solitaire::check(int first, int num, int second, stack<Card> &temp)
{
    if(second==12||stacks[first].empty()||first<=0||second<=0||num<=0
        || first==second || num>stacks[first].size() || ((second>=8 && second<= 11) && num !=1)
        || ((first>=8 && first<=11) && num!=1))
    {
        cout<<endl<<"\aIllegal Move!";
        return false;
    }
    if(second>=1 && second<=7)
    {
        if(stacks[second].empty())
        {
            if(num==1)
            {
                if(stacks[first].top().getValue()==13)
                {
                    temp.push(stacks[first].top());
                    stacks[first].pop();
                    return true;
                }
                else
                {
                    cout<<endl<<"\aIllegal Move!";
                    return false;
                }
            }
            else if(num>1)
            {
                stack<Card> temp2=stacks[first];
                for(int i=1;i<num;i++)
                    temp2.pop();
                if(temp2.top().getValue()==13)
                {
                    for(int i=1;i<=num;i++)
                    {
                        temp.push(stacks[first].top());
                        stacks[first].pop();
                    }
                    return true;
                }
                else
                {
                    cout<<endl<<"\aIllegal Move!";
                    return false;
                }
            }
        }
        else
        {
            for(int i=1;i<=num;i++)
            {
                temp.push(stacks[first].top());
                stacks[first].pop();
            }
            if(temp.top().getValue()==(stacks[second].top().getValue()-1) && temp.top().getColor()!=stacks[second].top().getColor())
                return true;
            else
            {
                for(int i=1;i<=num;i++)
                {
                    stacks[first].push(temp.top());
                    temp.pop();
                }
                cout<<endl<<"\aIllegal Move!";
                return false;
            }
        }
    }
    else if(second>=8 && second<=11)
    {
        if(!stacks[second].empty()&&(stacks[first].top().getValue()==(stacks[second].top().getValue()+1))&&
                stacks[first].top().getSuit()==(stacks[second].top().getSuit()))
        {
            temp.push(stacks[first].top());
            stacks[first].pop();
            return true;
        }
        else if(stacks[second].empty() && stacks[first].top().getValue()==1)
        {
            temp.push(stacks[first].top());
            stacks[first].pop();
            return true;
        }
    }
    else
        {
            cout<<endl<<"\aIllegal Move!";
            return false;
        }
}
void Solitaire::printStack(stack<Card> &st)
{
    if(st.empty())
        cout<<"EMPTY";
    else
    {
        stack<Card> temp2,temp1=st;
        while(!temp1.empty())
        {
            temp2.push(temp1.top());
            temp1.pop();
        }
        while(!temp2.empty())
        {
            printCard(temp2.top());
            temp2.pop();
        }
    }
}

//**********************************************************

#include "Solitaire.h"

#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;

int main(void)
{
    
    ofstream out("NOTE.txt");
    out<<endl<<endl;
    out<<"  Name: Solitaire Game V. 1.0.1"<<endl<<endl;
    out<<"  Copyright: COPYRIGHTED (C) , Please use this program with the author's name. "<<endl<<endl;
    out<<"  Author: Mahdi Yeilaghi Ashrafi"<<endl<<endl;
    out<<"  Website: http://www.codecorona.com/"<<endl<<endl;
    out<<"  E-mail: mahdi.y@codecorona.com"<<endl<<endl;
    out<<"  Azad University of Mashhad"<<endl<<endl;
    out<<"  Date: 24/01/07 23:44"<<endl<<endl;
    out<<"  Description:"<<endl;
    out<<"  This program contains 6 files: 2 header files, 3 source code files and 1 text file."<<endl;
    out<<"  This program simulates the solitaire game in console mode."<<endl<<endl;
    out<<"  Compiled by Microsoft Visual Studio 2005 , Microsoft Visual C++ 8"<<endl;
    out<<"    For the best result, please compile by this compiler and run the game in full screen mode.";
    out.close();
    system("call NOTE.txt");
    
    Solitaire game;
    game.shuffle();
    game.play();
    cout<<"\a\a\a\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n";
    system("pause");
    return EXIT_SUCCESS;
}
لینک‌های مرجع