程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> c++ win32 API實現方塊聯機游戲歷程

c++ win32 API實現方塊聯機游戲歷程

編輯:關於C++

先簡單介紹下自己的情況,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;
}

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved