老九学堂C++实现小游戏之小公主养成记

戏子无情 提交于 2020-01-07 08:13:20

本程序根据老九学堂许嵩老师的课程编写,部分功能限于时间和能力暂时还未完成。完成此程序对于游戏实现有了大体的了解,结合到平时玩的游戏,理解了一些机制的实现原理。以后有时间会逐步完善背景音乐、存档、读档、战斗系统。

/********************************
 *文件名:main.cpp
 *描述:小公主养成记 代码实战
 *作者:li
 *时间:2020.1.6
 *版权:www.cnblogs.com/lijitao/
 ********************************/
#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <vector>
#include <array>

using namespace std;

/***/
int main()
{
    //1.为父女取名字
    /** 父亲的姓名 */
    string value_father_name;
    /**  女儿的姓名 */
    string value_daughter_name;


    //2.为女儿录入信息(生日、星座)
    //  根据女儿的星座,设置游戏的基本参数(体力、智力、魅力、道德、气质)
    /** 女儿出生月份 */
    int  value_birth_month;
    /** 女儿出生的日期 */
    int value_birth_date;
    /** 女儿的星座 */
    string value_daughter_constell;
    /** 女儿的五项基本信息: 体力、智力、魅力、道德、气质 */
    array<int,5> value_array_baseinfo;  // 动态分配内存的数组
    /** 五项基本属性名 */
    array<string,5> value_array_baseinfo_names = {"体力","智力","魅力","道德","气质"};
    /** 金钱 */
    int value_daughter_gold = 500;
    /** 星座的二维数组 */
    string constell_names[12][2] =
    {
        {"山羊座","水瓶座"},  //一月
        {"水瓶座","双鱼座"},  //二月
        {"双鱼座","白羊座"},  //三月
        {"白羊座","金牛座"},  //四月
        {"金牛座","双子座"},  //五月
        {"双子座","巨蟹座"},  //六月
        {"巨蟹座","狮子座"},  //七月
        {"狮子座","处女座"},  //八月
        {"处女座","天秤座"},  //九月
        {"天秤座","天蝎座"},  //十月
        {"天蝎座","射手座"},  //十一月
        {"射手座","山羊座"},  //十二月
    };


    int choice,temp1,temp2,temp3;

    cout << "父亲的姓名:";
    cin >> value_father_name;
    cout <<"女儿的姓名:";
    cin >> value_daughter_name;
    cout << "女儿的生日(格式:月 日):";
    cin >> value_birth_month >> value_birth_date;

    /** 各月份的跨星座日期*/
    int constell_dates[] {20,19,21,20,21,22,23,23,23,24,23,22};
    value_daughter_constell = constell_names[value_birth_month-1][value_birth_date / constell_dates[value_birth_month-1]];

    cout << endl << "女儿的信息:" << endl;
    cout << "姓名:" << value_daughter_name << endl;
    cout << "生日:1659-" << value_birth_month << "-" << value_birth_date << endl;
    cout << "星座:" << value_daughter_constell << endl;
    cout << "金币:" << value_daughter_gold << endl;

    if(value_daughter_constell == "白羊座" )
    {

        value_array_baseinfo[0] = 80;
        value_array_baseinfo[1] = 18;
        value_array_baseinfo[2] = 18;
        value_array_baseinfo[3] = 28;
        value_array_baseinfo[4] = 14;
    }
    else if(value_daughter_constell == "金牛座")
    {
        value_array_baseinfo[0] = 65;
        value_array_baseinfo[1] = 30;
        value_array_baseinfo[2] = 28;
        value_array_baseinfo[3] = 35;
        value_array_baseinfo[4] = 20;
    }
    else if(value_daughter_constell == "双子座" )
    {
        value_array_baseinfo[0] = 50;
        value_array_baseinfo[1] = 35;
        value_array_baseinfo[2] = 23;
        value_array_baseinfo[3] = 26;
        value_array_baseinfo[4] = 27;
    }

    else if(value_daughter_constell == "巨蟹座" )
    {
        value_array_baseinfo[0] = 40;
        value_array_baseinfo[1] = 31;
        value_array_baseinfo[2] = 31;
        value_array_baseinfo[3] = 23;
        value_array_baseinfo[4] = 37;
    }
    else if(value_daughter_constell == "狮子座" )
    {
        value_array_baseinfo[0] = 85;
        value_array_baseinfo[1] = 35;
        value_array_baseinfo[2] = 11;
        value_array_baseinfo[3] = 28;
        value_array_baseinfo[4] = 20;
    }
    else if(value_daughter_constell == "处女座" )
    {
        value_array_baseinfo[0] = 35;
        value_array_baseinfo[1] = 28;
        value_array_baseinfo[2] = 36;
        value_array_baseinfo[3] = 29;
        value_array_baseinfo[4] = 18;
    }
    else if(value_daughter_constell == "天秤座" )
    {
        value_array_baseinfo[0] = 42;
        value_array_baseinfo[1] = 33;
        value_array_baseinfo[2] = 25;
        value_array_baseinfo[3] = 24;
        value_array_baseinfo[4] = 32;
    }
    else if(value_daughter_constell == "天蝎座" )
    {
        value_array_baseinfo[0] = 50;
        value_array_baseinfo[1] = 25;
        value_array_baseinfo[2] = 40;
        value_array_baseinfo[3] = 20;
        value_array_baseinfo[4] = 26;
    }
    else if(value_daughter_constell == "射手座" )
    {
        value_array_baseinfo[0] = 57;
        value_array_baseinfo[1] = 31;
        value_array_baseinfo[2] = 25;
        value_array_baseinfo[3] = 26;
        value_array_baseinfo[4] = 29;
    }
    else if(value_daughter_constell == "山羊座" )
    {
        value_array_baseinfo[0] = 56;
        value_array_baseinfo[1] = 30;
        value_array_baseinfo[2] = 26;
        value_array_baseinfo[3] = 22;
        value_array_baseinfo[4] = 25;
    }
    else if(value_daughter_constell == "水瓶座" )
    {
        value_array_baseinfo[0] = 41;
        value_array_baseinfo[1] = 43;
        value_array_baseinfo[2] = 20;
        value_array_baseinfo[3] = 27;
        value_array_baseinfo[4] = 23;
    }
    else if(value_daughter_constell == "双鱼座" )
    {
        value_array_baseinfo[0] = 41;
        value_array_baseinfo[1] = 40;
        value_array_baseinfo[2] = 29;
        value_array_baseinfo[3] = 25;
        value_array_baseinfo[4] = 23;
    }

    //3.开始游戏大循环
    //游戏从1659年6月开始开始
    for(int year = 1659; year <= 1659 + 7; year++)
    {
        for(int month = (year == 1659) ? 6 : 1; month <= 12; month++)
        {
            //判断本月是否是女儿的生日
            if(month == value_birth_month)
            {
                cout << "本月是" << value_daughter_name <<"生日哦~" << endl;
                //根据用户的输入进行判断

                //待写


            }

            //显示游戏主菜单
            cout << "\n 1、查看状态\n 2、安排行程\n 3、亲自谈话\n 4、存档\n 5、读档" << endl;
            cin >> choice;
            switch(choice)
            {
                case 1: //查看状态
                 cout << endl << "女儿的信息:" << endl;
                 cout << "姓名:" << value_daughter_name << endl;
                 cout << "生日:1659-" << value_birth_month << "-" << value_birth_date << endl;
                 cout << "星座:" << value_daughter_constell << endl;
                 cout << "金币:" << value_daughter_gold << endl;
                 //打印核心属性
                 cout << left; //左对齐

                     for(int i = 0; i < 5; i++)
                 {
                     cout << value_array_baseinfo_names[i] << ":" << setw(2) << value_array_baseinfo[i];
                     //计算实心方方框的数量
                     int solidCount = value_array_baseinfo[i] / 10;
                     for(int j = 0; j < 10; j++)
                     {
                         if(j < solidCount)
                             cout << "■";
                         else
                             cout << "□";
                     }
                     cout << endl;
                 }
                 break;
            case 2:   //安排行程:一个月最多安排3个行程
            {
                string month_parts[] = {"上旬","中旬","下旬"};
                for(int i = 0; i < 3; i++)
                {
                    cout << year << "年" <<"--" << month << "月 --" << month_parts[i] << endl;
                    cout <<"1、学习武术\n 2、上私塾\n 3、学习礼法\n 4、出城修行\n 5、打工赚钱" << endl;
                    cout << "请选择:";
                    cin >> choice;
                    //以后补充:如果没钱就强制打工
                    srand(time(NULL));
                    if(choice == 1)   // +体力 +魅力 -金钱 随机数字
                    {
                        value_array_baseinfo[0] += temp1 = rand() % 10;
                        value_array_baseinfo[2] += temp2 = rand() % 10;
                        value_daughter_gold -= temp3 = rand() % 51;
                        cout << value_daughter_name << "学习到了绝学!" << endl;
                        cout << "体力+" << temp1 << ",魅力+" << temp2 << ",金钱-"<< temp3 << endl;
                    }
                    else if(choice == 5)
                    {
                        value_daughter_gold += temp3 = rand() % 101;
                        cout << "通过努力打工,赚到了" << temp3 << "个金币!" << endl;
                    }

                }
                break;
            }
            case 3: cout << "暂时未完成(只写了1 2 5)" << endl;
                break;
            case 4: cout << "暂时未完成(只写了1 2 5)" << endl;
                break;
            case 5: cout << "暂时未完成(只写了1 2 5)" << endl;
                break;
            default: cout << "暂时未完成(只写了1 2 5)" << endl;
                break;


            }
        }
    }//4、根据各项参数、判定游戏结果
    /*
    女       王:  >2000
    王       妃: (1800, 2000]
    女   将   军:(1600, 1800]
    皇家学院总裁: (1200, 1600],智力最高,且魅力>气质
    公        主:(1200, 1600],气质最高,且魅力>体力
    近卫骑士团长:(1200, 1600],体力最高,且气质>魅力
    高级    祭司:(1200, 1600],魔法最高,且道德>武艺
    国王的  宠妃:(1200, 1600],魅力最高,且气质>道德
    农妇、魔法师、修女、作家、酒吧女郎:<=1200,随机分配身份
    */

    //计算女儿当前总的属性得分
    int sum = 0; //声明女儿当前获得的金币总量
    for(int j = 0; j < 10; j++)
    {
        sum += value_array_baseinfo[j];
    }
    cout << "女儿" << value_daughter_name << "当前总的属性得分为:" << sum << endl;
    cout << endl;
    //评定女儿最终的成长等级
    if(sum > 2000){
        cout << "最优游戏结果:登基为女王陛下。" << endl;
    }
    else if(sum > 1800 && sum <= 2000){
        cout << "游戏结果第二名:成为王妃。" << endl;
    }
    else if(sum > 1600 && sum <= 1800){
        cout << "游戏结果第三名:成为女将军。" << endl;
    }
    else if(sum > 1200 && sum <= 1600)
    {
        //先求出这10个属性的最大值和最小值
        int maxValue = value_array_baseinfo[0]; //声明一个最大值,并初始化为value_array_attributes收割元素的值
        int maxIndex = 0;      //记录最大值在数组元素中的位置
        for(int i = 1; i < 10; i++)
        {
            if(maxValue < value_array_baseinfo[i])
            {
                maxValue = value_array_baseinfo[i];
                maxIndex = i;
            }
        }
        cout << "女儿的10个属性中,得分最高的属性在数组中的位置为" << maxIndex  << ",取值为:" << maxValue << endl;

        if(maxValue == value_array_baseinfo[1] && value_array_baseinfo[2] > value_array_baseinfo[5])
        {
            cout << "女儿成长为:皇家学院总裁。" << endl;   //智力最高,且魅力>气质
        }
        else if(maxValue == value_array_baseinfo[5] && value_array_baseinfo[2] > value_array_baseinfo[0])
        {
            cout << "女儿成长为:公主。" << endl;   //气质最高,且魅力>体力
        }
        else if(maxValue == value_array_baseinfo[0] && value_array_baseinfo[5] > value_array_baseinfo[2])
        {
            cout << "女儿成长为:近卫骑士团长。" << endl;  //体力最高,且气质>魅力
        }

        else if(maxValue == value_array_baseinfo[9] && value_array_baseinfo[3] > value_array_baseinfo[8])
        {
            cout << "女儿成长为:高级祭司。" << endl;  //魔法最高,且道德>武艺
        }
        else if(maxValue == value_array_baseinfo[2] && value_array_baseinfo[5] > value_array_baseinfo[4])
        {
            cout << "女儿成长为:国王的宠妃。" << endl;  //魅力最高,且气质>道德
        }

    }
    else if(sum <= 1200) //农妇、魔法师、修女、作家、酒吧女郎:<=1200,随机分配身份
    {
        array<string, 5> value_daughter_role = {"农妇", "魔法师", "修女", "作家", "酒吧女郎"};
        string role; //声明一个角色变量
        srand((unsigned) time(NULL));  //设定随机数种子
        role = value_daughter_role[rand() % 5];
        cout <<  "女儿最终成长为:" << role << "。" << endl;
    }


    return 0;
}

THE END.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!