⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 unit1.cpp

📁 自编小俄罗斯方块
💻 CPP
📖 第 1 页 / 共 3 页
字号:
//---------------------------------------------------------------------------

#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 + -