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