前言
本着学习的态度去报名了北京大学的mooc:C++面向对象程序设计(虽然自己已经报名过好几次了)。虽然学校将来要学的是JAVA,但不知道怎么说,看了看几节Java学习的网课,发现Java要学的东西有点多(背的API),感觉学习起来并没有太大的乐趣。
前面几次都有由于各种各样的事件自己咕咕掉了。
这一次下定决心认真来学习,所以决定开一个专栏来监督自己。
不得不说第一次接触面向对象的思想总感觉在写程序的时候需要纠结特别久。每一次还是用以前的面向对象的思想去做题,做起来特别纠结,毕竟谁不想写出来一个美观的代码。
因为自己还没有去学习后面的继承、多态一些东西,所以在某些方面代码还是不够简练。
给出题目地址。
题目地址
分析过程
话不多说,首先来分析一下解题的思路。
首先明确属性和方法。
属性:
总生命值,当前时间,每一个兵种的血量,当前总兵种数量,每一个兵种的数量,阵营(红/蓝),下一个要生产的兵种
对于每个兵种的血量和当前的时间,总的时间 都是静态成员变量
方法:
显示、更新当前的状态、输入数据,
题目还是比较简单的,但作为自己的第一个用面向对象方法编写的项目,特地发帖纪念一下。
#include <iostream>
using namespace std;
string WowName[5] = {"dragon","ninja","iceman","lion","wolf"};
string WowTeamName[2] = {"red","blue"};
int Order[2][5]={{2,3,4,1,0},{3,0,1,2,4}};
class Wow{
public:
static int TotalHp;
static int Time;
static int PerHp[5]; //记录每个兵种要的血量
int PerNumber[5]; //记录每个兵种的数量
int Next[5];
int CurTeam;
int NowHp;
int TotalNumber;
Wow(int Team):CurTeam(Team),NowHp(0),TotalNumber(0){
for (int i = 0; i < 5; i++) PerNumber[i] = 0;
Time = 0;
}
~Wow(){}
static void input();
void Print(int i);
int Updata(int &i);
void init();
};
int Wow::TotalHp = 0;
int Wow::Time = 0;
int Wow::PerHp[5]={0,0,0,0,0};
void Wow::input()
{
cin>>TotalHp;
for (int i = 0; i < 5; i++) cin>>PerHp[i];
}
void Wow::init()
{
for (int i = 0; i < 5; i++) Next[Order[CurTeam][i]] = Order[CurTeam][(i+1)%5];
}
void Wow::Print(int i) // i表示当前要制造的
{
printf("%03d", Time);
cout<<" "<<WowTeamName[CurTeam]<<" "<<WowName[i]<<" "<<TotalNumber<<" born with strength "<<PerHp[i];
cout<<","<<PerNumber[i]<<" "<<WowName[i]<<" in "<<WowTeamName[CurTeam]<<" "<<"headquarter";
cout<<endl;
}
int Wow::Updata(int &i)
{
if (NowHp + PerHp[i] > TotalHp){
int PreI = i;
i = Next[i];
while((NowHp + PerHp[i] > TotalHp) && (PreI != i)) {
// cout<<CurTeam<<" "<<Next[i]<<" "<<NowHp + PerHp[i]<<endl;
i = Next[i];
}
if (PreI == i) {
printf("%03d", Time);
cout<<" "<<WowTeamName[CurTeam]<<" headquarter stops making warriors"<<endl;
return 0;
}
}
NowHp += PerHp[i];
// cout<<CurTeam<<" "<<NowHp<<endl;
PerNumber[i]++;
TotalNumber++;
Print(i);
i = Next[i];
return 1;
}
int main()
{
// freopen("1.txt","r",stdin);
// freopen("2.txt","w",stdout);
int n;
cin>>n;
for (int i = 1; i <= n; i++){
printf("Case:%d\n", i);
Wow Red(0),Blue(1);
Wow::input();
Red.init(); Blue.init();
int NowRed = Order[0][0];
int NowBlue = Order[1][0];
int F1 = 1,F2 = 1;
do{
if (F1) F1 = Red.Updata(NowRed);
if (F2) F2 = Blue.Updata(NowBlue);
Wow::Time++;
}while(F1|F2);
}
return 0;
}
感觉自己写的还不错XD,就是花的时间长了点。