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

📄 c15_3f.cpp

📁 C++Builder编程实例详解,用具体的例子阐明C++的一些基本操作,所有程序均在BC++上编译过.可靠,建议下载
💻 CPP
字号:
//---------------------------------------------------------------------------
#include <vcl\vcl.h>
#pragma hdrstop

#include "C15_3f.h"
//---------------------------------------------------------------------------
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormCreate(TObject *Sender)
{
    Image[0] = Image1; // 设置图象控件指针
    Image[1] = Image2;
    Image[2] = Image3;
    Image[3] = Image4;
    Image[4] = Image5;
    Image[5] = Image6;
    Start6Click(NULL); // 开始游戏
}
//---------------------------------------------------------------------------
void TForm1::NewGame()
{
    // 初始化各数组
    memset(ImageAt, 0, sizeof(short)*6);
    memset(MaxLevel, 0, sizeof(short)*3);
    memset(MinImage, 0, sizeof(void*)*3);
    GameOver = false; // 取消结束游戏标志
    StatusBar1->SimpleText = " 请将左边的金字塔依次移动到右边 !";
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Start3Click(TObject *Sender)
{
    int i;

    TotalLevel = 3; // 设置最大金字塔层数
    NewGame(); // 初始化数据

    for(i=0; i<6; i++) // 遍历各图象控件
      if(i<TotalLevel)
      {
        // 移动控件
        Image[i]->Left = LeftTower - Image[i]->Width / 2;
        Image[i]->Top = TowerBottom - (TotalLevel - i) * 16;
        // 显示控件
        Image[i]->Visible = true;
      }
      else
        // 隐藏控件
        Image[i]->Visible = false;

    MaxLevel[0] = TotalLevel; // 设置左边塔的最大层数
    MinImage[0] = Image[0]; // 设置第一个控件指针
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Start4Click(TObject *Sender)
{
    int i;

    TotalLevel = 4; // 最大层数(4层)
    NewGame(); // 初始化数据

    for(i=0; i<6; i++) // 遍历各图象控件
      if(i<TotalLevel)
      {
        // 移动控件
        Image[i]->Left = LeftTower - Image[i]->Width / 2;
        Image[i]->Top = TowerBottom - (TotalLevel - i) * 16;
        // 显示控件
        Image[i]->Visible = true;
      }
      else
        // 隐藏控件
        Image[i]->Visible = false;

    MaxLevel[0] = TotalLevel;
    MinImage[0] = Image[0];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Start5Click(TObject *Sender)
{
    int i;

    TotalLevel = 5; // 最大层数(5层)
    NewGame(); // 初始化数据

    for(i=0; i<6; i++) // 遍历各图象控件
      if(i<TotalLevel)
      {
        // 移动控件
        Image[i]->Left = LeftTower - Image[i]->Width / 2;
        Image[i]->Top = TowerBottom - (TotalLevel - i) * 16;
        // 显示控件
        Image[i]->Visible = true;
      }
      else
        // 隐藏控件
        Image[i]->Visible = false;

    MaxLevel[0] = TotalLevel;
    MinImage[0] = Image[0];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::Start6Click(TObject *Sender)
{
    int i;

    TotalLevel = 6; // 最大层数(6层)
    NewGame(); // 初始化数据

    for(i=0; i<6; i++) // 遍历各图象控件
      if(i<TotalLevel)
      {
        // 移动控件
        Image[i]->Left = LeftTower - Image[i]->Width / 2;
        Image[i]->Top = TowerBottom - (TotalLevel - i) * 16;
        // 显示控件
        Image[i]->Visible = true;
      }
      else
        // 隐藏控件
        Image[i]->Visible = false;

    MaxLevel[0] = TotalLevel;
    MinImage[0] = Image[0];
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ExitClick(TObject *Sender)
{
    Close(); // 结束程序。
}
//---------------------------------------------------------------------------
void __fastcall TForm1::PaintBox1Paint(TObject *Sender)
{
    // 清除绘图区
    PaintBox1->Canvas->Rectangle(0, 0, PaintBox1->Width, PaintBox1->Height);
    // 保存初始设置
    TColor RawColor = PaintBox1->Canvas->Pen->Color;
    long RawWidth = PaintBox1->Canvas->Pen->Width;
    // 修改设置
    PaintBox1->Canvas->Pen->Width = 3;
    PaintBox1->Canvas->Pen->Color = clBlue;
    // 绘图
    PaintBox1->Canvas->MoveTo(10, TowerBottom); // 画底座
    PaintBox1->Canvas->LineTo(610, TowerBottom);
    PaintBox1->Canvas->MoveTo(LeftTower, TowerTop); // 画左边塔柱
    PaintBox1->Canvas->LineTo(LeftTower, TowerBottom);
    PaintBox1->Canvas->MoveTo(MiddleTower, TowerTop); // 画中间塔柱
    PaintBox1->Canvas->LineTo(MiddleTower, TowerBottom);
    PaintBox1->Canvas->MoveTo(RightTower, TowerTop); // 画右边塔柱
    PaintBox1->Canvas->LineTo(RightTower, TowerBottom);
    // 恢复初始设置
    PaintBox1->Canvas->Pen->Color = RawColor;
    PaintBox1->Canvas->Pen->Width = RawWidth;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageMouseDown(TObject *Sender, TMouseButton Button,
	TShiftState Shift, int X, int Y)
{
    TImage *Image = (TImage*)Sender;

    if(Button == mbLeft && CanDrag(Image->Tag) && !GameOver)
              /* mbRight, mbMiddle */
    { // 按下鼠标左键
        Moving = true;
        CurrentX = X; // 保存鼠标当前位置
        CurrentY = Y;
        OldTop = Image->Top; // 保存空间当前位置
        OldLeft = Image->Left;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageMouseMove(TObject *Sender, TShiftState Shift,
	int X, int Y)
{
    TImage *p = (TImage*)Sender;

    if(Moving)
    { // 当鼠标左键按下时,Moving = true.
        // 拖动图象控件
        p->Left -= CurrentX - X; // 计算鼠标移动量,并移动控件
        p->Top -= CurrentY - Y;
    }
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ImageMouseUp(TObject *Sender, TMouseButton Button,
	TShiftState Shift, int X, int Y)
{
    TImage *p = (TImage*)Sender;

    if(Button == mbLeft && Moving)
    { // 抬起鼠标左键
        Moving = false;
        CanDrop(p); // 判断移动结果
    }
}
//---------------------------------------------------------------------------
bool TForm1::CanDrag(int Number)
{
    if(MinImage[ImageAt[Number]]->Tag < Image[Number]->Tag)
        return(false); // 该控件不是第一个控件
    else
        return(true); // 是第一个控件(在最上面)
}
//---------------------------------------------------------------------------
void TForm1::CanDrop(TImage *P)
{
    int X = P->Left + P->Width /2; // 控件中心(水平)坐标
    short Tower;
    int Width = LeftTower/2;

    // 以下计算控件移动的位置(X坐标)
    Tower = -1;
    if(abs(X - LeftTower)<Width)
        Tower = 0;
    else if(abs(X - MiddleTower)<Width)
        Tower = 1;
    else if(abs(X - RightTower)<Width)
        Tower = 2;

    // 以下判断移动是否合法(该塔中没有更小的层)
    if(MinImage[Tower])
      if(MinImage[Tower]->Tag <= P->Tag)
          // 有更小的层
          Tower = -1;

    if(Tower < 0 )
    { // 移动非法
        P->Top = OldTop;
        P->Left = OldLeft;
        StatusBar1->SimpleText = "移动非法,可能目标塔中已有更小的层 !";
    }
    else if(Tower == 0)
    { // 移动到左边的塔中
        int OldTower = ImageAt[P->Tag];
        MaxLevel[Tower]++;
        P->Top = TowerBottom - MaxLevel[Tower] * 16;
        P->Left = LeftTower/*左边塔的中心*/ - P->Width / 2;
        MinImage[Tower] = P;
        ImageAt[P->Tag] = Tower;

        MaxLevel[OldTower]--;
        MinImage[OldTower] = MinTImage(OldTower);
        StatusBar1->SimpleText = "OK, 移动成功 !";
    }
    else if(Tower == 1)
    { // 移动到中间的塔中
        int OldTower = ImageAt[P->Tag];
        MaxLevel[Tower]++;
        P->Top = TowerBottom - MaxLevel[Tower] * 16;
        P->Left = MiddleTower/*中间塔的中心*/ - P->Width / 2;
        MinImage[Tower] = P;
        ImageAt[P->Tag] = Tower;

        MaxLevel[OldTower]--;
        MinImage[OldTower] = MinTImage(OldTower);
        StatusBar1->SimpleText = "OK, 移动成功 !";
    }
    else if(Tower == 2)
    { // 移动到右边的塔中
        int OldTower = ImageAt[P->Tag];
        MaxLevel[Tower]++;
        P->Top = TowerBottom - MaxLevel[Tower] * 16;
        P->Left = RightTower/*右边塔的中心*/ - P->Width / 2;
        MinImage[Tower] = P;
        ImageAt[P->Tag] = Tower;

        MaxLevel[OldTower]--;
        MinImage[OldTower] = MinTImage(OldTower);
        if(MaxLevel[Tower] == TotalLevel)
        { // 获胜,
            StatusBar1->SimpleText = " 恭喜你成功的完成了游戏 !";
            GameOver = true;
        }
        else
            StatusBar1->SimpleText = "OK, 移动成功 !";
    }
}
//---------------------------------------------------------------------------
// 该函数用于查找指定塔中最上层的控件
TImage* TForm1::MinTImage(int Tower)
{
   int i;
   int k=10;

   for(i=0;i<6;i++)
     if(ImageAt[i] == Tower && k>i)
         k = i;

   if(k>6)
       return(NULL);
   else
       return(Image[k]);
}
//---------------------------------------------------------------------------

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -