Как использовать наборы строк в Паскале? - PullRequest
1 голос
/ 26 января 2009

Я пишу небольшую игру, в которой у пользователя спрашивают его расу и класс. Существует пять возможных рас строк [5] и четыре возможных класса строк [9].

Как мне запрограммировать паскаль на 1. Определить пять рас и четыре класса как константы, 2. Проверить ввод пользователя, чтобы увидеть, находится ли ввод в пределах возможных рас и классов - без использования нескольких операторов IF?

Любые советы будут оценены.

Ответы [ 3 ]

2 голосов
/ 10 февраля 2009

Я бы порекомендовал решение 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;
2 голосов
/ 26 января 2009

Поскольку ваш ввод строго определен, мой первый вопрос: должны ли вы использовать строки в качестве пользовательского ввода? Не можете ли вы дать пользователю выбор? Скажи выпадающий? Затем вы можете сопоставить каждый выбор перечислению.

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;

То же самое для класса.

0 голосов
/ 04 февраля 2009

Я считаю, что вы должны следовать решению Стивса. Но если вы используете строки, вы можете использовать TStringList (в Delphi / возможно FreePascal). Вы можете заполнить его своими расами, а затем оценить ответ игроков, используя функцию IndexOf в TStringList. Возвращает индекс переданной строки или -1, если переданная строка отсутствует в списке.

В любом случае, я бы настоятельно рекомендовал решение Стивса:)

...