天天看點

brew小遊戲

最近剛接觸了brew這個平台,學習做了一個簡單的小遊戲,現在将自己的體會寫一下,也順便整理一下思路。在做這個小遊戲的過程中,我發現了自己很多的缺點:

1.在做東西時不能考慮全局,沒有認真的把這個小項目思考一下便開始,這樣造成了很多時間的浪費,是以,以後在做項目時,需要把握全局,劃分子產品,仔細了解每個子產品之間的練習,這樣才能有個清晰的思路。

2.害怕麻煩,在用一種方法解決問題時,遇到困難,就放棄,換另一種方法,這樣雖然換了很多種,但是實際上并沒有解決問題。

3.缺乏耐性,在調試的過程中,每次都沒有耐性,導緻有些很簡單的錯誤,自己也沒有發現。

4.缺乏獨立思考的能力,在面對問題時,容易煩躁,這樣就造成很容易發現的錯誤卻找不到。

現在我把自己的思路寫一下,并且貼上有關代碼

整體思路:

我把這個遊戲分為兩部分:小木塊的移動和小球的移動

球有三種狀态:

(1)不操作時保持靜止

(2)左方鍵按一下向左(逆時針轉動)滾動一格

(3)右方鍵按一下向右(順時針轉動)

(4)穿越,遇到紅色方塊,紅色方塊被壓下,球與紅色方塊同時向下掉落,掉落過程中可以左右滾動(依托于紅色方塊)。

(5)下落,遇到無支撐物時即下落。模仿重力加速度。

(6)彈起,向下掉落時遇到土塊,則按照硬地面彈起規則,對重力加速度進行彈起,被空氣阻力(1/2重力)緩沖,反複彈起、掉落,直到速度為0。

判定:

(1) 左滾到邊界即從右邊界中滾入;

(2) 右滾到邊界即從左邊界滾入

(3) 遇到障礙物,撞擊三次,障礙物消失。

(4) 越過螢幕下邊界遊戲界面滾屏,進入下一張随機地圖。

生成地圖:定義一個二維數組,把小球的三種狀态分别用0,1,2表示,用随機數生成數組,數組存放的是狀态,然後根據數組下标貼圖

我隻判斷小球下面目前行,目前列是否為空,如為空就直接下落,不管下面的下面等等的情況,若為紅色方塊,這時就不用管紅色方塊,因為紅色方塊也是一個整體,不用管理,這時下面為空,小球依然下落,如遇到×××方塊就彈起。小球運動到螢幕的1/3時,小球就不再移動,地圖上移

地圖上移:每判斷一次,我們就把數組下面的值賦給上面,然後随機填充最後一行的值

紅木塊類似與小球,如果下面為空的話就下落,如下面紅色方塊,就循環判斷紅色方塊下面有多少紅色方塊,然後判斷最後一個紅色方塊下面是否為空,若為空,則方塊依次下移。

代碼:我隻粘貼主要代碼

//随機數組生成地圖

int getRandNumber(int nRange)

{

if (nRange==0)

return 0;

}

static int nRandomSeed = 0 ;

if ( nRandomSeed == 0 )

nRandomSeed = ISHELL_GetTimeMS(m_pIShell);

nRandomSeed = nRandomSeed * 1103515245L + 12345;

return((unsigned) (nRandomSeed / 65536L) % nRange);

int getRandNumberFromTo( int nBegin,int nEnd )

int nRange = nEnd - nBegin;

return (nBegin+getRandNumber(nRange));

void menu::Randmap(int map[20][20])

for(int i = 0; i< numh;i++)

for (int j = 0; j< numw;j++)

map[i][j] = getRandNumberFromTo( 0,4);//第一張地圖

for(int i = 0; i< numh;i+=2)

map[i][j] = 0;//第一張地圖

//紅色方塊的移動

//小球的位置是固定的,判斷小球所在行下面的紅色方塊。然後根據最後一個紅色方塊,下移

void menu::MoveMap()

if (map1[readrow][m_ballmoveh] == 1)

while(map1[readrow ][m_ballmoveh] == 1)

++readrow;

rednum = readrow;//+1;

if (map1[rednum][m_ballmoveh] == 0)

int i = rednum;

for(;rednum > m_ballmovew;--rednum)

map1[rednum][m_ballmoveh] = map1[rednum -1][m_ballmoveh];

map1[rednum -1][m_ballmoveh] = 0;

for(int i = 0; i < numh; i++)

int j = getRandNumberFromTo(0,numw);

map[i][j] = 0;

for(int i = 0;i<20;i++)

for (int j = numw;j<20;j++)

map1[i][j]=55;

小球彈起及下落

void menu::Movenum()

double tball = 0;//小球下落的時間

int g =10;

double m = 1;//假設的小球的品質

double f = 0.1 *m *g;//假設的阻力

if (map1[m_ballmovew][m_ballmoveh] == 0)

bDown=TRUE;

m_ballmovew++;

numball++;

maxHeight+=m_pich;

hball =m_pich;

h1 = hball;

//小球下落過程

t1=sqrt((2*m*(m*g*h1-f*h1))*1.0/pow((m*g-f),2));

v1=(m*g-f)*t1;

for(double i=1;i<t1+1;i+=1)

t=i<=t1?i:t1;

hight=(0.5/m)*t*t*(m*g-f)+(hball-h1);

//小球在超過1/3的位置時不再移動

if (m_bally >= pApp->lcdH/3)

hight = 0;

m_ballmovew--;

//數組上移,并把下個數組的值付給它

for (int i = 0; i < numh-1;i++)

for (int j = 0; j < numw;j++)

map1[i][j] = map1[i+1][j];

for(int j = 0;j< numw;j++)

map1[numh-1][j] = map2[k][j];

k++;

if (k == numh-1)

Randmap(map2);

k = 0;

m_bally += hight;

//小球彈跳

if (bUp==FALSE && bDown==TRUE)

if ( map1[m_ballmovew ][m_ballmoveh] == 2 || map1[m_ballmovew ][m_ballmoveh] == 3)

bDown=FALSE;

bUp=TRUE;

else if (bUp==TRUE)

if(h1 > 2)

v1=v1/3;

//小球上升過程.h1為上升的最大高度

h1=(m*v1*v1*0.1)/(2*(m*g+f));

t1=(m*v1*1.0)/(m*g+f);

for(double i=0;i<t1+1;i+=1)

//hight為t時刻小球所在高度

hight=v1*t-0.5*((m*g+f)*1.0/m)*t*t;

h1 = hight;

m_bally -=hight;

m_bally +=hight;

else

bUp=FALSE;

m_bally+= hight;

v1=0;

t1=0;

h1=0;

hight=0;

t=0;

numball = 0;

mapmove = 0;

readrow = m_ballmovew;

MoveMap();

}  

這是第一次寫部落格,有什麼不懂得可以問我

再說一句:這個遊戲最主要的時回調函數,隻有每隔多少秒重新整理一下,才能有效果,其實就是不停的重繪