2022/10/06
手数はどこから?
KTB48 のprogram を書き直して以下のように書いてみた。
TJNファイルから、DIAファイルに KAITOU_SEG と KAITOU_DIF
を持ってくるところだ。
procedure TDiaManager.SetTjnSegDif(ATJNName: string);
var
i: integer;
Seg, Dif: integer;
curNum: string;
begin
TjnManager := TTjnManager.Create;
TjnManager.TjnFileLoad(ATJNName);
TjnManager.SetRecordIndex;
for i := 0 to RecordCount -1 do begin
CurRecordIndex := i;
GetRecord;
curNum := getFieldValue(tbfNUM);
TjnManager.GetSegDif(curNum, Seg, Dif);
setFieldValue(tbfKAITOU_SEG, Seg);
setFieldValue(tbfKAITOU_DIF, Dif);
CurRecordIndex := i;
SetRecord;
end;
TjnManager.Free;
end;
いつも、これくらい、スッキリしたコードが書けるといいのだが、ここまでくるには、何度も書き直していて、時間ばっかりかかった。費用対効果は、メッチャ悪い。
で、門脇さんの似たような作業のソースコードをみてみる。
'---------------
*KAITOU
'---------------
KAI=0
ER=0: open TJN_FIL$(NN) for input as #1
if ER=1 then KAI=1 : RETURN
GY=GY+1: locate 0,GY
print "解答インデックスを作成します。 ";
LL#=0
NUM_ORG=0
while not eof(1)
line input #1,A$
NUM=val(left$(A$,4))
if NUM<>NUM_ORG then REC%(NUM)=int(LL#/330)+1
if NUM<>NUM_ORG then DIF%(NUM)=LL#-330*(REC%(NUM)-1)
T1=instr(A$,"手")
if T1>0 then
T2=T1
while instr("0123456789",mid$(A$,T2-1,1))>0: T2=T2-1: wend
if T2<>T1 then
if T2<T1-3 then T1=T2+3
TEKAZU%(NUM)=val(mid$(A$,T2,T1-T2))
endif
endif
LL#=LL#+len(A$)+2
NUM_ORG=NUM
if T1>0 then NUM_ORG=0 '同じ番号の解答が2つ連続して出た場合の対策
wend
close #1
locate 40,GY: print "→完了 "
return
ううむ。ここで手数を get するのか。
program は、手数も求める修正が必要かもしれぬ。まあ、いいか。
柿木将棋の手数は、
1. 指し手を数える
2. まで○○手 という記述から
3. 詰将棋情報から
のやり方で求められる。3つとも同じ数字だったら問題は無いが、違った場合はどうなるのか?
KTB48 では、詰将棋情報の手数で上書きする仕様だったが、TBase で解答インデックスを付け替えると まで○○手 の手数になってしまうのだろう。