私は、ユーザーに人種とクラスを尋ねる小さなゲームを書いています。string[5]には5つの可能な種族があり、string[9]には4つの可能なクラスがあります。
パスカルを1.5つの種族と4つのクラスを定数として定義する、2。ユーザー入力をチェックして、複数のIFステートメントを使用せずに、入力が可能な種族とクラス内にあるかどうかを確認するにはどうすればよいですか?
ヒントをいただければ幸いです。
入力は厳密に定義されているので、私の最初の質問は、ユーザー入力として文字列を使用する必要があるかどうかです。ユーザーに選択肢を与えることはできませんか?ドロップダウンと言いますか?次に、各選択肢を列挙型にマップできます。
type
race = (rcRace0, rcRace1, rcRace2 rcRace3, rcRace4);
case race(Input) of //input is an integer, index of the drop down list for example
rcRace0 : //perform processing for race 0
rcRace1 : //perform processing for race 1
rcRace2 : //perform processing for race 2
rcRace3 : //perform processing for race 3
rcRace4 : //perform processing for race 4
end;
クラスも同じです。
出発点としてStevesソリューションをお勧めしますが、列挙型とセットを使用してもう少し進んでください...
type
TRace = (rcRace0, rcRace1, rcRace2, rcRace3, rcRace4);
TCharacterClass = (ccClass0, ccClass1, ccClass2, ccClass3);
TCharacterClassSet = set of TCharacterClass;
const
validCombinations : array[TRace] of TCharacterClassSet = (
[ccClass0, ccClass1, ccClass2, ccClass3], // race0 can be any class
[ccClass0, ccClass2], // race1
[ccClass0, ccClass1, ccClass2], // race2
[ccClass0, ccClass3], // race3
[ccClass0] // race4
);
種族名とキャラクタークラスの定数を設定することもできます。
const
raceNames : array[TRace] of string = (
'Race 0',
'Race 1',
'Race 2',
'Race 3',
'Race 4'
);
characterClassNames = array[TCharacterClass] of string = (
'Class 0',
'Class 1 ',
'Class 2',
'Class 3'
);
ここで、ユーザー入力にコンボボックスを使用し、入力をこれらの列挙型にマップする場合、組み合わせが有効かどうかのチェックは簡単です。
function ValidRaceAndClass( aRace : TRace; aClass : TCharacterClass ) : Boolean;
begin
result := aClass in validCombinations[ aRace ];
end;
スティーブのソリューションに従う必要があることがわかりました。ただし、文字列を使用する場合は、TStringList (Delphi/おそらく FreePascal) を使用できます。レースを入力してから、TStringList の IndexOf 関数を使用してプレイヤーの回答を評価できます。渡された文字列のインデックスを返すか、渡された文字列がリストにない場合は -1 を返します。
とにかく、スティーブのソリューションを強くお勧めします:)