Я вижу тут возможность описания максимум одного класса. Это класс "Игра", в котором происходят все проверки и вычисления относительно текущей стадии игры.
В
Конструктор передается информация о том, ходит ли первый "Х" (по-умолчанию да), очищается все поле и выставляется признак того, что игра не завершена.
Метод
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;