超级玛丽最低分爆机

为了响应党的号召,营造和谐社会。决定在不破坏公物、不欺负小动物、不踩花花草草、不抢银行、拾金不昧、充分利用时间的前提下从城堡中把公主救出。

花了差不多一个小时,终于基本实现了这个目的:

超级玛丽700分通关

超级玛丽700分通关

上网搜了下,好像这个700分已经是公认的最低分了。达到这个目标的关键点主要包括:

  • 不打开宝箱,不踩小动物,不吃金币
  • 在关底的时候要在倒计时结束的时候从棋杆的最低处降旗(这样才能拿到最低的100分)
  • 必须按1-1>1-2>4-1>4-2>8-1>8-2>8-3>8-4的顺序完成游戏

700分是包括了1-1、4-1、8-1、8-2、8-3的五次降棋和在8-1中不得不吃的一个金币的200分。

难点主要有下面几个地方:

  • 4-2中为进入选关画面的“爬天窗”,需要从跳板上直接把藤条顶出来,落地后往回跳上跳板再跳上藤条
  • 8-1中两个大跳,第一个大跳就是唯一个的必须吃到金币的地方,我是直接跳过去的。有朋友用“踩墙跳”的方法跳这个地方,还是难免要吃到一个金币。但我总觉得这里还是有希望通过踩墙跳不吃金币跳过去的,太难了,我是不指望做到了。第二个大跳也是中间很容易吃到金币,采用的做法是按A的时间短一点来降低跳跃的高度。
  • 8-4中为了进入海中需要跳上一个半空中的水管,正常的做法是撞出它左边的一个金币墙,然后跳上去。为了少吃金币就只能另想办法跳了,有朋友是也是通过“踩墙跳”跳上去的,可惜我总是不成功。突然想到小时候在红白机上玩的时候发现的一个技巧:往右走一点,直到管子与屏幕左边缘相距不到一个人宽的时候,回头从夹缝中往上跳,这时人会卡在水管的底部不掉下来,然后继续再跳一下就行了:)

如果不想通过选关来完整的把它玩下也是可以的,不过最低过关分数将是2600分。因为要降24次旗是2400分,加上那个不得不吃的金币就是2600分。如果这样玩,在4-3关会有一个新的困难:为了不踩乌龟(鸭子?)、不吃金币,需要连续做四次条件苛刻的大跳。

借别人一句话结尾:嗯,发现我真的很无聊。

如何在C++中动态分配二维数组-续

回头看一下前一篇《如何在C++中动态分配二维数组》才发现它是挂羊头卖狗肉,文中只提了从ChinaUnix上拿来的那个C的实现,还是没有结论说对于C++的对象应该怎么处理。今天抽空写了一下。

关键点还是在于placement new和显示的析构函数调用,用于保证对象可以正常的构造和析构。

不过这个实现也还是有不少缺点的,比如,数组的大小必须记住,才能保证析构所有对象。不过这点可以通过改进分配方法算法,把数组大小也用一点空间保存起来。

另一个缺点是,从语法上看,很容易让人误把darray_new返回的指针以为是数据区的起始地址,从而可能导致一些逻辑错误。

其实正像ftofficer在前一篇文章的留言中说的那样,最好的办法还是不要“造轮子”了,有强大的Boost放在那里不用实在是太浪费了……

#include <iostream>
#include <cstdlib>
#include <new>
template <typename T>
T **darray_new(int row, int col)
{
int size = sizeof(T);
void **arr = (void **) malloc(sizeof(void *) * row + size * row * col);
if (arr != NULL)
{
unsigned char * head;
head = (unsigned char *) arr + sizeof(void *) * row;
for (int i = 0; i < row; ++i)
{
arr[i] = head + size * i * col;
for (int j = 0; j < col; ++j)
new (head + size * (i * col + j)) T;
}
}
return (T**) arr;
}
template <typename T>
void darray_free(T **arr, int row, int col)
{
for (int i = 0; i < row; ++i)
for (int j = 0; j < col; ++j)
arr[i][j].~T();
if (arr != NULL)
free((void **)arr);
}

火车

五一期间折腾火车票时认识了一个火车爱好者,才知道这世上还有火车迷这一爱好。于是乎去转了转海子铁路网论坛,发现火车还真是个挺有意思的东东。MS我一直比较喜欢所谓“有技术含量”的东东,看看这些不同的车头车底,加上各种术语,还有车迷口中对火车的“专用名词”,嗯,足够有“技术含量”了也足够吸引我了。

爱好火车有个很实用的地方就是出行可以比较方便,因为车迷总能在各种条件下找到一个相对最合理的乘车方法。比如南京到北京,Z50/Z6对于不坐飞机的有钱人是不二的选择,但对于我等穷人,最实惠的车应该是T66硬卧,但T66的票不好买,到点又比较晚,所以T736到扬州转个Z30硬卧成为了最佳的备选方案。开点到点都不错,T736是BSP的车底,舒适度很好,Z30条件比T66强,总价格比Z50便宜四分之一,在南京把票买好,到扬州后过天桥上一站台直接上车,也不折腾。(不过今年4月18号“六提”之后T736改成T782,时间上有点悬乎了,一旦晚点,可能就得等着Z30开出后才能到进扬州了,此现象车迷称为“被猪踩了”,“猪”是指直特列车或它的DF11-G车头,“踩”就是指“待避”也就是等车)

今天看到一则新闻,也是讲中转车的好处,不过不是省钱,是省时间。可惜可怜的记者在车迷眼中成了笑柄一把,更可怜我是在看了三遍以后才看出其中的漏洞的,你能看出来吗(这个漏洞其实跟火车关系不是太大)?

======

昨日,记者从南昌火车站获悉,南昌火车站已开售异地D字头高速列车火车票,时限在20天内。这意味着,市民可在南昌购买上海开往南京、北京、苏州、镇江等地高速列车车票。

记者了解到,以往,市民如果要乘火车去南京的话,通常是乘坐2240次南昌—南京西的普通快车,14:29从南昌站发出,次日7:38分抵达南京,总耗时要17个小时,非常漫长。而如果乘客购买异地动车组车票的话,则可节省10个多小时,可在南昌火车站购买南昌—上海南的D92次列车和上海—南京的D434次列车车票。这样的话,早上8:34分从南昌站出发,13:58分到达上海南站,14:33分再从上海站出发,16:53分抵达南京站,总耗时8.5个小时,比2240次节省了近10个小时。

如何在C++中动态分配二维数组

这个问题应该是我在CSDN蹭分时回答次数比较多的一个问题了,我的回答一般是三种方法:(1)用vector的vector,(2)先分配一个指针数组,然后让里面每一个指针再指向一个数组,这个做法的好处是访问数组元素时比较直观,可以用a[x][y]这样的写法,缺点是它相当于C#中的一个锯齿数组,内存空间不连续。(3)直接分配一个x*y大小的一维数组,这样保证空间是连续的,但访问数组元素不直观。对于我这个“经典”回答,我那时还一直是挺得意的,至少从蹭分的角度来看,这样回答还是很有效的。

今天在ChinaUnix论坛闲逛时看到一个贴子,再次证明了我在C++方面才疏学浅。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void **darray_new(int row, int col, int size)
{
void **arr;
arr = (void **) malloc(sizeof(void *) * row + size * row * col);
if (arr != NULL)
{
void *head;
head = (void *) arr + sizeof(void *) * row;
memset(arr, 0, sizeof(void *) * row + size * row * col);
while (row--)
arr[row] = head + size * row * col;
}
return arr;
}
void darray_free(void **arr)
{
if (arr != NULL)
free(arr);
}

嗯,连续分配内存,而且可以用a[x][y]的方式来访问!可谓二维数组动态分配的绝妙方法!这段程序是C的,似乎要改成支持对象分配的C++版也不是什么难事(不过估计得用上placement new吧,嗯,需要再思考一下……)。

电影与配乐

难得看看电视,看到了CCTV音乐频道正在放Ennio Morricone专题,今天是介绍《海上钢琴师》的配乐。海上钢琴师的配乐应该说是已经被介绍得有点泛滥了,但我还是又一次重温了这些优美的音乐,并写下这些音乐感言。

《音乐之声》也许是我一次关注电影音乐,当然这个片子还是比较特殊的,毕竟它的主题就是音乐,所以不太可以把它的音乐称为是“配”乐。不过有次 跟对音乐没有特别感觉的母亲一起看这部情节简单而时间巨长的电影的时候,她居然一点也没有犯困,可见当这些轻松活泼的音乐与情节完美的融为一体时,还是很 有魅力的。

《勇敢的心》中的悠扬的苏格兰风笛的声音、《黄河绝恋》中略带凄凉的小提琴的声音和《美丽人生》的音乐主题也许是最先触动我的一些电影配乐。在欣赏电影的时候,当音乐响起的时候,心中会有一种特别的感觉,有时感受到的是激动,有时是温馨,有时是紧张,有时是惆怅……

有时候我自己真的有点搞不清楚我是因为喜欢电影才喜欢这些音乐,还是因为喜欢这些音乐才喜欢电影。也许大部分的时候,是因为喜欢电影才喜欢音 乐。像肖申克的救赎,属于我不敢存在硬盘上的电影,因为一旦不小心点开了,可能就要忍不住再看一遍,所以用OST取代电影,毕竟听音乐不像看电影那样只是 “单线程”去完成的。当工作的时候,放放OST,就像是看了一遍电影,不同的音乐,记录着不同的故事和画面。当一段温馨的音乐响起的时候,我会不自觉的微 笑;当一段波澜壮阔的音乐响起的时候,我的心情也会跟着起伏,甚至会流出眼泪。

很多古典乐迷常常会说:“这个曲子让我很感动,不止一次的让我落泪”。我以前总是很难理解,音乐真的有这么大的魅力吗?通过电影配乐,让我很容 易的理解到了这一点,乐迷们所谓的听懂了音乐、对音乐的理解,不是正像电影配乐所带我们的感受一样吗?他们所听到的音乐,其实是音乐与画面、音乐与故事、 音乐与心情的结合。这些东西是需要自己从音乐中去理解,自己去为音乐配上画面和情节才能获得的。而电影配乐则能通过电影本身的画面、情节让我们更容易的理 解到音乐所蕴含的意义。我听了这么多年的古典,却很少被打动,原因就是没有用心去体会,只是停留在音乐的旋律这个肤浅的层面,这样其实收获真是很少的。通 过理解电影配乐,也帮助了我重新去认识更多的音乐的价值。

说到Ennio Morricone,他的确是电影配乐大师,在我知道这个名字之前,我就已经喜欢上了他的一些作品,它们是美国往事、天堂电影院和海上钢琴师。我看电影不 多,对音乐有深刻印象的更少,在没有刻意寻找的前提下就能一下子“偶遇”他的三部作品,实在是对他的功力敬佩无比。Morricone的音乐,风格多样, 题材广泛,但总是与电影的情节是如此的丝丝入扣。海上钢琴师中对不同人物用不同的音乐来描写以及描写爱情的那段Playing Love就足以表现他对钢琴的驾驭能力。而在美国往事中,他则采用的更为多样的音乐形式来表达情感,表现童年的排萧吹出的主题加上产生的各种变奏,配合到 不同的情节中,达到一致而又个性鲜明效果。弦乐和人声创造出温暖舒缓的情节,而变化丰富的管乐和电子乐则创造出激情或冲动。不同的音乐,配合有张有驰的情 节安排和丰富的故事,才让这部长达四个小时的人生故事讲得是如此的生动。

好电影很多,它们中的绝大部分也是音乐很好的电影,音乐与电影的关系总是这么的密切,它们一同构成一部艺术佳作。