C++ 知识复习--一个简易围棋比赛系统

#include<iostream>
#include<string>
#include<algorithm>
#include<vector>
#include <fstream>
using namespace std;
#define LongOfChar 100  // 定义了一个常量为100的宏LongOfChar

/**
* The class of Player
* 2017/2/19
*/
class Player{
   private:
   int dan;      //棋手段位
   public :
   char  name[LongOfChar]; //棋手姓名
   int mikeScore;
   public:  
    Player(){
        dan=0;
        mikeScore=0;
     }
     void setDan(int da){
     dan=da;
     }
     int getDan(){
         return dan;
     }
};
/*Player降序排列*/
class CompGreater
{
public:
    bool operator ()(const Player& pstItem1, const Player& pstItem2)
    {
        return pstItem1.mikeScore> pstItem2.mikeScore;
    }
 
};  


/*
* The Class Of PlayerPair
* 2017/2/23
*/
 class PlayerPair{
    public :
    Player* A_Player;  //对手中A的指针
    Player* B_Player;  //对手中B的指针
    Player* winer_Player; //获胜者的指针
};


/**
* The class of Complete
* 2017/2/19
*/
class WeiQiComplete{
    public :
    int numberOfPlayer;     //参赛人数
    int roundOfCompelte;    //比赛轮数
    int currentCompelte;    //当前第几轮
    vector<Player>  mPlayerVetor;   //存放参赛选手的Vector
    vector<PlayerPair>  mPlayerPairVetor; //存放配对实体的Vector
    public :
    WeiQiComplete(){
       numberOfPlayer=0;
       roundOfCompelte=0;
       currentCompelte=0;
    }

    //Print the info of player
    void printPlayer(){   //循环打印所有参赛选手信息
        vector<Player>::iterator it;    
            cout << "The In of Player:"<< endl;
        for(it=mPlayerVetor.begin();it!=mPlayerVetor.end();it++){
           cout<<"name:"<<(*it).name<<"  dan:"<<(*it).getDan()<<"  MikeScore:"<<(*it).mikeScore<<endl;
        }
    }
    //input the info of complete
    void inputPlayer(){ //输入比赛信息(根据当前第几轮判断是否已经开始比赛,开始则不可以输入)
    if(currentCompelte>0){
        cout<<"the complete has begin,you cannot enter again!";
    }else{
       cout << "Please input the number of player :"<<endl;
       cin>>numberOfPlayer;
       cout << "Please input the round of Compelte :"<<endl;
       cin>>roundOfCompelte;
       cout << "Please input the Info of all Player"<<endl;
       for(int i=0;i < numberOfPlayer; i++){
        Player mPlayer;
        int dan;
        cout << "Please input name of "<< i+1 <<" player :"<<endl;
        cin>>mPlayer.name;
        cout << "Please input dan of "<< i+1 <<" player :"<<endl;
        cin>>dan;
        mPlayer.setDan(dan);
        mPlayer.mikeScore=dan;
         mPlayerVetor.push_back(mPlayer);
      }
    }
      
      
    }
    //sort the Player
    void sortPlayer(){  //根据选手的麦克马洪分数对选手进行排序
        sort(mPlayerVetor.begin(), mPlayerVetor.end(), CompGreater());
    }
        //make Pair of Player //根据选手的麦克马洪分数从高到低依次配对
    void makePair(){
        int sizeOfArray=mPlayerVetor.size() / 2;
        for(int i=0;i<sizeOfArray;i++){
            PlayerPair mPlayerPair;
            mPlayerPair.A_Player=&mPlayerVetor[2*i];
            mPlayerPair.B_Player=&mPlayerVetor[2*i+1];
            mPlayerPairVetor.push_back(mPlayerPair);
        }
        if(sizeOfArray*2 < mPlayerVetor.size()){
            mPlayerVetor[mPlayerVetor.size()-1].mikeScore+=0.5;
        }
    }
    //print the pair of Player
    void printpair(){  //打印出所有的分组信息
            cout << "*The Result of the pair*"<< endl;
        for(int i=0;i<mPlayerPairVetor.size();i++){
             cout<< (*(mPlayerPairVetor[i].A_Player)).name<<"   :   "<<(*(mPlayerPairVetor[i].B_Player)).name<<endl;
        }
             cout << "you can enter the result "<< endl;
    }
    //print the Result of round
    void printTheResult(){ //打印此轮的比赛结果
        for(int i=0;i<mPlayerPairVetor.size();i++){
             cout<< (*(mPlayerPairVetor[i].A_Player)).name<<"  :  "<<(*(mPlayerPairVetor[i].B_Player)).name<< "  Winer is *" <<(*(mPlayerPairVetor[i].winer_Player)).name<<"*"<<endl;
        }
        if(roundOfCompelte==currentCompelte){
            cout<<"The Complete End ! The Sort Of all Payer is --"<<endl;
            sortPlayer();
            printPlayer();
        }
    }
    //input the result of round
    void inputResult(){  //输入此轮的比赛每组的结果
        for(int i=0;i<mPlayerPairVetor.size();i++){
        int playerid;
        cout<<"please input the result of "<<(*(mPlayerPairVetor[i].A_Player)).name<<" win is 1 ; "<<(*(mPlayerPairVetor[i].B_Player)).name<<" win is 2 "<<endl;
         cin>>playerid;
           if(playerid==1){
               mPlayerPairVetor[i].winer_Player=mPlayerPairVetor[i].A_Player;
               (*(mPlayerPairVetor[i].A_Player)).mikeScore+=1;
           }else{
              if(playerid==2){
                mPlayerPairVetor[i].winer_Player=mPlayerPairVetor[i].B_Player;
                 (*(mPlayerPairVetor[i].B_Player)).mikeScore+=1;
             }  
             else{
                 (*(mPlayerPairVetor[i].A_Player)).mikeScore+=0.5;
                 (*(mPlayerPairVetor[i].B_Player)).mikeScore+=0.5;
             }
           }
        }
    }
};



/**
* The class 0f Login
* 2017/2/26
*/
class Login{
    private :
    string  name;
    string  password;
    public:
    void login(){  //登录验证的入口
        cout<< "*************************************"<<endl;
        cout<< "           WeiQi System              "<<endl;
        cout<< "*************************************"<<endl;
        cout<< "Please input your name and password :"<<endl;
         input();
        if(login_Verification(name,password)){
            login_success();    
        }else{
            login_error();
        }
    }
    //input info of login
    void input(){  //输入登录信息
        cout<< "Your name:";
        cin>>name;
        cout<< "Your password:";
        cin>>password;
    }
    //Verification
    bool login_Verification(string  name,string  password){ //比对登录信息
        bool resp=false;
        if(name.compare("li")==0 && password.compare("123")==0){
            resp=true;
        }
        return resp;
    }
    //login success
    void login_success(){  //比对成功后
        cout<< "Login Success !"<<endl;
    }
    //login error
    void login_error(){   //比对失败后
        cout<< "Your name Or Password is Error!"<<endl;
        login();
    }
};

class fileUtil{
    public:
    static void outPutToFile(WeiQiComplete weiQiComplete){   //将类对象打印保存到文件中
        ofstream file;   
        file.open("WeiQiComplete.txt", ios::out | ios::binary | ios::app);   
        file.write((char *)&weiQiComplete,sizeof(WeiQiComplete));  
        file.close();  
    }
    static WeiQiComplete readFromFile(){ //从文件中将之前所保存的对象读取出来
         WeiQiComplete weiQiComplete;
         ifstream infile;   
         infile.open("WeiQiComplete.txt", ios::in | ios::binary);
         if(infile.is_open()){
             infile.read((char *)&weiQiComplete,sizeof(weiQiComplete));     //(char *)&weiQiComplete 指读存放读取到的数据的对象的指针
             infile.close();                                               //sizeof(weiQiComplete) 存放读取数据所需要的空间大小
             cout << "finish read file " << endl;
         }
         print(weiQiComplete);        
         return  weiQiComplete;    
    }
    static void print(WeiQiComplete weiQiComplete){
             cout <<" have read a  WeiQiComplete Info "<< ":" << &weiQiComplete << endl;
    }
};

/**
* The class 0f Menu
* 2017/2/27
*/
class Menu{   //菜单类
    WeiQiComplete mWeiQiComplete;
    public:
    void menu(){
        int select;
        cout<< "******************************************"<<endl;
        cout<< "              WelCome You                 "<<endl;
        cout<< "This is Menu ,you can input the number of list"<<endl;
        cout<< "* 1: Enter The Number of Player And Round "<<endl;
        cout<< "* 2: Start a Round "<<endl;
        cout<< "* 3: Enter The Result Of Round"<<endl;
        cout<< "* 4: Print The Sort Of Player"<<endl;
        cout<< "* 5: Save to the file"<<endl;
        cout<< "* 6: read  the file"<<endl;
        cout<< "* 7: Back "<<endl;
        cout<< "******************************************"<<endl;
        
        cin>>select;
        switch(select){
            case 1:
            enterInfo();
            break;
            case 2:
            startRound();
            break;
            case 3:
            inputResultOfRound();
            break;
            case 4:
            printSort();
            break;
            case 5:
            SaveToFile();
            break;
            case 6:
            ReadFromFile();
            break;
            case 7:
            exit(0);
            break;
        }
    }
    void enterInfo(){ //输入比赛信息
        mWeiQiComplete.inputPlayer();
        mWeiQiComplete.printPlayer();
        mWeiQiComplete.sortPlayer();
        
        menu();
    }
    void startRound(){  //开始新的一轮比赛
        if(mWeiQiComplete.numberOfPlayer <= 0 || mWeiQiComplete.roundOfCompelte<=0){
            cout <<"Please Enter the Info About Player and Compelte!"<<endl;
            menu();
        }
        else{
            if(mWeiQiComplete.roundOfCompelte <= mWeiQiComplete.currentCompelte){
                    cout <<"The Compelte Has Finish!"<<endl;
                    menu();
            }
            else{
             mWeiQiComplete.currentCompelte = mWeiQiComplete.currentCompelte + 1;
             cout <<"you will begin the  * "<<mWeiQiComplete.currentCompelte<<"  * round "<<endl;
             mWeiQiComplete.makePair();
             mWeiQiComplete.printpair();
             menu();                
            }
        }
    }
    void printSort(){ //输出排序后的选手信息
        mWeiQiComplete.printPlayer();
        menu();
    }
    void inputResultOfRound(){ //输入每轮比赛每组结果
        mWeiQiComplete.inputResult();
        mWeiQiComplete.printTheResult();
        menu();
    }
    void SaveToFile(){ //将比赛对象整体保存到文件中
        fileUtil::outPutToFile(mWeiQiComplete);
        menu();
    }
    void ReadFromFile(){ //从已存在的文件读取比赛对象数据
        mWeiQiComplete=fileUtil::readFromFile();
        menu();
    }
};
/**
* main method
* 2017/2/19
*/
int main(){
    Menu  mMenu;  
    Login mLogin;
    mLogin.login();
    mMenu.menu();
    return 0;
  }
 
其中在保存类对象时,如果对象中的域是string,a将会报错(在读取时报错)
  • 6
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值