|
|
#1
|
||||
|
||||
Я вижу тут возможность описания максимум одного класса. Это класс "Игра", в котором происходят все проверки и вычисления относительно текущей стадии игры.
В Конструктор передается информация о том, ходит ли первый "Х" (по-умолчанию да), очищается все поле и выставляется признак того, что игра не завершена. Метод MakeTurn принимает координаты поля, в которое сделан ход и возвращает результат хода. Если поле занято, то ход некорректный, если поле пустое, то вызывается метод IsWin в котором осуществляется проверка на "победу". Если победы нет, то меняется активный игрок и возвращается результат "ОК", если победа, то игра завершена (выставляется флаг Done). Нужно написать содержимое метода IsWin, чтоб он осуществлял проверку на победу. Ну и нужно проверить в конце хода, что еще остались пустые поля и можно продолжать игру. Код:
type TGameXOFieldIndex = 0..2; TGameXOTurnResult = (trOK, trError, trWin, trDraw); TGameXOFieldState = (fsEmpty, fsCross, fsZero); TGameXO = class private fActiveCross: Boolean; fDone: Boolean; fField: array [0..2, 0..2]: TGameXOFieldState; function GetFieldState(X, Y: TGameXOFieldIndex): TGameXOFieldState; function IsWin: Boolean; public constructor Create(FirstCross: Boolean = true); function MakeTurn(X, Y: TGameXOFieldIndex): TGameXOTurnResult; property Field[X, Y: TGameXOFieldIndex]: TGameXOFieldState read GetFieldState; property Done: Boolean read fDone; property ActiveCross: Boolean read fActiveCross; end; constructor TGameXO.Create(FirstCross: Boolean = true); var i, j: TGameXOFieldIndex; begin fActiveCross := FirstCross; for i := Low(TGameXOFieldIndex) to High(TGameXOFieldIndex) do for j := Low(TGameXOFieldIndex) to High(TGameXOFieldIndex) do fField[i, j] := fsEmpty; fDone := false; end; function TGameXO.MakeTurn(X, Y: TGameXOFieldIndex): TGameXOTurnResult; begin if fField[X, Y] = fsEmpty then begin if fActiveCross then fField[X, Y] := fsCross else fField[X, Y] := fsZero; if IsWin then begin fDone := true; Result := trWin; end else begin fActiveCross := not fActiveCross; end; end else Result := trError; end; function TGameXO.GetFieldState(X, Y: TGameXOFieldIndex): TGameXOFieldState; begin Result := fField[X, Y]; end; function TGameXO.IsWin: Boolean; begin //проверка на победу end; Грамотно поставленный вопрос содержит не менее 50% ответа. Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть. |