前回に引き続き、ちょっと面白そうなので少し考えてみました。
ざっと以下のようなプログラムになるかと思います。
ご質問の2点については、コメント欄に「★」をつけた部分になります。参考になれば幸いです。
% テーブルd(ictionary)の作成
T_d = readtable('list.csv','ReadVariableNames',false);
% 単語の列を抽出
T_d = T_d(:,{'Var2'});
T_d.Properties.VariableNames = {'Tango'};
% 重複を消す(一応)
[~,ia] = unique(T_d.Tango);
T_d = T_d(ia,:);
% 始めと終わりの文字の抽出
T_d.Start = cellfun(@(x) {x(1)}, T_d.Tango);
T_d.End = cellfun(@(x) {x(end)}, T_d.Tango);
% ★最後が長音の場合一文字前の文字を抽出
idx = strcmp(T_d.End,'ー');
T_d.End(idx) = cellfun(@(x) {x(end-1)}, T_d.Tango(idx));
% 使った単語を記録するための列(コンピュータ側)
T_d.Used = false(height(T_d),1);
% ランダムで最初の単語を選択(人が入力する形式に変更予定)
pt = randi(height(T_d));
fprintf(' Com : %s \n',T_d.Tango{pt});
T_d.Used(pt) = true;
% ★ユーザーが入力した単語を格納するテーブルを準備
varNames = T_d.Properties.VariableNames;
User_Input = table(...
'Size', [0 4],...
'VariableTypes',{'cell','cell','cell','logical'},...
'VariableNames',varNames);
% しりとりを行うプログラム
for kk = 1:20
% ★単語の最後の文字をピックアップ
curChar = T_d.End(pt);
% ★「ン」だったらアウト!
if strcmp(curChar,'ン')
errordlg('Game Over!','End');
break;
end
% ユーザーが単語を入力する
prompt = ' Your turn : ';
UI= input(prompt,'s'); % CommandWindowでユーザー入力
% ちゃんとしりとりになってなかったらアウト!
if ~strcmp(UI(1), curChar)
errordlg('Game Over!','End');
break;
end
% ★単語の最後の文字をピックアップ
curChar = UI(end);
% ★「ン」だったらアウト!
if strcmp(curChar,'ン')
errordlg('Game Over!','End');
end
% ★テーブルに追加
if strcmp(UI(end),'ー')
User_Input = [User_Input; {UI, UI(1), UI(end-1), true}]; %#ok
else
User_Input = [User_Input; {UI, UI(1), UI(end), true}]; %#ok
end
% 一度使用した単語以外を探す(注:User_Inputは使用済みの単語しか入っていないためUser_Input.Usedは確認しなくて良い)
pt = find(strcmp(User_Input.End(end),T_d.Start) & ~T_d.Used);
if isempty(pt)
disp(' Com : I could accept this Loss. ');
break;
end
pt = pt(randi(numel(pt))); %"ン"で終わる単語を選ぶ確率の調整必要
fprintf(' Com : %s \n',T_d.Tango{pt});
T_d.Used(pt) = true;
end