|
写的很烂请别在意- -! 暑假无聊时写的。
 /**//***************************************************
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] = {4, 3, 3, 3, 3, 3, 2};
int SquareData::sData[SquareData::S_KIND][SquareData::S_MAX] =
  {//0为格子不显示 非0则显示
 {0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0},
 {2, 0, 0, 2, 2, 0, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0},
 {0, 0, 3, 0, 3, 3, 0, 3, 0, 0, 0, 0, 0, 0, 0, 0},
 {4, 4, 0, 0, 4, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0},
 {0, 5, 5, 0, 5, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0},
 {0, 6, 0, 6, 6, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
 {7, 7, 7, 7, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
};
//----------------------Matrix--------------------------
//游戏区域
 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>=x || _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>=x ||
_y+i<0 || _y+i>=y || 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 : 定义应用程序的入口点。
//
#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; // 当前实例
TCHAR szTitle[MAX_LOADSTRING]; // 标题栏文本
TCHAR szWindowClass[MAX_LOADSTRING]; // 主窗口类名

// 此代码模块中包含的函数的前向声明:
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, 0, 0))
 {
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; // 将实例句柄存储在全局变量中
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));
}
//--------------------游戏区------------------------
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);//结束更新
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;
}
//----------------------初始和结束处理------------------------
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;
}


// “关于”框的消息处理程序。
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;
}

|