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

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

/********************************
 *文件名: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.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值