본문 바로가기

Delphi/끄적이기

네모네모로직 라인 계산기 - 2

2018.01.25 - [Project/Etc..] - 네모네모로직 라인 계산기

 

네모네모로직 라인 계산기

회사에서 머리가 안 돌아가거나 짬짬히 틈날 때 하고 있는 네모네모로직! 라인별 계산 공식은 게임에 별다른 영향을 미치는 것도 아니고 단순 계산식이라 게임 진행에 방해가 되지도 않고 귀차

developist.tistory.com

다른 분 요청으로 또 까먹기 전에 소스 공유해봅니다.

개인용으로 대충 만들어서 쓴거라 적당히 봐주세요^0^


{******************************************************************************}
{                                                                              }
{                       Delphi Nonogram LineCalc                               }
{                                                                              }
{                       Copyright (C) TeakHyun Kang                            }
{                                                                              }
{                       https://github.com/kth920517                           }
{                       https://developist.tistory.com/                        }
{                                                                              }
{******************************************************************************}

unit uMain;

interface

uses
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants, System.Classes, System.Character,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls;

type
  TfrmNonogramCalc = class(TForm)
    edtSize: TEdit;
    edtNumbers: TEdit;
    mmResult: TMemo;
    btnCalc: TButton;
    procedure btnCalcClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure edtNumbersKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
    procedure edtSizeKeyDown(Sender: TObject; var Key: Word;
      Shift: TShiftState);
  private
    { Private declarations }

    function CalcRow(ASize, ANumbers: string): string;
  public
    { Public declarations }
  end;

var
  frmNonogramCalc: TfrmNonogramCalc;

implementation

{$R *.dfm}

procedure TfrmNonogramCalc.btnCalcClick(Sender: TObject);
begin
  if edtSize.Text = '' then begin
    ShowMessage('로직 사이즈를 입력해주세요.');

    if edtSize.CanFocus then
      edtSize.SetFocus;

    Exit;
  end;

  if edtNumbers.Text = '' then begin
    ShowMessage('라인의 크기를 입력해주세요.');

    if edtNumbers.CanFocus then
      edtNumbers.SetFocus;

    Exit;
  end;

  mmResult.Clear;
  mmResult.Lines.Add(CalcRow(edtSize.Text, edtNumbers.Text));
end;

function TfrmNonogramCalc.CalcRow(ASize, ANumbers: string): string;
var
  I, J: Integer;
  nSum: Integer;
  nSize: Integer;
  nCheck: Integer;
  sNum: string;

  arrNum: TArray<Integer>;
  arrResult : TArray<string>;
  lstNumberList: TStringList;
begin
  Result := '';

  try
    lstNumberList := TStringList.Create;

    try
      lstNumberList.DelimitedText := ANumbers.Trim;

      nSum := lstNumberList.Count - 1;
      for I := 0 to lstNumberList.Count - 1 do begin
        if I > 0 then arrNum := arrNum + [0];

        sNum := lstNumberList[I];

        for J := 0 to sNum.Length - 1 do begin
          if not IsNumber(sNum.ToCharArray[J]) then begin
            ShowMessage('라인은 숫자만 입력해주세요.');
            Exit;
          end;
        end;

        arrNum := arrNum + [sNum.ToInteger];
        nSum := nSum + sNum.ToInteger;
      end;
    finally
      lstNumberList.Free;
    end;

    nSize := ASize.ToInteger;

    if nSum > nSize then begin
      ShowMessage('유효한 라인의 크기가 아닙니다.');

      Exit;
    end;

    //합차에 따른 유효 칸 계산
    nCheck := nSize - nSum;

    for I := Low(arrNum) to High(arrNum) do begin
      if arrNum[I] = 0 then
        arrResult := arrResult + ['▨']
      else begin
        if arrNum[I] < nCheck then begin
          for J := 0 to arrNum[I] - 1 do
            arrResult := arrResult + ['▨'];
        end else begin
          for J := 0 to arrNum[I] - 1 do begin
            if J < nCheck then
              arrResult := arrResult + ['▨']
            else if arrNum[I] > J then
              arrResult := arrResult + ['■']
            else
              arrResult := arrResult + ['▨'];
          end;
        end;
      end;
    end;

    //나머지 빈칸 채우기
    for I := 0 to (nSize - nSum - 1) do
      arrResult := arrResult + ['▨'];

    //결과
    for I := Low(arrResult) to High(arrResult) do begin
      if (I > 0) and (I mod 5 = 0) then
        Result := Result + ' | ';

      Result := Result + arrResult[I];
    end;

    Result := Result + sLineBreak + sLineBreak +
             '로직 크기와 라인 합의 차 : ' + nCheck.ToString;
  except
    on E : Exception do begin
      ShowMessage(E.Message);
    end;
  end;
end;

procedure TfrmNonogramCalc.edtNumbersKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
    btnCalcClick(nil);
end;

procedure TfrmNonogramCalc.edtSizeKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
  if Key = VK_RETURN then
    edtNumbers.SetFocus;
end;

procedure TfrmNonogramCalc.FormCreate(Sender: TObject);
begin
  edtSize.Text := '';
  edtNumbers.Text := '';

  mmResult.Clear;
end;

procedure TfrmNonogramCalc.FormShow(Sender: TObject);
begin
  if mmResult.CanFocus then
    mmResult.SetFocus;
end;

end.
반응형