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 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(316) |
評論 (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 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(225) |
評論 (2) |
編輯 收藏
懶懶散散的已經過了兩天了,只有偶爾得看看OpenGL。貌似已經早早得遇到了一個瓶頸,這只能怪我學得太雜---什么東西都想學學---而不精---學過的都是一知半解。最近看看3D的基礎知識,前面的看似很簡單,但是看過了之后才知道自己好像就沒記住什么東西。
今天網上找了一本書,雖然很難看懂---英文版的---但是感覺很好,至少不必再取瞎研究一個函數參數的具體意義了,《
OpenGL函數手冊》推薦大家看看。
posted @
2008-10-14 21:56 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(132) |
評論 (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 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(157) |
評論 (1) |
編輯 收藏
我昨晚回來第一件事開電腦,本想寫點啥的,結果真是兩天不學習,趕不上咱們小組的好童鞋們。我高估了我的體力,今下午睡了整整一下午才休息過來,這學期少有的逃課啊。果然腦力勞動對體力的耗費是不可估量的。本想今下午休息好了晚上可以大干一場了,結果又被弄去采訪,到十點才回來,馬上斷網了,俺先隨便寫點兒。
不過在南京的時候,比賽的前一天晚上睡覺前,學習了一節OpenGL教程,在去南京和回南京的汽車火車上看完了貪食蛇的全部代碼,總算是沒有落下太多,還望大家多提攜俺。接下來俺會趕緊的趕上大家的進度不會拖后腿兒的。俺今天晚上斷網以后還要再學一會兒,明天筆記多寫點兒。
posted @
2008-10-13 22:54 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(79) |
評論 (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 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(182) |
評論 (0) |
編輯 收藏
早晨起來驚奇地發現留言板居然有內容,更驚奇的是還是私人留言,更更驚奇的是私人留言也沒說什么私人的內容,更更更驚奇的是這個人是傳說中的tdzl。傳說中的二師傅現身了。咱也不了解這個傳說有多邪乎,隱約感覺這是一個知名度不小的同志。那個神奇啊。感謝感謝。
需要感謝的還有陳梓翰同志,一直實名評論,給出一些很中肯的建議,推動著推動著。話說這個人俺自然也不認識的,畢竟才在這里呆了兩天。就像一男人搬家到了新幾內亞的一所房子里,雖然兩天了,但是他也沒出去啊,沒串門就不知道鄰居啥樣子。不過隱約感覺這也是圈內一個知名度不小的同志。那個神奇啊。感謝感謝。
下面說恭喜。俺們的PureMilk拿了江蘇ACM大賽的一等獎,那個神奇啊。恭喜恭喜。
不能破壞已有結構,結尾了。明天貪食蛇的研究就要結束了,改寫報告的寫報告,咋就能沒有感想呢?俺媽說偷懶不是好孩子。
posted @
2008-10-12 22:11 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(252) |
評論 (3) |
編輯 收藏
有些人活著,可他已經死了——》說的就是白天的我。大學以來,因為貪玩一向把學習時間逼到夜里,久而久之我的生物鐘真的顛倒了。。。以前數據結構做作業都是夜里通宵寫程序調程序的,夜里身子累的不行,思維卻異常的興奮。。。今天因為夜里沒有時間。。。只好白天學習。。。很不習慣。。。沒有激情,只有噪音。。。
貪食蛇。。。為了看懂那個丑陋(不,是簡陋)的EXE的源代碼,我把C語言和C++的書都給扒出來了,找書實在是個體力活。。。看書也是。。。冗長的代碼,for循環很暈人,調試錯誤很揪心(調出來自然很得意,調不出來就得那么一直揪著。。。揪著。。。),偷偷展望了一下今后(工作以后)要是真的天天對對著這些。。。以后找工作,希望最后可以做筱筱殿下那個,主策劃輔編程,不用整天整天的琢磨代碼,不會未老先衰;偶一為之,還可以鍛煉腦力,預防老年癡呆。。。當然,這種職位是不會屬于剛畢業的小孩的。。。
所以。。。還得繼續打著哈欠看glutMainLoop();很欽佩殿下的氣定神閑,顯然這只屬于作息正常的孩子的。。。
posted @
2008-10-11 21:56 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(231) |
評論 (7) |
編輯 收藏
做東西得沉得住氣,也就是說要氣定神閑地去做,切不可浮躁。這就是今天的體會,哦,其實是老早就想明白的一個道理,今天又重新體會了一遍。
按照計劃今天和明天是研究貪食蛇的時間,那個程序對于我來說很長,雖然也有很多注解,看得我還是眼花繚亂。其實,我個人感覺我是可以看明白的,不就是幾個英文單詞嗎,都寫那么明白了,再說不會的還可以百度和谷歌呢。現在都晚上了,其實看那個程序加起來的時間也就不到10分鐘,認真地看這個程序的時間也就是一兩分鐘,這樣子想看懂?癡人說夢,嗯,也是吃人說孟。明天逮個精神好的時間段,吭哧吭哧把丫撂平了。
之前一直在做一個Flash的小游戲,因為是從0到10的過程,所以比較艱難,也沒有系統地去學AS,只是用到哪里看哪里,這樣只有架構,沒有真正理解了Flash這個軟件以及AS的核心思想,也就是他的套路。我覺得弄明白一個軟件的概念和套路,這個軟件你就拿下了。到現在我只是大概了解了它的思路,結構層次。一步一步的實現,前一陣子做得焦頭爛額,陷了進去,越掙扎陷得越深,漿糊效應(這個是自個兒起的名字),也就是說一頭扎下去了,拼了老命的往前沖,不撞墻才怪呢,所以需要做得就是冷靜一下,站在一個更高的位子看下自己走過的路,哪里是正確的,哪里出問題了。于是,停手了一段時間,不過不是主動停手去找問題的,而是忙別的事情,這個就暫時耽擱了。今天早晨比較靠譜地分析了一下,然后吭哧吭哧就解決了兩個問題,現在從0走到4了吧,走到6的時候這個游戲的需求就滿足了。嘿嘿,小得意一個。繼續加油。
總之~~做事情就像挖地道,挖的時候要用力還要用心,挖不動的時候就跑到地面上看看哪里堵墻了。不管怎么著就是一個核心思想,像一個將軍一樣去分析和規劃,像一個士兵一樣去實踐和戰斗。
大家好運,我也好運~~明兒見~
posted @
2008-10-11 20:53 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(209) |
評論 (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 正牌的天地之靈和他的徒兒們肖赫_王婷婷_王冠_鄭燚_孫婷 閱讀(12113) |
評論 (13) |
編輯 收藏