Дельфи. Шахматная позиция

Мазмұны

Кіріспе...........................................................................................................................3

1. Программаның нұсқалы және техникалық өңделуі.............................................4    

1.1. Техникалық жабдықтаманың және ақпараттық      қамтамасыздандыруды таңдау.........................................................................5

1.2. Алгоритмдердің сипаттамасы...................................................................9

2. Жобаны өңдеу..........................................................................................................7

2.1. Программаның жазылуы, спецификациясы............................................6

2.2.Программаның мәтіні..................................................................................7

2.3. Программаны тестілеу...............................................................................9

Қорытынды...................................................................................................................9

Пайдаланылған әдебиеттер тізімі..............................................................................0

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Кіріспе

Соңғы кезде адамдардың программалауға қызуғышылығының артқанының байқаймыз. Бұл құбылыс ақпараттық-коммуникативтік технологиялардың адамның күнделікті өміріне енуіне байланысты. Егер кез-келген бір адам копьютермен жұмыс істесе, онда белгілі бір уақыттан кейін сол адамда программалауға қызуғышылық туындайды.

Қазіргі кезде дербес компьютерлердің басым көпшілігіне Windows операциялық жүйелері орнатылған, сондықтан программалауға ұмтылған адам жоғарыда көрсетілген операциялық жүйелерінде жұмыс істейтін программаларды құруға тырысады.

Бұрында қолданушыға Windows-қа арналған программа жасау өте қиын болды, себебі тек тәжірибесі мол мамандарға арналған Borland C++ for Windows компиляторы болған.

Ақпараттық технологиялардың қарқынды дамуы, программалаудың тиімді әрі өнімді әдісітеріне сұраныстың өсуі Borland Delphi-дің пайда болуына әкелді. Delphi-дің негізі ретінде Rapid Application Development технологиясы жатыр. Бұл технологияның мәні программистің жұмысын оңайлатуға негізделген. Rapid Application Development технологиясын қолдану кезіндегі өнімділіктің шамасы салыстырмалы түрде керемет!

Delphi тілінің негізінде көптеген программистерге таныс,  қатаң түрде стандартталған, объектілген-бағытталған Object Pascal тілі жатыр.

Заман талабына сай қолданылатын Delphi пакетінің нұсқасы - Borland Delphi 7 Studio. Delphi-дің графикалық интерфесі өте қарапайым, оны түсіну көп уақыт алмайды. Бұрыңғы нұсқалар сияқты, Borland Delphi 7 Studio алуан түрлі программаларды жасауға мүмкіндік береді: қарапайым біртерезелі утилиталардан бастап деректер базаларымен жұмыс істейтін программаларға дейін. Жетінші нұсқаның негізгі ерекшелігі ретінде NET технологиясымен жұмыс істеу мүмкіндігі.

Курстық жобаның мақсаты : «Шахмат позициясы» программасын құру. Программада бастапқы мәліметті екі түрде енгізу қарастырылуы тиіс:

1) Шахмат позициясы кездейсоқ сандар датчигінің көмегімен генерацияланады;

2) Шахмат позициясы ЭЕМ пернетақтасынан енгізіледі.

Осы мақсатты жүзеге асыру үшін келесі міндеттер орындалуы тиіс:

    1. Шахмат алаңы мен фигураларды бейнелеу;
    2. Корольдер үшін шахтардың анализы;
    3. Корольдердің мүмкін шегінулерінің анализы;
    4. Корольдер үшін әр 6 фигурадан мүмкін жеңілістің анализы;
    5. Фигуралардың алаңдағы кездейсоқ орналастырылуы;

Зерттеу әдістері: кездейсоқ сандар датчигі, процедуралар, фунциялар, Drag & Drop технологиясы.

Программаның қолдану облысы: балаларға шахмат ойынын үйрету аясы. Программа Windows-ң ОЖ-де жұмыс істеуі керек.

 

1.Программаның нұсқалы және техникалық өңделуі

1.1.Техникалық жабдықтаманы және ақпараттық қамтамасыздандыруды таңдау

Borland Delphi 7 Studio программасы Windows 98, NT, 2000, XP, Vista, Seven операциялық жүйелеріне орнатыла алады. Программа компьютерден көп ресурстарды талап етпейді: процессордың такттік жиілігінің минимум шамасы 166 МГц, жедел жадтың мөлшерінің минимумы – 128 Мбайт, қаткыл дискдегі бос орынның мөлшері кем дегенде 128 Мбайт болыу керек.

  Бірдей айнымалыларды сақтау үшін массивтерді қолдану ыңғайлы. Кез-келген айнымалы секілді, массив те айнымалы сияқты сипатталуы керек:

Аты: array [астынғы_индекс. .үстінгі_индекс] of тип

Мұнда:

  • Аты— массивтың аты;
  • array — көрсетілген есім масиивтың аты екенін білдіретін Delphi тілінің арнайы сөзі;
  • Астыңғы_индекс және үстіңгі_индекс — массивтың айнымалыларының өзгеруінің диапазонын анықтайды;
  • тип —массивтың элементтер типі;

Программадағы көптеген жазуларды  белгілеу үшін Label компоненті қолданылады. Label-дағы жазуларды еркшелеуді тек жазудын түсі мен өлшемі арқылы жүзеге асырылады. Компонент өлшемі AutoSize қасиеті арқылы орындалады. Егер бұл қасиеттің шамасы true болса, онда компоненттердің өлшемі жазудың өлшеміне байланысты өзгереді.

Shape компоненті графикалық фигураларды бейнелеу үшін қолданылады. Бұл компоненттің негізгі қасиеті – онын формасы. Компонент 6 түрлі пішінге ие бола алады.

Delphi-де мәзірді белгілейтін екі компонент бар: MainMenu – басты мәзір, PopupMenu – қосымша мәзір. Екі компоненттердің ортақ қасиеттері көп. Бұл компоненттің негізгі қасиеті -  Items. Оның толтырылуы мәзір конструкторы арқылы жүзеге асырылады.

Tabset компоненті арқылы біз орынды үнемдеу үшін, бір жерде бірнеше сілтеме жасай аламыз.

Image компоненті графикалық файлдарды бейнелеуге қолданылады. Оның негізгі қасиеті- Tpicture.

GroupBox компоненті рамкамен қоршалған панельдің рөлін атқара алады.

.

1.2. Алгоритмдердің сипаттамасы

Алгоритм дегеніміз – белгілі бір мәселені шешуінің нұсқаулары. Кез-келген программаны жазу алгоритмдеуден басталады. Программалау процесі ыңғайлы болу үшін алгоритмдерді блок-схемалар түрінде дайындаймыз. .Алгоритмнің жалпылама схемасы 1-суретте көрсетілген.

Сурет 1. Алгоритмнің жалпылама схемасы

Шахматтық позицияны енгізу Drag & Drop технологиясы арқылы жүзеге асырылады, яғни кез-келген фигураны кез-келген бос орынға орналастыруға мүмкіндік бар.

Шахматтық жағдайдың анализының алгоритмі бірнеше алгоритмнең тұрады: 1 – корольдер үшін шахтардың анализының алгоритмі; 2 – корольдердің шахтан шығуының алгоритмы.

2-суретте шахматтық позицияның анализынын жалпылама алгоритмі көрсетілген.

Сурет 2. Шахматтық  позицияның анализының жалпылама алгоритмі

 

 

2 король үшін шахтан  құтылудың амалын табудың алгоритмдері бірдей, тек корольдің түсін анықтайтын параметр ғана өзгертіледі.

Шахтың анализының алгоритмі ойын алаңының әр торының дәйекті түрде теруге негізделеді. Егер торда фигура болса (нольден өзгеше емес),   онда фигураның түрі анықталып, сол фигура қарсы корольге қауіп төндіретінін я төндірмейтінін анықталады. Егер кез келген фигура қарсыластын короліне қауіп төндірсе, шах қойылады. Сонымен бірге корольге шах қойып тұрған фигура түрлі-түсті рамкамен белгілінеді;

Сонымен бірге қарсыластын  короліне де шахтың бар жоғы қарастырылады. Шахты іздеу алгоритмі 3-суретте көрсетілген.

Сурет 3. Шахты  іздеу алгоритмі

 

Сурет 3-ң жалғасы

Нақты фигуралардың корольге қауіп төндіретіндігінің я төндірмейтіндігінің анықтау алгоритмі астыда қарастырылады.

Шахтан құтылудың жалпы алгоритмі 4-суретте көрсетілген.

Сурет 4. Шахтан құтылудың жалпылама алгоритмі

 

Белгілі бір король қанша  бос позицияға ие болса, алгоритм сонша орындалады. Егер жаңа позиция шахқа әкелмесе, онда сол тор жасыл түспен ерекшеленеді. Егер ондай тор болмаса, корольге мат қойылады.

 

 

2.Жобаны өңдеу

2.1. Программаның жазылуы және спецификациясы

“Сhess” программасын жазу  Delphi7 арқылы жүзеге асырылады. Программанын жобасы бір ғана терезеден тұрады - Form1.

Form1 терезесі. 5-суретте жоба  көрсетілген.

 


Сурет 5. Программаның бас терезесі

Form1 компоненті.

Caption = 'Шахмат позициясы'

Menu = MainMenu1

AutoSize = True

OnCreate = FormCreate – ойын алаңының кескінделуі және суреттердің жүктелуі.

1 - Компонент TMainMenu

object N1: TMenuItem

Caption = 'Ойын'

object N2: TMenuItem

Caption = 'Фигураларды кездейсоқ орналастыру'

ShortCut = 113

OnClick = N2Click – Фигураларды кездейсоқ тәртіппен орналастырады.

object N4: TMenuItem

Caption = 'Алаңды тазарту'

ShortCut = 114

OnClick = N4Click – аланды барлық фигуралардан тазартады.

object N3: TMenuItem

Caption = 'Шығу'

OnClick = N3Click – Программадан шығу.

2 - компонент TTabSet

Align = alBottom

Tabs.Strings = ( 'Ақ','Қара')

TabIndex = 0

OnChange = TabSet1Change – 3-компонетттегі фигуралардың суреттерін өзгерту.

3 - компонент TImage

Center = True

DragMode = dmAutomatic

IncrementalDisplay = True

Transparent = True

OnEndDrag = PechkaImageEndDrag – ағымдағы компоненттен басталған Drag & Drop сессиясы аяқталған кезде шақырылады. Мысалы, фигураны алаңға қойғанда.

4 – компонент TLabel

Alignment = taCenter

AutoSize = False

Caption = 'Пешка' – басқа компоненттерде сәйкесінше «піл», «ат», «офицер», «ферзь», «король».

Font.Style = [fsBold]

5 - компонент TImage

IncrementalDisplay = True

OnDragOver = Image1DragOver – Drag & Drop сессиясы ашық болғанда және курсор компонентте орналасқанда шақырылады.

OnEndDrag = Image1EndDrag – ағымдағы  компоненттен басталған Drag & Drop сессиясы аяқталған кезде шақырылады. Мысалы, фигураны алаңға қойғанда.

OnMouseDown = Image1MouseDown –тышқанның  батырмасы компонентке апарып  басылса шақырылады, тордын бос  я бос емес екенінін анықтауға  және Drag & Drop сессиясын бастау үшін  қолданылады.

6 – компонент TShape

Brush.Style = bsClear

Pen.Color = clRed – басқаларда  сәйкесінше  «clBlue», «clLime».

Pen.Width = 2

7 – компонент TGroupBox

Caption = 'Ақ король' и ‘Қара король'  –Tlabel компоненттері үшін рамка бқызметін атқарады.

8 – компоненттер Tlabel –  суретте көрінбейді,корольдердің  позицияларын көрсету үшін керек  (шах немесе мат) .

Align = alClient

Alignment = taCenter

Font.Color = clWindowText

Font.Height = -19

Font.Name = 'Times New Roman'

Font.Style = [fsBold]

ParentFont = False

Layout = tlCenter

 

FormCreate өңдеушісі.

Суреттерді жүктеу үшін келесі алгоритм қолданылады. Алгоритм схемасы 6-суретте көрсетілген.

6-сурет. Суреттерді  жүктеудің алгоритімінің схемасы

Сурет 6-ң жалғасы

Процедура

Procedure TForm1.FormCreate(Sender: TObject);

Var

x, y: integer;

temp: boolean; // TabSet1Change(Sender, 0, Temp) үшін қолданылған уақытша айнымалы;

Begin

KletkaW := Tbitmap.Create;

KletkaB := Tbitmap.Create;

KletkaW.LoadFromFile('КлеткаБ.bmp');

KletkaB.LoadFromFile('КлеткаЧ.bmp');

For x := 0 To 1 Do

For y := 1 To 6 Do

Begin

Figura[x, y] := Tbitmap.create;

Figura[x, y].Transparent := true;

Figura[x, y].TransparentColor := clred;

If x = 0 Then

Figura[x, y].LoadFromFile(FiguraFileName[y] + 'Б.bmp') Else

Figura[x, y].LoadFromFile(FiguraFileName[y] + 'Ч.bmp');

End;

PechkaImage.Picture.LoadFromFile('ПешкаБ.bmp');

Pole := Tbitmap.Create;

Pole.Width := KletkaW.Width * 8 + 9;

Pole.Height := KletkaW.Height * 8 + 9;

Image1.Picture.Bitmap := Pole;

Image1.Width := Pole.Width;

Image1.Height := Pole.Height;

ClearPole; // аланды тазарту

TabSet1Change(Sender, 0, Temp);

End;

 

ClearPole аланды тазарту процедурасы:

Аланды тазарту және есептегіштегі қалып қойған финуралардың санын бастапқы мәнге келтіру үшін қолданылады. Тазартудың алгоритмі 7-суретте көрсетілген.

 

Сурет 7. Шахматтық алаңды тазарту процедурасы

 

Процедура

Procedure TForm1.ClearPole;

Var

x, y: byte;

Const

FiguraCount: Array[1..6] Of byte = (8, 2, 2, 2, 1, 1);

Begin

For x := 0 To 1 Do

For y := 1 To 6 Do // орналастырылған фигуралар жоқ

Figura_count[x, y] := Figuracount[y];

Image1.Canvas.Brush.Color := clblack;

Image1.Canvas.FillRect(Image1.Canvas.ClipRect); // Алаңды қара түспен толтыру

With Image1.Canvas Do

For x := 0 To 7 Do

For y := 0 To 7 Do

Begin // Алаңды торлармен толтыру

fPole_date[x, y] := 0;

If (x * 7 + y) Mod 2 <> 0 Then

draw(x * (KletkaW.Width + 1) + 1, y * (KletkaW.Height + 1) + 1, KletkaW) Else

draw(x * (KletkaB.Width + 1) + 1, y * (KletkaB.Height + 1) + 1, KletkaB);

End;

WKingMat.Caption:=''; BKingMat.Caption:='';

End;

 

N2Click өңдеушісі;

Кездейсоқ шахматтық позицияны  генерациялау кезінде шақырылады.

Шахматтық позицияны кездейсоқ қалыптастыру кезінде алаңның бұрынғы позициядан тазарту жүргізіліп, содан кейін алан жаңа торлармен толады , бірақ 2 король міндетті түрде болуы керек және фигуралардын жалпы саны 32-ден аспауы керек (максимум 16 ақ және 16 қара). 

Орналастыру кезінде тордын бос я бос емес болуын және ойын шартымен белгіленген бірдей фигуралардын максималды санын (мысалы, пекалардын максималды саны 8, аттардын жалпы саны 4) ескеру керек.

8-суретте шахматтық аланды  фигуралармен кездейсоқ орналастырудың алгоритмі көрсетілген.

8-сурет. Кездейсоқ шахматты позицияны генерациялау

 

Процедура

Procedure TForm1.N2Click(Sender: TObject);

Var

x, y, CurrentInstal: integer;

NoFigure, a, b,

InstalCount: byte;

Begin

Randomize;

InstalCount := 0; // жалпы орналастырылғаң фигуралар саны

NoFigure := Random(20); // аланға орналастырылмайтын  фмгуралар саны

ClearPole; // алаңды тазарту

Repeat

Repeat

If Figura_count[0, 6] > 0 Then

Begin

a := 0; b := 6;

End Else

If Figura_count[1, 6] > 0 Then

Begin

a := 1; b := 6;

End Else

Begin

a := Random(29) Div 15; // кездейсоқ сан немесе 1 ақ үшін немесе 0 қара үшін

b := Random(16) Div 3 + 1; // кездейсоқ  фигураны тандау үшін 1-ден 6-ға  деінгі сан

End;

CurrentInstal := Figura_count[a, b];

If Figura_count[a, b] > 0 Then dec(Figura_count[a, b]) Else CurrentInstal := -1;

Until CurrentInstal > 0;

Repeat

x := Random(8); // торды тандау

y := Random(8); // торды тандау

Until fPole_date[x, y] = 0;

DrawFigure(x, y, Figura[a, b]);

fPole_date[x, y] := a * 7 + b;

If b = 6 Then

Begin

If a = 0 Then

Begin // ақ корольдің координаттарын сақтау

WhiteX := x; WhiteY := y;

End Else

Begin // қара корольдің координаттарын сақтау

BlackX := x; BlackY := y;

End;

End;

inc(InstalCount);

Until InstalCount >= 32 - NoFigure;

UpdateFigereCount; // қалған фигуралар туралы ақпаратты жанарту

ChaXAnalis; // шахматтық позицияның анализы

End;

 

PechkaImageEndDrag өндеушісі

Ағымдағы компоненттен басталған Drag & Drop сессиясы аяқталған кезде  шақырылады. Мысалы, фигураны алаңға қойғанда. Өндеуші фигураларды қолдан орналастыру  үшн керек. Процедура алгоритмі 9-суретте  көрсетілген.

Сурет 9. PechkaImageEndDrag алгоритмі

Сурет 9-ң жалғасы

Процедура

Procedure TForm1.PechkaImageEndDrag(Sender, Target: TObject; X, Y: Integer);

Var FigIndex: byte;

Begin

If Target <> Image1 Then exit;

x := (x - 1) Div (KletkaW.Width + 1);

y := (y - 1) Div (KletkaW.Height + 1);

If sender = PechkaImage Then FigIndex := 1 Else

If sender = TuraImage Then FigIndex := 2 Else

If sender = HorseImage Then FigIndex := 3 Else

If sender = OficerImage Then FigIndex := 4 Else

If sender = FersImage Then FigIndex := 5 Else

If sender = KingImage Then

Begin

FigIndex := 6;

If TabSet1.TabIndex = 0 Then

Begin

WhiteX := x; WhiteY := y;

End

Else

Begin

BlackX := x; BlackY := y;

End;

End Else exit;

fPole_date[x, y] := TabSet1.TabIndex * 7 + FigIndex;

dec(Figura_count[TabSet1.TabIndex, FigIndex]);

UpdateFigereCount;

RefreshPole;

End;

 

RefreshPole суретті жаңарту процедурасы.

Аланды толық жанарту  үшін қолданылады (барлық торларды және фигураларды). Аланнын суретін жаңарту процедурасы 10-суретте көрсетілген.

 

Сурет 10. Алаңның суретін жанарту процедурасы.

 

Процедура

Procedure TForm1.RefreshPole;

Var x, y: byte;

Begin

Image1.Canvas.Brush.Color := clblack;

Image1.Canvas.FillRect(Image1.Canvas.ClipRect); // Алаңды қара түспен бояу

With Image1.Canvas Do

For x := 0 To 7 Do

For y := 0 To 7 Do

Begin // Алаңды торлармен толтыру

If (x * 7 + y) Mod 2 <> 0 Then

draw(x * (KletkaW.Width + 1) + 1, y * (KletkaW.Height + 1) + 1, KletkaW) Else

draw(x * (KletkaB.Width + 1) + 1, y * (KletkaB.Height + 1) + 1, KletkaB);

If fPole_date[x, y] > 0 Then

DrawFigure(x, y, Figura[fPole_date[x, y] Div 7, fPole_date[x, y] –

(fPole_date[x, y] Div 7) * 7]);

End;

ChaXAnalis; // Шахтық ситуацияның анализы

End;

 

Image1EndDrag өңдеушісі

Фигуранын орнын ауыстырғанда, оны жою кезінде қолданылады.

Процедура шахматтық позицияны  қолдан енгізу үшін қолданылады. Процедура  алгоритмі 11-суретте көрсетілген.

Сурет 11. Image1EndDrag өндеушісінін алгоритмі

 

Процедура

Procedure TForm1.Image1EndDrag(Sender, Target: TObject; X, Y: Integer);

Var k: byte;

Begin

Image1.DragMode := dmManual;

k := fPole_date[BkPosX, BkPosY];

If Target = Image1 Then

Begin

x := (x - 1) Div (KletkaW.Width + 1);

y := (y - 1) Div (KletkaW.Height + 1);

If k = 6 Then

Begin

WhiteX := x; WhiteY := y;

End

Else If k = 13 Then

Begin

BlackX := x; BlackY := y;

End;

fPole_date[BkPosX, BkPosY] := 0;

fPole_date[x, Y] := k;

End Else

If target<>NIL Then

Begin

fPole_date[BkPosX, BkPosY] := 0;

inc(Figura_count[k Div 7, k - (k Div 7) * 7]);

UpdateFigereCount;

End;

RefreshPole;

End;

 

Пешка қарсы корольді өлтіре алатындығының немесе алмайтындығының анықтау процедурасы.

Шахтық ситуацияны анықтау  кезінде шақырылады, сонын ішінде егер аланда пешка болса. Функция  алгоритмі 12-суретте көрсетілген. Ойын шарты бойынша пешка тек алда тұрған фигураны жей алатындықтан ақ және қара пешкалар үшін екі түрлі  шарт жасау керек.

Сурет 12. Пешка  үшін шахты анықтау алгоритмі

Сурет 12-ң жалғасы

 

Функция

Function TForm1.PechkaDeadKing(x, y: smallint): boolean;

Var

WorB: boolean; // ақ немесе қара фигура

Begin

result := false;

WorB := Odd(fPole_date[x, y] Div 7);

If (Not WorB) And (y > 0) Then // ақтар астыда

Begin

If ((x > 0) And (fPole_date[x - 1, y - 1] = 13)) Or ((x < 7) And (fPole_date[x + 1, y - 1] = 13)) Then

result := true;

End Else

If (y < 7) And (WorB) Then // қаралар астыда

Begin

If ((x > 0) And (fPole_date[x - 1, y + 1] = 6)) Or ((x < 7) And (fPole_date[x + 1, y + 1] = 6)) Then

result := true;

End;

End;

Ат қарсы корольді өлтіре алатындығынын немесе алмайтындығынын  анықтау процедурасы. 

Шахтық ситуацияны анықтау  кезінде шақырылады, сонын ішінде егер аланда ат болса. Функция алгоритмі 14-суретте көрсетілген.

Сурет 14. Ат корольді өлтіре алатындығын анықтау алгоритмі

 

Сурет 14-ң жалғасы

 

Функция

Function TForm1.HorseDeadKing(x, y: smallint): boolean;

Var WorB: boolean;

Begin

result := false;

WorB := Not Odd(fPole_date[x, y] Div 7);

If (x < 6) Then

Begin

 If ((y > 0) And (fPole_date[x + 2, y - 1] = BorWKing[WorB])) Or ((y < 7) And

(fPole_date[x + 2, y + 1] = BorWKing[WorB])) Then result := true;

End;

 If (x > 1) And (Not result) Then

Begin

If ((y > 0) And (fPole_date[x - 2, y - 1] = BorWKing[WorB])) Or ((y < 7) And

(fPole_date[x - 2, y + 1] = BorWKing[WorB])) Then result := true;

End;

If (Y > 1) And (Not result) Then

Begin

If ((X > 0) And (fPole_date[x - 1, y - 2] = BorWKing[WorB])) Or ((x < 7) And

(fPole_date[x + 1, y - 2] = BorWKing[WorB])) Then result := true;

 End;

 If (Y < 6) And (Not result) Then

 Begin

 If ((X > 0) And (fPole_date[x - 1, y + 2] = BorWKing[WorB])) Or ((x < 7) And

(fPole_date[x + 1, y + 2] = BorWKing[WorB])) Then result := true;

End;

End;

Тура қарсы корольді өлтіре алатындығының немесе алмайтындығының анықтау процедурасы.

Шахтық ситуацияны анықтау  кезінде шақырылады, сонын ішінде егер аланда тура болса. Функция алгоритмі 15-суретте көрсетілген.

Сурет 15. Тура корольді өлтіре алатындығын анықтау алгоритмі

 

Функция

Function TForm1.TuraDeadKing(x, y: smallint): boolean;

Var

WorB: boolean; // Ақ немесе қара фигура

a: smallint;

Begin

result := false;

WorB := Not Odd(fPole_date[x, y] Div 7);

If x < 7 Then

For a := x + 1 To 7 Do

If fPole_date[a, y] = BorWKing[WorB] Then

Begin

result := true; break;

End Else

If fPole_date[a, y] <> 0 Then break;

If (Not result) And (x > 0) Then

For a := x - 1 DownTo 0 Do If fPole_date[a, y] = BorWKing[WorB] Then

Begin

result := true; break;

End Else

If fPole_date[a, y] <> 0 Then break;

If (Not result) And (y < 7) Then

For a := y + 1 To 7 Do If fPole_date[x, a] = BorWKing[WorB] Then

Begin

result := true; break;

End Else

If fPole_date[x, a] <> 0 Then break;

If (Not result) And (y > 0) Then

For a := y - 1 DownTo 0 Do If fPole_date[x, a] = BorWKing[WorB] Then

Begin

result := true; break;

End Else

If fPole_date[x, a] <> 0 Then break;

End;

 

Офицер қарсы корольді өлтіре алатындығынын немесе алмайтындығынын  анықтау процедурасы.

Шахтық ситуацияны анықтау  кезінде шақырылады, сонын ішінде егер аланда Офицер болса. Функция алгоритмі 16-суретте көрсетілген.

Сурет 16. Офицер корольді өлтіре алатындығын анықтау алгоритмі

 

 

Сурет 16-ң жалғасы

 

Функция

Function TForm1.OficerDeadKing(x, y: smallint): boolean;

Var  WorB: boolean; // Ақ немесе қара фигура

a, b: smallint; // Айнымалылар

Begin

result := false;

WorB := Not Odd(fPole_date[x, y] Div 7);

a := x + 1; b := y + 1;

If (x < 7) And (y < 7) Then

While (a <= 7) And (b <= 7) Do

Begin

If fPole_date[a, b] = BorWKing[WorB] Then

Begin  result := true; break; End Else

If fPole_date[a, b] <> 0 Then break;

inc(a); inc(b);

End;

a := x - 1; b := y - 1;

If (Not result) And (x > 0) And (y > 0) Then

While (a >= 0) And (b >= 0) Do

Begin

If fPole_date[a, b] = BorWKing[WorB] Then

Begin  result := true; break; End Else

If fPole_date[a, b] <> 0 Then break;

dec(a); Dec(b);

End;

a := x - 1; b := y + 1;

If (Not result) And (x > 0) And (y < 7) Then

While (a >= 0) And (b <= 7) Do

Begin

If fPole_date[a, b] = BorWKing[WorB] Then

Begin result := true; break; End Else

If fPole_date[a, b] <> 0 Then break;

dec(a); inc(b);

End;

a := x + 1; b := y - 1;

If (Not result) And (x < 7) And (y > 0) Then

While (a <= 7) And (b >= 0) Do

Begin

If fPole_date[a, b] = BorWKing[WorB] Then

Begin  result := true; break; End Else

If fPole_date[a, b] <> 0 Then break;

inc(a); Dec(b);

End;

End;

Ферзь қарсы корольді өлтіре алатындығының немесе алмайтындығының анықтау процедурасы.

Шахтық ситуацияны анықтау  кезінде шақырылады, сонын ішінде егер алаңда ферзь болса. Функция алгоритмі 17-суретте көрсетілген. Ферзьдін қадамдары офицер мен туранын қадамдарына ұқсас болғандықтан, шахты анықтау процедурасы алдынғы процедуралардан тұрады.

Сурет 17. Ферзь  корольді өлтіре алатындығын анықтау  алгоритмі

 

 

Функция

Function TForm1.FersDeadKing(x, y: smallint): boolean;

Begin

If OficerDeadKing(x, y) Or TuraDeadKing(x, y) Then result := true Else result := false;

End;

 

Король арқылы шах жасау  қарастырылмайды, себебі ойын шарты  бойынша 2 король бір-біріне жақындай алмайды.

 

2.3. Программаның мәтіні

Unit Unit1;

Interface

Uses

Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,

Dialogs, ExtCtrls, StdCtrls, Tabs, Menus;

Type

Дельфи. Шахматная позиция