小游戏集合

· · 个人记录

该博文汇集了一些博主做的小游戏

二十四点解题:

#include<bits/stdc++.h>
#define EXP 1e-7
using namespace std;
struct Element
{
    enum ElementType{add=0,sub=1,mul=2,div=3,mod=4,num=5};
    ElementType type;
    double data;
    Element():
        type(num),
        data(0)
    {
    }
    Element(const ElementType &t):
        type(t),
        data(0)
    {
    }
    Element(const double &n):
        type(num),
        data(n)
    {
    }
};
struct TreeNode
{
    Element element;
    int f,l,r;
    TreeNode(const Element &_element,int _l=-1,int _r=-1,int _f=-1):
        element(_element),
        f(_f),
        l(_l),
        r(_r)
    {
    }
};
inline double calc(const vector<Element> &expr)
{
    stack<double> sta;
    for(vector<Element>::const_iterator i=expr.begin();i!=expr.end();i++)
    {
        if(i->type==Element::num) sta.push(i->data);
        else
        {
            if(sta.size()<2) throw 400;
            double a,b;
            b=sta.top();
            sta.pop();
            a=sta.top();
            sta.pop();
            if(i->type==Element::add) sta.push(a+b);
            else if(i->type==Element::sub) sta.push(a-b);
            else if(i->type==Element::mul) sta.push(a*b);
            else if(i->type==Element::div)
            {
                if(fabs(b-0)<=EXP) throw 500;
                sta.push(a/b);
            }
            else
            {
                if(fabs(b-0)<=EXP) throw 500;
                sta.push(a-floor(a/b)*b);
            }
        }
    }
    if(sta.size()!=1) throw 400;
    return sta.top();
}
inline vector<TreeNode> makeTree(const vector<Element> &expr)
{
    vector<TreeNode> tree;
    stack<int> sta;
    for(vector<Element>::const_iterator i=expr.begin();i!=expr.end();i++)
    {
        if(i->type==Element::num)
        {
            tree.push_back(TreeNode(*i));
            sta.push(tree.size()-1);
        }
        else
        {
            if(sta.size()<2) throw 400;
            int a,b;
            b=sta.top();
            sta.pop();
            a=sta.top();
            sta.pop();
            tree.push_back(TreeNode(*i,a,b));
            tree[a].f=tree.size()-1;
            tree[b].f=tree.size()-1;
            sta.push(tree.size()-1);
        }
    }
    return tree;
}
const string optsChar[5]={"﹢","﹣","×","÷","%",};
int nums[4];
inline vector<Element> makeExpr(int a,int b,int c,int d,int opt1_id,int opt2_id,int opt3_id,int t)
{
    vector<Element> expr;
    if(t==0)
    {
        expr.push_back(Element(a));
        expr.push_back(Element(b));
        expr.push_back(Element(Element::ElementType(opt1_id)));
        expr.push_back(Element(c));
        expr.push_back(Element(Element::ElementType(opt2_id)));
        expr.push_back(Element(d));
        expr.push_back(Element(Element::ElementType(opt3_id)));
    }
    else if(t==1)
    {
        expr.push_back(Element(a));
        expr.push_back(Element(b));
        expr.push_back(Element(Element::ElementType(opt1_id)));
        expr.push_back(Element(c));
        expr.push_back(Element(d));
        expr.push_back(Element(Element::ElementType(opt3_id)));
        expr.push_back(Element(Element::ElementType(opt2_id)));
    }
    else if(t==2)
    {
        expr.push_back(Element(a));
        expr.push_back(Element(b));
        expr.push_back(Element(c));
        expr.push_back(Element(Element::ElementType(opt2_id)));
        expr.push_back(Element(Element::ElementType(opt1_id)));
        expr.push_back(Element(d));
        expr.push_back(Element(Element::ElementType(opt3_id)));
    }
    else if(t==3)
    {
        expr.push_back(Element(a));
        expr.push_back(Element(b));
        expr.push_back(Element(c));
        expr.push_back(Element(Element::ElementType(opt2_id)));
        expr.push_back(Element(d));
        expr.push_back(Element(Element::ElementType(opt3_id)));
        expr.push_back(Element(Element::ElementType(opt1_id)));
    }
    else
    {
        expr.push_back(Element(a));
        expr.push_back(Element(b));
        expr.push_back(Element(c));
        expr.push_back(Element(d));
        expr.push_back(Element(Element::ElementType(opt3_id)));
        expr.push_back(Element(Element::ElementType(opt2_id)));
        expr.push_back(Element(Element::ElementType(opt1_id)));
    }
    return expr;
}
inline string intToString(int num)
{
    if(num==0) return "0";
    char sta[15];
    short top=-1;
    string str;
    if(num<0) str="-";
    while(num!=0) sta[++top]=(char)(num%10<0?-(num%10):num%10),num/=10;
    while(top>=0) str.push_back(sta[top]+'0'),top--;
    return str;
}
void dfs(const vector<TreeNode> &tree,string &str,const int &pos)
{
    #define PRI(TYPE) ((TYPE)==Element::add||(TYPE)==Element::sub?1:2)
    if(tree[pos].element.type==Element::num) str.append(intToString(tree[pos].element.data));
    else
    {
        if(!(tree[pos].f==-1||PRI(tree[pos].element.type)>PRI(tree[tree[pos].f].element.type)||\
        (PRI(tree[pos].element.type)==PRI(tree[tree[pos].f].element.type)&&pos==tree[tree[pos].f].l))) str.push_back('(');
        dfs(tree,str,tree[pos].l);
        str.append(optsChar[tree[pos].element.type]);
        dfs(tree,str,tree[pos].r);
        if(!(tree[pos].f==-1||PRI(tree[pos].element.type)>PRI(tree[tree[pos].f].element.type)||\
        (PRI(tree[pos].element.type)==PRI(tree[tree[pos].f].element.type)&&pos==tree[tree[pos].f].l))) str.push_back(')');
    }
    #undef PRI
}
inline void print(const vector<Element> &expr)
{
    vector<TreeNode> tree=makeTree(expr);
    int root;
    for(int i=0;i<tree.size();i++)
    {
        if(tree[i].f==-1)
        {
            root=i;
            break;
        }
    }
    string str;
    dfs(tree,str,root);
    cout<<str<<"\n";
}
inline int check(const vector<Element> &expr)
{
    try
    {
        return fabs(calc(expr)-24)<=EXP;
    }
    catch(int error_code)
    {
        if(error_code==500) return 0;
        else
        {
            printf("Unknown error! ");
            return 0;
        }
    }
}
inline void sol1(int a,int b,int c,int d)
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            for(int k=0;k<4;k++)
            {
                for(int t=0;t<5;t++)
                {
                    vector<Element> expr=makeExpr(a,b,c,d,i,j,k,t);
                    if(check(expr)) print(expr);
                }
            }
        }
    }
}
inline void sol2()
{
    for(int i=0;i<4;i++)
    {
        for(int j=0;j<4;j++)
        {
            if(j==i) continue;
            for(int k=0;k<4;k++)
            {
                if(k==i||k==j) continue;
                for(int l=0;l<4;l++)
                {
                    if(l==i||l==j||l==k) continue;
                    sol1(nums[i],nums[j],nums[k],nums[l]);
                }
            }
        }
    }
}
int main()
{
//  freopen("sol.txt","w",stdout);
    scanf("%d %d %d %d",&nums[0],&nums[1],&nums[2],&nums[3]);
    sol2();
    return 0;
}

谁是卧底:

#include<stdio.h>
#include<stdlib.h>
#include<string>
#include<time.h>
#define CARD_NUM 15
using namespace std;
bool pm_win(int peo_num,bool *peo_life,bool *wd_pla);
bool wd_win(int peo_num,bool *peo_life,bool *wd_pla);
int main()
{
    string pm[CARD_NUM]={"包菜","包子","被子","壁纸","风扇","饼干","纸巾","橙子","唇膏","平板","保安","水盆","气泡","魔术师","双胞胎"};
    string wd[CARD_NUM]={"生菜","饺子","床单","贴画","空调","薯片","湿巾","橘子","口红","ipad","保镖","水桶","水泡","魔法师","龙凤胎"};
    int peo_num=0;
    printf("请输入3~10的人数:");
    scanf("%d",&peo_num);
    while(!(peo_num<11&&peo_num>2))
    {
        system("cls");
        printf("人数只能为3~10");
        printf("请输入3~10的人数:");
        scanf("%d",&peo_num);   
    }
    int wd_num=peo_num%2==0?peo_num/2-1:peo_num/2;
    int ran_num=time(NULL);
    srand((unsigned)ran_num);
    int ca_num=rand()%CARD_NUM;
    ran_num++;
    bool wd_pla[10]={0,};
    bool peo_life[10]={1,1,1,1,1,1,1,1,1,1};
    for(int i=0;i<peo_num;i++)
    {
        if(wd_num==0) break;
        if(wd_num==peo_num-i)
        {
            wd_pla[i]=1;
            wd_num--;
        }
        else if(rand()%peo_num<wd_num)
        {
            wd_pla[i]=1;
            ran_num++;
            wd_num--;
        }
    }
    system("cls");
    for(int i=1;i<=peo_num;i++)
    {
        printf("玩家%d的单词是...\n",i);
        system("pause");
        system("cls");
        if(wd_pla[i-1]==1) printf("玩家%i的单词是%s\n",i,wd[ca_num].c_str());
        else printf("玩家%i的单词是%s\n",i,pm[ca_num].c_str());
        system("pause");
        system("cls");
    }
    while(!(pm_win(peo_num,peo_life,wd_pla)||wd_win(peo_num,peo_life,wd_pla)))
    {
        short answer=0;
        printf("请选出得票最高者:");
        scanf("%d",&answer);
        while (!(peo_life[answer-1]==1&&peo_num>=answer))
        {
            system("cls");
            if (peo_num<answer) printf("没有这个人\n");
            else printf("这个人已出局\n");
            printf("请选出得票最高者:");
            scanf("%d",&answer);
        }
        peo_life[answer-1]=0;
        system("cls");
    }
    if(pm_win(peo_num,peo_life,wd_pla)) printf("平民胜利!\n");
    else printf("卧底胜利!\n");
    system("pause");
}
bool pm_win(int peo_num,bool *peo_life,bool *wd_pla)
{
    for(int i=0;i<peo_num;i++)
    {
        if(peo_life[i]==1&&wd_pla[i]==1) return 0;
    }
    return 1;
}
bool wd_win(int peo_num,bool *peo_life,bool *wd_pla)
{
    for(int i=0;i<peo_num;i++)
    {
        if(peo_life[i]==1&&wd_pla[i]==0) return 0;
    }
    return 1;
}

人机对战井字棋:

#include<stdio.h>
#include<stdlib.h>
#include<vector>
#define GETBIT(ITEM,POS) ((ITEM)>>(POS)&1)
#define SETBIT(ITEM,POS,VALUE) ((VALUE)?(ITEM)|1<<(POS):(ITEM)&~(1<<(POS)))
using namespace std;
struct State
{
    enum BlockType{Empty=0,Black=1,White=2};
    enum EndType{No,BlackWin,WhiteWin,Dogfall};
    int data;
    State(int _data=0):data(_data)
    {
    }
    BlockType getBlockData(int x,int y)
    {
        return BlockType(data>>(3*x+y-4)*2&3);
    }
    State setBlockData(int x,int y,BlockType val)
    {
        return State(data&~(3<<(3*x+y-4)*2)|val<<(3*x+y-4)*2);
    }
    EndType getEnd()
    {
        bool blackWin=blackIsWin(),whiteWin=whiteIsWin();
        if(!blackWin&&!whiteWin)
        {
            if(isFull()) return Dogfall;
            return No;
        }
        if(blackWin&&!whiteWin) return BlackWin;
        if(!blackWin&&whiteWin) return WhiteWin;
    }
    bool blackIsWin()
    {
        for(int i=1;i<=3;i++)
        {
            if(getBlockData(i,1)==Black&&getBlockData(i,2)==Black&&getBlockData(i,3)==Black) return 1;
        }
        for(int i=1;i<=3;i++)
        {
            if(getBlockData(1,i)==Black&&getBlockData(2,i)==Black&&getBlockData(3,i)==Black) return 1;
        }
        if(getBlockData(1,1)==Black&&getBlockData(2,2)==Black&&getBlockData(3,3)==Black) return 1;
        if(getBlockData(1,3)==Black&&getBlockData(2,2)==Black&&getBlockData(3,1)==Black) return 1;
    }
    bool whiteIsWin()
    {
        for(int i=1;i<=3;i++)
        {
            if(getBlockData(i,1)==White&&getBlockData(i,2)==White&&getBlockData(i,3)==White) return 1;
        }
        for(int i=1;i<=3;i++)
        {
            if(getBlockData(1,i)==White&&getBlockData(2,i)==White&&getBlockData(3,i)==White) return 1;
        }
        if(getBlockData(1,1)==White&&getBlockData(2,2)==White&&getBlockData(3,3)==White) return 1;
        if(getBlockData(1,3)==White&&getBlockData(2,2)==White&&getBlockData(3,1)==White) return 1;
    }
    bool isFull()
    {
        for(int i=1;i<=3;i++)
        {
            for(int j=1;j<=3;j++)
            {
                if(getBlockData(i,j)==Empty) return 0;
            }
        }
        return 1;
    }
};
struct Node
{
    enum Next{Black,White};
    Next next;
    int end;
    vector<int> nextNode;
    Node(Next _next=Black,int _end=0):next(_next),end(_end)
    {
    }
}nodes[262144];
int dfs(State state)
{
    State::EndType end=state.getEnd();
    if(end!=State::No) return nodes[state.data].end=(end==State::BlackWin?1:(end==State::WhiteWin?-1:0));
    int maxe=-1,mine=1;
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++)
        {
            if(state.getBlockData(i,j)==State::Empty)
            {
                State tmp(state.setBlockData(i,j,nodes[state.data].next==Node::Black?State::Black:State::White));
                nodes[state.data].nextNode.push_back(tmp.data);
                nodes[tmp.data].next=(nodes[state.data].next==Node::Black?Node::White:Node::Black);
                int ans=dfs(tmp);
                maxe=max(maxe,ans),mine=min(mine,ans);
            }
        }
    }
    return nodes[state.data].end=(nodes[state.data].next==Node::Black?maxe:mine);
}
inline void print(State state)
{
    char maps[4][4];
    for(int i=1;i<=3;i++)
    {
        for(int j=1;j<=3;j++) maps[i][j]=(state.getBlockData(i,j)==State::Empty?' ':(state.getBlockData(i,j)==State::Black?'x':'o'));
    }
    printf("  | |  \n %c|%c|%c \n--+-+--\n %c|%c|%c \n--+-+--\n %c|%c|%c \n  | |  \n",maps[1][1],maps[1][2],maps[1][3],maps[2][1],maps[2][2],maps[2][3],maps[3][1],maps[3][2],maps[3][3]);
}
inline int getNext(int at)
{
    if(nodes[at].next==Node::Black)
    {
        int maxe=-1,ans;
        for(int i=0;i<nodes[at].nextNode.size();i++)
        {
            if(maxe<nodes[nodes[at].nextNode[i]].end)
            {
                maxe=nodes[nodes[at].nextNode[i]].end;
                ans=nodes[at].nextNode[i];
            }
        }
        return ans;
    }
    else
    {
        int mine=1,ans;
        for(int i=0;i<nodes[at].nextNode.size();i++)
        {
            if(mine>nodes[nodes[at].nextNode[i]].end)
            {
                mine=nodes[nodes[at].nextNode[i]].end;
                ans=nodes[at].nextNode[i];
            }
        }
        return ans;
    }
}
int at=0;
State::BlockType type;
int main()
{
    nodes[0].next=Node::Black;
    dfs(State(0));
    printf("Choose \"x\" or \"o\"(\"x\" is the first):");
    char ch;
    scanf("%c",&ch);
    if(ch=='x')
    {
        type=State::Black;
        print(State(at));
        int x,y;
        scanf("%d %d",&x,&y);
        while(State(at).getBlockData(x,y)!=State::Empty)
        {
            printf("This block is not empty!\n");
            scanf("%d %d",&x,&y);
        }
        at=State(at).setBlockData(x,y,type).data;
        State::EndType end=State(at).getEnd();
        if(end==State::BlackWin)
        {
            printf("\"x\" is WIN!\n");
            system("pause");
            return 0;
        }
        else if(end==State::WhiteWin)
        {
            printf("\"o\" is WIN!\n");
            system("pause");
            return 0;
        }
        else if(end==State::Dogfall)
        {
            printf("Dogfall!\n");
            system("pause");
            return 0;
        }
    }
    else type=State::White;
    while(1)
    {
        at=getNext(at);
        print(State(at));
        State::EndType end=State(at).getEnd();
        if(end==State::BlackWin)
        {
            printf("\"x\" is WIN!\n");
            system("pause");
            return 0;
        }
        else if(end==State::WhiteWin)
        {
            printf("\"o\" is WIN!\n");
            system("pause");
            return 0;
        }
        else if(end==State::Dogfall)
        {
            printf("Dogfall!\n");
            system("pause");
            return 0;
        }
        int x,y;
        scanf("%d %d",&x,&y);
        while(State(at).getBlockData(x,y)!=State::Empty)
        {
            printf("This block is not empty!\n");
            scanf("%d %d",&x,&y);
        }
        at=State(at).setBlockData(x,y,type).data;
        end=State(at).getEnd();
        if(end==State::BlackWin)
        {
            printf("\"x\" is WIN!\n");
            system("pause");
            return 0;
        }
        else if(end==State::WhiteWin)
        {
            printf("\"o\" is WIN!\n");
            system("pause");
            return 0;
        }
        else if(end==State::Dogfall)
        {
            printf("Dogfall!\n");
            system("pause");
            return 0;
        }
    }
    return 0;
}

小公举养成记:

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<time.h>
#include<string>
#include<cstring>
#include<fstream>
#define CH_L 1024
using namespace std;
int r_seed=time(0);
int random(int a,int b);
void game(char d_name[CH_L],char f_name[CH_L],int b_month,int b_data,char d_star[128],int sub_i[5],int money,int t_year,int t_month,bool t_talk,bool t_gift);
int main()
{
    char cmd=0;
    printf("请选择游戏模式:\n①新游戏\n②读档\n");
    cin>>cmd;
    if(cmd=='1')
    {
        char d_name[CH_L]={};//女儿名字
        char f_name[CH_L]={};//父亲名字
        char d_star[128]={};//星座名字
        int b_month=0;//生日月份
        int b_data=0;//生日日期
        string star[12][2]={
            {"摩羯座","水瓶座"},//1月
            {"水瓶座","双鱼座"},//2月 
            {"双鱼座","白羊座"},//3月
            {"白羊座","金牛座"},//4月
            {"金牛座","双子座"},//5月
            {"双子座","巨蟹座"},//6月
            {"巨蟹座","狮子座"},//7月
            {"狮子座","处女座"},//8月
            {"处女座","天秤座"},//9月
            {"天秤座","天蝎座"},//10月
            {"天蝎座","射手座"},//11月
            {"射手座","摩羯座"} //12月
        };//十二星座列表
        int star_d[12]={20,19,21,20,21,22,22,22,23,22,21,22};//十二星座跨度表
        //星座算法:star[month-1][data/star_d[month-1]]
        printf("请输入父亲姓名:");
        scanf("%s",f_name);
        printf("请输入女儿姓名:");
        scanf("%s",d_name);
        printf("请输入女儿出生月日(MM DD):");
        scanf("%d %d",&b_month,&b_data);
        strcpy(d_star,star[b_month-1][b_data/star_d[b_month-1]].c_str());
        //根据星座初始化属性
        const char sub_name[5][127]={"体力","智力","魅力","道德","气质"};
        int sub_i[5]={};
        int money=500;
        if(star[b_month-1][b_data/star_d[b_month-1]]=="摩羯座")
        {
            sub_i[0]=56;
            sub_i[1]=21;
            sub_i[2]=16;
            sub_i[3]=25;
            sub_i[4]=23;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="水瓶座")
        {
            sub_i[0]=41;
            sub_i[1]=43;
            sub_i[2]=20;
            sub_i[3]=23;
            sub_i[4]=17;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="双鱼座")
        {
            sub_i[0]=41;
            sub_i[1]=20;
            sub_i[2]=29;
            sub_i[3]=23;
            sub_i[4]=32;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="白羊座")
        {
            sub_i[0]=80;
            sub_i[1]=15;
            sub_i[2]=15;
            sub_i[3]=11;
            sub_i[4]=21;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="金牛座")
        {
            sub_i[0]=46;
            sub_i[1]=30;
            sub_i[2]=28;
            sub_i[3]=20;
            sub_i[4]=29;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="双子座")
        {
            sub_i[0]=50;
            sub_i[1]=35;
            sub_i[2]=23;
            sub_i[3]=8;
            sub_i[4]=20;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="巨蟹座")
        {
            sub_i[0]=40;
            sub_i[1]=31;
            sub_i[2]=33;
            sub_i[3]=17;
            sub_i[4]=33;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="狮子座")
        {
            sub_i[0]=85;
            sub_i[1]=9;
            sub_i[2]=11;
            sub_i[3]=20;
            sub_i[4]=37;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="处女座")
        {
            sub_i[0]=35;
            sub_i[1]=28;
            sub_i[2]=36;
            sub_i[3]=18;
            sub_i[4]=40;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="天秤座")
        {
            sub_i[0]=42;
            sub_i[1]=33;
            sub_i[2]=25;
            sub_i[3]=32;
            sub_i[4]=28;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="天蝎座")
        {
            sub_i[0]=50;
            sub_i[1]=25;
            sub_i[2]=40;
            sub_i[3]=18;
            sub_i[4]=17;
        }
        else if(star[b_month-1][b_data/star_d[b_month-1]]=="射手座")
        {
            sub_i[0]=57;
            sub_i[1]=31;
            sub_i[2]=15;
            sub_i[3]=19;
            sub_i[4]=20;
        }
        printf("----------------游戏开始----------------\n一天,%s收养了流浪的%s,开始了新生活\n",f_name,d_name);
        game(d_name,f_name,b_month,b_data,d_star,sub_i,money,1659,b_month,1,1);
        system("pause");
    }
    else
    {
        //读档
        char d_name[CH_L]={};//女儿名字
        char f_name[CH_L]={};//父亲名字
        char d_star[128]={};//星座名字
        int b_month=0;//生日月份
        int b_data=0;//生日日期
        string star[12][2]={
            {"摩羯座","水瓶座"},//1月
            {"水瓶座","双鱼座"},//2二
            {"双鱼座","白羊座"},//3月
            {"白羊座","金牛座"},//4月
            {"金牛座","双子座"},//5月
            {"双子座","巨蟹座"},//6月
            {"巨蟹座","狮子座"},//7月
            {"狮子座","处女座"},//8月
            {"处女座","天秤座"},//9月
            {"天秤座","天蝎座"},//10月
            {"天蝎座","射手座"},//11月
            {"射手座","摩羯座"} //12月
        };//十二星座列表
        int star_d[12]={20,19,21,20,21,22,22,22,23,22,21,22};//十二星座跨度表
        //星座算法:star[month-1][data/star_d[month-1]]
        int sub_i[5]={};
        int money;
        int t_year,t_month;
        bool t_talk,t_gift;
        fstream ifile("game_data.dat",ios::in|ios::binary);
        while(!ifile)
        {
            printf("未找到存档文件game_data.dat,请将存档文件放在当前目录下并重命名为game_data.dat\n");
            system("pause");
            ifile.open("game_data.dat",ios::in|ios::binary);
        }
        ifile.read(d_name,sizeof(d_name));
        ifile.read(f_name,sizeof(f_name));
        ifile.read((char*)(&b_month),sizeof(b_month));
        ifile.read((char*)(&b_data),sizeof(b_data));
        ifile.read((char*)(sub_i),sizeof(sub_i));
        ifile.read((char*)(&money),sizeof(money));
        ifile.read((char*)(&t_year),sizeof(t_year));
        ifile.read((char*)(&t_month),sizeof(t_month));
        ifile.read((char*)(&t_talk),sizeof(t_talk));
        ifile.read((char*)(&t_gift),sizeof(t_gift));
        strcpy(d_star,star[b_month-1][b_data/star_d[b_month-1]].c_str());
        game(d_name,f_name,b_month,b_data,d_star,sub_i,money,t_year,t_month,t_talk,t_gift);
        system("pause");
    }
    return 0;
}
int random(int a,int b)
{
    srand(r_seed);
    r_seed++;
    return rand()%(b-a+1)+a;
}
void game(char d_name[CH_L],char f_name[CH_L],int b_month,int b_data,char d_star[128],int sub_i[5],int money,int t_year,int t_month,bool t_talk,bool t_gift)
{
    const char sub_name[5][127]={"体力","智力","魅力","道德","气质"};
    for(int year=t_year;year<=1659+8;year++)
    {
        for(int month=(year==t_year)?t_month:1;month<=12;month++)
        {
            bool gift=((year==t_year&&month==t_month)?t_gift:1);
            printf("当前时间:%d年%d月\n",year,month);
            if(month==b_month&&gift)
            {
                //进行生日操作
                //岁数计算:year-1648
                printf("今天是%s的%d岁生日,要花200金买礼物吗?(y/n)\n",d_name,year-1649);
                char tmp;
                cin>>tmp;
                if(tmp=='y')
                {
                    if(money>=200)
                    {
                        printf("花费200金买了个精美的礼物,%s很开心\n",d_name);
                        //对属性进行操作,并通知玩家
                        money-=200;
                        for(int i=0;i<5;i++)
                        {
                            int tmp=random(1,15);
                            sub_i[i]+=tmp;
                            printf("%s+%d\n",sub_name[i],tmp);
                        }
                        gift=0;
                    }
                    else printf("钱不够\n");
                }
            }
            //进行月份安排
            bool talk=((year==t_year&&month==t_month)?t_talk:1);//是否谈过话 
            for(bool finish=0;!finish;)
            {
                char cmd;
                printf("要做什么事吗?\n①查看状态\n②安排行程\n③谈话\n④存档\n");
                cin>>cmd;
                switch(cmd)
                {
                    case '1':
                        //显示状态
                        printf("金币:%d\n星座:%s\n",money,d_star);
                        for(int i=0;i<5;i++)
                        {
                            printf("%s:%-4d",sub_name[i],sub_i[i]);
                            for(int j=1;j<=10;j++)
                            {
                                if(sub_i[i]/10>=j) printf("■");
                                else printf("□");
                            }
                            printf("\n");
                        }
                        break;
                    case '2':
                        //安排行程
                        for(int i=0;i<3;i++)
                        {
                            char cmd;
                            printf("%d月%s,要做些什么呢?\n①学习武艺\n②上私塾\n③学习礼法\n④打工赚钱\n",month,i==0?"上旬":(i==1?"中旬":"下旬"));
                            cin>>cmd;
                            switch(cmd)
                            {
                                case '1':
                                    if(money==0)
                                    {
                                        printf("没钱了,强制打工\n");
                                        int tmp=random(100,250);
                                        money+=tmp;
                                        printf("金钱+%d\n",tmp);
                                        break;
                                    }
                                    else
                                    {
                                        int tmp1=random(0,5);
                                        int tmp2=random(0,5);
                                        int tmp3=random(0,10);
                                        printf("哼哼哈兮,快使用双节棍...\n");
                                        printf("%s+%d\n%s+%d\n金钱-%d\n",sub_name[0],tmp1,sub_name[2],tmp2,tmp3<=money?tmp3:money);
                                        sub_i[0]+=tmp1;
                                        sub_i[2]+=tmp2;
                                        money-=tmp3<=money?tmp3:money;
                                        break;
                                    }
                                case '2':
                                    if(money==0)
                                    {
                                        printf("没钱了,强制打工\n");
                                        int tmp=random(100,250);
                                        money+=tmp;
                                        printf("金钱+%d\n",tmp);
                                        break;
                                    }
                                    else
                                    {
                                        int tmp1=random(0,5);
                                        int tmp2=random(0,5);
                                        int tmp3=random(0,10);
                                        printf("学而不思则罔,思而不学则殆...\n");
                                        printf("%s+%d\n%s+%d\n金钱-%d\n",sub_name[1],tmp1,sub_name[4],tmp2,tmp3<=money?tmp3:money);
                                        sub_i[1]+=tmp1;
                                        sub_i[4]+=tmp2;
                                        money-=tmp3<=money?tmp3:money;
                                        break;
                                    }
                                case '3':
                                    if(money==0)
                                    {
                                        printf("没钱了,强制打工\n");
                                        int tmp=random(100,250);
                                        money+=tmp;
                                        printf("金钱+%d\n",tmp);
                                        break;
                                    }
                                    else
                                    {
                                        int tmp1=random(0,5);
                                        int tmp2=random(0,5);
                                        int tmp3=random(0,10);
                                        printf("中国,是礼仪之邦...\n");
                                        printf("%s+%d\n%s+%d\n金钱-%d\n",sub_name[3],tmp1,sub_name[4],tmp2,tmp3<=money?tmp3:money);
                                        sub_i[3]+=tmp1;
                                        sub_i[4]+=tmp2;
                                        money-=tmp3<=money?tmp3:money;
                                        break;
                                    }
                                default:
                                    {
                                        int tmp=random(100,250);
                                        money+=tmp;
                                        printf("金钱+%d\n",tmp);
                                        break;
                                    }
                            }
                        }
                        finish=1;
                        break;
                    case '3':
                        if(talk)
                        {
                            //谈话
                            int cmd;
                            printf("请选择谈话方式:\n①打招呼\n②聊天\n③严厉的教育\n④给零花钱\n");
                            scanf("%d",&cmd);
                            switch(cmd)
                            {
                                case 1:
                                    printf("哈喽!\n");
                                    //打招呼无影响
                                    break;
                                case 2:
                                    printf("......\n");
                                    //聊天无影响
                                    break;
                                case 3:
                                    {
                                        printf("你对%s进行了严厉的教育\n",d_name);
                                        int l_d=random(0,15);
                                        sub_i[3]+=l_d;
                                        printf("%s+%d\n",sub_name[3],l_d);
                                    }
                                    break;
                                default:
                                    printf("你给了%s零花钱100金\n",d_name);
                                    //对属性进行操作,并通知玩家
                                    if(money>=100)
                                    {
                                        money-=100;
                                        int num=random(10,25);
                                        int l_sub_i[5]={};
                                        for(int i=0;i<num;i++)
                                        {
                                            l_sub_i[random(0,4)]++;
                                        }
                                        for(int i=0;i<5;i++)
                                        {
                                            sub_i[i]+=l_sub_i[i];
                                            if(l_sub_i[i]>0) printf("%s+%d\n",sub_name[i],l_sub_i[i]);
                                        }
                                    }
                                    else printf("钱不够,需100金\n");
                                    break;
                            }
                            talk=0;
                        }
                        else printf("这个月已谈话\n");
                        break;
                    default:
                        fstream ofile("game_data.dat",ios::out|ios::binary);
                        ofile.write(d_name,CH_L);
                        ofile.write(f_name,CH_L);
                        ofile.write((char*)(&b_month),sizeof(b_month));
                        ofile.write((char*)(&b_data),sizeof(b_data));
                        ofile.write((char*)(sub_i),20);
                        ofile.write((char*)(&money),sizeof(money));
                        ofile.write((char*)(&year),sizeof(year));
                        ofile.write((char*)(&month),sizeof(month));
                        ofile.write((char*)(&talk),sizeof(talk));
                        ofile.write((char*)(&gift),sizeof(gift));
                        printf("已存档为game_data.dat\n");
                        ofile.close();
                        break;
                }
            }
        }
    }
    //进行结局判定
    if(sub_i[0]+sub_i[1]+sub_i[2]+sub_i[3]+sub_i[4]>=2000) printf("经过刻苦修炼,恭喜你登基为女王陛下!!!\n----------------游戏结束----------------\n");//女王
    else if(sub_i[0]+sub_i[1]+sub_i[2]+sub_i[3]+sub_i[4]>=1800) printf("经过刻苦修炼,恭喜你成为为王妃!!\n----------------游戏结束----------------\n");//王妃
    else if(sub_i[0]+sub_i[1]+sub_i[2]+sub_i[3]+sub_i[4]>=1600) printf("经过刻苦修炼,恭喜你成为为女将军!\n----------------游戏结束----------------\n");//女将军
    else if(sub_i[0]+sub_i[1]+sub_i[2]+sub_i[3]+sub_i[4]>=1200)
    {
        if(sub_i[0]>sub_i[1]&&sub_i[0]>sub_i[2]&&sub_i[0]>sub_i[3]&&sub_i[0]>sub_i[4]) printf("经过刻苦修炼,恭喜你成为为近卫骑士团长!\n----------------游戏结束----------------\n");//近卫骑士团长
        else if(sub_i[1]>sub_i[0]&&sub_i[1]>sub_i[2]&&sub_i[1]>sub_i[3]&&sub_i[1]>sub_i[4]) printf("经过刻苦修炼,恭喜你成为为皇家学院总裁!\n----------------游戏结束----------------\n");//皇家学院总裁
        else if(sub_i[2]>sub_i[1]&&sub_i[2]>sub_i[0]&&sub_i[2]>sub_i[3]&&sub_i[2]>sub_i[4]) printf("经过刻苦修炼,恭喜你成为为国王的宠妃!\n----------------游戏结束----------------\n");//国王的宠妃
        else if(sub_i[3]>sub_i[1]&&sub_i[3]>sub_i[2]&&sub_i[3]>sub_i[0]&&sub_i[3]>sub_i[4]) printf("经过刻苦修炼,恭喜你成为为高级祭祀!\n----------------游戏结束----------------\n");//高级祭祀
        else if(sub_i[4]>sub_i[1]&&sub_i[4]>sub_i[2]&&sub_i[4]>sub_i[3]&&sub_i[4]>sub_i[0]) printf("经过刻苦修炼,恭喜你成为为公主!\n----------------游戏结束----------------\n");//公主
    }
    else//随机    农妇,魔术师,修女,作家,酒吧女郎
    {
        int tmp=random(0,5);
        string job[5]={"农妇","魔术师","修女","作家","酒吧女郎"};
        printf("经过刻苦修炼,恭喜你成为为%s!\n----------------游戏结束----------------\n",job[tmp].c_str());
    }
}