Q&A

  • 델파이로 어느싸이트에서 강좌를보며 만드는데요...문제가..
오늘 델파이라는것을 처음 접해보고 방학이 끝나기 전에 뭔가를 한번 만들어보려고하는데요..
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'
에러가 이렇게 떠요...어떻게 해야 할까요...무시하지마시구 어떻게 해야하는지 좀 알려주세요 꼭이요ㅜ^ㅜ
1  COMMENTS
  • Profile
    연기훈 2004.02.04 23:20
    우선 델파이 기초나, 객체지향 언어를 공부하세요!

    무조건 따라하기식으로 프로그램 짜기 힘듭니다.

    에러는
    uses절에 U_Basic 유닛 아니면 pas파일 등 어떤 외부 파일로 이루어진

    것이 없어서 나는 에러 입니다. 이파일 부분을 코딩을 하시던가 하셔야 하고요!

    또는... 나오는 부분에 보시면 위에 문장중 함수 이름이 같은 것을 아래 부분으로

    대치할 수 있다는 애가 같네요~

    그럼 즐프하세요!