Форум по Delphi программированию



Вернуться   Форум по Delphi программированию > Все о Delphi > Компоненты и классы
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 01.12.2021, 20:14
Katyaaa99 Katyaaa99 вне форума
Прохожий
 
Регистрация: 01.12.2021
Сообщения: 1
Версия Delphi: Delphi 10
Репутация: 10
По умолчанию Крестики-нолики

Здравствуйте. Необходима помощь. Реализовать программу игры крестики-нолики (3 на 3) через классы. В гугле задачи без классов. Помогите пожалуйста. Буду очень благодарна.
Ответить с цитированием
  #2  
Старый 02.12.2021, 09:50
Аватар для dr. F.I.N.
dr. F.I.N. dr. F.I.N. вне форума
I Like it!
 
Регистрация: 12.12.2009
Адрес: Россия, г. Новосибирск
Сообщения: 660
Версия Delphi: D6/D7
Репутация: 26643
По умолчанию

Я вижу тут возможность описания максимум одного класса. Это класс "Игра", в котором происходят все проверки и вычисления относительно текущей стадии игры.

В Конструктор передается информация о том, ходит ли первый "Х" (по-умолчанию да), очищается все поле и выставляется признак того, что игра не завершена.

Метод 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% ответа.
Грамотно поставленная речь вызывает уважение, а у некоторых даже зависть.
Ответить с цитированием
Ответ



Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра
Комбинированный вид Комбинированный вид

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:47.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2021

ВКонтакте   Facebook   Twitter   Ссылка на Telegram