ZZU第四届程序设计大赛 3-游戏棋

3.游戏棋
相信大家都听说过大富翁这个游戏,一个不断进行色子抛出和买卖的格子游戏。在这个
游戏中我们可以对于自己财产进行买卖。并且按照自己策略不断积攒财富。而且,在不同的
地方对于玩家还有相应的惩罚机制。这都给这个游戏带来了极大的趣味性。
郑州大学ACM 实验室中最近这个游戏相当之流行。可以说大富翁的重要程度已经仅仅
排在了训练的后面。但是网络中所能提供的地图是有限的,所以实验室的同学玩的时间长了
之后就感觉非常的无聊。可恶的开发团队并没有给出地图设计软件。这个让整个实验室的同
学很纠结。所以他们最终决定自己开发一套自己的大富翁游戏软件。在这个游戏的内部测试
版本中,色子的功能被取消。每次一个人向前走一步。并且按照设定好的方式进行游戏。
在整个过程中我们只有一种商品:房子。而且在整个过程中只有4 种操作,分别是价
格上升,价格下降,买房子,卖掉所有的房子。在游戏开始的时候我们会给予你一定的启动
资金。
当你的资产大于原来的二倍的时候。(包括你的现金和房子数量乘以当前的价格,也就
是说房子即使不卖出,也可以算做资产的部分)你就赢得了游戏。如果你的资产在某个时刻
达到了原来的1/2 之下。那么你将失败。如果你在300 次操作过程内没有结束游戏,那么
就说明游戏本身设计的是有问题的。毕竟我们不能让我们的ACMer 们过于沉迷于此。而且
因为游戏是前期产品,如果游戏要求你买的房子超过你的现有资金或者要求你卖出的房子超
过你的现有的房子的数量。那么游戏将直接报错。
Input
输入分两部分:
第一部分有一个整数T(1<=T<=10)表示测试组数。
第二部分共T 组,对于每组数据:
第一行有三个数字X,Y 和Z,表示整个游戏棋的大小,房子的初始价格,以及你的初始
资产0 < N < 100, 0 < Y < 50 , 5 < Z < 1000。
第二行到第N + 1 行是N 个格子中的内容。你将顺次从第一个格子走到最后一个,然
后再从第一个开始。四种内容别是"price_up x","price_down x ","sell x houses","buy x
houses."其分别表示房子的价格上升x 元,房子的价格下降x 元,卖掉x 个房子,买入x 个
房子。

Output
如果你在300 步之内赢得比赛那么输出"win",如果你在300 步之内输掉了比赛,那么
输出"lose",如果你走到了第301 步,那么直接输出"bad game"。
如果游戏报错了,则直接输出"error"
Sample

input

1
4 3 100
buy 30 houses
price_up 1000
sell 30 houses
price_down 100

output

win

一道模拟题,按输入执行,如果执行结束就循环执行,直到满足胜利或失败的条件或者步数超过300,因此执行的操作要先存起来,方便循环操作~

  1 #include<stdio.h>
2 #include<string.h>
3 char s[15], house[15];
4 typedef struct
5 {
6 int flag;
7 int x;
8 }S;
9 S d[110];
10 int main()
11 {
12 int tcases;
13 int X, i, housenum, Y, Z, x, FM, len;
14 int m, count, over;
15 scanf("%d", &tcases);
16 while(tcases--)
17 {
18 scanf("%d%d%d", &X, &Y, &Z);
19 FM = Z;
20 for(i = 0; i < X; i++)
21 {
22 scanf("%s", s);
23 len = strlen(s);
24 if(len == 8)
25 {
26 scanf("%d", &x);
27 d[i].flag = 0;
28 d[i].x = x;
29 }
30 else if(len == 10)
31 {
32 scanf("%d", &x);
33 d[i].flag = 1;
34 d[i].x = x;
35 }
36 else if(len == 3)
37 {
38 scanf("%d", &x);
39 scanf("%s", house);
40 d[i].flag = 2;
41 d[i].x = x;
42 }
43 else if(len == 4)
44 {
45 scanf("%d", &x);
46 scanf("%s", house);
47 d[i].flag = 3;
48 d[i].x = x;
49 }
50 }
51 count = 0; over = 0; housenum = 0;
52 while(count < 300 && !over)
53 {
54 if( Z + housenum * Y > FM * 2)
55 {
56 over = 1;
57 printf("win\n");
58 continue;
59 }
60 if(Z + housenum * Y < FM / 2)
61 {
62 over = 1;
63 printf("lose\n");
64 continue;
65 }
66 m = count % X;
67 count++;
68 if(d[m].flag == 0)
69 {
70 Y += d[m].x;
71 continue;
72 }
73 if(d[m].flag == 1)
74 {
75 Y -= d[m].x;
76 continue;
77 }
78 if(d[m].flag == 2)
79 {
80 if(d[m].x * Y > Z)
81 {
82 over = 1;
83 printf("error\n");
84 continue;
85 }
86 Z = Z - d[m].x * Y;
87 housenum += d[m].x;
88 continue;
89 }
90 if(d[m].flag == 3)
91 {
92 if(housenum < d[m].x)
93 {
94 over = 1;
95 printf("error\n");
96 continue;
97 }
98 housenum -= d[m].x;
99 Z = Z + d[m].x * Y;
100 continue;
101 }
102 }
103 if(!over)
104 printf("bad game\n");
105 }
106 return 0;
107 }

 

posted @ 2011-12-17 17:50  枫萧萧  阅读(362)  评论(0编辑  收藏  举报