您的位置:首页 > 其它

吴昊品游戏核心算法 Round 16 —— 吴昊教你玩口袋妖怪 第二弹 777赌博机

2013-04-01 10:22 169 查看


(此图选自口袋妖怪红宝石的某个镇的娱乐场所的赌博机)

这款777赌博机存在于日本的赌场,这里,我不想再像以前一样,通过各种百科COPY一些资料,这样没有意思。我谈谈自己当年玩POKEMON时的感受吧!

赌博机分两种投币模式,一种是一次100个币,一种是一次50个币,我认为任天堂在整个城镇的设计中很独到。比如,有些城镇比较古朴(比如:鬼斯,鬼斯通等出现的城镇,给人一种云雾缭绕的感觉),而有些城镇则比较偏娱乐,比如有娱乐中心的城镇(当然,赌博机乃是必不可少的道具)。我们可以看到,不同的城镇既有共性又有个性。比如,每个城镇都会有道馆和精灵中心(每个道馆也许还会不一样,这反映出了谜题的不一样),但是,每个城镇又确实具有独具特色的标志。

以上,我们来解剖一个口袋妖怪赌博机的构造。如果我们转到三个相同的图标(比如三个皮卡丘),那就中了头彩(777)。我们假设这台机器上有N个数字,并且我们将其引入一些确定性因素(在实际中,是利用srand做种,利用rand生成随机数,这里,考虑到输入输出的确定性,我们这样来设置按钮,假设其每次可以控制各位的增加,那么,最终会变为POJ 2316)

Ozy在短码之美中详尽地阐述了这一问题,并利用各种BT的技法将代码缩短到五行(感觉,这样整真心没有必要啊,短码是很省长度,但是,这样做会严重降低代码的可读性,所以,不提倡,我这里只列出Ozy缩短到最后的代码,具体过程可以参考他的书的P130--P135)

Input:每一行N个数字,表示对777赌博机的一系列操作

Output:输出经过几轮变换后,赌博机上的值

1 #include<stdio.h>
2
3 //这里因为要开启memset函数
4
5 #include<stdlib.h>
6
7
8
9 //这是短码的技法,对于某些编辑器是成立的
10
11 main()
12
13 {
14
15 //每一行N个数字,但是N不超过10,要不然,赌博机会爆掉
16
17 char v[10];
18
19 //输出的答案
20
21 int ans[10];
22
23 int i,len;
24
25 //初始化答案
26
27 memset(ans,0,sizeof(ans));
28
29 //每次读入一行,并存储到v中
30
31 for(;gets(v);)
32
33 {
34
35 len=strlen(v);
36
37 for(i=0;i<len;i++)
38
39 {
40
41 //ASC码和十进制不一样,所以每次需要模48进行转换
42
43 ans[i]+=v[i]%48;
44
45 //由于赌博机只有0--9这10个数字(皮卡丘等的符号可以替换为数字)故考虑到循环
46
47 ans[i]%=10;
48
49 }
50
51 }
52
53 //最后,输出结果,由于一共只有一行,故不考虑换行的情况
54
55 for(i=0;i<len;i++)
56
57 printf("%d",ans[i]);
58
59 }

Ozy的独到技法,中间的演变过于繁杂,这里一笔带过:

(1)利用getchar()函数将v[]数组的作用抵消

(2)发挥mod计算的技巧,将ans[i]+=n%48写成ans[i]+=(n+2)

(3)利用指针进一步缩短代码

//这种压缩体在某些编译器上面是会报错的

1 *p,a[10];
2
3 main(n)
4
5 {
6
7 for(;~n ? n=getchar(p=n>10 ? *p+=n+2,p+1:a): *p&&putchar(*p++%10+48););
8
9 }
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐