📄 c15_3f.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 + -