Автор работы: Пользователь скрыл имя, 15 Февраля 2013 в 18:25, курсовая работа
Соңғы кезде адамдардың программалауға қызуғышылығының артқанының байқаймыз. Бұл құбылыс ақпараттық-коммуникативтік технологиялардың адамның күнделікті өміріне енуіне байланысты. Егер кез-келген бір адам копьютермен жұмыс істесе, онда белгілі бір уақыттан кейін сол адамда программалауға қызуғышылық туындайды.
Қазіргі кезде дербес компьютерлердің басым көпшілігіне Windows операциялық жүйелері орнатылған, сондықтан программалауға ұмтылған адам жоғарыда көрсетілген операциялық жүйелерінде жұмыс істейтін программаларды құруға тырысады.
Кіріспе...........................................................................................................................3
1. Программаның нұсқалы және техникалық өңделуі.............................................4
1.1. Техникалық жабдықтаманың және ақпараттық қамтамасыздандыруды таңдау.........................................................................5
1.2. Алгоритмдердің сипаттамасы...................................................................9
2. Жобаны өңдеу..........................................................................................................7
2.1. Программаның жазылуы, спецификациясы............................................6
2.2.Программаның мәтіні..................................................................................7
2.3. Программаны тестілеу...............................................................................9
Қорытынды...................................................................................................................9
Пайдаланылған әдебиеттер тізімі..............................................................................0
For y := 1 To 6 Do // орналастырылған фигуралар жоқ
Figura_count[x, y] := Figuracount[y];
Image1.Canvas.Brush.Color := clblack;
Image1.Canvas.FillRect(Image1.
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(
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.
UpdateFigereCount;
RefreshPole;
End;
RefreshPole суретті жаңарту процедурасы.
Аланды толық жанарту үшін қолданылады (барлық торларды және фигураларды). Аланнын суретін жаңарту процедурасы 10-суретте көрсетілген.
Сурет 10. Алаңның суретін жанарту процедурасы.
Процедура
Procedure TForm1.RefreshPole;
Var x, y: byte;
Begin
Image1.Canvas.Brush.Color := clblack;
Image1.Canvas.FillRect(Image1.
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