Tuesday, June 21, 2011

开始写论文

什么是游戏

By Rui Chen

题注:尽管是码字,但是昨天已经码过一轮,无赖相信记事本不会掉线消掉自己的记录,所以,竟也没有保存过一次,今天打开电脑,发现电脑自动更新重启,无可奈何,所有的码字又需重来一轮.但回想尼古拉·奥斯特洛夫斯基在写《the making of steel》时的尴尬,面对原稿的遗失,依旧执着地完成心中的文字。有如明朝的张溥更有“七录七焚”的佳话。因此,我也有所动力重新整理一下昨日缩写的东西,顺便还可以校对一些东西。

游戏的本质
游戏就是game,但并非是game theory 的game,反过来,我觉得用game theory也只能说明game的一些特点,博弈求胜,但少了一些对娱乐有趣特点的刻画,而这也会让人对这个和电影旗鼓相当的休闲产业的理解有所偏颇。

红白机和街机
大凡谈到自己的经历,似乎没有人没玩过超级玛丽或是魂得罗的,也没有人会说自己曾经拒绝过街头霸王或者苹果机的诱惑。而这些在现在这些手拿ipad平板电脑或是怀揣上网本的这些小同学的眼里,这些可能都是不可触摸的历史了。确实,无论是拳皇,侍魂,恶狼传说还是一些忘记了名字的对战类游戏,他们都凸显着最为简单的游戏理念,在有限的时间内消灭对手。现在回想,都会感到那时满脸涨得通红,大汗漓淋的情景。
相比于街机,红白机可能要简单很多,里面的游戏可能大都是通关,冒险性质的。有时候能够足够沉迷这些需要连续通关不能存档的游戏,心里可能真的是要憋住一股劲,这种执着的游戏精神可能在电脑单机时代再也找不回了。
通关游戏不能存档似乎是很大的一个bug,街机的几款经典也逃脱不了,无论是三国演义(具体名字不清,和后面的三国战记不同),恐龙快打(面对这些名字我也是兴奋和差异,资料榜单:链接),三国战记,或者是西游释厄传等等,这些经典游戏让我们真的是不得不面对废寝忘食的生活。站在今天的角度回过头来看这些过往的经典,我觉得单机游戏的设计似乎也只能是这样了,它们之中不乏两人,四人的配合,它们之中也有着复杂多变的人际和人人的对抗,游戏再往上走可能就是游戏平台,游戏文化上的局限了。

从单机到局域网再到互联网
我其实到现在也没有搞清楚明白两台街机是如何联系到一起,然后形成四人的通关游戏的。但是要是我清楚地解释电脑与电脑之间如何构成网络对战却那么困难,无非就是局域网和互联网的介入。
几乎是在玩街机的同时,我也开始接触电脑。最早接触的一款电脑游戏应该是沙丘二代,即使是后面有使命与征服,红色警戒,帝国时代或是星际争霸的超越,这也是一款让我回味至今的游戏,当然他的游戏系统也并不复杂,简单的正反派设置,无科技树的发展,让我也在侍魂和拳皇之外,找到了一个简单的进阶游戏。
如果是提到单机游戏,就不得不提到有着和超级马里奥,街头霸王那样出众人气的大富翁,至少大富翁了。尽管是在最近的版本之中加入了即时性的设计,这款游戏却也始终达不到超级马里奥和街头霸王那样能够形成一种延续的文化,各种原因也很难解读,也许是国产游戏的发展始终就是不那么良性吧。街头霸王后来有了相应的漫画以及电影,就是在频繁的动漫展销会上你也可以看到那些明星式的cosplay。而马里奥兄弟在任天堂的wii之中也找到了自己的最新亮相。反过头来,这款靠掷骰子买卖地和股票,时不时碰碰运气的游戏之所以大受欢迎,很可能也就是因为掷骰子游戏所打下的基础了。
如果是要将所有的游戏都历数一遍,这也不大可能,而这其中我说钟爱的也太多太多,有模拟经营类的游戏如水上公园,铁路大亨等等,也有即使战略类游戏如星际争霸,红色警戒等等,当然也有战略模拟,角色扮演的游戏如大航海时代,太阁立志传,三国志等等(令人惊讶的是这些游戏都是出自光荣公司一家之手)。即使是在游戏模式是上,有时也会让我们惊讶地看到MUD游戏这种文字交互游戏始祖的影子。
当KOEI(光荣公司)陆续地开发出它出名单机游戏的online版时,毋庸置疑,网络这个有别于单机PC的媒介为游戏这个大家族做了新的注解。它所用的套路再也不是简单的通关,或是战略

--to be continued
--MUD 文字游戏,就是设立一个文字系统,大家都在一个社区里面相互地聊天

Monday, May 16, 2011

zzC++:送给正在学习C++朋友的50条建议

按:无论学习多久,我们都还在路上。C++支持的编程范式太多,因此还是博大精深的,但是C++本身的核心语言我觉得和C还是差不多的。弄清楚概念是学习的一个很重要的前提,因此选择一本比较基本的书(广泛认可的就是C++ language或者C++ Premier)就行了,懂得matlab对于我顺着过来结合,理清很多的概念非常的有帮助。

1.把C++当成一门新的语言学习(和C没啥关系!真的。);
2.看《Thinking In C++》,不要看《C++变成死相》;
3.看《The C++ Programming Language》和《Inside The C++ Object Model》,不要因为他们很难而我们自己是初学者所以就不看;
4.不要被VC、BCB、BC、MC、TC等词汇所迷惑——他们都是集成开发环境,而我们要学的是一门语言;
5.不要放过任何一个看上去很简单的小编程问题——他们往往并不那么简单,或者可以引伸出很多知识点;
6.会用Visual C++,并不说明你会C++;
7.学class并不难,template、STL、generic programming也不过如此——难的是长期坚持实践和不遗余力的博览群书;
8.如果不是天才的话,想学编程就不要想玩游戏——你以为你做到了,其实你的C++水平并没有和你通关的能力一起变高——其实可以时刻记住:学C++是为了编游戏的;
9.看Visual C++的书,是学不了C++语言的;
10.浮躁的人容易说:XX语言不行了,应该学YY;——是你自己不行了吧!?
11.浮躁的人容易问:我到底该学什么;——别问,学就对了;
12.浮躁的人容易问:XX有钱途吗;——建议你去抢银行;
13.浮躁的人容易说:我要中文版!我英文不行!——不行?学呀!
14.浮躁的人容易问:XX和YY哪个好;——告诉你吧,都好——只要你学就行;
15.浮躁的人分两种:a)只观望而不学的人;b)只学而不坚持的人;
16.把时髦的技术挂在嘴边,还不如把过时的技术记在心里;
17.C++不仅仅是支持面向对象的程序设计语言;
18.学习编程最好的方法之一就是阅读源代码;
19.在任何时刻都不要认为自己手中的书已经足够了;
20.请阅读《The Standard C++ Bible》(中文版:标准C++宝典),掌握C++标准;
21.看得懂的书,请仔细看;看不懂的书,请硬着头皮看;
22.别指望看第一遍书就能记住和掌握什么——请看第二遍、第三遍;
23.请看《Effective C++》和《More Effective C++》以及《Exceptional C++》;
24.不要停留在集成开发环境的摇篮上,要学会控制集成开发环境,还要学会用命令行方式处理程序;
25.和别人一起讨论有意义的C++知识点,而不是争吵XX行不行或者YY与ZZ哪个好;
26.请看《程序设计实践》,并严格的按照其要求去做;
27.不要因为C和C++中有一些语法和关键字看上去相同,就认为它们的意义和作用完全一样;
28.C++绝不是所谓的C的“扩充”——如果C++一开始就起名叫Z语言,你一定不会把C和Z语言联系得那么紧密;
29.请不要认为学过XX语言再改学C++会有什么问题——你只不过又在学一门全新的语言而已;
30.读完了《Inside The C++ Object Model》以后再来认定自己是不是已经学会了C++;
31.学习编程的秘诀是:编程,编程,再编程;
32.请留意下列书籍:《C++面向对象高效编程(C++ Effective Object-Oriented Software Construction)》《面向对象软件构造(Object-Oriented Software Construction)》《设计模式(Design Patterns)》《The Art of Computer Programming》;
33.记住:面向对象技术不只是C++专有的;
34.请把书上的程序例子亲手输入到电脑上实践,即使配套光盘中有源代码;
35.把在书中看到的有意义的例子扩充;
36.请重视C++中的异常处理技术,并将其切实的运用到自己的程序中;
37.经常回顾自己以前写过的程序,并尝试重写,把自己学到的新知识运用进去;
38.不要漏掉书中任何一个练习题——请全部做完并记录下解题思路;
39.C++语言和C++的集成开发环境要同时学习和掌握;
40.既然决定了学C++,就请坚持学下去,因为学习程序设计语言的目的是掌握程序设计技术,而程序设计技术是跨语言的;
41.就让C++语言的各种平台和开发环境去激烈的竞争吧,我们要以学习C++语言本身为主;
42.当你写C++程序写到一半却发现自己用的方法很拙劣时,请不要马上停手;请尽快将余下的部分粗略的完成以保证这个设计的完整性,然后分析自己的错误并重新设计和编写(参见43);
43.别心急,设计C++的class确实不容易;自己程序中的class和自己的class设计水平是在不断的编程实践中完善和发展的;
44.决不要因为程序“很小”就不遵循某些你不熟练的规则——好习惯是培养出来的,而不是一次记住的;
45.每学到一个C++难点的时候,尝试着对别人讲解这个知识点并让他理解——你能讲清楚才说明你真的理解了;
46.记录下在和别人交流时发现的自己忽视或不理解的知识点;
47.请不断的对自己写的程序提出更高的要求,哪怕你的程序版本号会变成Version 100.XX;
48.保存好你写过的所有的程序——那是你最好的积累之一;
49.请不要做浮躁的人;
50.请热爱C++!

zzlinux下程序的编译和链接

出处
传统意义上的编译程序分两步走 —— 编译和链接:
1.编译(compile):指用编译器(compiler)将源代码(source code)生成二进制目标文件(object file),在Windows下也就是 .obj 文件,UNIX下是 .o 文件。编译时,编译器需要的是语法的正确,函数与变量的声明的正确,编译器只检测程序语法,和函数、变量是否被声明,函数并不需要被定义。
    UNIX下g++的语法为:
        g++ -c file.cpp

    -c 是compile的意思,此命令将会生成 file.o 的目标文件。
2.链接(link):找到所要用到函数所在的目标文件,并把它们链接在一起合成为可执行文件(executable file)。链接时,要确保编译器能找到所有被用到了的函数所在的目标文件。
    g++ file1.o file2.o -o program.exe
    -o 是指定生成的可执行文件名称(output)。若不给出,默认的名称为 a.out
上述两部通常也可以合在一起完成:
    g++ file1.cpp file2.cpp -o program.exe
这完全等同于上面两步的结合,会先生成目标文件,然后链接成 file.exe
3. 库 (library)
对于一个源文件很多的大项目,为了避免重复编译,也为了方便编译器链接,通常会把一些常用 到的目标文件打包(archive),于是就成为了传说中的库文件(library)。在Windows下这种包叫“库文件”(Library File),也就是 .lib 文件,在UNIX下,是Archive File,也就是 .a 文件。
UNIX 所要用到的命令:
1)ar -- create, modify, and extract from archives.
@Usage: ar cr lib****.a file1.o file2.o
**** 为自定义的库文件名。
标签 c (create):如果库不存在,则创建库;
标签 r (replace):如果库中已存在要添加的对象文件,则旧的对象文件将被替换。

实际上 ar 只是一个打包工具,是archive(打包)的首字母。它将一系列的目标文件首位连接在一起,并内嵌一个索引表,使得编译器能够方便地找到所需要的函数。 一般来说,由于函数索引表的存在,对库的链接要比对一般的对象文件的链接更快。如果 ar 未能完成此项索引表工作,还可以手动用以下的 ranlib 命令创建索引表。
2) ranlib -- generate index to archive.
@Usage: ranlib lib****.a

3) nm -- list symbols from object files.
nm可以用来显示 ranlib 所构建的索引表。你将会看到所有库里的函数名(除了模板函数template function)。

4. 在编译时链接库
创建了自己的库,以后要用到相关函数的时候,只需在代码中声明所要用的函数(必须和库中定义得相同)。在链接的时候,需要给出库的名称和位置:
g++ file1.o file2.o -o program.exe -L**** -l****
-L 后紧跟库文件所在的目录地址,-l 后紧跟库名。
编译器在链接的时候会在所指定的目录地址下寻找名为 lib****.a 的库文件。

《不如归去》

http://www.mitbbs.com/article_t/Movie/31397049.html
《不如归去》导演自述兼答疑(剧透)
http://www.mitbbs.com/article_t/Biology/31495983.html
其他的相关信息

Tuesday, May 3, 2011

zzLinux下带颜色的终端输出与简单的闪烁功能[CODE]

Linux下带颜色的终端输出与简单的闪烁功能[CODE]
(ref link)

有时候为了实现在终端输出的时候字体能够带颜色,并且可以产生简单的闪烁的功能,特写了下列的代码 实现hello world的带颜色的输出,并且每过一秒产生一个闪烁的功能.


#include<stdio.h>
#include<unistd.h>
#include<signal.h>
#include<stdlib.h>

int flag = 0;

void sig_int(int signum)
{
        if (flag == 1)
                fprintf(stderr, "\033[47;31mhello world\033[5m");
        fprintf(stderr,"\033[;\033[0m");
        fprintf(stderr,"\033[;\033[0m");
        printf("\n");
        exit(0);
}

int main()
{
        int i = 0;
        struct sigaction sig_act;
        sig_act.sa_handler = sig_int;
        sigemptyset(&sig_act.sa_mask);
        sig_act.sa_flags = 0;
        if (sigaction(SIGINT, &sig_act, NULL) < 0)
        {
                fprintf(stderr, "signal error\n");
                exit(1);
        }
        while (i++ < 10)
        {
                fprintf(stderr, "\033[;\033[s"); /*使用stderr是因为其是不带缓存的*/
                fprintf(stderr, "\033[47;31mhello world\033[5m");
                flag = 0;
                sleep(1);
                fprintf(stderr, "\033[;\033[u");
                fprintf(stderr, "\033[;\033[K");
                flag = 1;
                sleep(1);
        }

        fprintf(stderr, "\033[47;31mhello world\033[5m");
        fprintf(stderr,"\033[;\033[0m");
        printf("\n");
        return 0;
}

该程序实现输出十次hello world然后退出. 使用一个信号是为了还原默认的终端输出的颜色.
另外再讲讲如何输出颜色以及颜色的代码.

格式:
printf("\033[字背景颜色;字体颜色m字符串\033[0m" ); 

printf("\033[47;31mhello world\033[5m");
47是字背景颜色, 31是字体的颜色, hello world是字符串.  后面的\033[5m是控制码.

颜色代码:


QUOTE:
字背景颜色范围: 40--49                   字颜色: 30--39
            40: 黑                          30: 黑
        41: 红                          31: 红
        42: 绿                          32: 绿
        43: 黄                          33: 黄
        44: 蓝                          34: 蓝
        45: 紫                          35: 紫
        46: 深绿                        36: 深绿
        47: 白色                        37: 白色



ANSI控制码:


QUOTE:
   \033[0m   关闭所有属性 
  \033[1m   设置高亮度 
  \03[4m   下划线 
  \033[5m   闪烁 
  \033[7m   反显 
  \033[8m   消隐 
  \033[30m   --   \033[37m   设置前景色 
  \033[40m   --   \033[47m   设置背景色 
  \033[nA   光标上移n行 
  \03[nB   光标下移n行 
  \033[nC   光标右移n行 
  \033[nD   光标左移n行 
  \033[y;xH设置光标位置 
  \033[2J   清屏 
  \033[K   清除从光标到行尾的内容 
  \033[s   保存光标位置 
  \033[u   恢复光标位置 
  \033[?25l   隐藏光标 
  \33[?25h   显示光标


这样, 在某些时候就可以实现动态的输出.

link
如何在linux(终端:ctrl+alt+F1之类的。绝非虚拟终端)下显示256色或24位的BMP图片?

Thursday, April 28, 2011

另类升级ubuntu to 11.04

自带的software upgrade行不通,一度想到放弃升级,毕竟杂七杂八地在小电脑上面装了很多的东西,为了好玩,并没有什么明确的目的先,所以,准备一换再换,无奈,只有lenovo的wireless驱动在装了ubuntu之后可以自动保持链接,所以,又转过头来了。

如果说是不考虑已经装过的东西,用wubi重装升级还真是比较的方便,windows 7中,然后,在windows 7中卸载也同样如此,所以整个过程也就没有受到这个wubi 安装ubuntu的折磨,凭着以前搭建llvm的经验,时间也就相对集中地花在了安装fcitx(中文输入), flex, bison and llvm 以及llvm-gcc(注意使用tar and cp方式)。

ubuntu下解压rar 文件(ref1, ref2, ref3) ref1直接了当地解决了这个问题,sudo apt-get install rar unrar,但是引入了两个包,rar和unrar。同时,rar还有中文乱码的问题,主要是文件名的名称,而unrar则不然,ref2的解决办法就是卸掉rar,只装unrar,当然ref3的问题也是乱码问题,保持英文命名,这个问题不是大问题。

linux下的modelsim 安装(ref1, ref2, ref3),相比较而言,我觉得ref1就已经足够讲清楚问题了,当然,ref1使用的是mentorKG,而我手头的这个modelsim 6.6并没有mentorKG,只有一个license.dat, mgls.dll, 和一个readme(光装zhcon环境,还不能结局gedit下的乱码阅读问题)。在安装的过程中,可执行的chmod方式并没有成功,偶然换用的是右击,属性更改成可执行文件。

最后的结果是费了半天劲也没又装上,似乎这个modelsim就不是为linux开发的,当然,ref1讲的到位,在像~/.bashrc的文件路径上没有交待(我就是在/home/路径下操作的),然后,MentorKG.exe怎么都没有反应,当然用上wine还有permission方面的问题,索性就用root权限(wine MentorKG.exe -o license.dat),还在自鸣得意,以为这次生成的license不错,打开也发现hostid与我的ipconfig结果一致,按照指示往下走,结果还是不行,Error: cannot find *** vsim。装了也还是徒劳。

comment: 这个MGLS.DLL并没有用上,因为在安装路径下找不到对应的这个dll文件。所有的指示mgls_admin, mgls_ok, mgls_asynch(都是可执行文件),这些文件分别位于modtech/linux_x86_64_mgls_lib (/bin and /lib)里面。
comment2: ref4这个里面的安装讲的还不如ref1,但是关于license,我并没有看到DEAMON,事实上,#应该是注释,为什么要去换注释部分的hostid, MAC地址?
comment: ---->/root/.bashrc.