?? unit1.cpp
字號:
//---------------------------------------------------------------------------
#include <vcl.h>
#include <time.h>
#include <mmsystem.h>
#pragma hdrstop
#include "Unit1.h"
#include "Unit2.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
//缺省為不是游戲暫停狀態
m_bGamePaush = FALSE;
//缺省為不插放背景音樂
m_bMusic = FALSE;
//缺省為畫網格線
m_bDrawGrid = TRUE;
//總分值清零
m_iPerformance = 0;
//測試值:為12行,10列
m_iRow = 12;
m_iCol = 10;
//左上角X,Y坐標
m_iStartX = 10;
m_iStartY = 10;
//缺省級別為3級
m_iLevel = 2;
//缺省方塊大小為m_iLarge個象素
m_iLarge = 30;
//缺省游戲是結束的
m_bGameEnd = TRUE;
int i,j;
//賦初值
for (i=0;i<100;i++)
for (j=0;j<100;j++)
GameStatus[i][j]=0;
//各種形狀方塊的接觸面數據,參見設計書的接觸面表格,
//如果某種形狀的方塊沒有4個接觸面,則后面的數據填-1
for (i=0;i<74;i++)
for (j=0;j<4;j++)
InterFace[i][j] = -1;
InterFace[1][0] = 3;
InterFace[11][0] = 0;
InterFace[11][1] = 1;
InterFace[11][2] = 2;
InterFace[11][3] = 3;
InterFace[2][0] = 1;
InterFace[2][1] = 3;
InterFace[3][0] = 0;
InterFace[3][1] = 2;
InterFace[3][2] = 3;
InterFace[31][0] = 2;
InterFace[31][1] = 3;
InterFace[32][0] = 0;
InterFace[32][1] = 2;
InterFace[32][2] = 3;
InterFace[33][0] = 0;
InterFace[33][1] = 3;
InterFace[4][0] = 1;
InterFace[4][1] = 3;
InterFace[41][0] = 0;
InterFace[41][1] = 2;
InterFace[41][2] = 3;
InterFace[5][0] = 1;
InterFace[5][1] = 3;
InterFace[51][0] = 0;
InterFace[51][1] = 2;
InterFace[51][2] = 3;
InterFace[6][0] = 0;
InterFace[6][1] = 3;
InterFace[61][0] = 1;
InterFace[61][1] = 2;
InterFace[61][2] = 3;
InterFace[62][0] = 2;
InterFace[62][1] = 3;
InterFace[63][0] = 0;
InterFace[63][1] = 1;
InterFace[63][2] = 3;
InterFace[7][0] = 2;
InterFace[7][1] = 3;
InterFace[71][0] = 1;
InterFace[71][1] = 2;
InterFace[71][2] = 3;
InterFace[72][0] = 0;
InterFace[72][1] = 3;
InterFace[73][0] = 0;
InterFace[73][1] = 1;
InterFace[73][2] = 3;
}
//---------------------------------------------------------------------------
//創建一些設備
void __fastcall TForm1::FormCreate(TObject *Sender)
{
//白色的黑筆
whitePen = new TPen();
whitePen->Color =clWhite;
whitePen->Style =psSolid;
whitePen->Width =1;
//黑色的黑筆
blackPen = new TPen();
blackPen->Color =clBlack;
blackPen->Style =psSolid;
blackPen->Width =1;
redPen = new TPen();
redPen->Color =clRed;
redPen->Style =psSolid;
redPen->Width =1;
//畫刷
grayBrush = new TBrush();
grayBrush->Color =clGray;//RGB(0,255,255);
blueBrush = new TBrush();
blueBrush->Color =clBlue;
blackBrush = new TBrush();
blackBrush->Color =clBlack;
//決定第一次掉下來的方塊的樣式
m_inextStatus = Random(7);
if (m_inextStatus==0) m_inextStatus++;
}
//---------------------------------------------------------------------------
/* * * * * * * * * * * * * * * * * * * * * * * * *
* 功能:承擔所有繪制屏幕工作
* * * * * * * * * * * * * * * * * * * * * * * * */
void __fastcall TForm1::FormPaint(TObject *Sender)
{
int i,j;
Canvas->Brush=blackBrush;
TRect rect=GetClientRect();
Canvas->Rectangle(rect);
Canvas->Brush=grayBrush;
Canvas-> Rectangle(m_iStartY ,m_iStartX, m_iStartY + 301, m_iStartX + 360);
Canvas->Brush=blueBrush;
Canvas->Pen=whitePen;
//畫網格線
if (m_bDrawGrid)
{
//畫橫線
for (i=0;i<m_iRow+1;i++)
{
Canvas->MoveTo(m_iStartY, m_iStartX + i*m_iLarge);
Canvas->LineTo(m_iStartY+300, m_iStartX +i*m_iLarge);
}
//畫豎線
for (i=0;i<m_iCol+1;i++)
{
Canvas->MoveTo(m_iStartY+i*m_iLarge, m_iStartX);
Canvas->LineTo(m_iStartY+i*m_iLarge, m_iStartX+360);
}
}
//畫方塊
for (i=0;i<m_iRow;i++)
for (j=0;j<m_iCol;j++)
{
if (GameStatus[i][j]==1)
{
//劃的方塊比規定的大小略微小一點
//畫小方塊邊框黑線
Canvas->Pen=blackPen;
Canvas -> MoveTo(m_iStartY+j*m_iLarge +1, m_iStartX+i*m_iLarge +1);
Canvas -> LineTo(m_iStartY+j*m_iLarge +1, m_iStartX+(i+1)*m_iLarge -1);
Canvas -> MoveTo(m_iStartY+j*m_iLarge +1, m_iStartX+(i+1)*m_iLarge -1);
Canvas -> LineTo(m_iStartY+(j+1)*m_iLarge -1, m_iStartX+(i+1)*m_iLarge -1);
//畫小方塊邊框白線
Canvas->Pen=whitePen;
Canvas -> MoveTo(m_iStartY+j*m_iLarge +1, m_iStartX+i*m_iLarge +1);
Canvas -> LineTo(m_iStartY+(j+1)*m_iLarge -1,m_iStartX+i*m_iLarge +1);
Canvas -> MoveTo(m_iStartY+(j+1)*m_iLarge -1,m_iStartX+i*m_iLarge +1);
Canvas -> LineTo(m_iStartY+(j+1)*m_iLarge -1,m_iStartX+(i+1)*m_iLarge -1);
//每個方塊填充綠色的背景
Canvas -> Rectangle(m_iStartY+j*m_iLarge +2,m_iStartX+i*m_iLarge +2,m_iStartY+(j+1)*m_iLarge -2,m_iStartX+(i+1)*m_iLarge -2);
}
}
//顯示游戲區域及游戲級別的漢字描述
if (!m_bGameEnd)
{
SetBkColor(Canvas->Handle,BLACK);
SetTextColor(Canvas->Handle,WHITE);
Canvas -> TextOut(m_iStartY+320, m_iStartX+220, "游戲區域大小:");
Canvas -> TextOut(m_iStartY+320, m_iStartX+240,m_strArea);
Canvas -> TextOut(m_iStartY+320, m_iStartX+280, "游戲級別:");
Canvas -> TextOut(m_iStartY+320, m_iStartX+300,m_strLevel);
}
//顯示總分
if (!m_bGameEnd)
{
AnsiString lsStr="總分為:";
lsStr+=IntToStr( m_iPerformance);
lsStr+=" 分";
SetBkColor(Canvas->Handle,BLACK);
SetTextColor(Canvas->Handle,WHITE);
Canvas -> TextOut(m_iStartY+320, m_iStartX+180,lsStr);
}
//畫下一次將要出現的方塊,用于提示用戶
if (!m_bGameEnd)
{
SetBkColor(Canvas->Handle,BLACK);
SetTextColor(Canvas->Handle,WHITE);
Canvas -> TextOut(m_iStartY+320, m_iStartX,"下一個方塊:");
for (UINT k=0;k<4;k++)
{
i = NextStatus[k][0];
j = NextStatus[k][1];
//劃的方塊比規定的大小略微小一點
//畫小方塊邊框黑線
Canvas->Pen=blackPen;
Canvas -> MoveTo(m_iStartY+j*30 +1+320, m_iStartX+i*30 +1+30);
Canvas -> LineTo(m_iStartY+j*30 +1+320, m_iStartX+(i+1)*30 -1+30);
Canvas -> MoveTo(m_iStartY+j*30 +1+320, m_iStartX+(i+1)*30 -1+30);
Canvas -> LineTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+(i+1)*30 -1+30);
//畫小方塊邊框白線
Canvas->Pen=whitePen;
Canvas -> MoveTo(m_iStartY+j*30 +1+320, m_iStartX+i*30 +1+30);
Canvas -> LineTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+i*30 +1+30);
Canvas -> MoveTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+i*30 +1+30);
Canvas -> LineTo(m_iStartY+(j+1)*30 -1+320, m_iStartX+(i+1)*30 -1+30);
//每個方塊填充藍色的背景
Canvas -> Rectangle(m_iStartY+j*30 +2+320,m_iStartX+i*30 +2+30,
m_iStartY+(j+1)*30 -2+320,m_iStartX+(i+1)*30 -2+30);
}
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SettingClick(TObject *Sender)
{
//參數順序: 區域大小代碼:0-3,分別為:12X10,18X15,24X20,m_iLargeX25
//級別:0-5,分別為:1500,1200,1000,800,600,400
//背景音樂:TRUE 或者 FALSE
int m_lsArea;
switch(m_iRow)
{
case 12:
m_lsArea = 0;
break;
case 18:
m_lsArea = 1;
break;
case 24:
m_lsArea = 2;
break;
case 30:
m_lsArea = 3;
break;
}
TOKBottomDlg* dlg=new TOKBottomDlg(m_lsArea,m_iLevel,m_bMusic,m_bDrawGrid,this);
if (dlg->ShowModal()==IDOK)
{
//確定區域的大小
switch(dlg->m_iArea)
{
case 0:
m_iRow = 12;
m_iCol = 10;
m_iLarge = 30;
break;
case 1:
m_iRow = 18;
m_iCol = 15;
m_iLarge = 20;
break;
case 2:
m_iRow = 24;
m_iCol = 20;
m_iLarge = 15;
break;
case 3:
m_iRow = 30;
m_iCol = 25;
m_iLarge = 12;
break;
}
//確定級別
m_iLevel = dlg->m_iLevel;
//確定是否繪網格背景
m_bDrawGrid = dlg->m_bDrawGrid;
//檢查是否插放音樂
m_bMusic = dlg->m_bMusic;
if (m_bMusic)
PlayMid();
else
StopMid();
Invalidate();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N12101Click(TObject *Sender)
{
m_iRow = 12;
m_iCol = 10;
m_iLarge = 30;
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N18151Click(TObject *Sender)
{
m_iRow = 18;
m_iCol = 15;
m_iLarge = 20;
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N24201Click(TObject *Sender)
{
m_iRow = 24;
m_iCol = 20;
m_iLarge = 15;
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::N30251Click(TObject *Sender)
{
m_iRow = 30;
m_iCol = 25;
m_iLarge = 12;
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Level1Click(TObject *Sender)
{
m_iLevel = 0;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Level2Click(TObject *Sender)
{
m_iLevel = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Level3Click(TObject *Sender)
{
m_iLevel = 1;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Level4Click(TObject *Sender)
{
m_iLevel = 3;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Level5Click(TObject *Sender)
{
m_iLevel = 4;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Level6Click(TObject *Sender)
{
m_iLevel = 5;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::SoundClick(TObject *Sender)
{
if (m_bMusic)
{
m_bMusic = false;
Sound->Checked=false;
StopMid();
}
else
{
m_bMusic = true;
Sound->Checked=true;
PlayMid();
}
}
//---------------------------------------------------------------------------
void __fastcall TForm1::GridClick(TObject *Sender)
{
if (m_bDrawGrid)
{
m_bDrawGrid = false;
Grid->Checked=false;
}
else
{
m_bDrawGrid = true;
Grid->Checked=false;
}
Invalidate();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ExitClick(TObject *Sender)
{
Close();
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Timer1Timer(TObject *Sender)
{
//如果原來的方塊已到底或游戲剛開始,則掉下一個新的方塊
int i,j,k;
if (m_isBottom)
{
m_icurrentStatus = m_inextStatus;
m_inextStatus = Random(7); //得到下一次的方塊樣式
if (m_inextStatus==0) m_inextStatus++;
m_currentRect = m_icurrentStatus; //當前落下的方塊的形狀代碼
RectStatusToActiveStatus( m_icurrentStatus );
ActiveStatusToGameStatus();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -