1 #include <GL/glut.h>
2 #include <ctime>
3
4 #define MULTIPLIER 0x015a4e35L
5 #define INCREMENT 1
6
7 static const unsigned char CD_UP = 24;
8 static const unsigned char CD_DOWN = 25;
9 static const unsigned char CD_RIGHT = 26;
10 static const unsigned char CD_LEFT = 27;
11
12 static const int WindowWidth = 640;
13 static const int WindowHeight = 480;
14
15 static Bottle* bottle = NULL;
16 static Capsule* capsule = NULL;
17
18 enum Connect
19 {
20 LEFT, RIGHT, UP, DOWN, NOT_CONNECTED
21 };
22
23 enum Color
24 {
25 YELLOW, BLUE, RED, BLACK
26 };
27
28 enum GridType
29 {
30 CAPSULE, WORM, NOTHING
31 };
32
33 class Bottle
34 {
35 private:
36 GridType b_grid_type[16][8];
37 Color b_color[16][8];
38 int b_x,b_y;
39 int b_seed;
40 public:
41 Bottle( int seed, int level, int xx, int yy )
42 {
43 b_seed = seed;
44 b_x = xx;
45 b_y = yy;
46 for ( int i = 0; i < 16; ++i )
47 {
48 for ( int j = 0; j < 8; ++j )
49 {
50 b_grid_type[i][j] = NOTHING;
51 b_color[16][8] = BLACK;
52 }
53 }
54 for ( int i = 0; i < level*4; ++i )
55 {
56 int x = myRand()%8;
57 int y = myRand()%16;
58 Color color = myRand()%3;
59 if ( ok( x, y, color, level ) )
60 {
61 b_grid_type[y][x] = WORM;
62 b_color[y][x] = color;
63 }
64 else
65 --i;
66 }
67 }
68 int myRand( void )
69 {
70 seed = MULTIPLIER*seed + INCREMENT;
71 return ((int)(seed>>16) & 0x7fff);
72 }
73 bool ok( int x, int y, Color color, int level )
74 {
75 if ( level < 15 && y <= 6 ) return false;
76 if ( ((level+1)>>1)+3+y < 16 ) return false;
77 if ( x-2 >= 0 && b_grid_type[x-1][y] == WORM && b_color[x-1][y] == color
78 && b_grid_type[x-2][y] == WORM && b_color[x-2][y] == color ) return false;
79 if ( x+2 < 8 && b_grid_type[x+1][y] == WORM && b_color[x+1][y] == color
80 && b_grid_type[x+2][y] == WORM && b_color[x+2][y] == color ) return false;
81 if ( y+2 < 16 && b_grid_type[x][y+1] == WORM && b_color[x][y+1] == color
82 && b_grid_type[x][y+2] == WORM && b_color[x][y+2] == color ) return false;
83 if ( b_grid_type[x][y-1] == WORM && b_color[x][y-1] == color
84 && b_grid_type[x][y-2] == WORM && b_color[x][y-2] == color ) return false;
85 return true;
86 }
87 };
88
89 class Capsule
90 {
91 private:
92 int c_x,c_y;
93 Connect c_connect;
94 Color C_color;
95 public:
96 Capsule( int xx, int yy, Connect con, int color)
97 {
98 c_x = xx; c_y = yy; c_connect = con; c_color = color;
99 }
100 };
101
102 void draw( void )
103 {
104 bottle->display();
105 }
106
107 void display( void )
108 {
109 glClear( GL_COLOR_BUFFER_BIT );
110 draw();
111 glutSwapBuffers();
112 }
113
114 void key( unsigned char key_char, int not_use, int not_use_1 )
115 {
116 capsule->setDirect( key_char );
117 }
118
119 int main( int argc, char * argv[] )
120 {
121 glutInit( &argc, argv );
122 glutInitDisplayMode( GLUT_RGBA|GLUT_DOUBLE );
123 glutInitWindowPosition( 50, 50 );
124 glutInitWindowSize( WindowWidth, WindowHeight );
125 glutCreateWindow( "Dr Mario By PureMilk" );
126 glutDisplayFunc( display );
127 glutKeyboardFunc( key );
128 glutTimerFunc( 250, timer, 0 );
129 gluOrtho2D( 0, WindowWidth, WindowHeight, 0 );
130 glutMainLoop();
131
132 return 0;
133 }
我是C++盲……
posted @
2008-10-15 13:13 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(293) |
评论 (5) |
编辑 收藏
void glutTimerFunc(int delay, (void (*func)( int
parameter),int parameter) 这个函数相当于win32 api 中的timer 定时器,也是在delay毫秒后 放出一个定时器消息,而这里的func 则为这个消息的处理函数, patameter为附加参数。 这里有一点要注意这个函数是一次性的, 如果要重复使用可以在func中继续调用glutTimerFunc,而且这个功能是可以叠加的,在opengl 内部将他们看成许多个不同的定时器,这也就是为什么我们在上面的例子中连续按下鼠标右键会加快旋转的速度
Trackback: http://tb.donews.net/TrackBack.aspx?PostId=628504
我就暂且给今天的笔记取个灵异事件的科教解析栏目的题目吧。
和猫聊天最大的收获是这句话:
天地之灵(402740419) 21:15:21
逻辑和显示 分离
这是经验,也是教训,也是潮流
天地之灵(402740419) 21:15:52
逻辑处理输入,改变状态
显示把状态展示到显示器
解除了我很多困惑。猫说的很清楚,我就不再多说了
下面说说我的计划。明天计划找老大聊科研基地的事,顺便把请他吃饭的诺言实现了,估计会聊到很晚,所以争取中午写学习笔记,下午有选修课。周四周五专心写Dr Mario。很难说能写到什么程度,因为以前写dp的很少有写到400行的时候,基本上写到一两百行就够我调试一两天了。虽说Dr Mario的逻辑比那些古怪算法简单多了,但是代码量增加,调试时间恐怕要指数级增长,我争取周五完成基本功能。周六周日又有两场比赛,真抱歉,这周末又做不了什么了。我想Dr Mario最多拖到下周二,也就是21号,完成一些附加的功能之类的。请大家监督我。
殿下定的计划里,Dr Mario持续到10月底,那么我21号到31号的时间就用来学习图形学理论知识,到时候把学到的知识每一点每一滴都总结出来给大家分享。另外科研基地的活动也马上就要大开工了,想想真烦啊,怎么总有些乱七八糟的事儿,就不能一次只做一件事。陈省身说“我一生只做一件事”,觉得很羡慕。不过这也都是我自己选择的,我的路都是我自己走的,更何况不是什么坏事。
我觉得自己面临很大的问题是这次得奖。比失败更难面对的是超出预计的荣誉。我找不到自己的位置了。一方面我无比怨念这成绩根本没法和我付出的努力比,另一方面,我的水平没达到那奖的程度。有些矛盾。我想还是多些感恩吧。不管经历什么,只要我在不断成长就好。
posted @
2008-10-14 22:51 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(213) |
评论 (2) |
编辑 收藏
懒懒散散的已经过了两天了,只有偶尔得看看OpenGL。貌似已经早早得遇到了一个瓶颈,这只能怪我学得太杂---什么东西都想学学---而不精---学过的都是一知半解。最近看看3D的基础知识,前面的看似很简单,但是看过了之后才知道自己好像就没记住什么东西。
今天网上找了一本书,虽然很难看懂---英文版的---但是感觉很好,至少不必再取瞎研究一个函数参数的具体意义了,《
OpenGL函数手册》推荐大家看看。
posted @
2008-10-14 21:56 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(121) |
评论 (1) |
编辑 收藏
这篇随笔保证只有一句废话。
init Xiaofangkuai() //小方块的初始化
{
color=random(RED,GREEN,BLUE);
x=x0;y=y0; //动态坐标,几何中心坐标
}
XiaofangkuanKuMade() //构建一个小方块库,容积1000,超过500胶囊还没死那就过关吧
{
for(i=0;i<1000;i++)
ku[i]=Xiaofangkuai;
}
JiaonangMade() //创建胶囊 if (key.isdown(key.DOWN)) {
{
left=ku[i];right=ku[i+1]; //胶囊分两块儿,左右各为一个小方块
ku[i+1].x=ku[i].x+a; //两个小方块的横坐标之间相差边长a
}
init Pingzi(); //用小方块构建瓶子
{
for()
{
ku[i].color=WHITE; //为以后不与普通小方块产生混淆,更改颜色为白色
ku[i];
}
}
上面是元件的构建,应该没落下什么东西吧。下面实现函数。
int hitTest() //检测碰撞
{
for(m=0;m<i;m++) //比较ku[i]小方块和之前所有小方块的横纵坐标。
{
Mx[m]=ku[m].x;
My[m]=ku[m].y;
if(ku[i].x==Mx[m]&&ku[i].y==My[m]+a) //如果ku[i]的横坐标和之前的小方块的横坐标相等,纵坐标相差一个边长
break;return ture; //跳出这个函数,直接返回真
else continue;
}
return false; //最后如果都不符合,返回假,即没有遇到
}
drop()
{
if(!hitTest)
{Jiaonang.left.y-=a;
Jiaonang.right.y-=a;}
}
下面推出的是按键检测函数
按键检测函数先不要写了,弄不明白它跟键盘是怎么交互的。
下面说这个难度最大的四块相消吧。
fourinvisiable()
{
for(m=i;m>0;m--) //判断四个相接的色块是不是同色
{
M[m]=ku[m].color;
if(M[m]==ku[i].color&&Mx[m]==k[i].x&&My[m]=ku[i].y+a){ //判断最新的色块和与其相接的色块是不是同色
for(n=m;n>0;n--)
{
if(M[n]==ku[m].color&&Mx[n]==k[m].x&&My[n]=ku[m].y+a) //如果同色判断该色块和与其相接的色块是不是同色
{
for(p=n;p>0;p--) //如果同色判断该色块和与其相接的色块是不是同色
{
if(M[p]==ku[n].color&&Mx[p]==k[n].x&&My[p]=ku[n].y+a) //如果同色判断该色块和与其相接的色块是不是同色
{ //至此四个色块同色,消掉
delet M[i],M[m],M[n],M[p];
}
}
}
}
}
if(剩下两种情况) ; //其他两种情况为最新的色块落在一排三个同色色块的右面以及落在一排三个同色色块的左面
}
}
结束判断
bool GameOver()
{
if (ku[i].y>=hight)
return ture;
}
bool GameFinished()
{
if (i>1000)
return ture;
}
主函数
main()
{
JiaonangMade();
PingziMade();
for(i=0;i<1000;i++)
{
if(GameOver)
cout<<"You Lose"<<endl;
if(GameFinished)
cout<<"YouPass"<<endl;
if(!hitTest)
{
Jiaonang[i].drop();
Jiaonang.key();
FourInvisiable();
}
else break;
}
}
posted @
2008-10-14 18:59 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(140) |
评论 (1) |
编辑 收藏
我昨晚回来第一件事开电脑,本想写点啥的,结果真是两天不学习,赶不上咱们小组的好童鞋们。我高估了我的体力,今下午睡了整整一下午才休息过来,这学期少有的逃课啊。果然脑力劳动对体力的耗费是不可估量的。本想今下午休息好了晚上可以大干一场了,结果又被弄去采访,到十点才回来,马上断网了,俺先随便写点儿。
不过在南京的时候,比赛的前一天晚上睡觉前,学习了一节OpenGL教程,在去南京和回南京的汽车火车上看完了贪食蛇的全部代码,总算是没有落下太多,还望大家多提携俺。接下来俺会赶紧的赶上大家的进度不会拖后腿儿的。俺今天晚上断网以后还要再学一会儿,明天笔记多写点儿。
posted @
2008-10-13 22:54 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(75) |
评论 (0) |
编辑 收藏
虽然给人又说了一遍啰嗦了,但是咱最起码先把这个题目解释清了。于是,这段就不叫啰嗦了。本来今天的计划是要继续研究贪食蛇呢,可是,两天了都没找到那个聚精会神的状态,于是乎,还没有看。本来玛丽医生是要明天讨论的,但是今天上网络忍了又忍之后还是想了一下。综上,不务正业。既然都不务正业了,那咱得把成果拿出来,于是,请回车。
小分析了一下实现玛丽医生通俗意义上的基本功能,理论上需要这么些函数。来,换行。
坠落函数,还是叫它堕落函数吧。功能:实现胶囊的匀速下落。
检测障碍物函数:碰到胶囊和瓶壁或者瓶底了要止步。
检测按键函数:跟踪键盘按键,实现翻转和加速。
同色检验:用于判断两个胶囊颜色是否相同。
四块相消函数:凡是能用直线串起来的四块同色胶囊消掉。联系坐标检测,因为是直线,所以某坐标是定值。检测坐标是否相同即可。
随机产生函数:用于胶囊的随机产生。
基础功能之上还需要积分换算函数用以计算分数。
下面贴流程设计。
没看到流程图的按钮,还是用文字来表达吧。
大体分三步:1.元件构建;2.各种函数书写;3.整合测试。
由于考虑到元件的性质决定了后面的过程,所以这个流程是我们开发的流程,也就是说做完一步才能走下一步。
1.元件构建:
1〉色块
如果有三种颜色的话需要九种图形。前提是我们把每个胶囊作为一个最基本的结构单元,现在想来完全可以把每个色块作为最基本的结构单元。
这个色块需要存储的信息:动态坐标,静态色块代码。
2〉瓶子
瓶子可以作为独立的结构单元,如果觉得繁琐的话可以用第四种颜色的色块拼成瓶子,这样少构建一个元件但需要一个静态的构造瓶子的函数。
2.各种函数:(按顺序设计)
1〉随机产生函数
2〉堕落函数
1)检测障碍物
2)检测按键
1*旋转测试
2*加速测试
3)匀速堕落
3〉同色检验
4〉四块相消
1) 检测
2)消去
3)检测障碍物继续堕落
5〉结束判断(判断Y坐标)
6〉预视窗添加
7〉积分添加
8〉声音添加
哦了,按着写的草稿网上贴了,都忘记什么意思了,快要停止思考了。我饿啊~~
要断网了,明天贴伪码。
posted @
2008-10-13 22:26 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(165) |
评论 (0) |
编辑 收藏
早晨起来惊奇地发现留言板居然有内容,更惊奇的是还是私人留言,更更惊奇的是私人留言也没说什么私人的内容,更更更惊奇的是这个人是传说中的tdzl。传说中的二师傅现身了。咱也不了解这个传说有多邪乎,隐约感觉这是一个知名度不小的同志。那个神奇啊。感谢感谢。
需要感谢的还有陈梓翰同志,一直实名评论,给出一些很中肯的建议,推动着推动着。话说这个人俺自然也不认识的,毕竟才在这里呆了两天。就像一男人搬家到了新几内亚的一所房子里,虽然两天了,但是他也没出去啊,没串门就不知道邻居啥样子。不过隐约感觉这也是圈内一个知名度不小的同志。那个神奇啊。感谢感谢。
下面说恭喜。俺们的PureMilk拿了江苏ACM大赛的一等奖,那个神奇啊。恭喜恭喜。
不能破坏已有结构,结尾了。明天贪食蛇的研究就要结束了,改写报告的写报告,咋就能没有感想呢?俺妈说偷懒不是好孩子。
posted @
2008-10-12 22:11 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(242) |
评论 (3) |
编辑 收藏
有些人活着,可他已经死了——》说的就是白天的我。大学以来,因为贪玩一向把学习时间逼到夜里,久而久之我的生物钟真的颠倒了。。。以前数据结构做作业都是夜里通宵写程序调程序的,夜里身子累的不行,思维却异常的兴奋。。。今天因为夜里没有时间。。。只好白天学习。。。很不习惯。。。没有激情,只有噪音。。。
贪食蛇。。。为了看懂那个丑陋(不,是简陋)的EXE的源代码,我把C语言和C++的书都给扒出来了,找书实在是个体力活。。。看书也是。。。冗长的代码,for循环很晕人,调试错误很揪心(调出来自然很得意,调不出来就得那么一直揪着。。。揪着。。。),偷偷展望了一下今后(工作以后)要是真的天天对对着这些。。。以后找工作,希望最后可以做筱筱殿下那个,主策划辅编程,不用整天整天的琢磨代码,不会未老先衰;偶一为之,还可以锻炼脑力,预防老年痴呆。。。当然,这种职位是不会属于刚毕业的小孩的。。。
所以。。。还得继续打着哈欠看glutMainLoop();很钦佩殿下的气定神闲,显然这只属于作息正常的孩子的。。。
posted @
2008-10-11 21:56 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(211) |
评论 (7) |
编辑 收藏
做东西得沉得住气,也就是说要气定神闲地去做,切不可浮躁。这就是今天的体会,哦,其实是老早就想明白的一个道理,今天又重新体会了一遍。
按照计划今天和明天是研究贪食蛇的时间,那个程序对于我来说很长,虽然也有很多注解,看得我还是眼花缭乱。其实,我个人感觉我是可以看明白的,不就是几个英文单词吗,都写那么明白了,再说不会的还可以百度和谷歌呢。现在都晚上了,其实看那个程序加起来的时间也就不到10分钟,认真地看这个程序的时间也就是一两分钟,这样子想看懂?痴人说梦,嗯,也是吃人说孟。明天逮个精神好的时间段,吭哧吭哧把丫撂平了。
之前一直在做一个Flash的小游戏,因为是从0到10的过程,所以比较艰难,也没有系统地去学AS,只是用到哪里看哪里,这样只有架构,没有真正理解了Flash这个软件以及AS的核心思想,也就是他的套路。我觉得弄明白一个软件的概念和套路,这个软件你就拿下了。到现在我只是大概了解了它的思路,结构层次。一步一步的实现,前一阵子做得焦头烂额,陷了进去,越挣扎陷得越深,浆糊效应(这个是自个儿起的名字),也就是说一头扎下去了,拼了老命的往前冲,不撞墙才怪呢,所以需要做得就是冷静一下,站在一个更高的位子看下自己走过的路,哪里是正确的,哪里出问题了。于是,停手了一段时间,不过不是主动停手去找问题的,而是忙别的事情,这个就暂时耽搁了。今天早晨比较靠谱地分析了一下,然后吭哧吭哧就解决了两个问题,现在从0走到4了吧,走到6的时候这个游戏的需求就满足了。嘿嘿,小得意一个。继续加油。
总之~~做事情就像挖地道,挖的时候要用力还要用心,挖不动的时候就跑到地面上看看哪里堵墙了。不管怎么着就是一个核心思想,像一个将军一样去分析和规划,像一个士兵一样去实践和战斗。
大家好运,我也好运~~明儿见~
posted @
2008-10-11 20:53 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(184) |
评论 (0) |
编辑 收藏
今天仔细研究了一下glRotatef()函数参数的具体意义。angle毋庸置疑就是旋转的角度,而x,y,z三个参数则应该看成一个整体表示一个向量,表示物体围绕向量[x,y,z]旋转。下面就具体谈谈自己发现这几个参数意义的过程。
刚看glRotatef()函数的时候对各个参数的意义很是不明白,自己上网查了一查,但发现网上说的却不是我想要的答案。于是潜下心来研究了一番。刚开始看的时候在参数angle上根本就没花什么时间,对于x,y,z三个参数的研究主要分为了如下几个个过程。初看的时候是对三个参数分个来研究的,发现如果x,y,z中仅有一个不为0的话,例如x不为0,若x>0,则表示绕x轴正方向旋转angle度,若x<0,则表示绕x轴负方向旋转angle度,不论x的值是多大,即1.0和0.1代表的都是绕x轴正方向旋转angle度。于是就初步下了一个结论,即x,y,z只表示了三个状态,即大于0表示绕该轴正方向旋转,小于0表示绕该轴负方向旋转,等于0就表示绕该轴不旋转。但是当x,y,z三个参数中至少有两个不为0的时候发现根本不是那么回事,因为当x不为0且为一个定值的时候,y取不同值物体旋转的状态根本就不一样,这就推翻了我第一次的假想。到了这里似乎就遇到了一个瓶颈,任我如何想都想不明白,到了吃饭的时间居然都感觉不到饿。后来实在没有办法的时候还是打算先去吃饭,刚穿上外衣的时候突然一个想法闪进我的脑海,为什么不把x,y,z看成一个整体呢?带着这个疑问我思考了一路,越想越兴奋,最后才向x,y,z应该表示一个向量,即物体旋转时所围绕的那个向量。回来后测试了一下发现[0,1,1]和[0,2,2]所产生的旋转效果是一样的,后来又测试了几组值,我对自己的猜想更加地肯定了。
虽然更加肯定了自己的想法,但还是不能说明它是百分之百正确的,还希望各位找找看看能不能再补充一点或者添加一些其他函数参数意义的说明。
posted @
2008-10-11 18:57 正牌的天地之灵和他的徒儿们肖赫_王婷婷_王冠_郑燚_孙婷 阅读(12099) |
评论 (13) |
编辑 收藏