青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

l

成都手游碼農(nóng)一枚
隨筆 - 32, 文章 - 0, 評論 - 117, 引用 - 0
數(shù)據(jù)加載中……

[C++]俄羅斯方塊源碼

寫的很爛請別在意- -!
暑假無聊時(shí)寫的。

/***************************************************
Filename:ELSFK.h
Anthor:shly
E-mail:xlq1989@vip.qq.com
LastUpdate:2009.8.7
**************************************************
*/


#pragma once

#include 
"stdafx.h"
#include 
<cassert>
//----------------------Data---------------------------
struct SquareData{
    
static const int S_KIND = 7;
    
static const int S_MAX  = 16;
    
static const int S_START= 6;
    
static int         sE[S_KIND];
    
static int         sData[S_KIND][S_MAX];
}
;
int SquareData::sE[SquareData::S_KIND] = {4333332};
int SquareData::sData[SquareData::S_KIND][SquareData::S_MAX] = 
{//0為格子不顯示 非0則顯示
    {0100010001000100},
    
{2002200200000000},
    
{0030330300000000},
    
{4400400400000000},
    
{0550500500000000},
    
{0606660000000000},
    
{7777000000000000}
}
;
//----------------------Matrix--------------------------
//游戲區(qū)域
class Matrix{
protected:
    
int x,y;  int* pM;
public:
    Matrix(
int _x, int _y)
             :x(_x),y(_y)
    
{
        pM 
= new int[x*y];
        assert(pM);
        
for(int i = 0; i<x*y; ++i) pM[i] = 0;
    }

    Matrix(
int* _t, int _x, int _y)
             :x(_x),y(_y)
    
{
        pM 
= new int[x*y];
        assert(pM);
        
for(int i = 0; i<x*y; ++i) pM[i] = _t[i];
    }

    
virtual ~Matrix(){ delete [] pM;}
public:
    
//common functions
    int GetX() const {return x;}
    
int GetY() const {return y;}
    
int*GetM() const {return pM;}
    
void MatrixCombin(Matrix& _m,int _x, int _y, bool zero = false);
    
bool MatrixIntersect(Matrix& _m, int _x, int _y);
    
bool MatrixYAll(int _y, bool zero = false);
public:
    
//use in the game
    void MatrixDeleteAndMove(int _y);
}
;
void Matrix::MatrixCombin(Matrix& _m, int _x, int _y, bool zero)
{
    
int Ex = _m.GetX(), Ey = _m.GetY();
    
for(int i = 0; i<Ey; ++i)
        
for(int j =0;  j<Ex; ++j)
        
{
            
if(_m.GetM()[i*Ex+j]){
                
if(_x+j<0 || _x+j>=|| _y+i<0 || _y+i>=y ) continue;
            zero
?pM[(_y+i)*x+_x+j] = 0:pM[(_y+i)*x+_x+j] = 
                (pM[(_y
+i)*x+_x+j]>_m.GetM()[i*Ex+j]?pM[(_y+i)*x+_x+j]:_m.GetM()[i*Ex+j]);
            }

        }

}

bool Matrix::MatrixIntersect(Matrix& _m, int _x, int _y)
{
    
int Ex = _m.GetX(), Ey = _m.GetY();
    
for(int i = 0; i<Ey; ++i)
        
for(int j =0;  j<Ex; ++j)
        
{
            
if(_m.GetM()[i*Ex+j]){
                
if(_x+j<0 || _x+j>=||
                   _y
+i<0 || _y+i>=|| pM[(_y+i)*x+_x+j] ) 
                    
return true;
            }

        }

    
return false;
}

bool Matrix::MatrixYAll(int _y, bool zero)
{
    
if(_y<0 || _y>=y) return false;
    
for(int i = 0; i<x; ++i)
        
if( zero?pM[_y*x+i]:!pM[_y*x+i])
            
return false;
    
return true;
}

void Matrix::MatrixDeleteAndMove(int _y)
{
    
if(_y<0 || _y>=y) return;
    
for(int i = _y; i>0--i){
        
for(int j = 0; j<x; ++j)
            pM[i
*x+j] = pM[(i-1)*x+j];
        
//use in the game
        if(MatrixYAll(i,true)) break;
    }

}


//------------------------FKMatrix-------------------------
//方塊
class FKMatrix:public Matrix{
protected:
    
int sx, sy;
public:
    FKMatrix(
int index):Matrix(SquareData::sData[index],
                      SquareData::sE[index],
                      SquareData::sE[index]),
                      sx(SquareData::S_START),sy(
0)
    
{}
    
int GetSX() const {return sx;}
    
int GetSY() const {return sy;}
    
void SetSX(int _x) {sx = _x;}
    
void SetSY(int _y) {sy = _y;}
    
void FKMatrixTransform(Matrix& _m);
}
;

void FKMatrix::FKMatrixTransform(Matrix& _m)
{
    
int i = 0,E = x;
    
int* tM = new int[E*E];
    assert(pM);
    
int* t = pM;
    
for(int j = 0; j<E; ++j)
        
for(int l = E - 1; l>=0--l, ++i)
            tM[i] 
= pM[l*E+j];
    
//use in the game
    pM = tM;
    
if(_m.MatrixIntersect(*this,sx,sy)){
        pM 
= t;
        delete [] tM;
    }
else delete [] t;
}




// ELSFK.cpp : 定義應(yīng)用程序的入口點(diǎn)。
//
#include "stdafx.h"
#include 
"ELSFK.h"
#include 
"resource.h"
#include 
<ctime>

// 全局變量:
Matrix matGame(10,18);
FKMatrix
* matFK = NULL;

bool   bAgain = true;
int        score = 0;
int        level = 1;
const int DES = 20;
const int SCREEN_WIDTH = 308;
const int SCREEN_HEIGHT = 408;

#define FKBeginUpdate(__g,__f) __g.MatrixCombin(*__f,__f->GetSX(),__f->GetSY(),true);
#define FKEndUpdate(__g,__f) __g.MatrixCombin(*__f,__f->GetSX(),__f->GetSY(),false);\
        InvalidateRect(hWnd,NULL,
false);

//{{{--------------------------編譯器生成代碼--------------------------
#define MAX_LOADSTRING 100
// 全局變量:
HINSTANCE hInst;                                // 當(dāng)前實(shí)例
TCHAR szTitle[MAX_LOADSTRING];                    // 標(biāo)題欄文本
TCHAR szWindowClass[MAX_LOADSTRING];            // 主窗口類名

// 此代碼模塊中包含的函數(shù)的前向聲明:
ATOM                MyRegisterClass(HINSTANCE hInstance);
BOOL                InitInstance(HINSTANCE, 
int);
LRESULT CALLBACK    WndProc(HWND, UINT, WPARAM, LPARAM);
INT_PTR CALLBACK    About(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,
                     HINSTANCE hPrevInstance,
                     LPTSTR    lpCmdLine,
                     
int       nCmdShow)
{
    UNREFERENCED_PARAMETER(hPrevInstance);
    UNREFERENCED_PARAMETER(lpCmdLine);
    MSG msg;
    HACCEL hAccelTable;
    LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);
    LoadString(hInstance, IDC_ELSFK, szWindowClass, MAX_LOADSTRING);
    MyRegisterClass(hInstance);
    
if (!InitInstance (hInstance, nCmdShow)){return FALSE;}
    hAccelTable 
= LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_ELSFK));
    
while (GetMessage(&msg, NULL, 00))
    
{
        
if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))
        
{
            TranslateMessage(
&msg);
            DispatchMessage(
&msg);
        }

    }

    
return (int) msg.wParam;
}

ATOM MyRegisterClass(HINSTANCE hInstance)
{
    WNDCLASSEX wcex;
    wcex.cbSize 
= sizeof(WNDCLASSEX);
    wcex.style            
= CS_HREDRAW | CS_VREDRAW;
    wcex.lpfnWndProc    
= WndProc;
    wcex.cbClsExtra        
= 0;
    wcex.cbWndExtra        
= 0;
    wcex.hInstance        
= hInstance;
    wcex.hIcon            
= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_ELSFK));
    wcex.hCursor        
= LoadCursor(NULL, IDC_ARROW);
    wcex.hbrBackground    
= (HBRUSH)(COLOR_WINDOW+1);
    wcex.lpszMenuName    
= MAKEINTRESOURCE(IDC_ELSFK);
    wcex.lpszClassName    
= szWindowClass;
    wcex.hIconSm        
= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
    
return RegisterClassEx(&wcex);
}

BOOL InitInstance(HINSTANCE hInstance, 
int nCmdShow)
{
   HWND hWnd;
   hInst 
= hInstance; // 將實(shí)例句柄存儲在全局變量中
   hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW^WS_THICKFRAME^WS_MAXIMIZEBOX,
      
400,100,SCREEN_WIDTH,SCREEN_HEIGHT, NULL, NULL, hInstance, NULL);
   
if (!hWnd)return FALSE;}
   ShowWindow(hWnd, nCmdShow);
   UpdateWindow(hWnd);
   
return TRUE;
}

//--------------------------編譯器生成代碼------------------------}}}


LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    
int wmId, wmEvent;
    PAINTSTRUCT ps;
    HDC hdc;

    
switch (message)
    
{
    
//{{{---------------------菜單----------------------
    case WM_COMMAND:
        wmId    
= LOWORD(wParam);
        wmEvent 
= HIWORD(wParam);
        
// 分析菜單選擇:
        switch (wmId)
        
{
        
case IDM_ABOUT:
            DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);
            
break;
        
case IDM_EXIT:
            DestroyWindow(hWnd);
            
break;
        
default:
            
return DefWindowProc(hWnd, message, wParam, lParam);
        }

        
break;
    
//---------------------菜單----------------------}}}
    case WM_PAINT:
        
{
            hdc 
= BeginPaint(hWnd, &ps);
            HBITMAP tmpBmp 
= CreateCompatibleBitmap(hdc,SCREEN_WIDTH,SCREEN_HEIGHT);
            HDC tmpDC 
= CreateCompatibleDC(hdc);
            SelectObject(tmpDC,tmpBmp);
            
//---------------------背景-------------------------
            {
                RECT r1 
= {0,0,(matGame.GetX())*DES,(matGame.GetY())*DES};
                RECT r2 
= {(matGame.GetX())*DES,0,SCREEN_WIDTH,(matGame.GetY())*DES};
                FillRect(tmpDC,
&r1,(HBRUSH)GetStockObject(BLACK_BRUSH));
                FillRect(tmpDC,
&r2,(HBRUSH)GetStockObject(DKGRAY_BRUSH));
            }

            
//--------------------游戲區(qū)------------------------
            for(int i = 0; i<matGame.GetY(); ++i)
                
for(int j = 0; j<matGame.GetX(); ++j)
                
{
                    
int id = matGame.GetM()[i*matGame.GetX()+j];
                    
if(!id) continue;
                    HBRUSH hBrush 
= CreateSolidBrush(RGB(id*35,255-id*35,id*20+150));
                    HBRUSH hOld 
=(HBRUSH) SelectObject(hdc,hBrush);
                    RECT r 
= {j*DES,i*DES,j*DES+DES-1,i*DES+DES-1};
                    FillRect(tmpDC,
&r,hBrush);
                    SelectObject(hdc,hOld);
                    DeleteObject(hBrush);
                }

            
//---------------------邊欄-------------------------
            SetBkMode(tmpDC,TRANSPARENT);
            SetTextColor(tmpDC,RGB(
200,50,75));
            
char cScr[20];
            
int l = wsprintfA(cScr,"得分: %d",score);
            TextOutA(tmpDC,matGame.GetX()
*DES+2,SCREEN_HEIGHT/2-60,cScr,l);

            SetTextColor(tmpDC,RGB(
200,200,0));
                l 
= wsprintfA(cScr,"等級: %d",level);
            TextOutA(tmpDC,matGame.GetX()
*DES+2,SCREEN_HEIGHT/2,cScr,l);

            BitBlt(hdc,
0,0,SCREEN_WIDTH,SCREEN_HEIGHT,tmpDC,0,0,SRCCOPY);
            DeleteDC(tmpDC);
            DeleteObject(tmpBmp);
            EndPaint(hWnd, 
&ps);
            
break;
        }

    
case WM_TIMER:
        SendMessage(hWnd,WM_KEYDOWN,VK_DOWN,
0);
        
break;
    
case WM_KEYDOWN:
        
{
            FKBeginUpdate(matGame,matFK);
//開始更新
            int sx = matFK->GetSX(), sy = matFK->GetSY();
            
int x = matGame.GetX(), y = matGame.GetY();
            
switch(wParam)
            
{
            
case VK_SPACE:
            
case VK_UP:
                matFK
->FKMatrixTransform(matGame); break;
            
case VK_DOWN:
                
if(matGame.MatrixIntersect(*matFK,sx,sy+1))
                    bAgain 
= true;
                
else 
                    matFK
->SetSY(sy+1);
                
break;
            
case VK_LEFT:
                
if(matGame.MatrixIntersect(*matFK,sx-1,sy)) break;
                matFK
->SetSX(sx-1);
                
break;
            
case VK_RIGHT:
                
if(matGame.MatrixIntersect(*matFK,sx+1,sy)) break;
                matFK
->SetSX(sx+1);
                
break;
            
default:break;
            }

            FKEndUpdate(matGame,matFK);
//結(jié)束更新
            if(bAgain)
            
{
                
int count = 0;
                
for(int i = 0; i<matFK->GetY(); ++i)
                        
if(matGame.MatrixYAll(sy+i,false)){
                            matGame.MatrixDeleteAndMove(sy
+i);
                            
++count;
                        }

                        score 
+= count*count*2;
                        level 
= score/200+1;
                
if(matFK->GetSY()-count<=0){
                    KillTimer(hWnd,
1);
                    MessageBox(NULL,L
"Game Over!",L"Sys",MB_OK);
                    SendMessage(hWnd,WM_DESTROY,
0,0);
                    
return 0;
                }

                delete matFK; bAgain 
= false;
                matFK 
= new FKMatrix(rand()%7);
                FKEndUpdate(matGame,matFK);
            }
 
            
break;
        }

    
//----------------------初始和結(jié)束處理------------------------
    case WM_CREATE:
        srand(time(NULL));
        matFK 
= new FKMatrix(rand()%7);
        bAgain 
= false;
        FKEndUpdate(matGame,matFK);
        SetTimer(hWnd,
1,500,NULL);
        
break;
    
case WM_DESTROY:
        PostQuitMessage(
0);
        delete matFK;
        
break;
    
default:
        
return DefWindowProc(hWnd, message, wParam, lParam);
    }

    
return 0;
}



// “關(guān)于”框的消息處理程序。
INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(lParam);
    
switch (message)
    
{
    
case WM_INITDIALOG:
        
return (INT_PTR)TRUE;

    
case WM_COMMAND:
        
if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)
        
{
            EndDialog(hDlg, LOWORD(wParam));
            
return (INT_PTR)TRUE;
        }

        
break;
    }

    
return (INT_PTR)FALSE;
}

posted on 2009-09-01 00:55 l1989 閱讀(7966) 評論(2)  編輯 收藏 引用 所屬分類: C++

評論

# re: [C++]俄羅斯方塊源碼  回復(fù)  更多評論   

分析的不錯(cuò)啊!
2009-09-01 16:13 | 99讀書人

# re: [C++]俄羅斯方塊源碼  回復(fù)  更多評論   

厲害。
2009-09-03 13:41 | vanlin
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            这里只有精品视频| 国产精品久久久久秋霞鲁丝 | 欧美日韩国产丝袜另类| 久久阴道视频| 欧美91大片| 欧美色另类天堂2015| 国产精品揄拍500视频| 极品av少妇一区二区| 日韩一级二级三级| 亚洲一区二区高清| 久久婷婷久久一区二区三区| 免费在线国产精品| 亚洲三级视频| 亚洲女爱视频在线| 久久亚洲影音av资源网| 欧美日韩国产bt| 国产亚洲成精品久久| 亚洲黄页一区| 久久国产直播| 亚洲三级视频| 久久久久成人精品免费播放动漫| 欧美激情在线观看| 国产日本欧美一区二区三区在线| 亚洲欧美日韩国产成人精品影院| 久久久无码精品亚洲日韩按摩| 欧美激情乱人伦| 国产亚洲视频在线观看| 夜夜嗨网站十八久久| 久久天天躁狠狠躁夜夜爽蜜月| 亚洲欧洲精品一区二区三区波多野1战4 | 久久婷婷av| 国产精品欧美一区二区三区奶水 | 亚洲国产导航| 一区二区国产日产| 久热精品视频在线免费观看 | 国产一区二区三区久久精品| 日韩一级精品| 免费成人高清视频| 午夜在线a亚洲v天堂网2018| 欧美日韩精品免费观看| 亚洲福利在线看| 久久久久欧美| 亚洲愉拍自拍另类高清精品| 欧美精品亚洲精品| 亚洲国产激情| 欧美99久久| 久久精品国产精品| 国产午夜一区二区三区| 亚洲欧美日本国产专区一区| 亚洲日本激情| 欧美福利精品| 亚洲伦理在线免费看| 欧美国产先锋| 欧美 日韩 国产一区二区在线视频 | 国产亚洲福利| 亚洲免费视频一区二区| 亚洲精品乱码久久久久久蜜桃麻豆| 久久久久久日产精品| 国产最新精品精品你懂的| 校园激情久久| 亚欧美中日韩视频| 国产亚洲欧美一区| 久久另类ts人妖一区二区| 欧美一区二区三区免费大片| 国产精品揄拍一区二区| 欧美一区二区三区喷汁尤物| 午夜精品福利一区二区三区av| 国产欧美精品国产国产专区| 欧美一区二区在线免费播放| 久久av一区二区三区| 一色屋精品视频在线看| 欧美高清在线一区二区| 欧美激情一区二区| 国产精品久久久久9999高清| 亚洲欧美日韩综合aⅴ视频| 一区二区三区精密机械公司| 国产精品爽爽爽| 久久精品国产免费观看| 久久婷婷影院| 99精品欧美一区二区蜜桃免费| 一区二区冒白浆视频| 国产日韩欧美视频在线| 农夫在线精品视频免费观看| 欧美另类69精品久久久久9999| 亚洲在线一区二区| 久久久久久久综合色一本| 99精品视频免费全部在线| 亚洲一区国产一区| 亚洲国产成人av好男人在线观看| 亚洲欧洲精品一区二区三区| 国产精品羞羞答答| 欧美激情小视频| 国产精品中文字幕欧美| 欧美高潮视频| 国产美女扒开尿口久久久| 欧美福利精品| 国产欧美日韩不卡免费| 亚洲高清一区二| 国产日本欧美一区二区三区在线| 欧美高清在线播放| 国产农村妇女精品一二区| 欧美激情一区二区三级高清视频| 国产精品久久久久aaaa樱花| 欧美黄网免费在线观看| 国产视频亚洲精品| 一本色道久久| 亚洲另类自拍| 久久久精品国产免费观看同学| 亚洲欧美精品在线观看| 欧美高清视频免费观看| 久久一区亚洲| 国产专区综合网| 亚洲欧美成人网| 亚洲女与黑人做爰| 欧美日韩精品免费| 亚洲欧洲综合| 亚洲国产欧美一区二区三区同亚洲 | 欧美激情亚洲视频| 国产嫩草影院久久久久| 亚洲人www| 亚洲国产专区| 老司机久久99久久精品播放免费 | 一区在线免费观看| 亚洲香蕉伊综合在人在线视看| 亚洲精品黄网在线观看| 久久免费国产| 欧美gay视频| 亚洲成人资源| 久久精品欧美日韩| 久久婷婷国产综合国色天香| 国产欧美精品va在线观看| 亚洲一区免费视频| 亚洲欧美日韩国产综合精品二区 | 激情五月***国产精品| 亚洲午夜影视影院在线观看| 亚洲婷婷免费| 国产精品久99| 欧美一区二区三区视频在线 | 一本色道久久综合狠狠躁篇怎么玩 | 久久久xxx| 好吊色欧美一区二区三区视频| 午夜欧美大尺度福利影院在线看| 午夜视频在线观看一区二区三区| 国产精品乱子久久久久| 亚洲女人av| 久久久国产精品一区| 国产在线精品二区| 老牛国产精品一区的观看方式| 免费欧美日韩国产三级电影| 亚洲国产日韩欧美| 欧美精选一区| 一区二区免费在线视频| 欧美一区在线视频| 国内欧美视频一区二区| 久久精品2019中文字幕| 免费欧美高清视频| 一区二区三区免费看| 国产精品嫩草久久久久| 久久成人国产| 亚洲国产一区二区三区a毛片 | 在线播放一区| 欧美激情一二区| 亚洲一区二区不卡免费| 久久久www成人免费精品| 亚洲韩国青草视频| 欧美视频在线一区| 欧美一区二区三区久久精品茉莉花| 久久久久久久高潮| 日韩一区二区高清| 国产精品永久| 蜜桃伊人久久| 亚洲制服欧美中文字幕中文字幕| 欧美中在线观看| 亚洲每日更新| 激情成人av| 国产精品免费区二区三区观看| 久久在线免费观看| 亚洲欧美卡通另类91av| 亚洲国产精品福利| 久久―日本道色综合久久| 一区二区三区视频观看| 影音先锋日韩有码| 国产毛片精品视频| 欧美剧在线观看| 久久视频这里只有精品| 亚洲欧美大片| 日韩视频免费观看高清在线视频 | 亚洲国产精品t66y| 久久成人18免费观看| 国产精品美女久久福利网站| 久久夜色精品国产亚洲aⅴ| 亚洲欧美成人一区二区三区| 亚洲精品国精品久久99热一| 美国成人直播| 久久久久88色偷偷免费| 亚洲欧美成人综合| 一区二区三区高清视频在线观看| 亚洲国产裸拍裸体视频在线观看乱了中文| 国产精品免费视频xxxx| 国产精品福利在线|