做了個拼圖小游戲
uj5u.com熱心網友回復:
unit main;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, FileCtrl, ExtCtrls, Myunit, Spin, strUtils;
type
TForm1 = class(TForm)
FileList1: TFileListBox;
Image1: TImage;
Panel1: TPanel;
procedure FormCreate(Sender: TObject);
procedure FileList1DblClick(Sender: TObject);
procedure FormShow(Sender: TObject);
procedure FormDestroy(Sender: TObject);
procedure FileList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
procedure InitImage(Sender: TObject);
procedure ImgClick(Sender: TObject);
procedure EndOr();
procedure ClickXtime();
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
myImg: array[0..24] of TImage; //最多6*6
nCount: integer; //定義每行的Image個數
ClickOrNot: boolean; //判斷myImg是否被點擊過
xClick, yClick: integer; //記錄被點擊的myImg的位置
xBegin, yBegin: array[0..24] of Integer; //保存初始化各Image的位置
bCheckEndOr: boolean;
implementation
{$R *.dfm}
{表單Creat時,加載圖片,默認是第一個}
procedure TForm1.FormCreate(Sender: TObject);
begin
font := screen.IconFont;
filelist1.Directory := ExtractFileDir(Application.ExeName) + '\Image';
filelist1.ItemIndex := 0;
Image1.Picture.LoadFromFile(filelist1.Directory + '\' +
filelist1.Items[filelist1.Itemindex]);
end;
{雙擊檔案名,加載圖片到Image1中}
procedure TForm1.FileList1DblClick(Sender: TObject);
begin
Image1.Picture.LoadFromFile(filelist1.Directory + '\' +
filelist1.Items[filelist1.Itemindex]);
InitImage(Sender); //初始化圖片,切割
bCheckEndOr := false; //在模擬點擊的時候,不檢查是否終局
ClickXtime; //更換新圖片時,模擬點擊,使圖形隨機
bCheckEndOr := true; //允許檢查是否終局
end;
{生成動態陣列Image}
procedure TForm1.FormShow(Sender: TObject);
var
i, j, m: integer;
begin
m := 0;
for i := 0 to 4 do
for j := 0 to 4 do
begin
myImg[m] := TImage.Create(panel1);
myImg[m].Parent := panel1;
myImg[m].Name := 'MyImg' + its(j + 1) + its(i + 1); //MyImg13這樣的名字
MyImg[m].OnClick := form1.imgclick; //統一定義所有myImg的click事件
m := m + 1;
end;
InitImage(sender); //初始化,切割Image1
ClickXtime; //隨機打亂myImg[]
end;
{釋放myImg}
procedure TForm1.FormDestroy(Sender: TObject);
var
i: integer;
begin
for i := 0 to 24 do
myImg[i].Free;
end;
{初始化Image陣列,將Image1中的圖片切割成25個小塊,賦值給myImg[]陣列}
procedure TForm1.InitImage(Sender: TObject);
var
i, j, m: integer;
nwidth: integer;
begin
nCount := 5;
nwidth := image1.Width div nCount; //myImg的寬、高
m := 0;
for i := 0 to nCount - 1 do
for j := 0 to nCount - 1 do
begin
myImg[m].Visible := true;
myImg[m].Left := i * nwidth + 1; //+1是為了出空白線
myImg[m].Top := j * nwidth + 1;
myImg[m].Width := nwidth;
myImg[m].Height := nwidth;
{呼叫自己撰寫過的復制Image的函式,非常方便}
CopyRectImage1toImage2(image1, myImg[m].Left, myImg[m].Top, myImg[m].Left
+ nwidth,
myImg[m].Top + nwidth, MyImg[m], 1, 1, nwidth + 1, nwidth + 1);
{保存初始化各Image的位置,在檢驗是否拼圖完成時使用,在EndOr()程序中}
xBegin[m] := myImg[m].Left;
yBegin[m] := myImg[m].Top;
m := m + 1;
end;
ClickOrNot := false; //表示myImg沒有被點擊過
end;
{當myImg被點擊時,前后兩次被點擊的myImg互換位置}
procedure TForm1.ImgClick(Sender: TObject);
var
s: string;
x, y: integer; //后點擊的myImg的left及top值
nleft, ntop: integer; //用于交換位置時使用的臨時存盤變數
begin
s := rightstr((sender as TImage).Name, 2); //取被點擊myImg的坐標,字符
if ClickOrNot = false then //奇數次點擊,將其設定為浮動效果
begin
(sender as TImage).Left := (sender as TImage).Left - 2;
(sender as TImage).Top := (sender as TImage).Top - 2;
{保存初次點擊的myImg的坐標}
xClick := sti(leftstr(s, 1));
yclick := sti(rightstr(s, 1));
ClickOrNot := true; //表明初次點擊已完成,下次再點擊該互換位置
end
else //為偶數次點擊,互換位置
begin
{偶數次點擊myImg的坐標}
x := sti(leftstr(s, 1));
y := sti(rightstr(s, 1));
{兩個myImg互換位置}
with panel1 do
begin
nleft := TImage(FindComponent('myImg' + its(xclick) + its(yclick))).Left;
TImage(FindComponent('myImg' + its(xclick) + its(yclick))).left :=
TImage(FindComponent('myImg' + its(x) + its(y))).left;
TImage(FindComponent('myImg' + its(x) + its(y))).left := nleft + 2;
ntop := TImage(FindComponent('myImg' + its(xclick) + its(yclick))).top;
TImage(FindComponent('myImg' + its(xclick) + its(yclick))).top :=
TImage(FindComponent('myImg' + its(x) + its(y))).top;
TImage(FindComponent('myImg' + its(x) + its(y))).top := ntop + 2;
end;
ClickOrNot := false; //偶數次點擊執行完畢,表明下次該執行奇數次點擊,即浮動效果
end;
// if bCheckEndOr = true then //當初始化之后的點擊,才啟用檢查是否終局
EndOr; //每次點擊結束,判斷下是否終局
end;
{判斷是否結束的程序}
procedure TForm1.EndOr;
var
i, j, m: integer;
bEndor: boolean; //判斷是否有不相符的數值
x, y: integer;
begin
bEndor := true; //先設為True,后面只要有一個不相符,即改為False
m := 0;
for i := 0 to 4 do
for j := 0 to 4 do
begin
x := TImage(panel1.FindComponent('myImg' + its(i + 1) + its(j + 1))).Left;
y := TImage(panel1.FindComponent('myImg' + its(i + 1) + its(j + 1))).top;
{只要有一個Image的left與top與初始化的不相符,即認定未完成。}
if xbegin[m] <> y then
bEndor := false;
if ybegin[m] <> x then
bEndor := false;
m := m + 1;
end;
if bEndor = true then
sm('游戲完成,您成功了!');
end;
{模擬點擊100次,初始化隨機圖片,這個方法很實用,代碼簡單}
procedure TForm1.ClickXtime;
var
i, x: integer;
begin
for i := 0 to 199 do //點擊100次,要偶數
begin
randomize;
x := random(25); //Random函式取值范圍:0<=x<25
{模擬點擊100次,()中寫Sender出錯,直接寫控制元件名成功}
myImg[x].OnClick(myImg[x]);
end;
end;
{F5,重繪檔案名串列}
procedure TForm1.FileList1KeyDown(Sender: TObject; var Key: Word;
Shift: TShiftState);
begin
if key = vk_f5 then
filelist1.Update;
end;
end.
uj5u.com熱心網友回復:
還在用D7,先給個贊!拼圖游戲比較好的體驗應該是把右邊切割后的圖塊拉到左邊正確的位置,這種體驗來源于我們生活中的拼圖方式。
uj5u.com熱心網友回復:
uj5u.com熱心網友回復:
偶不是程式員,自己玩兒的,所以D的升級就沒啥關系了并且人老了,不愿意學習新東西,就這個有空就玩玩吧
拖拽還不會用,本來想在右面弄拖拽,以后再說
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/76084.html
標籤:語言基礎/算法/系統設計
