delphi枚举进程代码
Delphi编程获取系统当前进程
Delphi编程获取系统当前进程、窗口句柄、文件属性以及程序运行状态Delphi编程获取系统当前进程、窗口句柄、文件属性以及程序运行状态.uses TLHelp32,PsAPI;(1)显示进程列表:procedure TForm1.Button2Click(Sender: TObject);var lppe: TProcessEntry32;found : boolean;Hand : THandle;P:DWORD;s:string;beginListBox1.Items.Clear ;Hand := CreateToolhelp32Snapshot(TH32CS_SNAPALL,0);found := Process32First(Hand,lppe);while found dobegins := StrPas(lppe.szExeFile);if lppe.th32ProcessID>0 thenp := lppe.th32ProcessIDelsep := 0;ListBox1.Items.AddObject(s,pointer(p));//列出所有进程。
found := Process32Next(Hand,lppe);end;end;(2)杀死某进程:procedure TForm1.Button3Click(Sender: TObject);var lppe: TProcessEntry32;found : boolean;Hand : THandle;P:DWORD;sExeFile,sSelect:string;killed:boolean;beginp :=DWORD(ListBox1.Items.Objects[ListBox1.itemindex]);if P<>0 thenbeginkilled := TerminateProcess(OpenProcess(PROCESS_TERMINA TE,False,P),$FFFFFFFF);if not killed thenmessagebox(self.handle,pchar(sExeFile+'无法杀死!'),'提示',MB_OK or MB_ICONW ARNING) elseListBox1.Items.Delete(ListBox1.ItemIndex);end;end;(3)取得某进程EXE路径:procedure TForm1.Button8Click(Sender: TObject); //uses PSAPI;varh:THandle; fileName:string; iLen:integer; hMod:HMODULE;cbNeeded,p:DWORD;beginp :=DWORD(ListBox1.Items.Objects[ListBox1.itemindex]);h := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为进程IDif h > 0 thenbeginif EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) thenbeginSetLength(fileName, MAX_PATH);iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PA TH);if iLen <> 0 thenbeginSetLength(fileName, StrLen(PCHAR(fileName)));ShowMessage(fileName);end;end;CloseHandle(h);end;end;(4)取得窗口列表:beginListBox1.Items.Clear ;EnumWindows(@EnumWindowsProc, 0);end;(5)杀死窗口进程:procedure TForm1.Button6Click(Sender: TObject);varH:THandle;P:DWORD;s:string;killed:boolean;begins := ListBox1.Items[ListBox1.ItemIndex];H:=FindWindow(nil,pchar(s));if H<>0 thenbeginGetWindowThreadProcessId(H,@P);if P<>0 thenkilled:=TerminateProcess(OpenProcess(PROCESS_TERMINA TE,False,P),$FFFFFFFF); if not killed thenmessagebox(self.handle,pchar(s+'无法杀死!'),'提示',MB_OK or MB_ICONW ARNING) elseListBox1.Items.Delete(ListBox1.ItemIndex);end;end;(6)取得窗口进程路径:procedure TForm1.Button9Click(Sender: TObject);varH:THandle; P,cbNeeded: DWORD; s,fileName:string;iLen:integer; hMod:HMODULE;begins := ListBox1.Items[ListBox1.ItemIndex];H:=FindWindow(nil,pchar(s));if H<>0 thenbeginGetWindowThreadProcessId(H,@P);if P<>0 thenbeginh := OpenProcess(PROCESS_ALL_ACCESS, false, p); //p 为进程IDif h > 0 thenbeginif EnumProcessModules( h, @hMod, sizeof(hMod), cbNeeded) thenbeginSetLength(fileName, MAX_PATH);iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);if iLen <> 0 thenbeginSetLength(fileName, StrLen(PCHAR(fileName)));ShowMessage(fileName);end;end;CloseHandle(h);end;end;end;end;(7)文件属性:procedure TForm1.Button1Click(Sender: TObject);varSR: TSearchRec;V1, V2, V3, V4: integer ;constdtFmt:string = 'YYYY-MM-DD HH:NN:SS';begin// ============== 方法一==================== //if FindFirst(sFileName, faAnyFile, SR) = 0 thenbeginEdit1.Text := intToStr(SR.Attr); //文件属性Edit2.Text := intToStr(SR.Size); //文件大小Edit3.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftCreationTime)); //创建时间Edit4.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastWriteTime)); //最后修改时间Edit5.Text := FormatDateTime(dtFmt,CovFileDate(SR.FindData.ftLastAccessTime)); //最后访问时间if SR.Attr and faHidden <> 0 thenFileSetAttr(sFileName, SR.Attr-faHidden);FindClose(SR);end;if GetFileVersion(sFileName,V1, V2, V3, V4) thenEdit7.Text := intToStr(v1)+'.'+intToStr(v2)+'.'+intToStr(v3)+'.'+intToStr(v4);// ============== 方法二==================== //{varAttrs: Word;f: file of Byte; // 文件大小必须要定义为" file of byte" ,这样才能取出bytessize: Longint;//文件属性Attrs := FileGetAttr(sFileName);Edit1.Text := intToStr(Attrs);//文件大小AssignFile(f, OpenDialog1.FileName);Reset(f);tryAssignFile(f, sFileName);Reset(f);size := FileSize(f);Edit2.Text := intToStr(size);finallyCloseFile(f);end;}end;(8)判断程序是否在运行:procedure TForm1.Button5Click(Sender: TObject);var PrevInstHandle:Thandle;AppTitle:pchar;beginAppTitle := pchar('test');PrevInstHandle := FindWindow(nil, AppTitle);if PrevInstHandle <> 0 then beginif IsIconic(PrevInstHandle) thenShowWindow(PrevInstHandle, SW_RESTORE)elseBringWindowToTop(PrevInstHandle);SetForegroundWindow(PrevInstHandle);end;end;。
delphi 枚举类型num用法
在Delphi编程语言中,枚举类型(enumeration type)是一种非常有用的数据类型,它可以帮助程序员更好地组织和管理代码。
而在枚举类型中使用num的用法则是其中一个重要的方面。
本文将深入探讨delphi枚举类型中num的用法,并结合实际例子进行详细解析。
1. 什么是Delphi枚举类型枚举类型是一种由一组命名的常数组成的数据类型。
在Delphi中,可以使用关键字"enum"来定义一个枚举类型,然后在其中列出所需的常数。
例如:enum Season {Spring, Summer, Autumn, Winter};2. Delphi枚举类型中num的用法在Delphi的枚举类型中,每个常数都会被自动赋予一个整数值,从0开始递增。
而使用num,则可以根据需要手动指定常数的整数值。
这种用法可以在需要特定取值的情况下非常有用,例如:enum Weekday {Monday=1, Tuesday, Wednesday, Thursday, Friday};3. 实际应用示例在实际应用中,可以使用枚举类型来更清晰地表达代码的意图。
在一个表示颜色的枚举类型中,使用num可以给不同的颜色赋予对应的RGB值,从而方便后续代码的处理。
4. 个人观点与理解在我看来,Delphi枚举类型中num的用法可以帮助我们更好地控制常数的取值,从而使代码更加清晰和易于维护。
当需要对特定常数进行精确控制时,通过num可以轻松实现这一目的。
总结通过本文的介绍,我们对Delphi枚举类型中num的用法有了更深入的了解。
在实际开发中,合理使用枚举类型可以提高代码的可读性和可维护性。
特别是在需要精确控制常数取值时,使用num可以帮助我们轻松实现这一目的。
希望本文对你有所启发,欢迎交流讨论!Delphi编程语言中的枚举类型在实际开发中具有非常重要的作用,可以帮助程序员更好地组织和管理代码。
在枚举类型中使用num的用法则是其中一个重要的方面,可以帮助我们更好地控制常数的取值,从而使代码更加清晰和易于维护。
Delphi基本数据类型---枚举、子界、集合、数组
Delphi基本数据类型---枚举、⼦界、集合、数组参考:参考:1.根据枚举定义集合typeTMyColor = (mcBlue, mcRed); //定义了⼀个枚举类型TMyColorTMyColorSet = set of TMyColor; //定义了⼀个基于枚举类型的集合TMyColorSet2.根据枚举定义数组typeTMyEnum = (red, green, blue); //定义枚举procedure TForm1.ButtonClick(Sender : TObject);constColorArr : array[TMyEnum] of string = ('红', '绿', '蓝'); //定义数据varmyEnum : TMyEnum; //定义枚举类型beginfor myEnum := Low(ColorArr) to High(ColorArr) dobeginShowMessage(ColorArr[myEnum]);end;end. 注意其中根据枚举定义相关的数组的语法 注意其中使⽤枚举进⾏循环控制的⽅法3.枚举类型的相关知识,参考4.⼦界类型 如果我们定义⼀个变量为Integer型,那么它的取值范围⼀般为-32768~32767.⽽事实上,每个程序所⽤到的变量的值都有⼀个确定的范围。
例如,⼈的年龄⼀般为1~120岁,⼀年中的⽉数为1~12,⼀个⽉中的天数为1~31天等等 如果能在程序中对所⽤的变量的值域做具体规定,就便于检查出那些不合法的数据,这样就能更好的保证程序运⾏的正确性且在⼀定程度上节省了内存空间 ⼦界类型就能很好的解决上⾯的问题。
此外,在数组的定义中,常⽤到⼦界类型,以规定数组下标的范围 1)定义格式: type ⼦界类型标识符 = 常量1..常量2 //其中常量1称为⼦界的下界,常量2称为⼦界的上界 上界和下界必须是同⼀顺序类型(该类型称为⼦界类型的基类型),且上界的序号必须⼤于下界序号,例如typeage = 1..100;letter = 'a'..'z'; 可以直接在变量说明中定义⼦界类型,如typeletter = 'a'..'z';varch1, ch2 : letter; 可以合并成varch1, ch2 : 'a'...'z'; 2)⼦界类型数据的运算规则 凡是可以使⽤基类型的运算规则同样适⽤于该类型的⼦界类型 例如,可以使⽤整型变量的地⽅,也可以使⽤以整型为基类型的⼦界类型数据 对基类型的运算规则同样适⽤于该类型的⼦界类型 例如,div,mod要求参数运算的数据为整型,因⽽也可以为整型的任何⼦界类型数据 基类型相同的不同⼦界类型可以进⾏混个运算,⽐如有以下说明varx : 1..100;y : 1..500;z : 1..1000;a : integer; 则下⾯的语句是合法的a:=Sqr(x) + y + z;z := x + y; 下⾯的语句:y := x + z + a; 当x+z+a的值在1~500范围内也就是(y所属的⼦界类型的范围)就是合法的,否则就会出错 3)⼦界类型的应⽤举例 例1,使⽤⼦界类型情况语句,当输⼊⽉、⽇、年(10 30 1986),输出30 oct 1986varmonth : 1..12;day : 1..31;year : 1900..2003;beginwrite('Enter date(mm dd yyyy):');readln(month, day, year);write(day);case month of1:write('Jan' :5);2:write('Feb' :5);3:write('Mar':5);4:write('Apr':5);5:write('May':5);6:write('Jun':5);7:write('Jul':5);8:write('Aug':5);9:write('Sep':5);10:write('Oct':5);11:write('Nov':5);12:write('Dec':5);end;writeln(year:7);end. 例2,将⼀个四位的⼗六进制数转换成⼗进制varch : char;n : 1..4;d1, d2, d3, d4, t : 0..15;s : real;beginwrite('The hex number is');for n:=1 to 4 dobegin {将四位的⼗六进制数分四次作为字符读⼊}read(ch);write(ch);{分别转换为⼗进制的数d1, d2, d3, d4}if (ch >= '0') and (ch <= '9') thent := ord(ch) - 48;if (ch >= 'a') and (ch <= 'z') thent:=ord(ch)-87;if (ch >= 'A') and (ch <= 'Z') thent:=ord(ch)-55;case n of1 : d1 := t;2 : d2 := t;3 : d3 := t;4 : d4 := t;end;end;s := d1*16*16*16 + d2*16*16 + d3*16 + d4;writeln('dec:', s);end.。
delphi高级数据类型:枚举、子界和集合讲稿
第6章枚举、子界与集合类型教学目的及要求:理解并掌握枚举类型的概念、定义与使用方法理解并掌握子界类型的概念、定义与使用方法理解并掌握集合类型的概念、定义与使用方法熟练应用枚举类型、子界类型、集合类型解决实际问题在delphi顺序类型中我们知道整型、字符型、布尔型是标准数据类型,而枚举型、子界型不是标准数据类型,这就是我们今天要学习的内容:Delphi的高级数据类型。
是Object pascal语言为了满足实际的需要,允许用户自定义的数据类型。
本节我们将首先学习delphi中如何定义数据类型,也就是delphi的数据类型定义语法格式及要求。
然后分别介绍枚举、子界类型和集合类型定义、变量声明及运用。
6.1 类型定义语句Object Pascal高级数据类型在使用之前必须首先使用类型定义语句进行定义。
经过定义后的高级数据类型就可在程序代码中使用。
其用法与常用的整型、字符串型用法相同。
类型定义语句的语法格式为:Type<标识符1>=<类型1>;<标识符2>=<类型2>;…<标识符n>=<类型n>;说明:1.保留字type 表示类型定义段开始。
2.<标识符>是用户为自定义数据类型取的名称。
说明:在上例中,tform1是用户自定义的类型名称,它是一个tform类型,在tform1中包含一个button1对象,该对象是一个tbutton类型,同时还包含了一个事件过程button1click.TypeA=integer;B=real;C=char;D=shring;6.2 枚举类型在处理实际问题过程中常用到的数据取值可能总是有限的几个值,例如学生成绩等级有优秀、良好、及格、不及格;处理这一类数据时可以用数值或字符串来表示,比如用“1”表示优秀,“2”表示良好。
利用数值表示此类数据不直观,容易出错,利用字符串表示不方便处理,占用内存较多。
Delphi枚举所有进程
Delphi枚举所有进程通过进程快照枚举所有进程,关于进程快照,在Delphi5开发⼈员指南中有说明,当然也可以百度⼀下⽤法。
使⽤进程快照CreateToolhelp32Snapshot,必须uses TlHelp32单元。
从快照中得到的进程ID,可以获得进程的很多信息,这⾥不多说,⽹上有很多资料,具体需要什么可以百度查⼀下。
以这⾥记录⼀下,⽅便以后查找unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls;typeTForm1 = class(TForm)Memo1: TMemo;Btn1: TButton;procedure Btn1Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;implementation{$R *.dfm}usesTlHelp32;// tagPROCESSENTRY32 = packed record// dwSize: DWORD;// cntUsage: DWORD;// th32ProcessID: DWORD; // 进程ID// th32DefaultHeapID: DWORD;// th32ModuleID: DWORD; // associated exe// cntThreads: DWORD;// th32ParentProcessID: DWORD; // this process's parent process// pcPriClassBase: Longint; // Base priority of process's threads// dwFlags: DWORD;// szExeFile: array[0..MAX_PATH - 1] of Char;// Path// end;// TProcessEntry32 = tagPROCESSENTRY32;procedure TForm1.Btn1Click(Sender: TObject);varhSnap: THandle;vPE: TProcessEntry32;sTmp: AnsiString;beginMemo1.Lines.Clear;hSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);vPE.dwSize := SizeOf(TProcessEntry32);if Process32First(hSnap, vPE) then// Process32First找到的肯定是 [System Process] 不管begin//如果 Process32First 函数执⾏成功后使⽤ Process32Next 读取每个进程的信息while Process32Next(hSnap, vPE) dobeginsTmp := PAnsiChar(@vPE.szExeFile[0]);Memo1.Lines.Add(sTmp);end;end;CloseHandle(hSnap);end;end.效果图如下:by lin 2016-11-13。
delphi取得任意程序的命令行
delphi取得任意程序的命令行program GetCommandLineExDemo;uses Windows;constSystemHandleInformation = 16;ProcessBasicInformation = 0;STATUS_SUCCESS = cardinal($00000000);SE_DEBUG_PRIVILEGE =20;STATUS_ACCESS_DENIED = cardinal($C0000022);STATUS_INFO_LENGTH_MISMATCH = cardinal($C0000004);SEVERITY_ERROR = cardinal($C0000000);TH32CS_SNAPPROCESS = $00000002; // 模块列表快照JOB_OBJECT_ALL_ACCESS = $1f001f;typeTPROCESSENTRY32 = recorddwSize: DWORD;cntUsage: DWORD;th32ProcessID: DWORD; // this processth32DefaultHeapID: DWORD;th32ModuleID: DWORD; // associated execntThreads: DWORD;th32ParentProcessID: DWORD; // this process's parent processpcPriClassBase: Longint; // Base priority of process's threads dwFlags: DWORD;szExeFile: array[0..MAX_PATH - 1] of Char;// Pathend;typeUSHORT = Word;UNICODE_STRING = packed RecordLength : USHORT;MaximumLength: USHORT;Buffer : PWideString;end;RTL_USER_PROCESS_PARAMETERS = packed recordReserved1 : array[0..15] of Byte;Reserved2 : array[0..9] of Pointer;ImagePathName: UNICODE_STRING;CommandLine : UNICODE_STRING;end;PRTL_USER_PROCESS_PARAMETERS = ^RTL_USER_PROCESS_PARAMETERS;PEB = packed recordReserved1 : array[0..1] of Byte;BeingDebugged: ByteBool;Reserved2 : Byte;Reserved3 : array[0..1] of Pointer;Ldr : Pointer;ProcessParameters: PRTL_USER_PROCESS_PARAMETERS;Reserved4 : array[0..103]of Byte;Reserved5 : array[0..51]of Pointer;end;PPEB = ^PEB;PROCESS_BASIC_INFORMATION = packed recordExitStatus : DWORD;PebBaseAddress: PPEB;AffinityMask : DWORD;BasePriority : DWORD;uUniqueProcessId: ULong;uInheritedFromUniqueProcessId: ULong;end;TProcessBasicInformation = PROCESS_BASIC_INFORMATION;function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD) : THandle ; stdcall; external 'kernel32.dll' name 'CreateToolhelp32Snapshot';function Process32First(hSnapshot: THandle; var lppe: TProcessEntry32): BOOL ; stdcall; external 'kernel32.dll' name 'Process32First';function Process32Next(hSnapshot: THandle; var lpme: TPROCESSENTRY32): BOOL ; stdcall; external 'kernel32.dll' name 'Process32Next';function NtQueryInformationProcess(ProcessHandle: THandle;ProcessInformationClass: Byte;ProcessInformation: Pointer;ProcessInformationLength: ULONG;ReturnLength: PULONG): DWORD; stdcall; external 'ntdll.dll';function EnablePrivilege(const PrivName: string; const Enable: Boolean = true): Boolean;varhToken: THandle;PrivId: Int64;tkp, PreviousState: TTokenPrivileges;ReturnLength: DWORD;beginResult:=False;if not LookupPrivilegeValue(nil,PChar(PrivName),PrivId) then exit;if not OpenProcessT oken(GetCurrentProcess,TOKEN_ADJUST_PRIVILE GES or TOKEN_QUERY,hT oken) then exit;tryReturnLength:=0;tkp.PrivilegeCount:=1;tkp.Privileges[0].Luid:=PrivId;if Enable then tkp.Privileges[0].Attributes:=SE_PRIVILEGE_ENABLEDelse tkp.Privileges[0].Attributes:=0;Result:=AdjustTokenPrivileges(hToken,false,tkp,SizeOf(TToke nPrivileges),PreviousState,ReturnLength);finallyCloseHandle(hT oken);end;end;function GetProcessCmdLine(PID: Cardinal): string;constSE_DEBUG_NAME = 'SeDebugPrivilege';ProcessBasicInformation = 0;varh : THandle;pbi : TProcessBasicInformation;ret : Cardinal;r : Cardinal;ws : WideString;aPEB : PEB;str:string;i:integer;ProcPar: RTL_USER_PROCESS_PARAMETERS;beginResult:='';str:='';if PID = 0 then PID:=GetCurrentProcessID;tryh:=OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,PID);if h=0 then exit;tryret:=NtQueryInformationProcess(h,ProcessBasicInformation ,@PBI,SizeOf(PBI),@r);if ret=0 thenrepeatif (not ReadProcessMemory(h,pbi.PebBaseAddress,@aPEB,SizeOf(aPEB ),r)) or (r<>SizeOf(aPEB)) then break;if (notReadProcessMemory(h,aPEB.ProcessParameters,@ProcPar,SizeO f(ProcPar),r)) or (r<>SizeOf(ProcPar)) then break;SetLength(ws,mandLine.Length div 2);if (not ReadProcessMemory(h,mandLine.Buffer,PWideChar (ws),mandLine.Length,r)) or (r<>mandLine.Length) then break;Result:=ws;until True;finallyCloseHandle(h);end;finallyend;end;function Trim(const S: string): string;varI, L: Integer;beginL := Length(S);I := 1;while (I <= L) and (S[I] <= ' ') doInc(I);if I > L thenResult := ''elsebeginwhile S[L] <= ' ' doDec(L);Result := Copy(S, I, L - I + 1);end;end;function UpperCase(const S: string): string;varCh: Char;L: Integer;Source, Dest: PChar;beginL := Length(S);SetLength(Result, L);Source := Pointer(S);Dest := Pointer(Result);while L <> 0 dobeginCh := Source^;if (Ch >= 'a') and (Ch <= 'z') thenDec(Ch, 32);Dest^ := Ch;Inc(Source);Inc(Dest);Dec(L);end;end;Function findprocess(TheProcName:String):DWORD; varisOK:Boolean;ProcessHandle:Thandle;ProcessStruct:TProcessEntry32;beginProcessHandle:=createtoolhelp32snapshot(Th32cs_snappro cess,0);processStruct.dwSize:=sizeof(ProcessStruct);isOK:=process32first(ProcessHandle,ProcessStruct);Result:=0;while isOK dobeginifTrim(UpperCase(TheProcName))=Trim(UpperCase(ProcessStruct. szExeFile)) thenbeginResult:=ProcessStruct.th32ProcessID;CloseHandle(ProcessHandle);exit;end;isOK:=process32next(ProcessHandle,ProcessStruct);end;CloseHandle(ProcessHandle);end;beginmessagebox(0,pchar(GetProcessCmdLine(findprocess('nod32.exe'))), 'aa', 0);end.。
delphi 类型定义
在Delphi 中,你可以使用`type` 关键字来定义新的数据类型。
这可以是在原有类型的基础上定义更复杂的数据类型,或者创建自定义的数据类型。
以下是一些常见的类型定义示例:1. 记录类型(Record):```delphitypeTMyRecord = recordX, Y: Integer;procedure SetX(Value: Integer);procedure SetY(Value: Integer);end;procedure TMyRecord.SetX(Value: Integer);beginX := Value;end;procedure TMyRecord.SetY(Value: Integer);beginY := Value;end;```在这个例子中,我们定义了一个名为`TMyRecord` 的记录类型。
这个记录包含了两个整型字段`X` 和`Y`,以及两个方法`SetX` 和`SetY` 用于设置这两个字段的值。
2. 枚举类型(Enum):```delphitypeTMyEnum = (Red, Green, Blue);```在这个例子中,我们定义了一个名为`TMyEnum` 的枚举类型。
这个枚举包含了三个可能的值:`Red`,`Green` 和`Blue`。
3. 集合类型(Set):```delphitypeTMySet = set of Integer;```在这个例子中,我们定义了一个名为`TMySet` 的集合类型。
这个集合可以包含任何整型数值,且每个数值只能出现一次。
4. 指针类型:```delphitypePMyStruct = ^TMyStruct;TMyStruct = recordX, Y: Integer;end;```在这个例子中,我们定义了一个指向`TMyStruct` 类型的指针类型`PMyStruct`。
注意,这个指针类型定义在记录类型`TMyStruct` 被定义之后。
delphi type 枚举用法
Delphi中的类型枚举用法探究1. 介绍在Delphi编程语言中,类型枚举是一种十分有用的数据类型,它允许程序员定义一个新的数据类型,该数据类型只能取特定的几个值。
在本文中,我们将深入探讨Delphi中类型枚举的用法,包括定义、使用和个人观点。
2. 定义类型枚举允许程序员为一组相关的常量赋予有意义的名字,以便在程序中更加直观地使用。
在Delphi中,类型枚举的定义非常简单,只需要使用关键字`type`,并在后面跟上`enum`关键字即可。
比如:```pascaltypeTSeason = (Spring, Summer, Autumn, Winter);```上述代码定义了一个名为TSeason的枚举类型,它包含了4个值:Spring、Summer、Autumn、Winter。
3. 使用类型枚举在Delphi中的使用也非常方便。
可以通过声明一个变量,并将枚举类型的值赋给该变量来使用。
例如:```pascalvarcurrentSeason: TSeason;begincurrentSeason := Summer;```在上述代码中,我们声明了一个名为currentSeason的变量,并将TSeason类型的枚举值Summer赋给它。
4. 深入探讨在实际应用中,类型枚举经常被用于管理程序中的状态和选项。
一个简单的开关状态可以使用类型枚举表示:```pascaltypeTSwitchState = (Off, On);```另外,类型枚举还可以与条件语句和循环结合使用,来简化程序逻辑和提高可读性。
可以使用`case`语句来处理枚举类型的值:```pascalcase currentSeason ofSpring: DoSomething();Summer: DoSomethingElse();Autumn: DoAnotherThing();Winter: DoSomethingDifferent();end;```5. 个人观点对我而言,类型枚举是Delphi中非常方便和实用的特性之一。
delphi 遍历 枚举类型
Delphi是一种使用Object Pascal编程语言的集成开发环境(IDE),它提供了强大的功能和工具,可帮助开发人员快速轻松地创建Windows应用程序、网络应用程序和数据库应用程序。
在Delphi中,枚举类型是一种非常有用的数据类型,它允许开发人员定义一组相关的命名常量,并将它们组织在一起,以便更好地组织和管理代码。
在本文中,我们将探讨如何在Delphi中遍历枚举类型,以及如何利用枚举类型来简化代码编写和提高程序的可读性和可维护性。
一、枚举类型的定义和用法在Delphi中,枚举类型通过使用关键字“enum”来定义,其基本语法如下所示:typeTEnumType = (Value1, Value2, Value3, ...);其中,TEnumType为枚举类型的名称,而Value1、Value2、Value3等为枚举类型的值,它们被定义为枚举类型TEnumType的成员。
在实际应用中,枚举类型可以用来表示一组相关的状态或选项,例如颜色、方向、性别等。
枚举类型的具体用法如下所示:varEnumValue: TEnumType;beginEnumValue := Value1;// 其他代码end;通过以上代码,可以看出,枚举类型的值可以被赋给对应的枚举变量,并且可以进行比较和操作。
二、遍历枚举类型的常规方法在Delphi中,遍历枚举类型的常规方法是通过使用for循环结构和枚举类型的范围来实现。
具体代码如下所示:varEnumValue: TEnumType;beginfor EnumValue := Low(TEnumType) to High(TEnumType) dobegin// 执行相关操作end;end;通过以上代码,可以看出,我们使用了Low和High函数来获取枚举类型TEnumType的最小值和最大值,然后通过for循环依次遍历枚举类型的所有值,从而实现了枚举类型的遍历。
三、遍历枚举类型的新方法除了常规方法外,Delphi还提供了一种更加简洁和优雅的遍历枚举类型的方法,即通过使用显式类型转换和Case语句来实现。
中国象棋Delphi版本程序代码
unit Unit1;interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, Menus, ExtCtrls, StdCtrls, Buttons,Unit2,Unit3;typeTForm1 = class(TForm)PaintBox1: TPaintBox;MainMenu1: TMainMenu;Game1: TMenuItem;NewGame1: TMenuItem;Eixt1: TMenuItem;Label1: TLabel;Label2: TLabel;Label3: TLabel;BitBtn1: TBitBtn;BitBtn3: TBitBtn;Label4: TLabel;s1: TMenuItem;N1: TMenuItem;N2: TMenuItem;N3: TMenuItem;N4: TMenuItem;N5: TMenuItem;N6: TMenuItem;N7: TMenuItem;N8: TMenuItem;GroupBox1: TGroupBox;PaintBox2: TPaintBox;BitBtn2: TBitBtn;BitBtn4: TBitBtn;BitBtn5: TBitBtn;BitBtn6: TBitBtn;GroupBox2: TGroupBox;Memo1: TMemo;BitBtn7: TBitBtn;N9: TMenuItem;N10: TMenuItem;N11: TMenuItem;N12: TMenuItem;N13: TMenuItem;RadioGroup1: TRadioGroup;RadioGroup2: TRadioGroup;procedure FormCreate(Sender: TObject);procedure PaintBox1Paint(Sender: TObject);procedure NewGame1Click(Sender: TObject);procedure Eixt1Click(Sender: TObject);procedure CrossPaint(x,y,i,j:integer); //自定义画兵格过程procedure PaintBox1MouseDown(Sender: TObject; Button: TMouseButton;Shift: TShiftState; X, Y: Integer);procedure FindDrop(NowR,NowC:integer); //扫描可以走棋的点过程procedure PaintCMoveDrop(); //画出可走点过程procedure WhoWin(); //判断输赢过程procedure IsNextWin();//判断是否将军procedure RemHistory();//走棋记录procedure RepentChess(n:integer);procedure FindAGoodMove(); //寻找一个优秀的走法procedure AddPoint(row,column:integer);//加入一个相关点function Eveluate(nSide:integer):integer;//估值函数function Eveluate1(nSide:integer):integer;//测试估值函数function GetRelatePiece(row,column:integer):integer;//枚举一个位置上棋子所有相关的点function GetBingValue(row,column:integer):integer;//为兵返回附加值//创建可能的走法 nPly记录扫描的层数,nSide记录到那边走棋 0为红方,1为黑方 function CreatePossibleMove(nPly,nSide:integer):integer;function MakeMove(depth,n:integer):integer;//猜想过程中生产一个新局面procedure UnMakeMove(depth,n,nChessID:integer); //猜想过程中根据走法恢复一个棋盘function IsGameOver(depth:integer):integer;//猜想过程中判断给定局面是否结束 function AddMove(FormR,FormC,ToR,ToC,nPly:integer):integer;//在nMoveList中插入一个走法function NegaMax(depth:integer):integer; //深度优先搜索负极大技校function Alpha_Beta(depth,alpha,beta:integer):integer;//Alpha-Beta搜索算法 function ChessMoveLaw(NowR,NowC,ToR,ToC,nChessID:integer):boolean; //走棋规则函数function ChessMoveLawPos(NowR,NowC,ToR,ToC,nChessID:integer):boolean; //猜想过程走棋规则函数function CanTouch(NowR,NowC,ToR,ToC,nChessID:integer):boolean;//判断能不能到达目标点function ChessPutLaw(NowR,NowC,ToR,ToC:integer):boolean; //摆起规则函数function ChessMove(NowR,NowC,ToR,ToC:integer):boolean; //走棋函数function AIChessMove(NowR,NowC,ToR,ToC:integer):boolean; //电脑走棋procedure BitBtn1Click(Sender: TObject);procedure FormPaint(Sender: TObject);procedure BitBtn3Click(Sender: TObject);procedure N3Click(Sender: TObject);procedure N2Click(Sender: TObject);procedure N6Click(Sender: TObject);procedure N7Click(Sender: TObject);procedure PaintBox2Paint(Sender: TObject);procedure N8Click(Sender: TObject);procedure PaintBox2MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);procedure BitBtn5Click(Sender: TObject);procedure BitBtn4Click(Sender: TObject);procedure BitBtn2Click(Sender: TObject);procedure BitBtn6Click(Sender: TObject);procedure BitBtn7Click(Sender: TObject);procedure N11Click(Sender: TObject);procedure N12Click(Sender: TObject);procedure N13Click(Sender: TObject);private{ Private declarations }public{ Public declarations }end;varForm1: TForm1;//棋盘格子单位大小mBit:integer;//棋子数组:所有棋子的数值mChess: array[1..14] of string =('车','马','相','士','帅','炮','兵','車','馬','象','仕','将','炮','卒');//===============================棋子价值==============================// //棋子的基础价值m_BaseValue: array[1..14] of integer=(500,350,250,250,10000,370,100,500,350,250,250,10000,370,100);//棋子灵活度基础价值m_Flexible:array[1..14] of integer=(6,12,1,1,0,6,15,6,12,1,1,0,6,15);//每一个位置上的棋子的灵活性即可走步数m_FlexibleNum:array[1..10,1..9]of integer;//每一个位置被威胁的信息m_AttackNum:array[1..10,1..9]of integer;//每一个位置被保护的信息m_GuardNum:array[1..10,1..9]of integer;//每一个棋子是总价值m_ChessValue:array[1..10,1..9]of integer;//红兵附加值矩阵mBing:array[1..10,1..9]of integer=((0,0,0,0,0,0,0,0,0),(90,90,110,120,120,120,110,90,90),(90,90,110,120,120,120,110,90,90),(70,90,110,110,110,110,110,90,70),(70,70,70,70,70,70,70,70,70),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0));//黑卒附加值矩阵mZhuzi:array[1..10,1..9]of integer=((0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(0,0,0,0,0,0,0,0,0),(70,70,70,70,70,70,70,70,70),(70,90,110,110,110,110,110,90,70),(90,90,110,120,120,120,110,90,90),(90,90,110,120,120,120,110,90,90),(0,0,0,0,0,0,0,0,0));//===============================棋子价值==============================////棋盘两边的数表NumWord1:array[1..9] of string =('1','2','3','4','5','6','7','8','9');NumWord2:array[1..10] of string=('一','二','三','四','五','六','七','八','九','十');NumWord3:array[1..14] of integer=//摆子时盒子里剩余的棋子数量(2,2,2,2,1,2,5,2,2,2,2,1,2,5);//棋盘数组:记录什么位置有什么棋子有子地方为mChess里面的数值,无子为0 ChessBoard: array[1..10,1..9] of integer;//电脑猜想时棋盘数组:记录什么位置有什么棋子有子地方为mChess里面的数值,无子为0nPosition: array[1..10,1..9] of integer;//自定义棋盘盒子数组ChessBox:array[1..2,1..7]of integer;//定义导航点数组能走的坐标点存在数组中值为1,不能走为0CMoveDrop:array[1..10,1..9] of integer;//棋盘1拾子标志(True表示已经拾取一个棋子)mPickFlag : boolean;//棋盘2拾子标志(True表示已经拾取一个棋子)mPickFlag2:boolean;//在paintbox1拾起棋子的值mPickChess: integer;//在paintbox2拾起的棋子值mPickChess2:integer;//拾起棋子的行号mPickRow : integer;//拾起棋子的列号mPickColumn :integer;//最大价值棋子的行列MVCRow,MVCColumn:integer;//走棋规则,允许落子标志CanDropFlag : boolean;//鼠标在Paintbox1点中坐标MouseRow,MouseColumn:integer;//鼠标在paintbox2点中的坐标MouseR2,MouseC2:integer;//定义到谁走棋WhoPlay:string;//定义先手方FirstPlay:string;GameMode:integer; //定义游戏模式 1:人人对弈 2:人机对弈 3:自定义棋局 4:思考模式//拾起棋子为哪一方 1为红方,0为黑方mPWhoPlay:string;//判定是否移动棋子IsMove:boolean;//胜利Win : boolean;//走棋步数MCSteep:integer;//总的走法数mMoveCount:integer;//相关位置点的总数mPosCount:integer;//调用估值函数的次数useEveluateCount:integer;//搜索的最大深度mMaxDepth:integer;//Memo1当前加上的最后一行MemoMaxLine:integer;type //自定义记录类型用来记录走棋记录ChessRecord=recordChessBoard:array[1..10,1..9]of integer;Win:boolean;WhoPlay:string;end;varHistory:array[0..300]of ChessRecord;typeHaveNum=recordNumber:integer;end;var ChessHaveNum:array[1..14]of HaveNum; //自定义棋盘是摆起盒子里面剩余的棋子数typePoint=recordrow:integer;column:integer;end;varRelatePos:array[1..20]of Point; //与一个棋子相关的位置typeMoveList=record //走法列表FormR:integer;FormC:integer;ToR:integer;ToC:integer;end;varnMoveList:array[0..10,1..100]of MoveList; //走法列表nBestMove:MoveList;//最佳走法implementationend.implementation{$R *.dfm}procedure TForm1.FormCreate(Sender: TObject); vari,j: integer;begin//设置棋盘格子单位大小,控制棋盘大小mBit:=50; //建议在45~55之间 50最佳//设置paintbox1的大小和位置paintbox1.Top:=65;paintbox1.Left:=10;paintbox1.Width:=10*mBit;paintbox1.Height:=11*mBit;//设置label1的大小和位置label1.Width:=150;label1.Height:=37;label1.Left:=15*mBit+15;label1.Top:=15;//设置label2的位置大小label2.Width:=115;label2.Height:=37;label2.Left:=13*mBit;label2.Top:=15;//设置label3的位置label3.Left:=30;label3.Top:=15;//初始化胜利提示label4.Caption:='';//设置form1的大小和颜色form1.Width:=19*mBit;form1.Height:=14*mBit;//初始化可走点for i:=1 to 10 dofor j:=1 to 9 doCMoveDrop[i,j]:=0;//初始化棋盘数组for i:=1 to 10 dofor j:=1 to 9 dobeginChessBoard[i,j]:=0;nPosition[i,j]:=0;end;//初始化先手FirstPlay:='';//初始化游戏模式GameMode:=0;//拾子标志为falsemPickFlag:=false;//能走棋标志为falseCanDropFlag:=false;//是否移动棋子为falseIsMove:=false;//初始化走棋步数MCSteep:=0;//初始化最大走法数mMoveCount:=0;//初始化相关位置数mPosCount:=0;//初始化游戏模式、先手方、电脑难度 GameMode:=2;N7.Checked:=true;FirstPlay:='红';N2.Checked:=true;mMaxDepth:=3;N12.Checked:=true;//胜利标志win:=false;end;procedure TForm1.PaintBox1Paint(Sender: TObject);vari,j:integer;beginlabel3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';//初始化胜利提示label4.Caption:='';:='宋体';label1.Font.Size:=25;label1.Caption:=WhoPlay+'方走棋';//<=========================画棋盘begin============================> paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clblack;paintbox1.Canvas.Brush.Color:=clSilver;//画出棋盘的外框paintbox1.Canvas.Rectangle(0,0,10*mBit,11*mBit); //棋盘外框for i:=1 to 9 do //棋盘边的行标和列标beginpaintbox1.Canvas.TextOut(i*mBit-3,10,NumWord1[i]);paintbox1.Canvas.TextOut(i*mBit-3,10*mBit+25,NumWord1[i]);end;for i:=1 to 10 dobeginpaintbox1.Canvas.TextOut(10,i*mBit-5,NumWord2[i]);paintbox1.Canvas.TextOut(9*mBit+25,i*mBit-5,NumWord2[i]);end;:='宋体';paintbox1.Canvas.font.Size:=mBit div 2;paintbox1.Canvas.TextOut(mBit+35,5*mBit+8,' 楚河汉界');//棋盘外边的字//棋盘两边的纵向直线paintbox1.Canvas.MoveTo(mBit,mBit);paintbox1.Canvas.LineTo(mBit,10*mBit); paintbox1.Canvas.MoveTo(9*mBit,mBit); paintbox1.Canvas.LineTo(9*mBit,10*mBit);//棋盘上面的横向直线for i:=1 to 10 dobeginpaintbox1.Canvas.MoveTo(mBit,i*mBit);paintbox1.Canvas.LineTo(9*mBit,i*mBit);end;//棋盘上的纵向直线for i:=2 to 8 dobeginpaintbox1.Canvas.MoveTo(i*mBit,mBit);paintbox1.Canvas.LineTo(i*mBit,5*mBit); paintbox1.Canvas.MoveTo(i*mBit,6*mBit); paintbox1.Canvas.LineTo(i*mBit,10*mBit); end;//棋盘上的田字格斜线paintbox1.Canvas.MoveTo(4*mBit,mBit); paintbox1.Canvas.LineTo(6*mBit,3*mBit); paintbox1.Canvas.MoveTo(4*mBit,3*mBit); paintbox1.Canvas.LineTo(6*mBit,mBit);paintbox1.Canvas.MoveTo(4*mBit,8*mBit); paintbox1.Canvas.LineTo(6*mBit,10*mBit); paintbox1.Canvas.MoveTo(4*mBit,10*mBit); paintbox1.Canvas.LineTo(6*mBit,8*mBit);//画兵格炮格i:=1;repeatCrossPaint(i*mBit,4*mBit,5,15);//黑方兵格 CrossPaint(i*mBit,7*mBit,5,15);//红方兵格 i:=i+2;until i>9;//黑方炮格CrossPaint(2*mBit,3*mBit,5,15);CrossPaint(8*mBit,3*mBit,5,15);//红方炮格CrossPaint(2*mBit,8*mBit,5,15);CrossPaint(8*mBit,8*mBit,5,15);//<=========================画棋盘end============================>//<=========================画棋子begin================================>for i:=1 to 10 dofor j:=1 to 9 doif ChessBoard[i,j]<> 0 thenbeginpaintbox1.Canvas.Brush.Color:=clBtnFace;//画出棋子if ChessBoard[i,j]<=7 thenbeginpaintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Ellipse(j*mBit-22,i*mBit-22,j*mBit+22,i*mBit+22);paintbox1.Canvas.Font.Size:=22;:='隶书';paintbox1.Canvas.Font.Color:=clred;paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]); endelsebeginpaintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clblack;paintbox1.Canvas.Ellipse(j*mBit-22,i*mBit-22,j*mBit+22,i*mBit+22);paintbox1.Canvas.font.Size:=22;:='隶书';paintbox1.Canvas.Font.Color:=clblack;paintbox1.Canvas.TextOut(j*mBit-15,i*mBit-15,mChess[ChessBoard[i,j]]); endend;//<=========================画棋子end================================>end;procedure TForm1.FormPaint(Sender: TObject); //游戏界面beginform1.Canvas.Pen.Width:=2;form1.Canvas.Rectangle(10,10,19*mBit-15,55);//最上方外框form1.Canvas.Rectangle(11*mBit-30,mBit+15,19*mBit-15,12*mBit+15);end;procedure TForm1.NewGame1Click(Sender: TObject);vari,j:integer;beginif(FirstPlay<>'')and((GameMode=1)or(GameMode=2))thenbeginif(MessageDlg('确定要开始新游戏吗?',mtConfirmation,[mbYes,mbNo],0))=mrYes thenbeginGroupBox1.Visible:=false;//隐藏GroupBox1Memo1.Lines.Clear;Memo1.Lines.Add('新游戏开始!');MemoMaxLine:=Memo1.Lines.Add('由'+FirstPlay+'先走棋!');//拾子标志为falsemPickFlag:=false;//能走棋标志为falseCanDropFlag:=false;//胜利标志win:=false;//初始化走棋一方WhoPlay:=FirstPlay;if(WhoPlay='红')thenlabel1.Font.Color:=clred;if(WhoPlay='黑')thenlabel1.Font.Color:=clblack;:='宋体';label1.Font.Size:=25;label1.Caption:='红方走棋';//初始化胜利提示label4.Caption:='';//初始化走棋步数MCSteep:=0;label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';//初始化棋盘数组for i:=1 to 10 dofor j:=1 to 9 dobeginChessBoard[i,j]:=0;end;//(1'车',2'马',3'象',4'士',5'帅',6'炮','7兵',8'車',9'馬',10'相',11'仕',12'将',13'炮',14'卒');//设置黑方的棋子ChessBoard[1,1]:=8;ChessBoard[1,2]:=9;ChessBoard[1,3]:=10;ChessBoard[1,4]:=11;ChessBoard[1,5]:=12;ChessBoard[1,6]:=11;ChessBoard[1,7]:=10;ChessBoard[1,8]:=9;ChessBoard[1,9]:=8;ChessBoard[3,2]:=13;ChessBoard[3,8]:=13;ChessBoard[4,1]:=14;ChessBoard[4,3]:=14;ChessBoard[4,5]:=14;ChessBoard[4,7]:=14;ChessBoard[4,9]:=14;//设置红方的棋子ChessBoard[10,1]:=1;ChessBoard[10,2]:=2;ChessBoard[10,3]:=3;ChessBoard[10,4]:=4;ChessBoard[10,5]:=5;ChessBoard[10,6]:=4;ChessBoard[10,7]:=3;ChessBoard[10,8]:=2;ChessBoard[10,9]:=1;ChessBoard[8,2]:=6;ChessBoard[8,8]:=6;ChessBoard[7,1]:=7;ChessBoard[7,3]:=7;ChessBoard[7,5]:=7;ChessBoard[7,7]:=7;ChessBoard[7,9]:=7;refresh();//更新棋盘RemHistory();if(GameMode=2)and(FirstPlay='黑')then //人机对弈模式由黑方先手beginFindAGoodMove();AIChessMove(nBestMove.FormR,nBestMove.FormC,nBestMove.ToR,nBestMove.ToC);if(isMove=true)thenbeginRemHistory();//记录棋子移动WhoPlay:='红';label1.Font.Color:=clred;refresh();paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(nBestMove.FormC*mBit,nBestMove.FormR*mBit,2,8);//棋子起走点标记CrossPaint(nBestMove.ToC*mBit,nBestMove.ToR*mBit,2,8);//棋子落点标记 isMove:=false;end;end;end;//if(MessageDlg('确定要开始新游戏吗endelseMessageDlg('请设置游戏模式!',mtWarning,[mbOk],0);end;procedure TForm1.CrossPaint(x,y,i,j:integer); //画兵格过程beginif x<>mBit thenbegin//兵格坐标左上部paintbox1.Canvas.MoveTo(x-i,y-i);paintbox1.Canvas.LineTo(x-j,y-i);paintbox1.Canvas.MoveTo(x-i,y-i);paintbox1.Canvas.LineTo(x-i,y-j);//兵格坐标左下部paintbox1.Canvas.MoveTo(x-i,y+i);paintbox1.Canvas.LineTo(x-j,y+i);paintbox1.Canvas.MoveTo(x-i,y+i);paintbox1.Canvas.LineTo(x-i,y+j);end;if x<>9*mBit thenbegin//兵格坐标右上部paintbox1.Canvas.MoveTo(x+i,y-i);paintbox1.Canvas.LineTo(x+i,y-j);paintbox1.Canvas.MoveTo(x+i,y-i);paintbox1.Canvas.LineTo(x+j,y-i);//兵格坐标右下部paintbox1.Canvas.MoveTo(x+i,y+i);paintbox1.Canvas.LineTo(x+j,y+i);paintbox1.Canvas.MoveTo(x+i,y+i);paintbox1.Canvas.LineTo(x+i,y+j);end;end;procedure TForm1.Eixt1Click(Sender: TObject);beginif(MessageDlg('确定要退出游戏?',mtConfirmation,[mbYes,mbNo],0))=mrYes then close;end;procedure TForm1.PaintBox1MouseDown(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer);varrow,column:integer;//鼠标落点的行,列号Lcross : real;//鼠标落点到棋盘交叉点的距离i,j:integer;beginif GameMode=1 then//判断游戏模式begin//计算出鼠标落下的行,列号row:=Y div mBit;if Y mod mBit>= (mBit div 2)+1 thenrow:=row+1;column:= x div mBit;if X mod mBit>= (mBit div 2)+1 thencolumn:=column+1;//记录鼠标点下的坐标MouseColumn:=column;MouseRow:=row;//当前鼠标点中的棋子mPickChess:=ChessBoard[row,column];//当前选中棋子属于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:='红';//红方if(ChessBoard[row,column]>7)thenmPWhoPlay:='黑';//黑方//计算出鼠标落点到棋盘交叉点的距离Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if(win=false)then//判断输赢beginif (Button = mbLeft) thenbegin//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半 if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div 2)) thenbeginif (mPickFlag = false) thenbeginif (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;//选中棋子endelse //可以下子begin//调用ChessMove过程,移动棋子ChessMove(mPickRow,mPickColumn,MouseRow,MouseColumn);if(IsMove=false)then //如果没有移动beginrefresh();//更新棋盘mPickFlag:=false;//目标点不合法更新棋盘//继续点自己的棋子直接选中if (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22);paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;end;if(IsMove=true)then //目标点合法更新走棋方begin//MFindDrop(MouseRow,MouseColumn);//移动到目标后该棋子可走点refresh();//更新棋盘IsNextWin();//判断是否将军WhoWin(); //判断输赢if(Win=true)thenexit;if(WhoPlay='红')then //交换走棋方beginWhoPlay:='黑';label1.Font.Color:=clblack;endelsebeginWhoPlay:='红';label1.Font.Color:=clred;end;label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';refresh();//更新棋盘RemHistory();//记录棋子移动paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(mPickColumn*mBit,mPickRow*mBit,2,8);//棋子起走点标记CrossPaint(MouseColumn*mBit,MouseRow*mBit,2,8);//棋子落点标记IsMove:=false;mPickFlag:=false;end;end;end;end;end;//if(win=false)thenend;//if(GameMode=1)if(GameMode=2)then //人机对弈beginif(WhoPlay='红')then //红方走棋begin//计算出鼠标落下的行,列号row:=Y div mBit;if Y mod mBit>= (mBit div 2)+1 thenrow:=row+1;column:= x div mBit;if X mod mBit>= (mBit div 2)+1 thencolumn:=column+1;//记录鼠标点下的坐标MouseColumn:=column;MouseRow:=row;//当前鼠标点中的棋子mPickChess:=ChessBoard[row,column];//当前选中棋子属于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:='红';//红方if(ChessBoard[row,column]>7)thenmPWhoPlay:='黑';//黑方//计算出鼠标落点到棋盘交叉点的距离Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if(win=false)then//判断输赢beginif (Button = mbLeft) thenbegin//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半 if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div2)) thenbeginif (mPickFlag = false) thenbeginif (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;//选中棋子endelse //可以下子begin//调用ChessMove过程,移动棋子ChessMove(mPickRow,mPickColumn,MouseRow,MouseColumn);if(IsMove=false)then //如果没有移动beginrefresh();//更新棋盘mPickFlag:=false;//目标点不合法更新棋盘//继续点自己的棋子直接选中if (ChessBoard[row,column]<>0)and(mPWhoPlay=WhoPlay) thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);//设置拾子标志为truemPickFlag:=true;//能走棋标志为falseCanDropFlag:=false;//扫描能走的点FindDrop(mPickRow,mPickColumn);//画出能走的点PaintCMoveDrop();end;end;if(IsMove=true)then //目标点合法更新走棋方begin//MFindDrop(MouseRow,MouseColumn);//移动到目标后该棋子可走点refresh();//更新棋盘IsNextWin();//判断是否将军WhoWin(); //判断输赢if(Win=true)thenexit;//交换走棋方WhoPlay:='黑';label1.Font.Color:=clblack;label3.Caption:='走棋步数:第'+inttostr(MCSteep)+'步';refresh();//更新棋盘RemHistory();//记录棋子移动paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(mPickColumn*mBit,mPickRow*mBit,2,8);//棋子起走点标记CrossPaint(MouseColumn*mBit,MouseRow*mBit,2,8);//棋子落点标记IsMove:=false;mPickFlag:=false;end;end;end;end;end;//if(win=false)thenend;//红方走棋if(WhoPlay='黑')then //黑方走棋beginif(win=false)thenbeginFindAGoodMove(); //寻找一个优秀的走法AIChessMove(nBestMove.FormR,nBestMove.FormC,nBestMove.ToR,nBestMove.ToC); if(isMove=true)thenbeginrefresh();IsNextWin();//判断是否将军WhoWin();//判断输赢if(Win=true)thenexit;WhoPlay:='红';RemHistory();//记录棋子移动label1.Font.Color:=clred;refresh();paintbox1.Canvas.Pen.Width:=2;paintbox1.Canvas.Pen.Color:=clgreen;CrossPaint(nBestMove.FormC*mBit,nBestMove.FormR*mBit,2,8);//棋子起走点标记CrossPaint(nBestMove.ToC*mBit,nBestMove.ToR*mBit,2,8);//棋子落点标记isMove:=false;end;end;// if(win=false)thenend;//黑方走棋end;//人机对弈if(Win=true)thenshowmessage(WhoPlay+'方已获胜,本局结束,请重新开始!');if(GameMode=3)then //自定义棋盘模式begin//计算出鼠标落下的行,列号row:=Y div mBit;if Y mod mBit>= (mBit div 2)+1 thenrow:=row+1;column:= x div mBit;if X mod mBit>= (mBit div 2)+1 thencolumn:=column+1;//记录鼠标点下的坐标MouseColumn:=column;MouseRow:=row;//当前鼠标点中的棋子mPickChess:=ChessBoard[row,column];//当前选中棋子属于哪一方if(ChessBoard[row,column]<=7)and(ChessBoard[row,column]<>0)thenmPWhoPlay:='红';//红方if(ChessBoard[row,column]>7)thenmPWhoPlay:='黑';//黑方//计算出鼠标落点到棋盘交叉点的距离Lcross:=sqrt(sqr(X-column*mBit)+sqr(Y-row*mBit));if (Button = mbLeft) thenbegin//行号在(1~10),列号在(1~9)且鼠标到棋盘交叉点的距离小于棋盘格子的一半if (row>=1)and (row<=10) and(column>=1)and(column<=9)and (Lcross<=(mBit div 2)) thenbeginif(mPickFlag2=true)thenbeginif(CMoveDrop[row,column]=1)thenbeginif(ChessHaveNum[mPickChess2].Number<>0)then//该子棋盒里面还有剩余beginMemo1.Lines.Add(mPWhoPlay+mChess[mPickChess2]+'摆在'+'('+inttostr(row)+','+inttostr(column)+')');ChessBoard[row,column]:=mPickChess2;//摆子以后该子剩余:ChessHaveNum[mPickChess2].Number:=ChessHaveNum[mPickChess2].Number-1;mPickFlag2:=false;refresh();GroupBox1.Refresh();endelseshowmessage('棋盘里能摆的“'+mChess[mPickChess2]+'”已经满了!');endelse //选中棋盒又点棋盘上不能摆子的地方beginmPickFlag2:=false;refresh();GroupBox1.Refresh();end;end;//当前没有选中棋子 mPickFlag2=falseif(mPickFlag2=false)and(mPickFlag=false)thenbeginif(ChessBoard[row,column]<>0)thenbeginmPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);mPickFlag:=true;exit;end;end;if(mPickFlag2=false)and(mPickFlag=true)thenbeginif(ChessBoard[row,column]<>0)thenbeginmPickFlag:=false;refresh();mPickChess:=ChessBoard[row,column];//拾起棋子赋值//拾起棋子的坐标mPickRow:=row;mPickColumn:=column;//拾起棋子标志重画paintbox1.Canvas.Pen.Width:=1;paintbox1.Canvas.Pen.Color:=clred;paintbox1.Canvas.Brush.Color:=clblue;paintbox1.Canvas.Ellipse(column*mBit-22,row*mBit-22,column*mBit+22,row*mBit+22); paintbox1.Canvas.Font.Size:=21;:='华文楷体';paintbox1.Canvas.Font.Color:=clwhite;paintbox1.Canvas.TextOut(column*mBit-15,row*mBit-15,mChess[ChessBoard[row,column ]]);mPickFlag:=true;exit;end;end;end;end;end;// if(GameMode=3)thenend;//PaintBox1MouseDown//==================棋子走begin==================//function Tform1.ChessMoveLaw(NowR,NowC,ToR,ToC,nChessID:integer):boolean;vari,j:integer; //循环变量begincase nChessID of//------------------车走法begin--------------------------//1:beginif(ToC=NowC)then //竖走beginif(ToR>NowR)then //从上到下beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then beginfor i:=(NowR+1) to (ToR-1) doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;if(ToR<NowR)then //从下到上beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then beginfor i:=(ToR+1)to (NowR-1)doif(ChessBoard[i,NowC]<>0)thenexit;CanDropFlag:=true;end;end;end;if(ToR=NowR)then //横着走beginif(ToC>NowC)then //从左到右beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then beginfor i:=(NowC+1) to (ToC-1) doif(ChessBoard[NowR,i]<>0)thenexit;CanDropFlag:=true;end;end;if(ToC<NowC)then //从右到左beginif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenbeginfor i:=(ToC+1)to (NowC-1)doif(ChessBoard[NowR,i]<>0)thenexit;CanDropFlag:=true;end;end;end;end;//------------------车走法end--------------------------////-------------------马走法begin----------------------//2:begin//马走日子if((abs(ToC-NowC)+abs(ToR-NowR))=3)and(ToC<>NowC)and(ToR<>NowR)thenbegin//竖日且无子当马脚if(abs(ToR-NowR)=2)and(ChessBoard[(NowR+ToR) div 2,NowC]=0)thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;//横日且无子当马脚if(abs(ToC-NowC)=2)and(ChessBoard[NowR,(NowC+ToC)div 2]=0)thenif(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)thenCanDropFlag:=true;end;end;//-------------------马走法end----------------------////-------------------相走法begin--------------------//3:begin//相走田if(ToR>5)and(abs(ToR-NowR)=2)and(abs(ToC-NowC)=2)thenif(ChessBoard[(ToR+NowR)div 2,(ToC+NowC)div 2]=0)then //田字格中间无子if(ChessBoard[ToR,ToC]=0)or(ChessBoard[ToR,ToC]>7)then//目标点无子或不是己方CanDropFlag:=true;。
