Реализация игры "Шашки" на Delphi

 

Федеральное агентство образования Республики Бурятия

Бурятский государственный университет

Институт математики и информатики

Кафедра информационных технологий







Курсовая работа

Реализация игры "Шашки" на Delphi



Выполнила: Раднаева М., группа 05470

Научный руководитель: Мордовской А. К.













Улан-Удэ


Содержание


1.Из истории

2.Классификация

.Правила игры

.Код программы


1. Из истории


Как и большинство настольных игр, шашки появились достаточно давно и во все времена пользовались немалой популярностью. Точной истории возникновения проследить не удается, хотя при раскопках, которые проходили в Египте, была найдена древняя доска и набор из фишек двух разных цветов, которые отдаленно напоминали современный инвентарь.

Согласно другой теории, шашки взяли свое начало от игры "латрункули", которая была достаточно популярна в Риме. Правила практически полностью соответствовали современным шашкам, за исключением некоторых нюансов. Например, в этой игре не было возможности обратного хода, зато существовали аналоги дамок - ими считались фишки, которые перешли на территорию противника и тем самым получали некоторые преимущества перед остальными шашками.

Что касается происхождения, то здесь можно вспомнить и историю об игре "алькерк" - мавританской настольной версии, в которой присутствовало две армии по 12 шашек, а ход производился по пересечению клеток игрового поля.

Помимо теорий возникновения игры, которые имеют под собой определенные исторические факты, существует и легенда. В ней говорится о том, что шашки были придуманы греческим богом Гермесом, который благодаря партии, выиграл 5 дополнительных дней в году. После этого, они добавились к 360 дням, и получилась современная протяжённость года.

Когда говорится об истории, то зачастую упоминается рассказ о греческом воине Паламеде, который придумал игру подобную шашкам, чтобы убить скуку. Это было во времена десятилетней осады одного из городов. Преимуществом данной игры было то, что любой желающий мог в нее сыграть, используя доску или просто нарисовав игровое поле на земле.

Какая же из всех перечисленных теорий является правдивой и достоверной, установить так и не удалось, зато известно, что на территорию древней Руси шашки попали примерно в Х веке нашей эры. При археологических раскопках были найдены шашки из натурального камня, глины и других доступных в то время материалов.

Чуть позже, во времена правления Петра I, игра уже стала настолько популярна и известна, что для неё оборудовались отдельные комнаты. Позже стали устраиваться турниры и соревнования, что еще больше укоренило этот вид развлечений.

Первая статья о шашках в России появилась в 1803 году. Ее автор - Н.М.Карамзин. Любителями шашек были Державин, Пушкин. Л.Н.Толстой в Войне и мире сравнивает стратегию военного искусства со стратегией шашечной игры. Наполеон шахматам предпочитал шашки, черпая в этой игре идеи для тактики ведения боя, и никогда не расставался во своей перламутровой шашечной доской.

Шашки - игра для двух игроков на многоклеточной доске, подобной шахматной, специальными фишками - шашками. Подобно шахматам, шашки воспроизводят действия сражающихся по определённым правилам сил.


2. Классификация

шашки игра программа код

Возможны различные классификации шашечных игр. Прежде всего, можно выделить собственно шашки и «игры шашечного типа», которые шашками обычно не называют (го, рэндзю, и пр., см. выше). Данная статья рассматривает только первую из этих категорий.

По размерам доски - 12х12 (канадские), 10х10 (международные), 8х8 (подавляющее большинство вариантов шашек).

По особенностям правил игры. К ним относятся:

Начальное расположение шашек. Возможны разнообразные варианты.

Направление хода и взятия: по диагонали или по вертикали/горизонтали.

Возможность боя назад простой шашкой.

Правила предпочтения взятия: при наличии нескольких вариантов боя в одних играх игрок может выбрать любой вариант, в других - его свобода выбора ограничена.

Правила превращения простой шашки в дамку: существуют различия в правиле превращения в дамку при прохождении дамочного поля во время взятия нескольких шашек противника. В одних правилах шашка, попавшая в середине хода на поле превращения, становится дамкой сразу же и может продолжать бить, как дамка, в других - простая становится дамкой только на следующем ходу, если предыдущий завершился на поле превращения.

Варианты шашек

Международные шашки. Игра наиболее популярна в Европе. Используется доска 10×10 клеток. У каждого игрока в начальной позиции по 20 шашек, которые занимают первые четыре ряда с каждой стороны, «простая» шашка может бить вперёд и назад, дамка может ходить и бить на любое число полей. «Простая» превращается в дамку только тогда, когда она заканчивает свой ход на поле превращения. При бое «простой» через поле превращения она не превращается и продолжает бой как простая. Если после поля превращения «простая» может бить только как дамка, она остаётся на поле превращения и может продолжать бить как дамка только со следующего хода. Также как и в русских шашках существует правило «турецкого удара». При возможности нескольких вариантов взятия полагается бить максимально возможное количество шашек. Цель игры, как и в русских шашках, - съесть или запереть все шашки противника.

Алтайские шашки. Сочетают в себе правила шашек и шахмат.

Бразильские шашки. Правила аналогичны международным шашкам, но игра ведётся на доске 8×8, по 12 шашек с каждой стороны.

Канадские шашки. В канадские шашки играют на доске 12×12, по 24 шашки с каждой стороны. В остальном правила аналогичны международным шашкам.

Английские шашки. Английские или американские шашки, или чекерс (англ. Checkers). Доска 8×8, в начальной позиции у каждого игрока по 12 шашек, расположенных в первых трёх рядах на чёрных клетках. Первый ход делают чёрные. «Простые» шашки могут ходить по диагонали на одну клетку вперёд и бить только вперёд, дамка может ходить на одну клетку по диагонали вперёд и назад и бить через одну клетку в любую сторону. Бить обязательно, если есть несколько путей, игрок может выбрать любой, не обязательно самый длинный, но пройти его до конца. В 2007 году Джонатан Шеффер доказал, что существует беспроигрышный алгоритм, следуя которому игрок может рассчитывать минимум на ничью в английских шашках, вне зависимости от того, каким цветом он играет. Являясь беспроигрышным, данный алгоритм тем не менее не является оптимальным.

Пул (Pool Checkers). Популярный в США вариант игры. Правила аналогичны международным шашкам, но игра ведётся на доске 8×8, по 12 шашек с каждой стороны. Ещё одно отличие - не требуется бить максимальное количество шашек.

Итальянские шашки. В итальянские шашки играют на шахматной доске размером 8×8 клеток, которая повернута на 90 градусов по сравнению со стандартной. Шашки игроков занимают первые три ряда с каждой стороны, располагаясь на белых полях. Правила игры в итальянские шашки похожи на правила игры чекерс, но имеют некоторые отличия: простая шашка не может бить назад и не может бить дамку; бить нужно максимально возможное количество шашек соперника, а при равных вариантах боя нужно бить максимальное количество дамок.

Испанские шашки. Правила подобны бразильским шашкам, но доска повёрнута на 90 градусов по сравнению со стандартной. Шашки игроков занимают первые три ряда с каждой стороны, располагаясь на белых полях. Ещё одно отличие - простые шашки не могут бить назад.

Турецкие шашки. Оригинальны по внешнему виду турецкие шашки. В них игра ведётся на стандартной 64-клеточной доске, но шашки ходят и бьют не по диагоналям, а по вертикалям и горизонталям, взятие назад для простой шашки запрещено. Ещё одна их особенность - наличие «джентльменских правил» - правил, требующих от игрока предупреждать противника, когда его шашки ставятся под удар и когда простая шашка оказывается на седьмой или восьмой горизонтали.

Поддавки (обратные шашки). Правила игры в поддавки (здесь также существуют варианты 8×8 и 10×10) аналогичны правилам в соответствующие русские и международные шашки, однако цель игры - поддать или запереть все свои шашки.

Шашки-самоеды. Играются на доске 8*8. В отличие от русских шашек, каждый из игроков может (и обязан при возможности, то есть, с самого начала игры) бить как шашки противника, так и свои шашки (взятие всегда производится своей шашкой). Можно бить несколько шашек обоих цветов за один ход. В принципе, возможна игра на доске 10*10, но без правила обязательного взятия большинства.

Столбовые шашки. Старинный русский вариант, где побитая простая шашка не снимается с поля, а ставится под побившую её башню.

Ставропольские шашки. По сравнению с русскими шашками добавлено лишь одно новое правило, резко усложнившее характер борьбы: в ставропольских шашках любой из игроков вместо хода своей шашкой всегда может сделать ход за противника. Так, начиная игру, белые имеют право играть чёрной шашкой. Двигать чужие простые шашки можно только в свою сторону и брать ими следует только свои шашки. Взятие обязательно.

Диагональные шашки. Правила аналогичны правилам в русские шашки, но начальная расстановка - иная (большая диагональ свободна, сверху и слева от нее все клетки заняты черными шашками, снизу и справа - белыми).


3. Правила игры


Правила игры в русские шашки

Для игры в русские шашки используется та же доска, что и для игры в шахматы. Игровыми полями являются только темные поля. У каждого игрока есть по 12 шашек. Первый ход всегда делают белые. Игроки ходят по очереди.

Начальное расположение показано на рисунке1:



Цель игры в шашки: выбить все шашки противника или заблокировать возможность их движения.

Ходят шашки только по диагонали на одно поле вперед.

Выбить шашку противника можно только перскочив ее. Для этого шашка должна находиться рядом с шашкой противника, а позади нее должо быть свободное поле. Причем выбивать можно не только ходом вперед, но и назад. Если после ударного хода, есть возможность выбить этой же шашкой другую враждебную шашку, то игрок делает еще один ударный ход, не передавая права хода сопернику. Т.е. за раз можно выбить одну-две-три и более шашек.

Если у игрока есть возможность выбить шашку противника, то он обязан сделать этот ударный ход, не зависимо от его желаний.

Шашка, которая дошла до противоположной стороны доски становится дамкой. Дамка может перемещаться на любой количество полей по диагонали вперед или назад. Если дамка выбила шашку соперника, то она может стать на любое свободное поле после того поля, где стояло выбитая шашка. Дамка, как и обычная шашка, обязана выбить чужую шашку, если такая возможность имеется. Дамка тоже может за раз выбить несколько шашек.

Если у игрока есть возможность выбить чужие шашки в разных направлениях, то он сам выбирает какой путь выбрать.


4. Код программы


const_DOMOVE = WM_USER + 1;_DEBUG = WM_USER + 2;_IS_ANIMATION = WM_USER + 3;

GameTactics;

{$R *.DFM}

Thinker(APosition: Pointer): Integer;: TPosition;: Integer;:= TPosition(APosition^);(Position, MainForm.Deep, Estimate);(MainForm.Handle, MM_DOMOVE, Integer(@Position), Estimate);:= 0;;

TMainForm.SelectCellBtnClick(Sender: TObject);.SelectCell(1, 6);;

TMainForm.AcceptMove(Sender: TObject; const NewPosition: TPosition);: string;.AddMove(NewPosition);.SetPosition(NewPosition);:= GameOver(NewPosition);St <> '' then(St);.AcceptMove := False;;;;;

TMainForm.FormResize(Sender: TObject);.Left := 3;.Top := 3;.Left := 3;.Top := PositionFrame.Top + PositionFrame.Height + 3;.Width := ClientWidth - 6;.Height := ClientHeight - PositionFrame.Height - 9;.Left := PositionFrame.Left + PositionFrame.Width + 3;.Width := ClientWidth - PositionFrame.Width - 9;.Top := 3;.Height := PositionFrame.Height;.Columns[0].Width := 30;.Columns[1].Width := (PartyView.Width - 40) div 2;.Columns[2].Width := (PartyView.Width - 40) div 2;;

TMainForm.DoMove(var Message: TMessage);: TPosition;:= TPosition(Pointer(Message.WParam)^);(ThreadHandle);:= 0;(nil, NewPosition);;

TMainForm.FormCreate(Sender: TObject);:= mdMachineBlack;.Clear;:= True;:= TGameHistory.Create;;


procedure TMainForm.TuneState;: Boolean;: Cardinal;: Integer;: Integer;ThreadHandle <> 0 then StopThinking;.AcceptMove := (Mode = mdView)((Mode = mdMachineWhite) and (PositionFrame.Position.Active = ActiveBlack))((Mode = mdMachineBlack) and (PositionFrame.Position.Active = ActiveWhite));:= (Mode = mdTwoMachine)((Mode = mdMachineWhite) and (PositionFrame.Position.Active = ActiveWhite))((Mode = mdMachineBlack) and (PositionFrame.Position.Active = ActiveBlack));DebugMenu.Visible then:= Lib.IndexOf(FormatPosition(PositionFrame.Position));Index <> -1 then:= Integer(Lib.Objects[Index]);.Lines.Add(Format('Theory = %.3f', [V/200]));;;not RunThinker then Exit;:= BeginThread(nil, 8*4096, @Thinker, @PositionFrame.Position, CREATE_SUSPENDED, ThreadId);(ThreadHandle, THREAD_PRIORITY_BELOW_NORMAL);(ThreadHandle);;

:= Pointer(Message.WPAram);.Lines.Add(Format('E=%d N=%.3f M=%s',

[Message.LParam, Message.LParam/200, GetLastMove(Position^)]));;

_LEN = 60;

TMainForm.StopThinking;(ThreadHandle, 0);(ThreadHandle);:= 0;;

TGameHistory.AddWhiteMove(const Move: string);: TListItem;:= PartyView.Items.Add;.Caption := IntToStr((MoveNo div 2) + 1);.Subitems.Add(Move);.Selected := NewItem;.Selected.MakeVisible(False);;

procedure TGameHistory.AddBlackMove(const Move: string);: TListItem;(MainForm.PartyView.Items.Count > 0);:= PartyView.Items[PartyView.Items.Count-1];.Subitems.Add(Move);.Selected := Item;.Selected.MakeVisible(False);;

TGameHistory.AddMove(NewPosition: TPosition);: string;:= GetLastMove(NewPosition);Move <> '' thenFPositions[MoveNo].Active = ActiveWhiteAddWhiteMove(Move)AddBlackMove(Move);:= MoveNo + 1;[MoveNo] := NewPosition;;

TGameHistory.NewGame;:= 0;.Items.Clear;[0] := StartBoard;.SetPosition(StartBoard);;

TGameHistory.GetPartyView: TListView;:= MainForm.PartyView;;

TGameHistory.GetPositionFrame: TPositionFrame;:= MainForm.PositionFrame;;

TGameHistory.Undo;: Integer;: TListItem;(MoveNo > 0);.ViewItem.Click;:= MoveNo - 1;.SetPosition(FPositions[MoveNo], False);:= PartyView.Items.Count-1;(Last >= 0);:= PartyView.Items[Last];Item.SubItems.Count > 1Item.SubItems.Delete(1)PartyView.Items.Delete(Last);;

TMainForm.NewGameActionExecute(Sender: TObject);;.NewGame;Mode in [mdMachineWhite, mdTwoMachine] then MachineBlackItem.Click;.AcceptMove := True;;

TMainForm.Deselect(Action: TAction; const Category: string);: Integer;I := 0 to ActionList.ActionCount - 1 doActionList.Actions[I].Category <> Category then Continue;ActionList.Actions[I] = Action then Continue;

(ActionList.Actions[I] as TAction).Checked := False;;;

TMainForm.LevelActionExecute(Sender: TObject);(Sender as TAction, 'Level');Sender as TAction do:= True;:= Tag;;;

procedure TMainForm.UndoMoveActionExecute(Sender: TObject);.Undo;;

TMainForm.ActionListUpdate(Action: TBasicAction;Handled: Boolean);.Enabled := GameHistory.MoveNo > 0;;

TMainForm.ExitActionExecute(Sender: TObject);.Click;;;

TMainForm.MachineWhiteActionExecute(Sender: TObject);(Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;Mode = mdMachineWhite then Exit;:= mdMachineWhite;.FlipBoard := True;;;

TMainForm.MachineBlackActionExecute(Sender: TObject);(Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;Mode = mdMachineBlack then Exit;:= mdMachineBlack;.FlipBoard := False;;;

TMainForm.TwoMachineActionExecute(Sender: TObject);(Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;Mode = mdTwoMachine then Exit;:= mdTwoMachine;;;

TMainForm.ViewGameActionExecute(Sender: TObject);(Sender as TAction, 'Mode');

(Sender as TAction).Checked := True;Mode = mdView then Exit;:= mdView;.Checked := True;ThreadHandle <> 0 then StopThinking;;

TMainForm.SetPositionActionExecute(Sender: TObject);: TPosition;.Click;(Position.Field, 32, $00);.Field[31] := -20;.Field[29] := 70;.Active := ActiveWhite;

// Position.Field[0] := 20;

// Position.Field[2] := -70;

// Position.Active := ActiveBlack;.MoveCount := 0;.SetPosition(Position);;

TMainForm.AddToLibraryActionExecute(Sender: TObject);: Integer;: string;: string;: Integer;:= '.';:= InputBox('Input', 'Please, enter estimate', '');Estimate = '' then Exit;:= StringReplace(Estimate, ',', '.', []);:= Round(200 * StrToFloat(Estimate));:= FormatPosition(PositionFrame.Position);:= Lib.IndexOf(PositionFmt);Index = -1 then.AddObject(PositionFmt, TObject(V))begin.Sorted := False;[Index] := PositionFmt;.Objects[Index] := TObject(V);.Sorted := True;;;;

TMainForm.CopyGameActionExecute(Sender: TObject);: Integer;: TListItem;: string;: TStringList;

Add(const St: string);Length(CurrentSt) + Length(St) + 1 > MAX_LEN then.Add(CurrentSt);:= '';;CurrentSt <> '' then CurrentSt := CurrentSt + ' ';:= CurrentSt + St;;

:= TStringList.Create;:= '';MoveNo := 0 to PartyView.Items.Count-1 do:= PartyView.Items[MoveNo];(Item.Caption + '.');(Item.SubItems[0]);Item.SubItems.Count > 1 then(Item.SubItems[1]);;CurrentSt <> '' then AllParty.Add(CurrentSt);.AsText := AllParty.Text;.Free;;;.

TPositionFrame.BeginDebug;

{$IFDEF SELECT_DEBUG}Assigned(Debug) then.BeginUpdate;.Clear;;

{$ENDIF};

TPositionFrame.EndDebug;

{$IFDEF SELECT_DEBUG}Assigned(Debug) then Debug.EndUpdate;

{$ENDIF};

TPositionFrame.OutputDebug(const St: string);

{$IFDEF SELECT_DEBUG}.Add(St);

{$ENDIF};

TPositionFrame.OutputDebug(const St: string; const Args: array of const);

{$IFDEF SELECT_DEBUG}(Format(St, Args));

{$ENDIF};

TPositionFrame.OutputDebugSelectMove;

{$IFDEF SELECT_DEBUG}, J: Integer;: string;

{$ENDIF}

{$IFDEF SELECT_DEBUG}('Возможные хода:');I := 0 to FAnswersCount - 1 do:= PointsDef[FAnswers[I].MoveStr[0]];:= 1;FAnswers[I].MoveStr[J] = -1 then Break;:= St + FAnswers[I].TakeChar + PointsDef[FAnswers[I].MoveStr[J]];:= J + 1;False;('(%d) %s', [I, St]);;('');:= '';I := 0 to 31 doFSelectedCells[I] then St := ' ' + PointsDef[I];('Selected =' + St);:= '';I := 0 to FAnswersCount-1 do:= St + Format(' %d(%d)', [FEnabledAnswer[I], I]);('EnabledAnswer =' + St);:= '';I := 0 to FUserSelectCount-1 do:= St + ' ' + PointsDef[FUserSelect[I]];('UserSelect =' + St);

{$ENDIF};

TPositionFrame.CellToField(X, Y: Integer): Integer;FlipBoardResult := 4*Y + (7-X) div 2Result := 28 - 4*Y + (X div 2);;

procedure TPositionFrame.ClearSelect;:= -1;;;

TPositionFrame.DrawField(X, Y, Index: Integer);.Draw(Image.Canvas, X*ImageList.Width, Y*ImageList.Height, Index);;

TPositionFrame.IsWhite(X, Y: Integer): Boolean;:= ((X xor Y) and 1) = 0;;

TPositionFrame.Loaded;;:= -1;;

TPositionFrame.RefreshView;, Y: Integer;, X2, Y1, Y2: Integer;, Q: Single;: Integer;: PPosition;AnimateOutPosition := @FAnimatePositionOutPosition := @FPosition; := 8 * ImageList.Width;:= 8 * ImageList.Height;Y := 0 to 7 doX := 0 to 7 doIsWhite(X, Y) then(X, Y, 0)begin:= CellToField(X, Y);Animate and (Position.MoveStr[0] = FieldIndex) then(X, Y, 1)OutPosition.Field[FieldIndex] of: DrawField(X, Y, 2);: DrawField(X, Y, 3);: DrawField(X, Y, 4);: DrawField(X, Y, 5);: DrawField(X, Y, 1)DrawField(X, Y, 6);FSelectedCells[FieldIndex] then.Canvas.Brush.Style := bsClear;.Canvas.Pen.Width := 1;.Canvas.Pen.Color := clGreen;.Canvas.Rectangle(CellRect(X, Y));.Canvas.Rectangle(CellRect(X, Y, -1));;;Animate thenFlipBoard then:= ImageList.Width * (7 - FAnimateWay[FAnimateStep-1] mod 8);:= ImageList.Height * (FAnimateWay[FAnimateStep-1] div 8);:= ImageList.Width * (7 - FAnimateWay[FAnimateStep] mod 8);:= ImageList.Height * (FAnimateWay[FAnimateStep] div 8);begin:= ImageList.Width * (FAnimateWay[FAnimateStep-1] mod 8);:= ImageList.Height * (7 - FAnimateWay[FAnimateStep-1] div 8);:= ImageList.Width * (FAnimateWay[FAnimateStep] mod 8);:= ImageList.Height * (7 - FAnimateWay[FAnimateStep] div 8);;:= FAnimateSubStep /ANIMATE_SUBSTEP_COUNT;:= 1 - P; := Round(Q*X1+P*X2);:= Round(Q*Y1+P*Y2);.Draw(Image.Canvas, X, Y, FAnimateObject);;.Refresh;;

TPositionFrame.SelectCell(X, Y: Integer);IsWhite(X, Y) then Exit;:= CellToField(X, Y);;;

TPositionFrame.SetFlipBoard(const Value: Boolean);FFlipBoard = Value then Exit;:= Value;;;

TPositionFrame.SetPosition(const Position: TPosition; NeedAnimate: Boolean);:= FPosition;:= Position;AcceptMove then PrepareAccept;NeedAnimate and (Position.MoveStr[0] <> -1)BeginAnimate(Position)RefreshView;

TPositionFrame.CellRect(X, Y: Integer; Grow: Integer = 0): TRect;.Left := X * ImageList.Width - Grow;.Top := Y * ImageList.Height - Grow;.Right := Result.Left + ImageList.Width + 2*Grow;.Bottom := Result.Top + ImageList.Height + 2*Grow;;

TPositionFrame.SetAcceptMove(const Value: Boolean);FAcceptMove = Value then Exit;Value and not PrepareAccept then Exit;:= Value;;

TPositionFrame.InitSelectMoveVars;(FSelectedCells, SizeOf(FSelectedCells), $00);(FEnabledAnswer, SizeOf(FEnabledAnswer), $00);:= 0;;

TPositionFrame.PrepareAccept: Boolean;:= GetMoves(FPosition, @FAnswers, ANSWERS_SIZE);:= (FAnswersCount <> 0) and (FAnswersCount <= ANSWERS_SIZE);;;

TPositionFrame.AddCellToMove(X, Y: Integer);IsWhite(X, Y) then Exit;FUserSelectCount = 0 then(CellToField(X, Y));;;Unselect(CellToField(X, Y)) then Exit;ThinkBetter(CellToField(X, Y)) then Exit;MoveComplete(CellToField(X, Y)) then Exit;(CellToField(X, Y));;

TPositionFrame.BeginMove(Field: Integer);: Integer;: Boolean;:= False;I := 0 to FAnswersCount-1 doFAnswers[I].MoveStr[0] = Field then:= True;[I] := 1;;not FindMove then Exit;[0] := Field;:= 1;[Field] := True;;;

TPositionFrame.Unselect(Field: Integer): Boolean;: Integer;:= False;FUserSelectCount = 0 then Exit;FUserSelect[FUserSelectCount-1] <> Field then Exit;[Field] := False;I := 0 to FAnswersCount-1 doFEnabledAnswer[I] = FUserSelectCount then[I] := FEnabledAnswer[I] - 1;:= FUserSelectCount - 1;;:= True;;

TPositionFrame.ThinkBetter(Field: Integer): Boolean;: Integer;:= False;FUserSelectCount <> 1 then Exit;I := 0 to FAnswersCount-1 doFAnswers[I].MoveStr[0] = Field then;(Field);:= True;;;;;

TPositionFrame.MoveComplete(Field: Integer): Boolean;, J: Integer;: Integer;:= False;:= -1;I := 0 to FAnswersCount-1 doFEnabledAnswer[I] <> FUserSelectCount then Continue;:= 2;FAnswers[I].MoveStr[J] <> -1 do J := J + 1;FAnswers[I].MoveStr[J-1] = Field thenUserMove <> -1 then ExitUserMove := I;;UserMove = -1 then Exit;:= False;(FSelectedCells, SizeOf(FSelectedCells), $00);Assigned(FOnAcceptMove) then FOnAcceptMove(Self, FAnswers[UserMove]);:= True;;

TPositionFrame.ContinueMove(Field: Integer);: Integer;: Boolean;

FreeWay(Field1, Field2: Integer): Boolean;: Integer;: TDirection;:= False;Direction := Low(TDirection) to High(TDirection) do:= Field1;:= DirectionTable[Direction, NextI];NextI = -1 then Break;FPosition.Field[NextI] <> 0 then Break;NextI = Field2 then:= True;;;False;;;

SameDiagonal(StartField, Field1, Field2, Field3: Integer): Boolean;: Integer;: Integer;: TDirection;:= False;Direction := Low(TDirection) to High(TDirection) do:= StartField;:= 0;:= DirectionTable[Direction, NextI];NextI = -1 then Break;NextI = Field1 then FindCount := FindCount + 1;NextI = Field2 then FindCount := FindCount + 1;NextI = Field3 then FindCount := FindCount + 1;FindCount = 3 then:= True;;;False;;;

AcceptMarginaly: Boolean;(FUserSelectCount > 0);:=

(FAnswers[I].MoveStr[FUserSelectCount+1] <> -1) and // это не последнее поле(FAnswers[I].MoveStr[FUserSelectCount], Field) and // можно пройти( // Одна диагональ[I].MoveStr[FUserSelectCount-1],[I].MoveStr[FUserSelectCount],,[I].MoveStr[FUserSelectCount+1]);


function AcceptDirectly: Boolean;:= Field = FAnswers[I].MoveStr[FUserSelectCount];;

AcceptVariant: Boolean;:= AcceptDirectly or AcceptMarginaly;;

:= False;I := 0 to FAnswersCount-1 doif FEnabledAnswer[I] <> FUserSelectCount then Continue;AcceptVariant then:= True;[I] := FEnabledAnswer[I] + 1;; end;FindMove then[FUserSelectCount] := Field;:= FUserSelectCount + 1;[Field] := True;; end;;

TPositionFrame.GetAnimate: Boolean;:= Timer.Enabled;;

TPositionFrame.BeginAnimate(const Position: TPosition);: Integer;: Integer;ProcessPair(Field1, Field2: Integer);: Integer;: Integer;: Integer;:= Abs(Field1 - Field2);Field1 > Field2 thenDelta mod 9 = 0Step := -9Step := -7beginDelta mod 9 = 0Step := 9Step := 7;:= Field1;:= NextI + Step;[AnimateWayPos] := NextI;:= AnimateWayPos + 1;NextI = Field2; ;Position do // Вычисляем путьif MoveStr[0] = -1 then Exit; [0] := DecodeField[MoveStr[0]];:= 1; I := 1;MoveStr[I] <> -1 do begin(DecodeField[MoveStr[I-1]], DecodeField[MoveStr[I]]);:= I + 1; end;FAnimatePosition.Field[MoveStr[0]] of: FAnimateObject := 0;: FAnimateObject := 1;: FAnimateObject := 2;: FAnimateObject := 3; end; ;[AnimateWayPos] := -1;:= 1;:= 0;.Enabled := True;;

TPositionFrame.TimerTimer(Sender: TObject);:= FAnimateSubStep + 1;FAnimateSubStep = ANIMATE_SUBSTEP_COUNT then:= FAnimateStep + 1;FAnimateWay[FAnimateStep] = -1 then Timer.Enabled := False;(FAnimateObject = 0) and (FAnimateWay[FAnimateStep] >= 56) then FAnimateObject := 2;(FAnimateObject = 1) and (FAnimateWay[FAnimateStep] <= 7) then FAnimateObject := 3;:= 0;;;;

.


Федеральное агентство образования Республики Бурятия Бурятский государственный университет Институт математики и информатики Кафедра информационных тех

Больше работ по теме:

КОНТАКТНЫЙ EMAIL: [email protected]

Скачать реферат © 2017 | Пользовательское соглашение

Скачать      Реферат

ПРОФЕССИОНАЛЬНАЯ ПОМОЩЬ СТУДЕНТАМ