先簡單介紹下自己的情況,2006年普通大專院校畢業,畢業後到了北京參加軟 件測試的培訓,目前做ASP.NET網站安全等方面的測試。很多人都說技術不好才去 做測試的,很不幸言中了,我當時我的情況確實是這樣的,這大概也是很多做測 試的朋友心中的一個老梗。即使工作了,心中的夢魇一直沒能除去,所以決定試 試自己到底能不能寫點東西。在工作期間,自學SQLSERVER+ASP.NET 在工作一年 後正式參與網站開發。
寫俄羅斯方塊聯機游戲想法,源於到北京後的培訓 經歷,那時候的老師是一個在華為經歷幾年開發經驗和測試經驗的高手,當他告 訴我說:“聽說你號稱學過C++的時候”,我心裡其實蠻慚愧的,因為 確實不懂。從此C++這東西,基本是心中不堪回首的回憶。也開始有想用C++寫個 小東西的想法。直到最近終於付諸於現實。
大學時間學習了MFC,對 WINDOWS窗口的運行機制一竅不通,只會拖拖控件添加消息,是個准新手。於是開 始看一些關於那方面的書和視頻,主要是 《Windows程序設計》和孫鑫老師的c++ 視頻第一、二章節。了解面向對象的基本概念和WINDWOS窗口的消息機制等基本的 理論。有了這些基礎後,腦袋裡大概就有個模型,覺得可以實現這個俄羅斯方塊 游戲。開始實際寫代碼。
我堅信所有復雜的東西都是由最簡單的東西組成 的,我所有的編程思路和實現都是基於這個簡單的思路來做的。當然這個游戲很 簡單,對於一些有經驗的朋友可以說是 一天半天就可以完成的,但是對於完全沒 有windwos窗口編程的新手來說,這會是一個讓人務實,讓人探索前進的思路。我 堅信在開發進行中的所有困難或BUG都是因為一個很簡單的錯誤而出現的。我能做 的就是不停的實驗和測試來實現。在這方面,測試的經驗給了我不少的幫助。讓 我在出現問題的時候,有大量的想法去測試尋找問題的緣由,+上自己的耐心,所 有的問題都迎刃而解。
實際過程:
1 對話框: 最開始,什麼都不想,要玩游戲就得有個窗口 。我用createwindow把裡面大部分的窗口類型都組合測試了一邊,最終才選定用 一個沒有最大化最小化按鈕、沒有改變大小邊框的對話框窗口來實現。
2 游戲界面:用什麼實現方塊。有很多想法,用一張畫好的圖片,做方塊格子,也 想過用按鈕。最後想想就用一個彩色矩形代表一個方塊最簡單。FillRect();
3 游戲方塊: 接著用設計好游戲規格,方塊大小,游戲界面寬高。就用 FillRect()畫個黑色矩形來表示游戲方塊。現在想想其實建立一個子窗口做界 面是最方便的了 .
4 顯示第一個方塊:游戲對話框有了,游戲界面有了, 於是我試著在黑色矩形游戲界面中畫第一個方塊,是一個直條。這也是我第一次 接觸到WM_PAINT消息。第一次知道窗口的重繪。剛開始的時候,出現很多的問題 ,不是只有直條就是只有游戲界面。在重繪函數裡面有很多錯誤的代碼,走了很 多灣路。光為了在游戲界面中畫出一個直條我就畫了兩天,終於才明白重繪的原 理和基本的函數的使用。當我在游戲界面中出現第一個直條的時候,我非常興奮 ,我覺得這個是一個很好的開始,起碼證明了我的方法在一定程度上是可行的。 意味著前面的工作都沒白費。給了我很大的鼓舞。
5 設計方塊基類: 有 了前面的基礎,我就堅信可以完成。我覺得方塊基類是整個游戲的基礎, 一定要 先確定好的,於是設計了一個4維的數組來表達7類方塊20多種的變化。這樣在游 戲中需要方塊的數據的時候都可以從中提取。其實最開始的時候在這塊想了很多 ,因為不確定後面到底要怎麼樣用到方塊,承前啟後的想了很久,既要考慮到後 面的使用,又要盡量簡單,最開始的時候還想用vector來實現,於是還順便學習 了關於容器的內容,怎麼使用怎麼初始化等等。不過最後還是否定了這個方案。
6 設計游戲類:其實不懂面向對象,只是覺得,不同類型的要分塊。你只管提 供數據,我只管操作。於是就設計了游戲類。
當時也不知道游戲類裡面到底需要什麼方法,只是覺得有些方法是必須要的。 比如 移動 下降 消行 游戲開始 游戲結束 游戲暫停等。也不想那麼多,一股腦 的都+上。
7 游戲運行機制:是游戲就要有開始,就要有結束,要有運行。看別人的代碼 都寫的很好,一個死循環就可以讓游戲不停運行。我想往上套,始終也不行。只 能另想辦法。最後因為方塊游戲的運行就是下降。所以我只要弄一個函數不停的 調用下降,就能實現游戲運行的原理。至於什麼時候下降停止。那可以具體再寫 。我覺得這樣是對的。最終找到了SETTIMMER來實現
8 游戲算法實現:當我第一次看到,隨機生成的方塊,在游戲界面裡緩緩下降 的時候…… 我心裡那個美啊…… 我知道我對了,勝 利在望了。接下的東西就是具體的游戲功能的寫作,一切都順利了許多,我只是 不停的測試+寫+測試。完成。在寫完之前我開始想著,下一步的實現。網絡版
9 單機游戲完成: 所有的都完成,單機游戲終於完成後,自己也是不停的測 試,優化算法,這中間還出現內存洩露的嚴重問題,也因禍得福了解了內存的基 本使用。直到修復問題。最終單機版的無bug版完成。我中間公司的項目也多了老 加班,就先放下了。
10 網絡版的孕育: 07年同學在武漢,有個朋友介紹他去干開發的工作。那邊 的人說了,在一個月之內,如果開發出一個網絡版的俄羅斯方塊游戲,那麼OK, 來上班。我想起這見事情,於是我想著能否實現它。其實這還是做一個測試的一 個心結。自己也有心思轉開發,所以決定去實現這個。
11 網絡版的實現過程: 因為整個游戲只有兩個類,所有我覺得給網絡功能這 塊+一個類。所有的網絡功能都在那裡實現,在開發的過程中發現,由於沒有很好 的設計,導致在實現的時候出現很多的矛盾。從而我也認識到設計和算法在軟件 開發中的重要性。跌跌撞撞的用WIndows socket使用UDP的協議實現了聯機通訊, 中間專門先實驗幾個通訊小例子,再把覺得可用的代碼用上,現在基本的聯機功 能都以實現。很想模仿騰訊QQ火拼俄羅斯游戲開發游戲道具。但目前也只停留在 想的階段。
游戲介紹:
1 單機版和網絡版並存
2 網絡版:實現在線用戶實時狀態顯示,(空閒中 游戲中 離線)
3 網絡版:邀請對方聯機對戰。若對方狀態不可以邀請,則不能邀請
4 網絡版:雙人聯機對戰實現,可以看到對方實時的方塊數據。游戲勝負根據 率先到達10000分的一方獲勝
5 網絡版道具使用: 醞釀中……
結束語: 第一個C++ WIN232的程序,雖然只是個小游戲,但也給了我一些信 心和鼓舞,希望有機會能正式加入程序員陣營中來,目前職位還是測試工作,想 這下一步的開發方向該怎麼走。希望各位同仁多多指教,給點建議。多謝啦。
下載地址:http://download.csdn.net/source/727355
部分源碼 :
Gameframe.h
#include "GameNet.h"
#ifndef _GAMEFRAME_H_
#define _GAMEFRAME_H_
using namespace std;
#define SingleRect 30 //單個方塊大小
#define FRAME_L 15 //主界面的起點坐標 L
#define FRAME_T 15 //主界面的起點坐標 T
#define NEXT_L SingleRect*10+FRAME_L+15 //下一個方塊的 起點座標 L
#define NEXT_T FRAME_T //下一個方塊的起點座標 T
#define MAIN_SIZE_R SingleRect*10+FRAME_L //主界面x_x
#define MAIN_SIZE_B SingleRect*20+FRAME_T //主界面y_y
#define NEXT_SIZE_R SingleRect*4+NEXT_L+20 //下一個方塊 x_x
#define NEXT_SIZE_B SingleRect*4+NEXT_T+20 //下一個方塊 y_y
class Gameframe:public GameNet
{
public:
Gameframe();
virtual ~Gameframe();
void Draw_Frame(HDC hDC,HWND
hwnd,HBRUSH G_brush); //重繪主框架
void Draw_Next(HDC hDC,HWND hwnd,HBRUSH G_brush); ////重繪下一個方塊框架
void Draw_Message(HDC hDC,HWND hwnd,HBRUSH G_brush); //重繪下一個方塊框架
void Draw_Child(HDC hDC,HWND hwnd,HBRUSH G_brush); //重繪子窗口
void Game_Start(); //開始游戲
bool G_Stop; //游戲是否暫停
bool Game_Over(); //判斷游戲是否結束
void Game_Run(); //開始運行,設定下落時間
void Game_Down(); //方塊下落
void Game_Change(); //方塊變形
bool Game_Move(int i); //方塊移動
void Game_Stop();
void Game_Restart();
void Game_Sound(unsigned short int sound);
bool Down_end;
bool Space_on;
char G_Path[100]; //游戲路徑
protected:
void Next_Rand(); //生成下一個方塊
RECT N; //下一個方塊界面
RECT F; //主界面
RECT Active_Rect; //方塊活動界面
RECT Total; //得分界面
RECT re; //
unsigned short int Actvie_bottom; //活動方塊的最下 面
Square squ; //定義一個方塊的對象
short int Next_A; //下一個方塊類型
short int
Next_B; //下一個方塊具體形狀
short int Frame_A; //當前方塊類型
short int Frame_B; //當前方塊具體形狀
short int Move; //移動格子數
short int Down; //下降個數
short int Now_Cake[4][2]; //新方塊 0橫坐標 1縱坐標
short int Old_Cake[4][2]; //舊方塊 0橫坐標 1縱坐標
short int Top; //有方塊的最高點
bool Gframe[10][20]; //10橫坐標 20 縱坐標
unsigned short int G_Level;
int Rect_Falling; //下落時間差
short int Gframe_Color[10][20]; //主游戲方塊顏色
short int Rect_Color; //當前方塊顏色
short int Rect_Color_N; //下一個方塊顏色
COLORREF G_BasicColor[7]; //方塊顏色基礎
bool Game_Active(int Event); //方塊事件處理
bool Game_DelRect(); //消行算法
private:
};
#endif
Gamefrme.cpp
#include "Gameframe.h"
//////////////////////////////////////////////////////////////////////< br /> // Gameframe Class
//////////////////////////////////////////////////////////////////////< br /> int Move_temp;
extern HINSTANCE h_inst;
extern HWND hwnd;
extern HWND
U_hwnd; //用戶列表
void Gameframe::Draw_Next(HDC hDC,HWND hwnd,HBRUSH G_brush)// 重繪下一個方塊框架主游戲框架+內容
{
N.left=Total.left;
FillRect(hDC,&N,G_brush);
FillRect(hDC,&Total,G_brush);
SetDCBrushColor(hDC,G_BasicColor[Rect_Color_N]);
for(int c=0;c<4;c++)
{
for(int d=0;d<4;d++)
{
if(1==squ.Nextframe[Next_A][Next_B] [d][c])
{
SetRect (&re,NEXT_L+c*30+1+10,NEXT_T+d*30+1+10,NEXT_L+c*30+29+10,NEXT_T+d*3 0+29+10);
FillRect (hDC,&re,G_brush);
}
}
}
char szChar[25];
sprintf(szChar,"%d VS % d",Game_Point,Child_Point);
unsigned short int count=0,i=0;
while(szChar[i] != '\0')
{
count++;
i++;
}
TextOut(hDC,NEXT_L+20,NEXT_T+185,szChar,count);
}
void Gameframe::Draw_Frame(HDC hDC,HWND hwnd,HBRUSH G_brush)//主游戲框架+內容
{
SetDCBrushColor(hDC,RGB(0,0,0));
FillRect(hDC,&F,G_brush);
for(unsigned short int o=0;o<10;o++)
{
for(unsigned short int p=0;p<20;p++)
{
if(1==Gframe[o][p])
{
SetDCBrushColor (hDC,G_BasicColor[Gframe_Color[o][p]]);
SetRect (&re,FRAME_L+o*30+1,FRAME_T+p*30+1,FRAME_L+o*30+29,FRAME_T+p*30+29) ;
FillRect (hDC,&re,G_brush);
}
}
}
if(G_Over)
{
if(G_Level>9)
{
G_Level=1;
TextOut (hDC,FRAME_L+100,FRAME_T+270,"通關了!厲害",strlen(" "));
}
else
{
if(!Arrive)
{
TextOut (hDC,FRAME_L+100,FRAME_T+270,"GAME OVER",strlen("GAME OVER"));
}
else
{
TextOut (hDC,FRAME_L+100,FRAME_T+270,"YOU'RE WINNER",strlen ("YOU'RE WINNER"));
}
}
}
}
void Gameframe::Draw_Message(HDC hDC,HWND hwnd,HBRUSH G_brush)
{
SetDCBrushColor(hDC,RGB(255,255,255));
SetTextColor(hDC,RGB(0,0,0));
FillRect(hDC,&Info,G_brush);
DrawText(hDC,InfoChar,strlen (InfoChar),&Info,DT_LEFT);
}
void Gameframe::Draw_Child(HDC hDC,HWND hwnd,HBRUSH G_brush)
{
SetDCBrushColor(hDC,RGB(0,0,0));
SetRect(&re,0,0,200,400);
FillRect(hDC,&re,G_brush);
for(unsigned short int o=0;o<10;o++)
{
for(unsigned short int
p=0;p<20;p++)
{
if(0!=Child_Frame[o][p])
{
SetDCBrushColor (hDC,G_BasicColor[Child_Frame[o][p]-1]);
SetRect (&re,o*20+1,p*20+1,o*20+19,p*20+19);
FillRect (hDC,&re,G_brush);
}
}
}
}
Gameframe::Gameframe()
{
//主游戲框初始化
SetRect (&F,FRAME_L,FRAME_T,MAIN_SIZE_R,MAIN_SIZE_B);
SetRect (&N,NEXT_L,NEXT_T,NEXT_SIZE_R,NEXT_SIZE_B); //下一個框
SetRect (&Total,NEXT_L,NEXT_T+170,NEXT_SIZE_R,NEXT_SIZE_B+80); //得分框
SetRect (&Info,NEXT_SIZE_R+FRAME_L+FRAME_L,FRAME_T+400+20,NEXT_SIZE_R+FRAME _L+FRAME_L+200,FRAME_T+400+20+100); //消息框
G_BasicColor[0] = RGB(220, 39, 75); // 紅
G_BasicColor[1] = RGB(232, 123, 20); // 橙
G_BasicColor[2] = RGB(200, 200, 102); // 黃
G_BasicColor[3] = RGB(51, 204, 102); // 綠
G_BasicColor[4] = RGB(0, 143, 224); // 藍
G_BasicColor[5] = RGB(153, 153, 204); // 青
G_BasicColor[6] = RGB(204, 204, 204); // 灰
getcwd(G_Path,80);
strcat(G_Path,"\\resource\\Wav\\"); //獲得資源路徑
G_NET=false;
this->Game_Restart();
}
Gameframe::~Gameframe()
{
squ.~Square();
}
void Gameframe::Game_Start()
{
//游戲開始
Next_Rand();
unsigned short int left=0,top=0,right=0,bottom=0;
for(unsigned short int h=0;h<4;h++)
{
if(left>Now_Cake[h][0])
{
left=Now_Cake[h][0];
}
if(right<Now_Cake[h][0])
{
right=Now_Cake[h][0];
}
if(bottom<Now_Cake[h][1])
{
bottom=Now_Cake[h][1];
}
Actvie_bottom=bottom+1;
SetRect (&Active_Rect,FRAME_L+left*30+90,FRAME_T+top*30,FRAME_L+right*30+30 +90,FRAME_T+bottom*30+30);
}
if(Game_Over())
{
if(G_NET)
{
if(!Arrive)
{
SendSelect(8); //游戲未完成
}
Game_Run();
return;
}
G_start=false;
G_Over=true;
Rect_Falling=1000;
Next_Rand();
Game_Sound(2);
KillTimer(hwnd,TIMER_ID);
InvalidateRect(hwnd,NULL,false);
}
else
{
InvalidateRect (hwnd,&Active_Rect,false);
InvalidateRect(hwnd,&N,false);
Game_Run();
}
}
bool Gameframe::Game_Over()
{
if(G_Over)
{
return G_Over;
}
for(unsigned short int a=0;a<4;a++)
{
if(1==Gframe[Now_Cake[a][0]][Now_Cake[a] [1]])//判斷游戲是否結束(新方塊生成時是否已經有方塊)
{
G_Over=true;
}
else
{
Gframe[Now_Cake[a][0]][Now_Cake[a] [1]]=1;
Gframe_Color[Now_Cake[a][0]] [Now_Cake[a][1]]=Rect_Color;
}
}
if(G_Over)
{
return G_Over;
}
else
{
for(unsigned short int b=0;b<4;b++)
{
Gframe[Now_Cake[b][0]][Now_Cake[b] [1]]=1;
}
return G_Over;
}
return G_Over;
}
void Gameframe::Game_Run()//游戲運行
{
if(G_Over)//游戲結束
{
KillTimer(hwnd,TIMER_ID);
if(G_NET)
{
G_NET=false;
G_start=false;
SendSelect(11); //通知所有在線人自 己的狀態
::SendMessage (U_hwnd,WM_COMMAND,LBN_SELCHANGE,0);
if(Arrive)//自己到達或者對方游戲結束
{
Game_Sound(7);
}
else
{
Game_Sound(2); //對方到達或者 自己游戲結束
}
InvalidateRect (hwnd,&F,false);
return;
}
}
else
{
if(!G_NET)//單機游戲
{
G_Level=Game_Point/1000;
if(G_Level<10)//游戲是否通關
{
Rect_Falling=1000- G_Level*100;
SetTimer (hwnd,TIMER_ID,Rect_Falling,NULL);
}
else
{
G_start=false;
G_Over=true;
Game_Sound(7);
Rect_Falling=1000;
KillTimer(hwnd,TIMER_ID);
InvalidateRect (hwnd,NULL,false);
}
}
else
{
SetTimer (hwnd,TIMER_ID,NET_SPEED,NULL); //對戰運行速度
}
}
}
void Gameframe::Game_Stop()//暫停
{
G_Stop=true;
KillTimer(hwnd,TIMER_ID);
}
bool Gameframe::Game_Move(int i)
{
Move_temp=i;
if(Game_Active(2))
{
if(1==i)
{
Active_Rect.right=Active_Rect.right+i*30;
InvalidateRect (hwnd,&Active_Rect,false);
Active_Rect.left=Active_Rect.left+i*30;
}
else
{
Active_Rect.left=Active_Rect.left+i*30;
InvalidateRect (hwnd,&Active_Rect,false);
Active_Rect.right=Active_Rect.right+i*30;
}
return true;
}
else
{
return false;
}
}
void Gameframe::Game_Down()//下落
{
if(G_Over)
{
Game_Run();
}
if(Down<19)
{
Down=Down+1; //變形時,需要使用縱坐標
}
else
{
Down=0; //變形時,需要使用縱坐標
}
if(Game_Active(1))
{
Down_end=true; // 是否可以連續下落和重繪時是否 需要刷新下一個方塊
Active_Rect.bottom=Active_Rect.bottom+30; //在 原來方塊基礎上增加下一行更新面積
Actvie_bottom=Actvie_bottom+1;
if(!Space_on)
{
InvalidateRect (hwnd,&Active_Rect,false);
}
Active_Rect.top=Active_Rect.top+30; //刷新後將 上方也增加一行
}
else
{
Game_Sound(4);
if(G_NET)
{
SendSelect(5);
}
Space_on=false;
if(!Game_DelRect())//消行算分。
{
InvalidateRect(hwnd,&F,false);
}
Down_end=false; //不能下落了。
Game_Start(); //重新開始生成方塊。
}
}
void Gameframe::Game_Change()//變形
{
Frame_B=Frame_B+1;
if(6==Frame_A||5==Frame_A||2==Frame_A)//4種類型的方 塊
{
if(Frame_B>3)
{
Frame_B=0;
}
}
else
{
if(Frame_B>1)
{
Frame_B=0;
}
}
if(Game_Active(3))//變形是否成功
{
Game_Sound(6);
InvalidateRect (hwnd,&Active_Rect,false);
short int left=0,top=0,right=0,bottom=0,k=0;
for(short int h=0;h<4;h++)
{
if(left>Now_Cake[h][k])
{
left=Now_Cake[h][k];
}
if(right<Now_Cake[h][k])
{
right=Now_Cake[h] [k];
}
if(bottom<Now_Cake[h][k+1])
{
bottom=Now_Cake[h][k+1];
}
if(top>Now_Cake[h][k+1])
{
top=Now_Cake[h][k+1];
}
}
Actvie_bottom=bottom+1;
SetRect (&Active_Rect,FRAME_L+left*30,FRAME_T+top*30,FRAME_L+right*30+30,FR AME_T+bottom*30+30);
InvalidateRect (hwnd,&Active_Rect,false);
}
else
{
if(6==Frame_A||5==Frame_A||2==Frame_A)//變形 失敗,返回原來的樣子
{
if(Frame_B>=1)
{
Frame_B=Frame_B-1;
}
else
{
Frame_B=Frame_B+3;
}
}
else
{
if(Frame_B>=1)
{
Frame_B=Frame_B-1;
}
else
{
Frame_B=Frame_B+1;
}
}
InvalidateRect(hwnd,&F,false);
}
}
bool Gameframe::Game_DelRect()
{
int del=0,Count=0;
bool re=false;
for(short int a=19;a>=Top;a--)
{
for(short int b=0;b<10;b++)
{
if(1==Gframe[b][a])
{
del=del+1;
}
}
if(10==del)
{
Count=Count+1;
for(a;a>=0;a--)
{
if(0==a)//只要有消行。那麼最 頂層一定是空的
{
for(short int d=0;d<10;d++)
{
Gframe[d] [a]=false;
Gframe_Color[d][a]=0;
}
}
else
{
for(short int c=0;c<10;c++)
{
Gframe[c] [a]=Gframe[c][a-1];
Gframe_Color[c][a]=Gframe_Color[c][a-1];
}
}
}
a=20; //不能等於十九。因為要進行a-- 操作
Top=Top+1;
}
del=0;
}
switch(Count)
{
case 1:
re=true;
Game_Sound(5);
Game_Point=Game_Point+100;
InvalidateRect(hwnd,NULL,false); //寫在外面 在游戲結束時看不到下一塊方塊
break;
case 2:
re=true;
Game_Sound(5);
Game_Point=Game_Point+300;
InvalidateRect(hwnd,NULL,false);
break;
case 3:
re=true;
Game_Sound(5);
Game_Point=Game_Point+500;
InvalidateRect(hwnd,NULL,false);
break;
case 4:
re=true;
Game_Sound(5);
Game_Point=Game_Point+800;
InvalidateRect(hwnd,NULL,false);
break;
default:
break;
}
if(G_NET)
{
if(Count>0)
{
SendInfo[1]=Count; //消了幾行
SendSelect(6);
if
(Game_Point>=Aim)
{
SendSelect(7);
}
}
}
return re;
}
void Gameframe::Game_Restart()
{
/**********初始化界面為0,表示沒有方塊*********/
for(unsigned short int a1=0;a1<20;a1++)
{
for(unsigned short int b1=0;b1<10;b1++)
{
Gframe[b1][a1]=0; //表示沒有方塊
Gframe_Color[b1][a1]=0; //游戲顏色 都初始化為0
Child_Frame[b1][a1]=0;
}
}
/**********初始化當前活動方塊位置,表示沒有方塊 *********/
for(unsigned short int j=0;j<4;j++)
{
for(unsigned short int k=0;k<2;k++)
{
Now_Cake[j][k]=0;
Old_Cake[j][k]=0;
}
}
/******初始化第一個NEXT和主界面的第一個方塊 ********/
struct _timeb timebuffer;
_ftime(&timebuffer);
unsigned short int tem=timebuffer.millitm;
unsigned short int a=tem%7;
short int b=0;
srand(tem);
if(6==a||5==a||2==a)
{
b=timebuffer.millitm%4;
}
else
{
b=timebuffer.millitm%2;
}
Frame_A=Next_A=a;
Frame_B=Next_B=b;
Rect_Color=Rect_Color_N=rand()%7;
/************************************************/
Down_end=true; //默認可以下落
Rect_Falling=1000; //游戲下落時間
G_start=false; //游戲還沒開始
G_Over=false; //游戲未結束
G_Stop=false; //游戲未暫停
Arrive=false; //沒有達到目標
Top=19; //默認為方塊的最底層
Game_Point=0; //分數起點為0
Child_Point=0; //對方分數起點為0
Down=0; //下降格數
Move=0; //移動格數
G_Level=0; //默認是0級
Space_on=false; //默認不按下空格鍵
InvalidateRect(hwnd,NULL,false);
}
bool Gameframe::Game_Active(int Event)
{
return ture;
}