太阳是黑色的

少年听雨歌楼上,红烛昏罗帐.壮年听雨客舟中,江阔云低断雁叫西风. 而今听雨僧庐下,鬓已星星也! 悲欢离合总无情,一任阶前点滴到天明.

Archive for 27 7 月, 2004

广安之旅

(这是给她的一封信的部分内容,就当是游记了)下午六点过终于从广安归来。恩,还是有很多的感想。总的来说,由于是跟着大人去玩儿,所以更像是一种任务。去的人都是我妈妈的大学同学。广安是四川的一个地区(一种行政单位),以前重庆没有划出去的时候地处四川的中部,现在则是在川东了,距离成都大概三百公里的地方。从成都出来一路的绿绿茵茵,以前没有高速公路(成都到南充、广安、达州)的时候,听说这三百公里要走一天。以前从来没有到过四川中部的这些地方,这次一看还是很喜欢的,就是那种很自然的小丘陵,和没有那么多现代化的城市气息。 广安是邓小平的故里,确切的说,邓小平从他十多岁离开那里就再也没有回去过了。我妈大学的一个同学在广安当市委副书记。所以,一到广安就是最高档次的接待,让人觉得很不自在。广安市在渠江边上,现在新县城修得很好,好得很多地方都比成都漂亮。当然,中央肯定投了很多钱,比如有中国最大的主题广场–思源广场,吉尼斯世界纪录的什么千年鼎。这个我等会儿再来评论。中午是在一个五星级宾馆吃的。都是我这种穷人没见过的菜肴,没吃饱也没吃好。我觉得这样出来玩儿很别扭。大人们自然很高兴,市委书记亲自给他们敬酒。最好笑也最让我深思的就是,市委书记手下的好多人也忙里忙外,我们几个小孩也被伺候得让我们自己都觉得不习惯。吃了饭,就由市委书记和手下一群什么什么书记局长带着我们去了才开发出来一个旅游景点–华蓥山大盆景风景区。华蓥山距离广安二十多公里,是四川东部最高山。如果你看过《红岩》,你就可能很熟悉华蓥山游击队,什么双枪老太婆,什么江姐都是华蓥山游击队的。我外婆的一个好朋友(现在还在,我还经常去)就是华蓥山游击队的。当然,开发这个旅游景点让我觉得很不伦不类。因为按理说,这个旅游景点不是很好,风景一般,就是喀斯特地貌,不过和云南、桂林的差远了,也就是有一些奇怪的石头和天然的树林而已。恩,还是可以啦,至少比较凉快。倒是有一个景点还可以,就是一个大天坑。所谓天坑就是一个山之间的坑,但是却不积水,因为水可以渗下去,很奇怪。其他的就没什么了,两个多小时,就当锻炼了身体吧。总之,这个景点我觉得就是因为要配合邓小平故里这个主题,硬着开发的一个景点,所谓配套的。玩儿了华蓥山,就到了一个农家山庄去吃饭,都是野味,还可以,就是觉得东西很杂。当然,农家院的东西要比中午的那些吃不来的山珍海味要好得多了。吃了东西又返回广安县城,到思源广场观看所谓中国最大的水幕电影。水幕电影就是类似音乐喷泉,不过除了音乐还有就是把电影投影到水上看。我们去的时候已经演完了。当然,由于有领导在,所以破例又给我们演了一次,然后我们做在广场中间贵宾席坐下。真的很让人不自在,因为周围的老百姓只能在远处站着看,就我们二十多个人坐着看,然后还有保安,更可笑的是广播里面放音:“欢迎领导观看”。我当时感到十分的羞愧。不过,这个水幕电影确实很不错。气势和精彩程度相当让人激动。这套设备是几千万引进的。看了这个,晚上又返回华蓥住在一个当地最好的宾馆里,包了一层楼。市委底下跑腿的累得够呛,还让我们几个小孩去洗桑拿,被我们坚决拒绝了,当然本来我们几个小孩都在看你推荐的《海上钢琴师》。今天早上八点起来,广安的气候很像重庆,早上一起来就很热了,坐车从宾馆出来到了邓小平故居。在我想象中,故居肯定是在一个小城镇里面,结果让我大吃一惊的是故居居然都是一个公园了!也就是说就那么孤零零的一座房子,周围都重新修成很现代化的公园了。我旁边的人都说难道邓小平家是地主庄园? 还是特殊化,别人游人都是走路,我们坐着电瓶车。理所当然,公园修建得很政治化。首先,公园绿化很好,周围的树林都是中央各部门捐建的,然后每个部门捐建的树林前面有一个石碑,刻着某某部门。我细细看了一下,总之好像大家还争先在这个地方捐建树林。可以想象,这也是一种政治荣誉。其实这个公园里面没什么东西,就是一个邓小平雕像,现在还没有安放好,要等八月22日一百周年诞辰的时候由中央领导揭开。然后就是一个邓小平纪念馆,也没有开馆,还在布置。当然我们又因为特殊的原因,所以进去参观了。就是邓小平的生平展览。很现代化的纪念馆,我看比北京任何一个展览馆都要好得多。特别说一下的还有就是纪念馆这个建筑修的还不错。是一种很抽象的建筑,不像北京那些四四方方的建筑。纪念馆以后就是正题:故居。故居自然经过翻修,不过里面的东西却没有动过,还是那些破破旧旧的东西,这个出乎我的意料。看完了故居也都中午了,又拉到邓小平的那个村子–牌坊村(就在这个公园旁边)吃饭。整个牌坊村都经过完全设计并且修建。都是那种很假的古建筑,一排一排的,所有的农民都住里面。看上去很不自然。又是在一家类似农家乐的地方吃饭。还凑合,大人们就是喝酒。很快就踏上了返回成都的路。我也混混沉沉的睡去了。

下面说一说我的感想。我的第一个感想就是,如果邓小平在世,那么他的家乡绝对不会这么搞。首先,他肯定不会同意。这完全是和他的精神相违背的。整个广安打的就是“邓小平牌”,就是所谓的“伟人游”。邓小平成了一个发财致富的品牌。显然,这个肯定是务实的邓小平所不能接受的。这也是一种造神,一种扭曲的个人崇拜,包括华蓥山旅游区的开发也是所谓“伟人游”的一部分,让人觉得很多余,很浪费资源。第二个感想就是,为什么广安不好好搞建设,而要去搞很多的政绩工程,很多面子活儿。乍一看广安,比成都,甚至比北京都要好,现代化程度都要高。城市里面的交警都是女警察,非常好看。可是,我们所见到的仅仅是新城,也就是拿出来顾面子的城区,老城区在新城区的旁边,我想肯定更多的老百姓是住在老城区里,那么老城区的生活是什么样子呢?还是新城区这样的花天酒地吗?不可能吧。广安是四川的穷地方,这个根本不容质疑。问题是,那么多的钱都去弄各种政绩了,真正的发展在哪里?到处都是邓小平的语录“发展才是硬道理”。我却对广安的发展深表怀疑。第三个感想就是,我终于领会到了腐败旅游,终于知道了什么是特权化。同时我也知道了,当官或者说是走仕途有多么多的应酬是怎么回事了。本来,就是一群大学同学聚会。可是弄成了招待首长的级别,很多与这个根本没有关系的人参与进来,比如我说过的什么什么局长,什么什么区委书记。然后吃饭就变成了政治化的聚餐。这些什么什么长还给我们小孩敬酒(我当然没喝),我都不知道这是哪儿跟哪儿。一个市委书记的大学同学聚会要搞成这样,地下的干部不去工作,而是陪玩儿,陪吃,这个建设怎么搞得好,好几个干部还很自豪的说,每天都要陪人,习惯了,甚至最近好些天都是一天陪几个团体。天!这就是我们基层干部!最后走了,还送我们很贵重的礼物–邓小平纪念邮票一本(是非卖品,我估计好几百)。这些让我觉得很恶心了。整个广安,借邓小平致富的办法令我很悲哀。这就是我们对待我们伟人的方法。

贪吃蛇进度(1)

现在实现了计时器机制和事件机制。下一步是怎么去实现贪吃蛇的走动。

现在分为两个文件:snake.h和snake.c

如下:snake.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
#define NEWEVENT (EventLink)malloc(sizeof(event))
#define MAXSNAKELEN 30 /* Max length of the snake */
#define DEFAULTSNAKECOLOR WHITE /* The default snake color */
#define DEFAULTSPEED 100000 /* The start speed of the snake */
#define DEFAULTSTARTX 100 /* The start x of the snake */
#define DEFAULTSTARTY 100 /* The start y of the snake */
#define MAXEVENT 1 /* The startup event number */
 
/* Keyboard definition */
 
#define ENTER 13
 
/* The prototype of bool type */
 
typedef enum {
    true,
    false
} bool;
 
/* The prototype of directions */
 
typedef enum {
    up,
    right,
    down,
    left
} direction;
 
/* The prototype of a point of the snake */
 
typedef struct {
    int posx;
    int posy;
    direction dir; /* The current direction of this point */
} point;
 
/* The prototype of the snake */
 
typedef struct {
    point dots[MAXSNAKELEN];
} snake;
 
 
 
#ifndef __SNAKE
 
 
 
/* prevent multiple includes */
 
#define __SNAKE
 
/* The prototype of the event */
 
typedef struct {
    long interval; /* The interval of the event occurs */
    long timer;
    void (*invoke)(); /* The function pointer to the invoke action */
 
} event;
 
/* The prototype of the eventlist */
 
struct eventlist {
    event *eventnow;
    struct eventlist *next;
 
};
 
typedef struct eventlist Node;
typedef Node *Link;
typedef event *EventLink;
 
 
int screenx = 0;
int screeny = 0;
 
 
 
void Init(snake *s);
void EventHandler(Link);
void EventInsert(Link, EventLink);
Link EventCreater(Link);
void EventFree(Link);
 
 
 
/* Registry Events */
 
void Controler(); /* The main keyboard controler */
void DrawPoint();
void DrawLine();
 
void DrawSnake(snake *s);
void EventInsert(Link eventhead, EventLink newevent) {
 
    Link pointer;
    Link newlist;
    pointer = eventhead;
 
    while (1) {
 
        if (pointer->next == NULL) {
            newlist = (Link) malloc(sizeof (Node));
            newlist->eventnow = newevent;
            newlist->next = NULL;
            pointer->next = newlist;
            break;
 
        }
 
        pointer = pointer->next;
    }
}
 
Link EventCreater(Link eventhead) {
 
    Link newevent;
    EventLink tempevent;
    int i;
    eventhead = (Link) malloc(sizeof (Node));
    /* Create event list */
    if (eventhead == NULL) {
        printf("Memory allocate Failure!!\n");
 
    } else {
        tempevent = (EventLink) malloc(sizeof (event));
        tempevent->interval = 1;
        tempevent->timer = 0;
        tempevent->invoke = Controler;
        eventhead->eventnow = tempevent;
        eventhead->next = NULL;
    }
    return eventhead;
 
}
 
void EventFree(Link eventhead) {
 
    Link pointer;
    EventLink tempevent;
    while (eventhead != NULL) {
 
        pointer = eventhead;
        eventhead = eventhead->next;
        tempevent = eventhead->eventnow;
        free(pointer);
        free(tempevent);
    }
}
#endif

Snake.c

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <conio.h>
#include <graphics.h>
#include <dos.h>
#include <snake.h>
/* To return the head pointer of the eventlist */
int main(void) {
 
    snake me;
    Link head;
    int gdriver = DETECT, gmode;
    EventLink tempevent;
 
    /* Init graphic mode */
    initgraph(&gdriver, &gmode, "");
    Init(&me);
    head = EventCreater(head);
    tempevent = NEWEVENT;
    tempevent->interval = 10000;
    tempevent->timer = 0;
    tempevent->invoke = DrawPoint;
    EventInsert(head, tempevent);
    EventHandler(head);
    EventFree(head);
    closegraph();
    clrscr();
    return 0;
}
 
void DrawLine() {
 
    int x;
    int y;
    x = random(500);
    y = random(500);
    circle(x, y, 20);
}
 
void DrawPoint() {
 
    int x1, x2;
    int y1, y2;
    x1 = random(200);
    x2 = random(100);
    y1 = random(200);
    y2 = random(100);
    line(x1, y1, x2, y2);
}
 
void Controler() {
 
}
 
void Init(snake *s) {
 
    int i, j;
    int sx = DEFAULTSTARTX, sy = DEFAULTSTARTY;
    randomize();
    for (i = 0; i < MAXSNAKELEN; i++) {
        s->dots[i].posx = sx;
        s->dots[i].posy = sy;
        s->dots[i].dir = up;
        sy++;
    }
 
    screenx = getmaxx();
    screeny = getmaxy();
}
 
/* Draw snake */
 
void DrawSnake(snake *s) {
 
    int i;
    for (i = 0; i < MAXSNAKELEN; i++) {
        putpixel(s->dots[i].posx, s->dots[i].posy, DEFAULTSNAKECOLOR);
    }
}
 
void EventHandler(Link eventhead) {
 
    int i;
    Link pointer;
    while (1) {
        delay(1);
        pointer = eventhead;
        while (pointer != NULL) {
            pointer->eventnow->timer++;
            if ((pointer->eventnow->timer) >= (pointer->eventnow->interval)) {
                /* Invoke current event */
                pointer->eventnow->invoke();
                pointer->eventnow->timer = 0;
            }
 
            pointer = pointer->next;
        }
 
        if (kbhit()) {
            if (getch() == ENTER)
                break;
        }
    }
}