C++ 实现《少女养成类游戏》

春节过完了,博主在这里还是给大家拜个年,正好今天还是一年一度杀单身狗的节日,在这里祝大家双节快乐,博主呢好久没更新博客了,博主在上学期报名了一个比赛,南桥杯的c++组,报名的时候呢还一点也不会,正好就借这个假期自学了一下c++ ,虽然不能说已经精通,但是什么运算符重载啊, 引用变量啊, 函数重载啊,指针操作啊,STL标准库啊………还是略知一二的,还有几天就开学了,然后自己就用c++做了一个项目,就是一个养成类的小游戏,逻辑还是很简单的 ,但是麻雀虽小五脏俱全,这里面包含了很多c++的基本操作 ,废话不多说直接贴代码了:(因为注释在代码已经写的很详细了 完全可以读懂 所以在这里就不介绍代码逻辑了 代码可以直接就拿来用,项目还不是很完善 欢迎大家进行改进 如果有留言 需要讲解代码逻辑的话 博主会抽空在博客里面进行讲解)

代码效果:
C++ 实现《少女养成类游戏》_第1张图片
C++ 实现《少女养成类游戏》_第2张图片

选择活动模块的头文件代码:

#ifndef ACTIVE_H_INCLUDED
#define ACTIVE_H_INCLUDED
#include 
#include 
#include"Value.h"
#define random(a,b) a+rand()%(b-a)

// 选择活动模块
using namespace std;

// 函数声明
/** 改值函数 */
void change_value(int);
/** 活动执行类容分配函数 */
void active(int);
/** 根据属性值得出玩家最后的角色 */
void jump_to_role();

// 变量定义
/** 执行不同活动后属性点数的变化值 */
const int array_value_change_attribut[][10]{
        { -5,  4,  2,  3,  3,  4,  2,  3,  0,  0},// 学习知识
        { -8,  1,  5,  2,  1,  4,  3,  3,  0,  0},// 学习舞蹈
        { -9,  0, -4,  2,  1,  1,  2,  1,  4,  0},// 学习武术
        { -6,  2,  1,  2,  1,  2,  1,  1,  0,  3},// 学习魔法
        { -4,  0,  2,  2,  3,  2,  1,  1,  0,  0},// 出去运动
        { -3,  0,  1,  2,  3,  2,  4,  4,  1,  0},// 出去散步
        { -2,  1,  5,  1,  2,  3,  2, -1,  0,  0},// 出去购物
        {-10,  2,  1,  1,  2,  1,  3,  4,  0,  0},// 出去打工
        {  5,  0,  0,  2,  0, -1,  1,  3,  0,  1} // 吃东西
};

/** 不同活动所花费金钱的随机数上限和下限 */
const int array_value_random_cost[][2]{
    { 30, 80},// 学习知识
    { 10, 60},// 学习舞蹈
    { 10, 60},// 学习武术
    { 10, 70},// 学习魔法
    { 10, 20},// 出去运动
    { 10, 20},// 出去散步
    { 30,100},// 出去购物
    {-60,-30},// 出去打工
    { 10, 50} // 吃东西
};

/** 不同活动所花费时间的随机数上限和下限 */
const int array_value_random_date[][6]{
     { 1,25, 0, 1, 0, 1},// 学习知识
     { 1,25, 0, 2, 0, 1},// 学习舞蹈
     { 1,10, 0, 2, 0, 1},// 学习武术
     { 1,10, 0, 2, 0, 1},// 学习魔法
     { 1, 2, 0, 0, 0, 1},// 出去运动
     { 1, 2, 0, 1, 0, 1},// 出去散步
     { 1, 2, 0, 1, 0, 1},// 出去购物
     { 1,25, 0, 2, 0, 1},// 出去打工
     { 1, 2, 0, 1, 0, 1} // 吃东西
};

// 函数实现
/**
* @param active_num     活动编号
*/
void active(int active_num){
    srand((int) time(NULL));
    change_value(active_num - 1);
    int money_cost = random(array_value_random_cost[active_num-1][0],array_value_random_cost[active_num-1][1]);
    value_money -= money_cost;
    // 三目表达式的作用是判断是否是花钱(-)还是赚钱(+)
    cout << "\b金钱 " << (money_cost > 0 ?"-":"+")<<abs(money_cost) << endl;

    change_data(random(array_value_random_date[active_num-1][0],array_value_random_date[active_num-1][1]),
                random(array_value_random_date[active_num-1][2],array_value_random_date[active_num-1][3]),
                random(array_value_random_date[active_num-1][4],array_value_random_date[active_num-1][5])
                );

}


void change_value(int mode_num){
    for(int i = 0;i < 10;i++){
        if(array_value_change_attribut[i] < 0){
            cout << array_value_name[i] << " " << array_value_change_attribut[mode_num][i] << "  ";
        }
        else if(array_value_change_attribut[i] > 0){
            cout << array_value_name[i] << " +" << array_value_change_attribut[mode_num][i] << "  ";
        }
        (*(ptr_array_value[i])) += array_value_change_attribut[mode_num][i];
    }
    cout << endl;
}

void jump_to_role(){
int max_attr = max_attribute();
    int attribute_total = value_power+
                          value_iq+
                          value_charm+
                          value_self_esteem+
                          value_moral+
                          value_temperament+
                          value_feeling+
                          value_thoughfulness+
                          value_ad+
                          value_ap;
    if(attribute_total > 2000){
            cout << array_role_name[0]<<endl;
    }
    else if(attribute_total > 1800){
            cout << array_role_name[1]<<endl;
    }
    else if(attribute_total > 1600){
            cout << array_role_name[2]<<endl;
    }
    else if(attribute_total > 1200 && max_attr == value_iq && value_power < value_iq){
            cout << array_role_name[3]<<endl;
    }
    else if(attribute_total > 1200 && max_attr == value_temperament && value_charm > value_power){
            cout << array_role_name[4]<<endl;
    }
    else if(attribute_total > 1200 && max_attr == value_power && value_temperament > value_charm){
            cout << array_role_name[5]<<endl;
    }
    else if(attribute_total > 1200 && max_attr == value_moral && value_charm > value_temperament){
            cout << array_role_name[6]<<endl;
    }
    else if(attribute_total > 1200 && max_attr == value_charm && value_temperament > value_moral){
            cout << array_role_name[7]<<endl;
    }
    else{
        cout << array_role_name[random(8,13)]<<endl;
    }
}

#endif // ACTIVE_H_INCLUDED

谈话模块头文件代码:

#ifndef TALK_H_INCLUDED
#define TALK_H_INCLUDED
#include 
#include 
#include"Value.h"
#define random(a,b) a+rand()%(b-a)
// 选择谈话模块

// 函数声明
/** 严厉谈话 */
void talkSevere();
/** 温柔谈话 */
void talkGentle();
/** 给零花钱 */
void giveMoney();

// 函数实现
void talkSevere()
{
    cout << "\b严厉训骂" << endl;
    int array_value_change[] {-1, 0, 1,-3, 5, 3,-2,-1, 0, 0};
    for(int i = 0 ;i<10 ;i++){
        if(array_value_change[i] < 0){
            cout << array_value_name[i] << " " << array_value_change[i] << "  ";
        }
        else if(array_value_change[i] > 0){
            cout << array_value_name[i] << " +" << array_value_change[i] << "  ";
        }
        (*(ptr_array_value[i]))+= array_value_change[i];
    }
    cout << endl;
}

void talkGentle(){
    cout << "\b温柔的说" << endl;
    int array_value_change[] { 0, 2, 2, 1, 3, 2, 4, 5, 0, 0};
    for(int i = 0 ;i<10 ;i++){
        if(array_value_change[i] < 0){
            cout << array_value_name[i] << " " << array_value_change[i] << "  ";
        }
        else if(array_value_change[i] > 0){
            cout << array_value_name[i] << " +" << array_value_change[i] << "  ";
        }
        (*(ptr_array_value[i]))+= array_value_change[i];
    }
    cout << endl;
}

void giveMoney(){
    srand((int)time(0));
    cout << "\b给零花钱" << endl;
    int array_value_change[] { 1, 0, 2, 3, 0, 2, 3, 4, 0, 0};
    for(int i = 0 ;i<10 ;i++){
        if(array_value_change[i] < 0){
            cout << array_value_name[i] << " " << array_value_change[i] << "  ";
        }
        else if(array_value_change[i] > 0){
            cout << array_value_name[i] << " +" << array_value_change[i] << "  ";
        }
        (*(ptr_array_value[i]))+= array_value_change[i];
    }
    cout << endl;
    cout << "---------------------------"<< endl
         << "\t\b︿( ̄︶ ̄)︿" << endl
         << "---------------------------"<< endl;
    // 随机给零花钱(50~100)
    int add_money = random(50,100);
    value_money += add_money;
    cout << "\b金钱 +" << add_money << endl;
}
#endif // TALK_H_INCLUDED

属性存放 属性操作模块头文件代码:

#ifndef VALUE_H_INCLUDED
#define VALUE_H_INCLUDED
#include 
using namespace std;
// 参数头文件

// 函数声明

void initValue();
void showValue();
void inputValue();
void change_data(int=0,int=0,int=0);
int max_attribute();

// 变量定义

/** 星座 */
string value_constellation;
/** 生日 */
string value_birthday = "1965/";
/** 父亲名字 */
string  value_father_name;
/** 少女名字 */
string value_girl_name;
/** 血型 */
string value_blood_type;
/** 当前年 */
int value_year = 1965;
/** 当前月 */
int value_month = 1;
/** 当前日 */
int value_day = 1;
/** 年龄 */
int value_age = 0;
/** 金钱 */
int value_money;
/** 体力 */
int value_power;
/** 智力 */
int value_iq;
/** 魅力 */
int value_charm;
/** 自尊 */
int value_self_esteem;
/** 道德 */
int value_moral;
/** 气质 */
int value_temperament;
/** 感受 */
int value_feeling;
/** 体贴 */
int value_thoughfulness;
/** 武力 */
int value_ad;
/** 魔法 */
int value_ap;
/** 过去的月初始为零 */
int past_month = 0;
/** 属性值数组(指针数组) **/
int * ptr_array_value[]{ &value_power,
                         &value_iq,
                         &value_charm,
                         &value_self_esteem,
                         &value_moral,
                         &value_temperament,
                         &value_feeling,
                         &value_thoughfulness,
                         &value_ad,
                         &value_ap
};
/** 各星座所对应的初始值 */
int array_init_value[12][10]{
    {56,21,16,22,25,23,17,40,20,31},
    {43,41,20,27,23,17,32,11,17,38},
    {41,20,29,25,23,32,35,20,19,35},
    {80,15,15,25,11,21,21,10,45,35},
    {46,30,28,35,20,26,20,23,20,20},
    {50,35,23,26, 8,20,42,12,25,40},
    {40,31,33,23,17,33,37,14,16,40},
    {85, 9,11,28,20,37,10,12,37,25},
    {35,28,36,19,18,40,30,32,10,33},
    {42,33,25,24,32,28,29,18,20,30},
    {50,25,40,20,18,17,33,10,18,45},
    {57,31,15,26,17,20,20,23,26,34}
};

/** 星座字典 */
string constellation_dict[12][2] {
        {"\b摩羯座","\b水瓶座"},
        {"\b水瓶座","\b双鱼座"},
        {"\b双鱼座","\b白羊座"},
        {"\b白羊座","\b金牛座"},
        {"\b金牛座","\b双子座"},
        {"\b双子座","\b巨蟹座"},
        {"\b巨蟹座","\b狮子座"},
        {"\b狮子座","\b处女座"},
        {"\b处女座","\b天秤座"},
        {"\b天秤座","\b天蝎座"},
        {"\b天蝎座","\b射手座"},
        {"\b射手座","\b摩羯座"},
    };
/** 星座月份临界点 */
int array_boundaries[]{19,18,20,19,20,21,22,22,22,23,22,21};
/** 血型附加属性 */
int array_biood_add[][10]{
    {5,0,2,1,2,1,3,4,7,2},
    {1,1,2,4,6,2,1,1,2,4},
    {2,2,3,0,0,1,2,3,2,8},
    {2,1,2,2,4,1,2,2,4,1}
};
/** 属性值名称 */
const string array_value_name[]{"\b体力值",
                                "\b智力值",
                                "\b魅力值",
                                "\b自尊值",
                                "\b道德值",
                                "\b气质值",
                                "\b感受值",
                                "\b体贴值",
                                "\b武力值",
                                "\b魔法值"};
/** 玩家最后的角色定位 */
const string array_role_name[]{"\b女王",
                               "\b王妃",
                               "\b女将军",
                               "\b皇家学院总裁",
                               "\b公主",
                               "\b近卫骑士团长",
                               "\b高级祭司",
                               "\b国王的宠妃",
                               // 以下身份为随机选择; index: 8 ~ 12
                               "\b农妇",
                               "\b作家",
                               "\b酒吧女郎",
                               "\b修女",
                               "\b魔法师"
};
// 函数实现

/** 数据初始化 */
void initValue(){
    /** 临时存放初始化属性默认值 */
    cout << value_constellation << endl;
    int *temp_ptr=nullptr;
    // 根据所属星座分配不同的属性初始值
    if(value_constellation == "\b摩羯座"){
        temp_ptr = &array_init_value[0][0];
    }
    else if(value_constellation == "\b水瓶座"){
        temp_ptr = &array_init_value[1][0];
    }
    else if(value_constellation == "\b双鱼座"){
        temp_ptr = &array_init_value[2][0];
    }
    else if(value_constellation == "\b白羊座"){
        temp_ptr = &array_init_value[3][0];
    }
    else if(value_constellation == "\b金牛座"){
        temp_ptr = &array_init_value[4][0];
    }
    else if(value_constellation == "\b双子座"){
        temp_ptr = &array_init_value[5][0];
    }
    else if(value_constellation == "\b巨蟹座"){
        temp_ptr = &array_init_value[6][0];
    }
    else if(value_constellation == "\b狮子座"){
        temp_ptr = &array_init_value[7][0];
    }
    else if(value_constellation == "\b处女座"){
        temp_ptr = &array_init_value[8][0];
    }
    else if(value_constellation == "\b天秤座"){
        temp_ptr = &array_init_value[9][0];
    }
    else if(value_constellation == "\b天蝎座"){
        temp_ptr = &array_init_value[10][0];
    }
    else if(value_constellation == "\b射手座"){
        temp_ptr = &array_init_value[11][0];
    }
    // 给所有属性进行初始化
    for(int i =0;i<10;i++){
        *ptr_array_value[i] = *(temp_ptr+i);
    }
    // 初始化金钱为 500
    value_money = 500;
}

/** 显示数据 */
void showValue(){
    cout << "\n\n\b当前时间:" << value_year << " \b年"<< value_month << " \b月" << value_day << " \b日" << endl;
    cout << "\n\b姓名 :" << value_girl_name << endl;
    cout << "\b年龄 :" << value_age<< endl;
    cout << "\b生日 :" << value_birthday << endl;
    cout << "\b星座 : " << value_constellation << endl;
    cout << "\b血型 :" << value_blood_type << endl;
    cout << "\b金钱 :" << value_money << endl;
    // 打印属性值,以进度条的方式打印
    for(int i = 0;i< (int)(sizeof(ptr_array_value)/sizeof(ptr_array_value[0]));i++){
        cout << array_value_name[i] << "\b:"<< (*(ptr_array_value[i]));
        for(int j =0;j<(*(ptr_array_value[i]))/10;j++){
            cout << " " << "\b■";
        }
        for(int j =0;j< 10 - (*(ptr_array_value[i]))/10;j++){
            cout << " " << "\b□";
        }
        cout  << endl;
    }
}

/** 数据录入 */
void inputValue(){
    /** 字符串流 */
    stringstream sstream;
    SetConsoleTitle("美少女养成日记");
    cout << "\b请输入父亲名字:";
    cin >> value_father_name;
    cout << "\b请输入少女的名字:";
    cin >> value_girl_name;
    cout << "\b请输入美少女的生日(MM/DD):";
    string temp_str;
    cin >> temp_str;
    value_birthday += temp_str;
    int temp_mm,temp_dd;
    sstream << value_birthday.substr(5,7);
    sstream >> temp_mm;
    // 清空stringstream 流里面的缓存
    sstream.str("");
    sstream << value_birthday.substr(8,10);
    sstream >> temp_dd;
    // 调整当前时间为主角出生时间
    value_month = temp_mm;
    value_day = temp_dd;
    // 根据生日计算出所属星座
    value_constellation = constellation_dict[temp_mm-1][temp_dd > array_boundaries[temp_mm-1]?1:0];
    initValue();
    cout << "\b请输入美少女的血型:"<< endl;
    cout << "\n*************************" << endl
         << "\t1、A型" << endl
         << "\t2、B型" << endl
         << "\t3、O型" << endl
         << "\t4、AB型" << endl;
    int n;
    /** 临时指针存放要给属性增加的值 */
    int *ptr_temp_add_value = nullptr;
    cin >> n;
    // 根据选择的血型选项将增加值数组首地址赋给临时指针(二维数组降维操作)
    switch(n){
    case 1 :
        ptr_temp_add_value = &array_biood_add[0][0];
        value_blood_type = "A";
        break;
    case 2 :
        ptr_temp_add_value = &array_biood_add[1][0];
        value_blood_type = "B";
        break;
    case 3 :
        ptr_temp_add_value = &array_biood_add[2][0];
        value_blood_type = "O";
        break;
    case 4 :
        ptr_temp_add_value = &array_biood_add[3][0];
        value_blood_type = "AB";
        break;
    }
    cout << "\b血型: " << value_blood_type << endl;
    // 只打印属性值增加的属性 和 增加值
    for(int i =0;i<10;i++){
        (*(ptr_array_value[i]))+= (*(ptr_temp_add_value+i));
        // 判断是否是属性值增加 *(ptr_temp_add_value+i) 为零 表示没变 即 不打印
        if(*(ptr_temp_add_value+i)){
            cout << array_value_name[i] << " +" << *(ptr_temp_add_value+i)<<"  ";
        }
    }
    cout << endl;
}


/**
* @param day        过去的天数
* @param month      过去的月份
* @param year       过去的年份
*/
void change_data(int day,int month,int year){

    if(year != 0)
        cout << year << " \b年";
    if(month != 0)
        cout << month << " \b月";
    if(day != 0)
        cout << day << " \b天";
    cout << " \b过去了………" << endl;
    value_day += day;
    value_month += month;
    value_year += year;
    // 闰年与平年每个月分别的天数
    int array_year_month_day[][13] {{0,31,28,31,30,31,30,31,31,30,31,30,31},
                                    {0,31,29,31,30,31,30,31,31,30,31,30,31}};

    // 根据传入函数的参数 进行日期更新
    while(true){
        int state_num =  ((value_year % 400 == 0) || ((value_year % 4 == 0)&&(value_year % 100 != 0))); // 值为1 表示闰年 值为0 表示平年
        if(value_month > 12){
            value_month -= 12;
            value_year += 1;
            value_age += 1;
        }
        if(value_day > array_year_month_day[state_num][value_month]){
            value_day -= array_year_month_day[state_num][value_month];
            value_month += 1;
        }
        else{
            break;
        }
    }
}

/** 查找属性的最大值 */
int max_attribute(){
    int max_attr = 0;
    for(int i =0; i< (int)(sizeof(ptr_array_value)/sizeof(ptr_array_value[0]));i++){
        if(*ptr_array_value[i] > max_attr){
            max_attr = *ptr_array_value[i];
        }
    }
    return max_attr;
}

#endif // VALUE_H_INCLUDED

主函数文件代码:

#include 
#include 
#include 
#include 
#include "Value.h"
#include "Talk.h"
#include "Active.h"
using namespace std;


int main()
{
    inputValue();
    showValue();
    cout<<"\n\n"
        << value_birthday.substr(0,5) << "\b年"
        << value_birthday.substr(0,5) << "\b月"
        << value_birthday.substr(0,5) << "\b日\t"
        << "\b一个风和日丽的下午\n哇~啊~哇哇,随着一阵的哭声\n"
        << "\b一个可爱的女孩出生了,一个中年男人在手术室外焦急的\n"
        << "\b等待着,医生终于出来了,好消息是孩子是一个女孩,但是还有一个坏消息孩子的母亲却\n"
        << "\b因为难产去世了,孩子的父亲立马就冲进来手术室,先是看了看还躺在病床上的妻子,眼睛被泪水浸湿了,\n"
        << "\b打转了好久,才抱起旁边女孩儿,女孩一对水汪汪的大眼睛盯着那个男人,女孩长得很水灵,跟她的妈妈很相似;\n"
        << "\b这个男人又看了看病床上的妻子,又看了看怀里的女孩儿,给女孩取了一个名字 " << value_girl_name
        << "\b\n女孩儿的一生便开始了......\n\n"<<endl;
    cout << "\b请按Enter键继续..."<<endl;
    cin.clear();  // 更改cin的状态标示符
    cin.sync();  // 清除缓存区的数据流
    cin.get();
    while(value_year < 1965 + 20){
        cout << "\n\n***************菜单***************\n"
             << "\t1、显示状态\n"
             << "\t2、谈话交流\n"
             << "\t3、选择活动\n"
             << "#********************************#"<<endl;
        int choice_num;
        cin >> choice_num;
        if(choice_num == 1){
            showValue();
        }
        else if(choice_num == 2){
            cout << "\n\n***********选择谈话方式***********\n"
                 << "\t1、严厉训骂\n"
                 << "\t2、温柔的说\n"
                 << "\t3、给零花钱" << endl;
            int c_num;
            cin >> c_num;
            switch(c_num){
            case 1:
                talkSevere();break;
            case 2:
                talkGentle();break;
            case 3:
                giveMoney();break;
            }
        }
        else if(choice_num == 3){
            int c_num;
            cout << "\n\n***********选择活动内容***********\n"
                 << "\t1、学习知识\n"
                 << "\t2、学习舞蹈\n"
                 << "\t3、学习武术\n"
                 << "\t4、学习魔法\n"
                 << "\t5、出去运动\n"
                 << "\t6、带她出去散步\n"
                 << "\t7、带她出去买衣服\n"
                 << "\t8、出去打工\n"
                 << "\t9、吃东西\n"
                 << "*********************************\n"
                 <<endl;
            cin >> c_num;
            // 调用ctive里面的 函数指针数组 根据c_num选择调用的函数
            active(c_num);
        }
    }
    jump_to_role();
};

你可能感兴趣的:(C++ 实现《少女养成类游戏》)