【前前言】下面的应该是2018年的程设大作业,应该每年都会有变化~仅供参考!

&当时好像是为了教某个同学写魔兽才写的下面的博客,里面有的措辞真是一眼难尽hhhh(所以有的地方过于做作请大家忽略!

看评论说我的魔兽三代码没有提供!现在也更新上了!魔兽四和终极版的也加上了!不过不能特别保证正确性hhhh仅供大家参考!

然后我看了一下当时还是没有特别面向对象,很多操作都是直接调用里面的元素来做的,并没有实现封装的感觉!比如直接调用武器的耐用值来操作!经过软工的学习之后发现这种写法是不好的!请大家通过调用函数来修改!从而保证每个类的封装性~尽可能把属性都设置为私有的嗯嗯!

【前言】:在学习了一些看上去只是能让程序更好看更清晰的类的知识之后...为了让我们真的觉得类是个好东西,丧心病狂的作业——魔兽出现了...然而...emmmm...

  好吧,这篇博客主要就是记录一下自己在打这些题的一些思路和想法...由于这个题里面其实没有什么算法和数据结构的运用,感觉这篇博客成了一个教大家学习怎么样完成作业的blog hhh不过这样也挺好。虽然这么说啦,我会把我觉得我的程序里自己觉得很漂亮的部分重点讲一下,也可以分享一些面对这样一个比较复杂而冗长的代码怎样更好的提高调试效率的一些小方法。

  因为直接让大家做魔兽·终极版会直接让大家放弃,所以老师很机智地设置了几个循序渐进的版本

【魔兽世界一:备战】

  笔者认为呢,这个题的目的主要在于:1.营造场景 2.让我们体会一下面向对象和面向过程之间的关系 3.emmm增加一下大家的信心,方便大家入坑(雾)

  有N个城市,两个指挥部,红方和蓝方。两个指挥部都会制造武士,双方会各自有一个制造武士的顺序,并且每小时制造一个武士,同时制造武士需要代价,基地会有一个初始的值来消耗,然后如果当前顺序能制造就制造,不能制造了就用顺序的下一个,直到所有的武士都不能制造,再宣称停止。

  然后魔兽一出现了:它需要让你按时间输出这些制造的武士。

  emm你看我上面的措辞:“输出这些制造的武士”hhh并不是“制造这些武士并输出...”

  为什么会想到不去真的制造武士呢,首先是...懒hhh能少一个类就少一个,其次因为在这个题中的武士是没有任何行为的。输出行为可以放在司令部中输出

  所以这题中我只设置了一个司令部的类。然后我们来思索一下这个类里面需要什么呢?一般可以先想一想它进行的行为:

【行为】1制造一个武士 2停止制造武士

  那么在制造武士的时候需要知道1.当前司令部的生命元 2.当前要制造的武士是谁 3.当前武士的编号 4.现在的时间 5.这个武士需要多少的生命元 6这个武士有多少了

  这里我们会发现:4和5 其实在意义上应该设置成全局变量的,因为比如时间应该是每一个函数都可以调用到的,而每个武士需要用的生命元也是一个客观的给出的条件,也应该是允许所有人调用的。

  那么我们来考虑1236,其中又会发现3也不用考虑啦,因为编号就是时间+1...然后1我们可以在基地里设置一个整型的HP。而2的话会发现和顺序和上一次用的是谁有关系,所以需要一个记录顺序的数组Order[],还有一个Index来记录上一个是谁,对于6的话呢,我们可以用一个桶Count[],每次制造了一个武士who之后就能使用:Count[who]++;

  嗯嗯,这样我们就解决了这个类的成员了!然后就只有一个问题啦,怎样通过Order[]数组和Index来得知下一个是谁呢?想来有很多方法啦...hhh我的代码就是尽量短一点,然后好懂啦hhh[这也是写代码很好的习惯啦,hhh比如who,Index这种变量]

1 Index++;
2 int who=Order[Index%5],tmp=0;
3 while(HP<Cost[who] && tmp<5)
4     who=Order[++Index%5],tmp++;

  然后就没有难的地方啦!做完之后可以沾沾自喜了(诶,这貌似是一个贬义词Hhh...不管啦) (果然是诱惑入坑的好题...)

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 
 5 using namespace std;
 6 
 7 int Time_Index; 
 8 int Cost[6];
 9 int ord1[5]={3,4,5,2,1},ord2[5]={4,1,2,3,5};
10 char Warrior_Name[6][7]={"\0","dragon","ninja","iceman","lion","wolf"};
11 
12 class Headquarter{
13 public:
14     int Index;
15     int HP;
16     int Count[6];
17     int Order[5];
18     char Name[5];
19     bool STOP;
20     Headquarter(int HP_,char *s,int *ord){
21         Time_Index=-1;
22         Index=-1;
23         HP=HP_;
24         for(int i=1;i<=5;i++) Count[i]=0;
25         for(int i=0;i<5;i++) Order[i]=ord[i];
26         memset(Name,0,sizeof(Name));
27         strcpy(Name,s);
28         STOP=false;
29     }
30     void Build(){
31         Time_Index++;
32         Index++;
33         if(STOP) return;
34         int who=Order[Index%5],tmp=0;
35         while(HP<Cost[who] && tmp<5)
36             who=Order[++Index%5],tmp++;
37         if(HP>=Cost[who]){
38             HP-=Cost[who];
39             Count[who]++;
40             printf("%03d %s %s %d born with strength %d,%d %s in %s headquarter\n",Time_Index,Name,Warrior_Name[who],Time_Index+1,Cost[who],Count[who],Warrior_Name[who],Name);
41         }
42         else{
43             printf("%03d %s headquarter stops making warriors\n",Time_Index,Name);
44             STOP=true;
45         }
46     }
47 };
48 
49 int main(){
50 #ifndef ONLINE_JUDGE
51     freopen("x.in","r",stdin);
52     freopen("x.out","w",stdout);
53 #endif
54     int Kase,W;
55     char s1[4]="red",s2[5]="blue";
56     scanf("%d",&Kase);
57     for(int T=1;T<=Kase;T++){
58         printf("Case:%d\n",T);
59         scanf("%d",&W);
60         for(int i=1;i<=5;i++)
61             scanf("%d",&Cost[i]);
62         Headquarter r(W,s1,ord1),b(W,s2,ord2);
63         while(!r.STOP || !b.STOP){
64             r.Build();
65             b.Build();
66         }
67     }
68     return 0;
69 }
View Code

相关文章: