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.
반응형