오늘 델파이라는것을 처음 접해보고 방학이 끝나기 전에 뭔가를 한번 만들어보려고하는데요..
unit UnitU_Color;
interface
uses
Windows, Messages, Classes, SysUtils, Graphics, U_Basic;
Const
msColDim = 14;
msRowDim = 10;
msBaseX = 203;
msBaseY = 160;
msTermX = 28;
msTermY = 28;
msItemCount = 28;
msUnknow = 99;
msBlank = 0;
Type
TColorB = Int64;
TColorS = Integer;
TItems = Array[0..msColDim-1, 0..msRowDim-1] Of ShortInt;
TItemInfo = Record
Col: Integer;
Row: Integer;
ItemCode: ShortInt;
End;
TPairInfo = Record
Item1: TItemInfo;
Item2: TItemInfo;
End;
TFindItemEvent = procedure (ItemInfo: TItemInfo) of object;
TFindPairEvent = procedure (PairInfo: TPairInfo) of object;
TProcIdleEvent = procedure of object;
TMasac = class (TGameBasic)
private
FItems: TItems;
FCol1: Integer;
FCol2: Integer;
FRow1: Integer;
FRow2: Integer;
FCnt: Integer;
FOnFindItem: TFindItemEvent;
FOnFindPair: TFindPairEvent;
public
function BlankCheckX(Row, Col1, Col2: Integer): Boolean;
function BlankCheckY(Col, Row1, Row2: Integer): Boolean;
function CalcX(Col: Integer): Integer;
function CalcY(Row: Integer): Integer;
function CheckLast: Boolean;
function CheckPass: Boolean;
procedure Close;
procedure FindItem(Col: Integer; Row: Integer);
function FindPair: Boolean;
procedure Open;
Function ReadAll: Integer;
published
property OnFindItem: TFindItemEvent read FOnFindItem write FOnFindItem;
property OnFindPair: TFindPairEvent read FOnFindPair write FOnFindPair;
Property OnMsgLog;
end;
function ReadS(Xpos: Integer; Ypos: Integer): TColorS;
function CompareS(Xpos: Integer; Ypos: Integer; Color: TColorS): Boolean;
Var
FGerHandle: HWND;
FDC: HDC;
FBitmap: TBitmap;
FSave: Integer;
implementation
{********************************* TScreenColor *********************************}
function ReadS(Xpos: Integer; Ypos: Integer): TColorS;
begin
Result := FBitMap.Canvas.Pixels[Xpos, Ypos];
end;
function CompareS(Xpos: Integer; Ypos: Integer; Color: TColorS): Boolean;
begin
Result := (ReadS(Xpos, Ypos) = Color);
end;
{************************************ TMasac ************************************}
function TMasac.CalcX(Col: Integer): Integer;
begin
Result := msBaseX + Col * 28;
end;
function TMasac.CalcY(Row: Integer): Integer;
begin
Result := msBaseY + Row * 28;
end;
procedure TMasac.FindItem(Col: Integer; Row: Integer);
var
Xpos: Integer;
Ypos: Integer;
ItemCode: ShortInt;
ItemInfo: TItemInfo;
begin
ItemCode := msUnKnow;
Xpos := Col * msTermX;
Ypos := Row * msTermY;
// 블랭크
If CompareS (Xpos+1, Ypos, $000c20) Then Begin
ItemCode := msBlank;
// 인삼
End Else If CompareS (Xpos+23, Ypos+8, 51200) Then Begin
ItemCode := 12;
// 호두
End Else If CompareS (Xpos+19, Ypos+5, 4456516) Then Begin
ItemCode := 19;
// 붓
End Else If CompareS (Xpos+15, Ypos+19, 2621480) Then Begin
ItemCode := 24;
// 당혜
End Else If CompareS (Xpos+13, Ypos+16, 6579200) Then Begin
ItemCode := 7;
// 보리
End Else If CompareS (Xpos+8, Ypos+18, 13160596) Then Begin
ItemCode := 11;
// 옥수수
End Else If CompareS (Xpos+19, Ypos+8, 33792) Then Begin
ItemCode := 15;
// 호미
End Else If CompareS (Xpos+8, Ypos+21, 30840) Then Begin
ItemCode := 20;
// 호박
End Else If CompareS (Xpos+13, Ypos+21, 30840) Then Begin
ItemCode := 21;
// 참치
End Else If CompareS (Xpos+21, Ypos+16, 4473856) Then Begin
ItemCode := 17;
// 고구마
End Else If CompareS (Xpos+11, Ypos+16, 5788820) Then Begin
ItemCode := 4;
// 곡괭이
End Else If CompareS (Xpos+19, Ypos+7, 7903408) Then Begin
ItemCode := 5;
// 밤
End Else If CompareS (Xpos+20, Ypos+11, 200) Then Begin
ItemCode := 9;
// 술
End Else If CompareS (Xpos+15, Ypos+7, 200) Then Begin
ItemCode := 13;
// 감
End Else If CompareS (Xpos+13, Ypos+12, 2631680) Then Begin
ItemCode := 2;
// 톱
End Else If CompareS (Xpos+3, Ypos+14, 10014972) Then Begin
ItemCode := 18;
// 배
End Else If CompareS (Xpos+21, Ypos+18, 19532) Then Begin
ItemCode := 10;
// 금반지
End Else If CompareS (Xpos+13, Ypos+15, 19532) Then Begin
ItemCode := 6;
// 망치
End Else If CompareS (Xpos+22, Ypos+15, 10280) Then Begin
ItemCode := 8;
// 가위
End Else If CompareS (Xpos+16, Ypos+5, 1334380) Then Begin
ItemCode := 1;
// 부채
End Else If CompareS (Xpos+13, Ypos+13, 200) Then Begin
ItemCode := 23;
// 옥반지
End Else If CompareS (Xpos+13, Ypos+11, 13160596) Then Begin
ItemCode := 26;
// 책
End Else If CompareS (Xpos+22, Ypos+20, 30840) Then Begin
ItemCode := 27;
// 오징어
End Else If CompareS (Xpos+16, Ypos+7, 10280) Then Begin
ItemCode := 14;
// 단거
End Else If CompareS (Xpos+16, Ypos+9, 19532) Then Begin
ItemCode := 22;
// 항아리
End Else If CompareS (Xpos+13, Ypos+10, 5788820) Then Begin
ItemCode := 25;
// 국자
End Else If CompareS (Xpos+16, Ypos+21, 10014972) Then Begin
ItemCode := 28;
// 조개
End Else If CompareS (Xpos+7, Ypos+12, 10801392) And Compares (Xpos+8, Ypos+11, 7903408) And Compares (Xpos+9, Ypos+17, 5277868) Then Begin
ItemCode := 16;
// 게
End Else If CompareS (Xpos+24, Ypos+11, 8176876) And Compares (Xpos+9, Ypos+22, 11069692) And Compares (Xpos+22, Ypos+24, 11857148) Then Begin
ItemCode := 3;
End;
FItems[Col, Row] := ItemCode;
If (ItemCode <> msBlank) Then Begin
Inc(FCnt);
End;
If Assigned(FOnFindItem) Then Begin
ItemInfo.Col := Col;
ItemInfo.Row := Row;
ItemInfo.ItemCode := ItemCode;
//ItemInfo.ItemName := ItemName(ItemCode);
FOnFindItem(ItemInfo);
End;
end;
이렇게 하나...
function TMasac.CalcY(Row: Integer): Integer;
begin
Result := msBaseY + Row * 28;
end;
function TMasac.CheckLast: Boolean;
begin
Result := (Fcnt=0);
end;
function TMasac.CheckPass: Boolean;
var
Check: Boolean;
Col: Integer;
Row: Integer;
//Pos1: Integer;
//Pos2: Integer;
begin
Result := True;
//바로 옆에 있는지 검사
If Abs(FCol1-FCol2)+Abs(FRow1-FRow2) = 1 Then Exit;
//X축이 같은경우
If FCol1=FCol2 Then Begin
//수직으로 연결되는지 검사
If FRow1 < FRow2 Then Begin
If BlankCheckY(FCol1, FRow1+1, FRow2-1) Then Exit;
End Else Begin
If BlankCheckY(FCol1, FRow2+1, FRow1-1) Then Exit;
End;
//3선으로 연결되는지 검사
For Col := 0 To msColDim-1 Do Begin
If BlankCheckY(Col, FRow1, FRow2) Then Begin
If Col < FCol1 Then Begin
If BlankCheckX(FRow1, Col, FCol1-1) And BlankCheckX(FRow2, Col, FCol2-1) Then Exit;
End Else If Col > FCol1 Then Begin<br />
If BlankCheckX(FRow1, FCol1+1, Col) And BlankCheckX(FRow2, FCol2+1, Col) Then Exit;
End;
End;
End;
//Y축이 같은경우
End Else If FRow1=FRow2 Then Begin
//수평으로 연결되는지 검사
If FCol1 < FCol2 Then Begin
If BlankCheckX(FRow1, FCol1+1, FCol2-1) Then Exit;
End Else Begin
If BlankCheckX(FRow1, FCol2+1, FCol1-1) Then Exit;
End;
//3선으로 연결되는지 검사
For Row := 0 To msRowDim-1 Do Begin
If BlankCheckX(Row, FCol1, FCol2) Then Begin
If Row < FRow1 Then Begin
If BlankCheckY(FCol1, Row, FRow1-1) And BlankCheckY(FCol2, Row, FRow2-1) Then Exit;
End Else If Row > FRow1 Then Begin
If BlankCheckY(FCol1, FRow1+1, Row) And BlankCheckY(FCol2, FRow2+1, Row) Then Exit;
End;
End;
End;
End Else Begin
//2선이내로 연결되는지 검사
//XY순서로 검사
If FCol1 < FCol2 Then Begin
Check := BlankCheckX(FRow1, FCol1+1, FCol2);
End Else Begin
Check := BlankCheckX(FRow1, FCol2, FCol1-1);
End;
If Check Then Begin
If FRow1 < FRow2 Then Begin
Check := BlankCheckY(FCol2, FRow1, FRow2-1);
End Else Begin
Check := BlankCheckY(FCol2, FRow2+1, FRow1);
End;
If Check Then Exit;
End;
//YX순서로 검사
If FRow1 < FRow2 Then Begin
Check := BlankCheckY(FCol1, FRow1+1, FRow2);
End Else Begin
Check := BlankCheckY(FCol1, FRow2, FRow1-1);
End;
If Check Then Begin
If FCol1 < FCol2 Then Begin
Check := BlankCheckX(FRow2, FCol1, FCol2-1);
End Else Begin
Check := BlankCheckX(FRow2, FCol2+1, FCol1);
End;
If Check Then Exit;
End;
//3선으로 연결되는지 검사
//X축을 변화 시키면서 검사
For Col := 0 To msColDim-1 Do Begin
If BlankCheckY(Col, FRow1, FRow2) Then Begin
//처음아이템검사
If Col < FCol1 Then Begin
Check := BlankCheckX(FRow1, Col, FCol1-1);
End Else If Col > FCol1 Then Begin
Check := BlankCheckX(FRow1, FCol1+1, Col);
End;
If Check Then Begin
//둘째아이템검사
If Col < FCol2 Then Begin
If BlankCheckX(FRow2, Col, FCol2-1) Then Exit;
End Else Begin
If BlankCheckX(FRow2, FCol2+1, Col) Then Exit;
End;
End;
End;
End;
//Y축을 변화 시키면서 검사
For Row := 0 To msRowDim-1 Do Begin
If BlankCheckX(Row, FCol1, FCol2) Then Begin
//처음아이템검사
If Row < FRow1 Then Begin
Check := BlankCheckY(FCol1, Row, FRow1-1);
End Else If Row > FRow1 Then Begin
Check := BlankCheckY(FCol1, FRow1+1, Row);
End;
If Check Then Begin
//둘째아이템검사
If Row < FRow2 Then Begin
If BlankCheckY(FCol2, Row, FRow2-1) Then Exit;
End Else Begin
If BlankCheckY(FCol2, FRow2+1, Row) Then Exit;
End;
End;
End;
End;
End;
Result := False;
end;
이렇게 하나
procedure TMasac.Open;<br />
begin<br />
//현재의 마작판 값을 읽어온다.<br />
FGerHandle := 0; //GetActiveWindow;<br />
FDC := GetWindowDC(FGerHandle);<br />
FBitmap := TBitMap.Create;<br />
FBitmap.PixelFormat := pf24Bit;<br />
FBitmap.Width := msColDim * msTermX;<br />
FBitmap.Height := msRowDim * msTermY;<br />
FSave := 0;<br />
end;
procedure TMasac.Close;
begin
FBitmap.Dormant; // Free up GDI resources
FBitmap.FreeImage; // Free up Memory.
FBitMap.ReleaseHandle; // This will actually lose the bitmap;
FBitmap.Free;
ReleaseDC(FGerHandle, FDC);
end;
Function TMasac.ReadAll: Integer;
var
Col: Integer;
Row: Integer;
//BitMapNumber: TBitmap;
begin
BitBlt(FBitmap.Canvas.Handle, 0, 0, FBitmap.Width, FBitmap.Height, FDC, msBaseX, msBaseY, SRCCOPY);
If (ReadS(330-msBaseX, 390-msBaseY)=$08182c) And (ReadS(470-msBaseX, 390-msBaseY)=$08182c) Then Begin
Result := 11;
End Else Begin
FCnt := 0;
For Col := 0 To msColDim-1 Do Begin
For Row := 0 To msRowDim-1 Do Begin
FindItem(Col, Row);
End;
End;
Result := 01;
End;
end;
이렇게 하나 3개를 올려놓으셨어요...
근데 처음접하다보니...이거를 우선 델파이 ....유닛인가하는 데다가 다쓰고나니까 왼쪽에5개의 폴더모양이 생기더군요..그다음에 저장을 하긴했는데...이걸 실행시킹방법이 없나요?아님 제가 위에소스를 다른유닛에 따로저장을 해야 하나요?거기 운영자님이 만드신걸 보니까 메모장 하나 dll파일 하나 응용프로그램하나가있던데...그리고 이걸 다쓴다음에 run버튼을 누르니까
에러가하나생기는데요그게 ...
[fatal error]unitu_color.pas(6):file not fonud:'u_basic.dcu'
에러가 이렇게 떠요...어떻게 해야 할까요...무시하지마시구 어떻게 해야하는지 좀 알려주세요 꼭이요ㅜ^ㅜ
무조건 따라하기식으로 프로그램 짜기 힘듭니다.
에러는
uses절에 U_Basic 유닛 아니면 pas파일 등 어떤 외부 파일로 이루어진
것이 없어서 나는 에러 입니다. 이파일 부분을 코딩을 하시던가 하셔야 하고요!
또는... 나오는 부분에 보시면 위에 문장중 함수 이름이 같은 것을 아래 부분으로
대치할 수 있다는 애가 같네요~
그럼 즐프하세요!