ΠΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Π½ΠΈΡ.
Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Win32-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΡΠ΅Π΄Π΅ Microsoft Visual Studio
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ΅Π΄Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ MS Visual Studio C++ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Microsoft Foundational Classes (MFC). Void TetrisWnd: OnTimer (UINT nIDEvent) //+ ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΡΠ»Π΅Π΄ΠΈΡΡ ΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΠΈΠ»ΠΈ Π»ΠΈ ΡΠ»ΠΎΠΆΠΈΠ»ΠΎΡΡ 3 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΡΡΠ΄. ΠΡΠΈ ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΠ· ΠΊΡΠ±ΠΈΠΊΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ²Π΅ΡΠ° ΡΠΈΠ³ΡΡΡ — ΡΠΈΠ³ΡΡΠ° ΠΈΡΡΠ΅Π·Π°Π΅Ρ, Π±Π°Π»Π»Ρ Π·Π°ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ Π² ΡΡΡΡ. Stock = (color… Π§ΠΈΡΠ°ΡΡ Π΅ΡΡ >
ΠΠΎΡΡΠ°Π½ΠΎΠ²ΠΊΠ° Π·Π°Π΄Π°Π½ΠΈΡ. Π Π°Π·ΡΠ°Π±ΠΎΡΠΊΠ° ΠΈΠ½ΡΠ΅ΡΠ°ΠΊΡΠΈΠ²Π½ΠΎΠ³ΠΎ Win32-ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π² ΡΡΠ΅Π΄Π΅ Microsoft Visual Studio (ΡΠ΅ΡΠ΅ΡΠ°Ρ, ΠΊΡΡΡΠΎΠ²Π°Ρ, Π΄ΠΈΠΏΠ»ΠΎΠΌ, ΠΊΠΎΠ½ΡΡΠΎΠ»ΡΠ½Π°Ρ)
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ ΡΡΠ΅Π΄Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΠΈΡΠΎΠ²Π°Π½ΠΈΡ MS Visual Studio C++ Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΠ΅ΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠΈ Microsoft Foundational Classes (MFC).
ΠΠ΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ ΡΠ°Π·ΡΠ°Π±ΠΎΡΠ°ΡΡ Π°Π»Π³ΠΎΡΠΈΡΠΌ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ, ΠΊΠΎΡΠΎΡΠ°Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅Ρ ΠΏΠ΅ΡΠ΅ΠΌΠ΅ΡΠ΅Π½ΠΈΠ΅ ΡΠΈΠ³ΡΡ ΠΏΠΎ ΡΠΊΡΠ°Π½Ρ ΡΠ²Π΅ΡΡ Ρ Π²Π½ΠΈΠ·, ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠΈΡ ΠΈΡ ΠΌΠ΅ΡΡΠΎΠ½Π°Ρ ΠΎΠΆΠ΄Π΅Π½ΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π΄Π΅ΠΉΡΡΠ²ΠΈΡΠΌΠΈ ΠΈΠ³ΡΠ°ΡΡΠ΅Π³ΠΎ. Π€ΠΈΠ³ΡΡΡ ΡΠΎΡΡΠΎΡΡ ΠΈΠ· ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ°Π·ΠΌΠ΅ΡΠ°, Π½Π°Π±ΠΎΡ ΡΠΈΠ³ΡΡ — ΠΊΠΎΠ½Π΅ΡΠ½ΡΠΉ, ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»ΡΠ½ΠΎΡΡΡ Π²ΡΠΏΠ°Π΄Π΅Π½ΠΈΡ ΡΠΈΠ³ΡΡ — ΡΠ»ΡΡΠ°ΠΉΠ½Π°Ρ. ΠΠ³ΡΠΎΠΊ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π²ΠΊΠ»Π°Π΄ΡΠ²Π°ΡΡ ΡΠΈΠ³ΡΡΡ ΡΠ°ΠΊ, ΡΡΠΎΠ±Ρ ΡΠΊΠ»Π°Π΄ΡΠ²Π°Π»ΠΈΡΡ ΡΡΠ΄ΠΎΠΌ ΠΊΠ²Π°Π΄ΡΠ°ΡΡ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΡ ΡΠ²Π΅ΡΠΎΠ². ΠΡΠΈ ΡΡΠΎΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠ²Π°Π½Π½Π°Ρ ΠΈΠ· ΠΊΠ²Π°Π΄ΡΠ°ΡΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ²Π΅ΡΠ° ΡΠΈΠ³ΡΡΠ°, Π΄ΠΎΠ»ΠΆΠ½Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ΅ΡΠΊΠΈ ΠΈΡΡΠ΅Π·Π°ΡΡ. Π Π΅Π·ΡΠ»ΡΡΠ°Ρ — ΠΈΡΠΏΠΎΠ»Π½ΡΠ΅ΠΌΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅, ΠΏΠΎΠ²ΡΠΎΡΡΡΡΠ΅Π΅ ΠΎΠ±ΡΠ΅ΠΈΠ·Π²Π΅ΡΡΠ½ΡΡ ΠΈΠ³ΡΡ «ΠΠΎΠ»ΠΎΠ½ΠΊΠΈ».
ΠΠΏΠΈΡΠ°Π½ΠΈΠ΅ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°
ΠΠΎΡΠ»Π΅ Π·Π°ΠΏΡΡΠΊΠ° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΌΡ Π½Π° ΡΠΊΡΠ°Π½Π΅ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ³ΡΠΎΠ²ΠΎΠ΅ ΠΏΠΎΠ»Π΅ Ρ ΡΠΈΠ³ΡΡΠΎΠΉ.
Π ΠΈΡ.
ΠΠ²Π΅ΡΡ Ρ ΡΠΊΡΠ°Π½Π° — ΠΈΠ³ΡΠ°. ΠΠ³ΡΠ° ΡΠΎΠ΄Π΅ΡΠΆΠΈΡ ΡΠ°ΠΊΠΈΠ΅ ΠΏΡΠ½ΠΊΡΡ:
- * Π½ΠΎΠ²Π°Ρ
- * Π²ΡΡ ΠΎΠ΄
Π ΠΈΡ.
ΠΠΌΠ΅Π΅ΡΡΡ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡ Π²ΡΠ±ΡΠ°ΡΡ ΡΡΠΎΠ²Π΅Π½Ρ ΠΈΠ³ΡΡ ΠΠ΅ΡΠ²ΡΠΉ ΠΡΠΎΡΠΎΠΉ Π’ΡΠ΅ΡΠΈΠΉ.
Π ΠΈΡ.
ΠΡΠΈ ΠΏΡΠΎΠΈΠ³ΡΡΡΠ΅ ΠΏΠΎΡΠ²Π»ΡΠ΅ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ ΡΡΡΡΠ΅.
Π ΠΈΡ.
ΠΡΠΈ ΡΠΎΡΡΠ°Π²Π»Π΅Π½ΠΈΠΈ ΠΈΠ· ΠΊΡΠ±ΠΈΠΊΠΎΠ² ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ ΡΠ²Π΅ΡΠ° ΡΠΈΠ³ΡΡΡ — ΡΠΈΠ³ΡΡΠ° ΠΈΡΡΠ΅Π·Π°Π΅Ρ, Π±Π°Π»Π»Ρ Π·Π°ΡΡΠΈΡΡΠ²Π°ΡΡΡΡ Π² ΡΡΡΡ.
Π Π΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π² VS C++.
#include.
#include.
#include.
#include" resource. h" .
#define size 20.
//———————————————-;
// class Shape.
//———————————————-;
class Shape.
{.
public:
bool cells[3][3]; // ΠΌΠ°ΡΡΠΈΡΠ° ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄Π΅Π½ΠΈΡ Π΄Π»Ρ ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
void NewShape (); // ΠΊΠΎΠ½ΡΡΡΡΠΊΡΠΎΡ ΡΠΎΠ·Π΄Π°Π΅Ρ Π½Π°Ρ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ.
void ClearShape (bool c[3][3]); // ΠΎΡΠΈΡΠ°Π΅Ρ ΠΌΠ°ΡΡΠΈΡΡ cells[3][3].
};
void Shape: ClearShape (bool c[3][3]).
{.
for (int i = 0; i < 3; i++).
for (int j = 0; j < 3; j++).
c[i][j] = false;
}.
void Shape: NewShape ().
{.
ClearShape (cells);
for (int i = 0; i < 3; i++).
cells[i][0] = true;
}.
class TetrisWnd: public CFrameWnd.
{.
public:
TetrisWnd ();
void NewShape (); //ΡΠΎΠ·Π΄Π°Π΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΎΠ±ΡΠ΅ΠΊΡ ΡΠΎΠ΄ΠΈΡΠ΅Π»ΡΡΠΊΠΎΠ³ΠΎ ΠΊΠ»Π°ΡΡΠ° Π½Π°Π²Π΅ΡΡ Ρ ΠΎΠΊΠ½Π° ΡΠΈΠΏΠ° ΡΡΠ°ΡΡΡΠ΅Ρ.
COLORREF ShapeColor (int color); // ΠΌΡ ΠΈΠΌΠ΅Π΅ΠΌ 5 ΡΠ²Π΅ΡΠΎΠ² ΡΡΠ° ΡΡΠ½ΠΊΡΠΈΡ Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ rgb ΡΠ²Π΅Ρ ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²Π΅Π½Π½ΠΎ ΠΎΡ Π½ΠΎΠΌΠ΅ΡΠ°.
void SetLevel (int); //ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ ΡΡΠΎΠ²Π½Ρ.
bool CheckLeft (); // ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅ΡΡΠΈΡΡ Π²Π»Π΅Π²ΠΎ.
bool CheckRight (); // ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅ΡΡΠΈΡΡ Π²ΠΏΡΠ°Π²ΠΎ.
void ShowTitle (); // show the window title.
void CheckForLine (); // ΠΏΡΠΎΠ²Π΅ΡΡΠ΅Ρ 3 ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΡΠΎΡΡ Π² ΡΡΠ΄.
bool IsAtBottom (); // ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° Π½Π΅Ρ Π»ΠΈ Π΄Π½Π°.
void MoveUp (); //ΡΠ΄Π²ΠΈΠ³Π°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Π²Π΅ΡΡ .
void MoveDown ();//ΡΠ΄Π²ΠΈΠ³Π°Π΅Ρ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ Π²Π½ΠΈΠ·.
void ClearStock (); // ΠΎΡΠΈΡΠ°Π΅Ρ ΡΠΎΡ ΡΠ°Π½Π΅Π½Ρ ΡΠ²Π΅ΡΠ°.
CRect GetRect (); // Π²ΠΎΠ·Π²ΡΠ°ΡΠ°Π΅Ρ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊ Π΄Π»Ρ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠΉ Π½ΡΠΆΠ½ΠΎ.
private:
CMenu menu;
Shape shape;
short stock[20][10]; //ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ ΡΠ²Π΅ΡΠ° Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΡΡ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΠΎΡΠ΅Π½Ρ Π²Π°ΠΆΠ΅Π½ ΠΌΠ°ΡΡΠΈΠ² ΡΠ²Π΅ΡΠΎΠ².
int curY; //ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΡ ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎΠ³ΠΎ ΠΏΡΡΠΌΠΎΡΠ³ΠΎΠ»ΡΠ½ΠΈΠΊΠ°.
int curX;
bool bGame; //Π² ΠΈΠ³ΡΠ΅ ΠΈΠ»ΠΈ Π½Π΅Ρ.
int score;
int level;
bool level1;
bool level2;
bool level3;
int color[3]; // ΡΠΎΡ ΡΠ°Π½ΡΠ΅Ρ Π½ΠΎΠΌΠ΅ΡΠ° ΡΠ²Π΅ΡΠΎΠ².
protected:
protected:
virtual BOOL PreCreateWindow (CREATESTRUCT& cs);
protected:
afx_msg void OnPaint ();
afx_msg void OnTimer (UINT nIDEvent);
afx_msg void OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags);
afx_msg void OnGameNew ();
afx_msg void OnGameExit ();
afx_msg void OnClose ();
afx_msg void OnLevelLevel1();
afx_msg void OnUpdateLevelLevel1(CCmdUI* pCmdUI);
afx_msg void OnLevelLevel2();
afx_msg void OnUpdateLevelLevel2(CCmdUI* pCmdUI);
afx_msg void OnLevelLevel3();
afx_msg void OnUpdateLevelLevel3(CCmdUI* pCmdUI);
afx_msg void OnHelpAbout ();
DECLARE_MESSAGE_MAP ().
};
BEGIN_MESSAGE_MAP (TetrisWnd, CFrameWnd).
ON_WM_PAINT ().
ON_WM_TIMER ().
ON_WM_KEYDOWN ().
ON_COMMAND (ID_GAME_NEW, OnGameNew).
ON_COMMAND (ID_GAME_EXIT, OnGameExit).
ON_WM_CLOSE ().
ON_COMMAND (ID_LEVEL_LEVEL1, OnLevelLevel1).
ON_UPDATE_COMMAND_UI (ID_LEVEL_LEVEL1, OnUpdateLevelLevel1).
ON_COMMAND (ID_LEVEL_LEVEL2, OnLevelLevel2).
ON_UPDATE_COMMAND_UI (ID_LEVEL_LEVEL2, OnUpdateLevelLevel2).
ON_COMMAND (ID_LEVEL_LEVEL3, OnLevelLevel3).
ON_UPDATE_COMMAND_UI (ID_LEVEL_LEVEL3, OnUpdateLevelLevel3).
ON_COMMAND (ID_HELP_ABOUT, OnHelpAbout).
END_MESSAGE_MAP ().
TetrisWnd:TetrisWnd ().
{.
CString s = AfxRegisterWndClass (CS_HREDRAW | CS_VREDRAW,.
AfxGetApp ()->LoadStandardCursor (IDC_ARROW),.
(HBRUSH)GetStockObject (BLACK_BRUSH),.
AfxGetApp ()->LoadIcon (IDI_ICON1));
Create (s, «ΠΠΎΠ»ΠΎΠ½ΠΊΠΈ»);
menu.LoadMenu (IDR_MENU1);
SetMenu (&menu);
level = 700;
SetLevel (1);
srand (time (0));
ClearStock ();
}.
class MyApp: public CWinApp.
{.
public:
virtual BOOL InitInstance ().
{.
m_pMainWnd = new TetrisWnd;
m_pMainWnd->ShowWindow (SW_SHOWNORMAL);
return TRUE;
}.
};
MyApp app;
BOOL TetrisWnd: PreCreateWindow (CREATESTRUCT& cs).
{.
cs.style &= ~WS_MAXIMIZEBOX;
cs.style &= ~WS_THICKFRAME;
cs.cx = 220; //ΡΠ°Π·ΠΌΠ΅ΡΡ ΠΎΠΊΠ½Π°.
cs.cy = 460;
return CFrameWnd: PreCreateWindow (cs);
}.
void TetrisWnd: MoveUp ().
{.
int c = color[0];
color[0] = color[1];
color[1] = color[2];
color[2] = c;
}.
void TetrisWnd: MoveDown ().
{.
int c = color[2];
color[2] = color[1];
color[1] = color[0];
color[0] = c;
}.
void TetrisWnd: OnPaint () //ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²ΠΊΠΈ ΡΠ»Π΅ΠΌΠ΅Π½ΡΠΎΠ² ΡΠ°ΠΌΠ°Ρ Π³Π»Π°Π²Π½Π°Ρ ΠΏΡΠΎΡΠ΅Π΄ΡΡΠ°.
{.
CPaintDC dc (this);
CBrush brush;
for (int i = 0; i < 3; i++) //ΡΠΈΡΡΠ΅Ρ Π½ΠΎΠ²ΡΠΉ ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎΠΉ ΡΠ»Π΅ΠΌΠ΅Π½Ρ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°ΠΌΠΈ.
{.
brush.CreateSolidBrush (ShapeColor (color[i]));
dc.SelectObject (&brush);
for (int j = 0; j < 3; j++).
{.
if (shape.cells[i][j] == true).
dc.Rectangle (curX + j*size, curY + i*size, curX + (j + 1)*size, curY + (i + 1)*size);
}.
brush.DeleteObject ();
}.
for (int i = 0; i < 20; i++) ///ΡΠ°ΠΊ ΠΊΠ°ΠΊ stock [i] [j] ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΡΡΡ Π²ΡΠ΅ ΡΠ»Π΅ΠΌΠ΅Π½ΡΡ ΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΈΡ ΠΏΠ΅ΡΠ΅ΡΠΈΡΠΎΠ²Π°ΡΡ.
{.
for (int j = 0; j < 10; j++).
{.
if (stock[i][j] ≠ -1).
{.
brush.CreateSolidBrush (ShapeColor (stock[i][j]));
dc.SelectObject (&brush);
dc.Rectangle (j*size, i*size, (j + 1)*size, (i + 1)*size);
brush.DeleteObject ();
}.
}.
}.
}.
CRect TetrisWnd: GetRect ().
{.
CRect r;
r.left = curX — size;
r.right = curX + size * 5;
r.top = curY — size;
r.bottom = curY + size * 5;
return r;
}.
void TetrisWnd: OnTimer (UINT nIDEvent) //+ ΠΠ°ΠΌ Π½ΡΠΆΠ½ΠΎ ΠΊΠ°ΠΆΠ΄ΡΠΉ ΡΠ°Π· ΡΠ»Π΅Π΄ΠΈΡΡ ΠΈΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΌΠΎΠΆΠ΅Ρ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΠΈΠ»ΠΈ Π»ΠΈ ΡΠ»ΠΎΠΆΠΈΠ»ΠΎΡΡ 3 ΡΠ»Π΅ΠΌΠ΅Π½ΡΠ° Π² ΡΡΠ΄.
{.
CPaintDC dc (this);
CBrush brush;
if (nIDEvent == 1 && bGame == true).
{.
if (IsAtBottom ()) //Π΅ΡΠ»ΠΈ ΡΠ»Π΅ΠΌΠ΅Π½Ρ ΠΎΡΡΠ°Π½ΠΎΠ²ΠΈΠ»ΡΡ.
{.
for (int i = 0; i < 3; i++).
for (int j = 0; j < 3; j++).
{.
if (shape.cells[i][j] == true).
stock[curY / size + i][curX / 20 + j] = (color[i]); //ΡΠΎΡ ΡΠ°Π½ΡΠ΅ΠΌ Π΅Π³ΠΎ ΡΠ²Π΅ΡΠ° Π² ΠΌΠ°ΡΡΠΈΠ² Π½Π΅ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΡΡ ΠΎΠ±ΡΠ΅ΠΊΡΠΎΠ² Π΅ΡΡΡ stock ΡΡΠΎΠ±Ρ ΠΏΠΎΠ·ΠΆΠ΅ Π΅Π³ΠΎ Π½Π°ΡΠΈΡΠΎΠ²Π°ΡΡ.
}.
NewShape (); //ΡΠΎΠ·Π΄Π°Π½ΠΈΠ΅ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Π²ΠΈΠΆΠ½ΠΎΠ³ΠΎ ΠΎΠ±ΡΠ΅ΠΊΡΠ°.
if (IsAtBottom ()).
{.
bGame = false;
}.
InvalidateRect (GetRect ());
CheckForLine (); //ΠΏΡΠΎΠ²Π΅ΡΡΠ΅ΠΌ Π² 3 Π² ΡΡΠ΄ Π½Π΅ ΡΠΎΠ±ΡΠ°Π»ΠΈΡΡ.
return;
}.
curY += 20;
InvalidateRect (GetRect ());
}.
else if (bGame == false).
{.
KillTimer (1);
CString s;
s.Format («%d», score);
MessageBox («ΠΡ ΠΏΡΠΎΠΈΠ³ΡΠ°Π»ΠΈ ! ΠΠ°Ρ ΡΡΠ΅Ρ: «+ s);
}.
CFrameWnd:OnTimer (nIDEvent);
}.
void TetrisWnd: OnKeyDown (UINT nChar, UINT nRepCnt, UINT nFlags).
{.
switch (nChar).
{.
case VK_CONTROL:
case VK_UP: MoveUp (); break;
case VK_LEFT: if (CheckLeft ()) return; curX -= 20; break;
case VK_RIGHT: if (CheckRight ()) return; curX += 20; break;
case VK_DOWN: MoveDown (); break;
case VK_SPACE: KillTimer (1); SetTimer (1, 20, NULL); break;
}.
InvalidateRect (GetRect ());
CFrameWnd:OnKeyDown (nChar, nRepCnt, nFlags);
}.
void TetrisWnd: OnGameNew ().
{.
ClearStock ();
score = 0;
bGame = true;
SetLevel (1);
NewShape ();
ShowTitle ();
Invalidate ();
}.
void TetrisWnd: ClearStock ().
{.
for (int i = 0; i < 20; i++).
for (int j = 0; j < 10; j++).
stock[i][j] = -1;
}.
bool TetrisWnd: IsAtBottom ().
{.
for (int i = 0; i < 3; i++).
{.
for (int j = 0; j < 3; j++).
{.
if (shape.cells[i][j] == true).
{.
if ((curY / 20 + i) >= 19 || stock[curY / 20 + i + 1][curX / 20 + j] ≠ -1).
return true;
}.
}.
}.
return false;
}.
void TetrisWnd: CheckForLine ().
{.
int i, j, k, c = 0;
bool flag;
for (i = 0; i < 20; i++).
{.
flag = false;
for (j = 0; j < 8; j++).
if (stock[i][j] == stock[i][j + 1] && stock[i][j + 1] == stock[i][j + 2] && stock[i][j] ≠ -1 && stock[i][j + 1] ≠ -1 && stock[i][j + 2] ≠ -1) flag = true;
if (flag == true && j ≠ 0).
{.
c++;
score++;
ShowTitle ();
for (k = i; k>0; k—).
{.
for (j = 0; j < 10; j++).
{.
stock[k][j] = stock[k — 1][j];
}.
}.
}.
}.
for (k = 0; k < c; k++).
for (j = 0; j < 10; j++).
stock[k][j] = -1;
for (j = 0; j < 10; j++).
for (i = 0; i < 20; i++).
{.
if (stock[i][j] == stock[i + 1][j] && stock[i + 1][j] == stock[i + 2][j] && stock[i][j] ≠ -1 && stock[i + 1][j] ≠ -1 && stock[i + 2][j] ≠ -1).
{.
for (k = 0; k < 20; k++).
stock[k][j] = -1;
}.
}.
Invalidate ();
}.
void TetrisWnd: ShowTitle () //Π²ΡΠ²ΠΎΠ΄ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°.
{.
CString title;
title.Format («ΠΠΎΠ»ΠΎΠ½ΠΊΠΈ: %d», score);
SetWindowText (title);
}.
bool TetrisWnd: CheckRight ().
{.
for (int i = 0; i < 3; i++).
{.
for (int j = 0; j < 3; j++).
{.
if (shape.cells[i][j] == true).
{.
if ((curX / size + j) >= 9 || stock[curY / size + i][curX / size + j + 1] ≠ -1).
return true;
}.
}.
}.
return false;
}.
bool TetrisWnd: CheckLeft ().
{.
for (int i = 0; i < 3; i++).
{.
for (int j = 0; j < 3; j++).
{.
if (shape.cells[i][j] == true).
{.
if ((curX / size + j) <= 0 || stock[curY / size + i][curX / size + j — 1] ≠ -1).
return true;
}.
}.
}.
return false;
}.
//ΡΠΈΡΡΠ΅ΠΌΠ½ΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ.
void TetrisWnd: OnGameExit ().
{.
OnClose ();
}.
void TetrisWnd: OnClose ().
{.
KillTimer (1);
CFrameWnd:OnClose ();
}.
void TetrisWnd: OnLevelLevel1().
{.
SetLevel (1);
}.
void TetrisWnd: OnUpdateLevelLevel1(CCmdUI* pCmdUI).
{.
pCmdUI->SetCheck (level1);
}.
void TetrisWnd: OnLevelLevel2().
{.
SetLevel (2);
}.
void TetrisWnd: OnUpdateLevelLevel2(CCmdUI* pCmdUI).
{.
pCmdUI->SetCheck (level2);
}.
void TetrisWnd: OnLevelLevel3().
{.
SetLevel (3);
}.
void TetrisWnd: OnUpdateLevelLevel3(CCmdUI* pCmdUI).
{.
pCmdUI->SetCheck (level3);
}.
void TetrisWnd: SetLevel (int lev).
{.
level1 = level2 = level3 = false;
switch (lev).
{.
case 1: level = 700; level1 = true; break;
case 2: level = 500; level2 = true; break;
case 3: level = 300; level3 = true; break;
}.
}.
void TetrisWnd: OnHelpAbout ().
{.
CDialog dlg (IDD_ABOUT);
dlg.DoModal ();
}.
COLORREF TetrisWnd: ShapeColor (int color)//ΡΠ²Π΅ΡΠ° Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΠΈΠΈ Ρ Π½ΠΎΠΌΠ΅ΡΠ°.
{.
switch (color).
{.
case 0: return RGB (255, 0, 0);
case 1: return RGB (0, 0, 255);
case 2: return RGB (0, 255, 0);
case 3: return RGB (8, 232, 222);
case 4: return RGB (112, 41, 99);
}.
return RGB (255, 255, 255);
}.
void TetrisWnd: NewShape ().
{.
KillTimer (1);
SetTimer (1, level, NULL);
curY = 0;
curX = 60;
shape.NewShape ();
for (int i = 0; i < 2; i++).
color[i] = (rand () %4);
do.
{.
color[2] = (rand () % 4);
} while (color[2] == color[1]);
}.