把做工程过程中经常用到的代码片段记录起来,下边资料是关于C++编写的俄罗斯方块的代码,应该对各位有所好处。
#ifndef DATA_H_
#define DATA_H_
#include
static const int TYPE1=1;
static const int TYPE2=2;
static const int TYPE3=3;
static const int TYPE4=4;
static const int TYPE5=5;
static const int TYPE6=6;
static const int TYPE7=7;
static const int RTYPE1=1;
static const int RTYPE2=2;
static const int RTYPE3=4;
static int rTypeNext;
static int rTypeDown;
static const int index[KINDS][COLS]={
{0,1,0,1,0,0,-1,-1,TYPE1,RTYPE1},
{-1,0,1,2,0,0,0,0,TYPE2,RTYPE2},
{0,0,1,1,1,0,0,-1,TYPE3,RTYPE2},
{0,0,1,1,-1,0,0,1,TYPE4,RTYPE2},
{-1,0,0,1,0,0,1,0,TYPE5,RTYPE3},
{-1,0,1,1,0,0,0,-1,TYPE6,RTYPE3},
{-1,0,1,1,0,0,0,1,TYPE7,RTYPE3}
};
static const int TIMER=1;
static int CURRENTLEVEL=600;
static int level=1;
static const int CTN=4;
typedef struct {
int x;
int y;
}sCord;
sCord sDown[CTN],sNext[CTN];
static RECT rectNext[CTN];
static RECT rectDown[CTN];
static const int cxSize=25;
static const int cySize=35;
static int offsetx;
static int offsety;
static int offsetxNext;
static int offsetyNext;
static const int MS_DOWN=10001;
static bool go=true;
static bool startGame=false;
static bool gameOver=false;
static int score;
RECT rt={326,81,425,455};
static const int pelsSize=13;
static const POINT area[]={0,455,326,455,326,0};
static int fillArea[cySize+1][cxSize+1];
HBRUSH hBrush2=CreateSolidBrush(RGB(255,255,255));
#include"Data.h"
#include
#include
using namespace std;
LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM);
int main()
{
HINSTANCE hInstance=NULL;
static TCHAR szAppName[]=TEXT("ELS");
HWND hwnd;
MSG msg;
WNDCLASS wndclass;
wndclass.lpfnWndProc=WndProc;
wndclass.cbClsExtra=0;
wndclass.cbWndExtra=0;
wndclass.hInstance=hInstance;
wndclass.hIcon = LoadIcon(NULL, IDI_APPLICATION);
wndclass.hCursor = LoadCursor (NULL, IDC_ARROW);
wndclass.lpszMenuName= NULL;
wndclass.lpszClassName= szAppName;
if(!RegisterClass(&wndclass))
{
MessageBox(NULL,TEXT("REGISTER ERROR"),szAppName,MB_ICONERROR);
return 0;
}
300,100,429,480,
NULL,NULL,hInstance,NULL);
ShowWindow(hwnd,SW_SHOWNORMAL);
UpdateWindow(hwnd);
while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return msg.wParam;
}
void getRandom()
{
int k=rand()%KINDS+1;
for(int i=0;i { if(index[i][COLS-2]==k) { for(int j=0;j { sNext[j].x=index[i][j]; sNext[j].y=index[i][j+4]; } break; } } rotate(sNext,rTypeNext,rand()%rTypeNext+1,true); int min_y=0; for (int t = 0; t < CTN; t++) min_y = min_y > sNext[t].y ? sNext[t].y : min_y; } { int tempx; int tempy; int temp; int tx=(offsetx-(int)(pelsSize/2))/pelsSize; int ty=(offsety-(int)(pelsSize/2))/pelsSize; bool ra=true; switch(rType) { case RTYPE1: ra=false; break; case RTYPE2: { if(rNumber%2!=0) { for (int j = 0; j < CTN; j++) { tempx=-lpsCord->y+tx; tempy=lpsCord->x+ty; lpsCord++; if(!firstRotate&&(fillArea[tempx][tempy]>0||tempx>24||tempx<0||tempy<0||tempy>34)) { ra=false; } } lpsCord-=4; } if(ra) { if (rNumber % 2 != 0) for (int k = 0; k < CTN; k++) { temp = -lpsCord->x; lpsCord->x = lpsCord->y; lpsCord->y = temp; lpsCord++; } } } break; case RTYPE3: for(int k=0;k { for(int l=0;l { tempx=lpsCord->y+tx; tempy=(-lpsCord->x)+ty; lpsCord++; if(!firstRotate&&(fillArea[tempx][tempy]>0||tempx>24||tempx<0||tempy<0||tempy>34)) { ra = false; } } lpsCord-=4; } if(ra) for (int i = 0; i < rNumber; i++) { for (int j = 0; j < CTN; j++) { temp = -lpsCord->x; lpsCord->x = lpsCord->y; lpsCord->y = temp; lpsCord++; } lpsCord=lpsCord-4; } break; } return ra; } { rTypeDown=rTypeNext; offsetx=offsetxNext; offsety=offsetyNext; for(int i=0;i { targ->x=sur->x; targ->y=sur->y; sur++; targ++; } getRandom(); } { HDC hdc=GetDC(hwnd); SelectObject(hdc,hBrush); SelectObject(hdc,hPen1); for(int i=0;i { shape++; } ReleaseDC(hwnd,hdc); } void start() { if(!startGame) { for (int i = 0; i < cySize + 1; i++) for (int j = 0; j < cxSize + 1; j++) fillArea[i][j] = 0; startGame=true; go=true; score=0; } } bool downAble() { bool da=true; int x=(offsetx-(int)(pelsSize/2))/pelsSize; int y=(offsety-(int)(pelsSize/2))/pelsSize; int xtemp; int ytemp; for(int i=0;i { xtemp=sDown[i].x+x; ytemp=sDown[i].y+y+1; if(fillArea[ytemp][xtemp]>0||ytemp>34) { da=false; break; } } if (!da) { for (int k = 0; k < CTN; k++) { xtemp = sDown[k].x + x; ytemp = sDown[k].y + y; fillArea[ytemp][xtemp] = 1; fillArea[ytemp][cxSize]++; fillArea[cySize][xtemp]++; } } return da; } bool leftAble() { bool la = true; int x = (offsetx - (int) (pelsSize / 2)) / pelsSize; int y = (offsety - (int) (pelsSize / 2)) / pelsSize; int xtemp; int ytemp; for (int i = 0; i < CTN; i++) { xtemp = sDown[i].x + x-1; ytemp = sDown[i].y + y; if (fillArea[ytemp][xtemp] > 0 || xtemp <0) { la = false; break; } } return la; } bool rightAble() { bool ra = true; int x = (offsetx - (int) (pelsSize / 2)) / pelsSize; int y = (offsety - (int) (pelsSize / 2)) / pelsSize ; int xtemp; int ytemp; for (int i = 0; i < CTN; i++) { xtemp = sDown[i].x + x+1; ytemp = sDown[i].y + y; if (fillArea[ytemp][xtemp] > 0 || xtemp > 24) { ra = false; break; } } return ra; } bool disRows(HWND hwnd) { HDC hdc=GetDC(hwnd); bool da=false; for (int ii = 0; ii < CTN; ii++) row[ii] = 0; static int levelScore; SelectObject(hdc,hPen1); for (int i = 0; i < cySize; i++) { if (fillArea[i][cxSize] == cxSize) row[number++] = i; } { da=true; cout<<"levelScore:"< { levelScore=0; SetTimer(hwnd,TIMER,CURRENTLEVEL,NULL); cout<<"currentlevel:"< for(int i=0;i<15;i++) { { level=i+2; cout<<"level"<
break; } } } InvalidateRect(hwnd,&rt,true); for (int k = 0; k < number; k++) { for(int i=row[k];i>0;i--) { for(int j=0;j { fillArea[i][j]=fillArea[i-1][j]; } } } InvalidateRect(hwnd,NULL,true); } ReleaseDC(hwnd,hdc); return da; } LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRUCT ps; RECT r; static bool down=false; bool isSend=false; switch(message) { case WM_CREATE: { SetTimer(hwnd,TIMER,CURRENTLEVEL,NULL); cout<<"level1"< return 0; } case WM_SIZE: return 0; case WM_TIMER: { if(startGame&&go) { if (down) { { cout<<"can not down"< down=false; disRows(hwnd); if(!isSend) { SendMessage(hwnd,MS_DOWN,0,0); isSend=true; } } else { draw(hwnd, sDown, rectDown,(HBRUSH)GetStockObject(WHITE_BRUSH), offsetx, offsety); offsety += pelsSize; draw(hwnd, sDown, rectDown,hBrush1, offsetx, offsety); } } } return 0; } case MS_DOWN: { draw(hwnd,sNext,rectNext,(HBRUSH)GetStockObject(WHITE_BRUSH),369,44); getNext(sDown,sNext); draw(hwnd,sNext,rectNext,hBrush1,369,44); draw(hwnd,sDown,rectDown,hBrush1,offsetx,offsety); offsety-=pelsSize; if(downAble()) { offsety+=pelsSize; isSend=false; down=true; } else { cout<<"game over!"< startGame=false; gameOver=true; InvalidateRect(hwnd,&rt,true); } } case WM_PAINT: { hdc = BeginPaint(hwnd, &ps); GetClientRect(hwnd, &r); SelectObject(hdc,hPen1); SelectObject(hdc,hBrush1); for(int i=1;i { } for(int j=1;j { } SaveDC(hdc); for(int t=0;t for(int k=0;k { if(fillArea[t][k]>0) { } } if(startGame) { draw(hwnd,sNext,rectNext,hBrush1,369,44); draw(hwnd,sDown,rectDown,hBrush1,offsetx,offsety); } FillRect(hdc,&rt,hBrush2); char ss[20]; char ll[20]; wsprintf(ss,"score:%d",score); wsprintf(ll,"level:%d",level); TextOut(hdc,330,300,ll,lstrlen(ll)); TextOut(hdc,330,320,ss,lstrlen(ss)); if(gameOver) { char g[]="Game Over!!"; TextOut(hdc,330,200,g,lstrlen(g)); } SelectObject(hdc, GetStockObject(BLACK_PEN)); MoveToEx(hdc, 325, 80, NULL); LineTo(hdc, 425, 80); EndPaint(hwnd, &ps); return 0; } case WM_KEYDOWN: switch(wParam) { case VK_UP: { if(go&&startGame) { down=false; draw(hwnd,sDown,rectDown,(HBRUSH)GetStockObject(WHITE_BRUSH),offsetx,offsety); rotate(sDown,rTypeDown,1,false); draw(hwnd,sDown,rectDown,hBrush1,offsetx,offsety); } } return 0; case VK_DOWN: { if(go&&startGame) { down=false; draw(hwnd,sDown,rectDown,(HBRUSH)GetStockObject(WHITE_BRUSH),offsetx,offsety); int k=(offsety-(int)(pelsSize)/2)/pelsSize; while(k { if(downAble()) { offsety+=pelsSize; } else break; } draw(hwnd,sDown,rectDown,hBrush1,offsetx,offsety); disRows(hwnd); SendMessage(hwnd,MS_DOWN,0,0); } return 0; } case VK_LEFT: { if(leftAble()&&go&&startGame) { down=false; draw(hwnd,sDown,rectDown,(HBRUSH)GetStockObject(WHITE_BRUSH),offsetx,offsety); offsetx-=pelsSize; draw(hwnd,sDown,rectDown,hBrush1,offsetx,offsety); } return 0; } case VK_RIGHT: { if(rightAble()&&go&&startGame) { down=false; draw(hwnd, sDown, rectDown, (HBRUSH) GetStockObject(WHITE_BRUSH), offsetx, offsety); offsetx+=pelsSize; draw(hwnd, sDown, rectDown, hBrush1, offsetx, offsety); } return 0; } case VK_SPACE: { go=!go; return 0; } case VK_RETURN: { if(!startGame&&!gameOver) { cout<<"startGame"< gameOver=false; start(); getRandom(); SendMessage(hwnd,MS_DOWN,0,0); } if(!startGame&&gameOver) { cout<<"RestartGame!"< gameOver=false; start(); level=1; InvalidateRect(hwnd,NULL,true); getRandom(); SendMessage(hwnd,MS_DOWN,0,0); } return 0; } } return 0; case WM_KEYUP: switch(wParam) { case VK_UP: if(go) down=true; return 0; case VK_LEFT: if(go) down=true; return 0; case VK_RIGHT: if(go) down=true; return 0; } return 0; case WM_DESTROY: DeleteObject(hBrush1); DeleteObject(hBrush2); DeleteObject(hPen1); KillTimer(hwnd,TIMER); PostQuitMessage(0); return 0; } return DefWindowProc(hwnd,message,wParam,lParam); }