Автор работы: Пользователь скрыл имя, 21 Января 2014 в 16:18, дипломная работа
Цель дипломной работы: моделирование аналогов популярной игры шашки.
Одним из разделов компьютерного моделирования, являются компьютерные игры, зависящие от случайности и стратегических правил игры.
Актуальность темы на сегодняшний день: тема как никогда актуальна, за счет достаточно высокой конкуренции на рынке подобных приложений и программ. Многие подобные разработки, нацелены на игру «компьютер – человек», и искусственный интеллект в редких случаях, обыгрывает даже чемпионов.
Введение…………………………………………………………………………..2Терминология…………………………………………………………………….4
Аналитический обзор
I. Шашки.
История шашечной игры……………………………………………………..8
Классификация……………………………………………………………....10
Варианты шашек……………………………………………………...…......10
Шашки как вид спорта....................................................................................15
II. Среда программирования Delphi.
2.1 Краткое определение Delphi…………………………………………...……16
2.2 Целевая платформа…………………………………………………………..16
2.3 История языка………………………………………………………………..16
2.4 Синтаксис языка……………………………………………………………..20
2.5 Объектно-ориентированные особенности языка…………………………..21
2.6 Примеры……………………………………………………………………..21
2.7 Расширения файлов………………………………………………………….23
Глава III Практическая часть.
Работа в среде Delphi, написание программы «Шашки»
3.1 Проект, его местоположение………………………………………………..24
3.2 Запуск программы с компакт диска………..……………………………….25
3.3 Исходный код программы…………………………………………………..27
Заключение…………………………………………………………………..….45
Список литературы………………………………………………………….…46
If vcbChess.Board.GetDraught(xP, yP)<>nil Then
Begin
If vcbChess.Board.GetDraught(xP, yP).Side=PlayerSide Then
vcbChess.Cursor:=crHandPoint
End;
end;
procedure TfmCheckers.vcbChessMouseDown(
Var
xP, yP:Integer;
begin
If StrikeMode Then Exit;
vcbChess.GetCellNumberByCoord(
If Not(IsDraughtChosen) Then //Если еще нет выбранной шашки
Begin
TrySelectNewDraught(xP, yP);
End
Else Begin //Если уже есть выбранная шашка
If vcbChess.Board.GetDraught(xP, yP)=nil Then
Begin //Если клетка пустая, то обработаем как отпускание мыши
vcbChessMouseUp(Sender, Button, Shift, X, Y);
End
Else Begin //Если там стоит наша шашка, то сбросим выбор и рекурсируем
If vcbChess.Board.GetDraught(xP, yP).Side=PlayerSide Then
Begin
vcbChess.Refresh;
IsDraughtChosen:=False;
vcbChessMouseDown(Sender, Button, Shift, X, Y);
End;
End;
End;
end;
procedure TfmCheckers.vcbChessMouseUp(
Var
xP, yP:Integer;
Moves, Strikes, Strickens:TList;
begin
vcbChess.GetCellNumberByCoord(
If IsDraughtChosen Then //Если есть выбранная шашка
Begin
//Проверим: можно ли в принципе шагнуть сюда
If vcbChess.Board.GetDraught(xP, yP)<>nil Then Exit;
//Клетка пустая
//Проверим правильность хода в эту клетку
vcbChess.Board.FindMoves(
If Strikes.Count=0 Then //Нет рубки - пытаемся просто ходить
Begin
If CheckPosition(xP, yP, Moves)>=0 Then //Ход верен!
Begin
vcbChess.Board.MoveDraught(
IsDraughtChosen:=False;
vcbChess.Refresh;
vcbChessMouseMove(Sender, Shift, X, Y);
SwitchCurrentPlayer; //Ход сделан - переключем игрока
CheckForWin;
End;
End
Else Begin //Есть возможность рубки - обязательно!
TryMakeStrike(xP, yP);
End;
ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);
End
Else Begin //Шашка не еще выбрана
End;
end;
Procedure TfmCheckers.
Var
Moves, Strikes, Strickens:TList;
StrikingDraughts:TList;
Begin
If vcbChess.Board.GetDraught(x, y)=nil Then Exit;
If vcbChess.Board.GetDraught(x, y).Side<>PlayerSide Then Exit;
//Проверим обязательные рубки
StrikingDraughts:=vcbChess.
If StrikingDraughts.Count>0 Then
Begin
If CheckPosition(x, y, StrikingDraughts)<0 Then
Begin
ClearMoves(StrikingDraughts);
Exit;
End;
End;
ClearMoves(StrikingDraughts);
DraughtPosition.X:=x;
DraughtPosition.Y:=y;
IsDraughtChosen:=True;
//Отрисуем возможные ходы с учетом обязаловки рубки
vcbChess.Board.FindMoves(x, y, Moves, Strikes, Strickens);
If Strikes.Count=0 Then
vcbChess.DrawMoves(Moves, nil)
Else
vcbChess.DrawMoves(nil, Strikes);
ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);
End;
Procedure TfmCheckers.TryMakeStrike(x, y:Integer);
Var
Moves, Strikes, Strickens:TList;
CP:PCellPosition;
Begin
If Not(IsDraughtChosen) Then Exit;
vcbChess.Board.FindMoves(
//Возможна ли рубка в данную клетку
If CheckPosition(x, y, Strikes)>=0 Then //Рубка верна!
Begin //рубим
//Определим срубленную шашку
CP:=Strickens.Items[
vcbChess.Board.DeleteDraught(
//Перескакиваем
vcbChess.Board.MoveDraught(
DraughtPosition.X:=x; DraughtPosition.Y:=y;
ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);
//Определим: возможно ли продолжение рубки
vcbChess.Board.FindMoves(
If Strikes.Count>0 Then
Begin
StrikeMode:=True; //Установим режим рубки
End
Else Begin
StrikeMode:=False;
SwitchCurrentPlayer; //Закончена рубка - переключим игрока
End;
ClearMoves(Moves);
ClearMoves(Strikes);
ClearMoves(Strickens);
vcbChess.Refresh;
End;
If StrikeMode Then
Begin
IsDraughtChosen:=False;
TrySelectNewDraught(
End;
CheckForWin;
End;
Procedure TfmCheckers.
Begin
If CurrentPlayer=sdWhite Then CurrentPlayer:=sdBlack Else CurrentPlayer:=sdWhite;
If LocalGame Then PlayerSide:=CurrentPlayer;
If CurrentPlayer=sdWhite
Then stCurrentPlayer.Caption:='
If PlayerSide=CurrentPlayer Then
Begin
pnChessBoard.Enabled:=True;
End
Else Begin
pnChessBoard.Enabled:=False;
End;
End;
Function TfmCheckers.CheckForWin:
Begin
Result:=-1;
//Проверим победу по срубам
If vcbChess.Board.CountDraughts(
Begin
Result:=sdBlack;
End;
If vcbChess.Board.CountDraughts(
Begin
Result:=sdWhite;
End;
//Проверим победу по блокировкам
If Not(vcbChess.Board.AbleToMove(
If CurrentPlayer=sdWhite Then Result:=sdBlack Else Result:=sdWhite;
If Result<0 Then Exit;
//Game Over!
miCancelGameClick(Self);
Case Result Of
sdWhite: Application.MessageBox('
sdBlack: Application.MessageBox('
End;
End;
procedure TfmCheckers.Timer1Timer(
begin
// Inc(PlayTime);
// stTimer.Caption:=Format('%d:%.
stTimer.Caption:=TimeToStr(
end;
procedure TfmCheckers.
begin
LocalGame:=True;
lbedWhiteName.ReadOnly:=True;
lbedBlackName.ReadOnly:=True;
// PlayTime:=0;
StartTime:=Now;
PlayerSide:=sdWhite;
CurrentPlayer:=sdBlack;
IsDraughtChosen:=False;
StrikeMode:=False;
vcbChess.Board.Respawn;
vcbChess.Refresh;
pnChessBoard.Enabled:=True;
Timer1.Enabled:=True;
SwitchCurrentPlayer;
end;
procedure TfmCheckers.miCancelGameClick(
begin
Timer1.Enabled:=False;
pnChessBoard.Enabled:=False;
lbedWhiteName.ReadOnly:=False;
lbedBlackName.ReadOnly:=False;
Application.MessageBox('Игра зкончена', 'Игра закончена', MB_OK+MB_ICONINFORMATION);
end;
procedure TfmCheckers.miAboutClick(
begin
fmAbout.ShowModal;
end;
end.
{$A8,B-,C+,D+,E-,F-,G+,H+,I+,
{$MINSTACKSIZE $00004000}
{$MAXSTACKSIZE $00100000}
{$IMAGEBASE $00400000}
{$APPTYPE GUI}
unit Draughts;
interface
Uses
Classes;
Type
TMove=Record
dX, dY:Integer;
End;
Const
ctWhite=0;
ctBlack=1;
ctNone=255;
sdWhite=0;
sdBlack=1;
kdSimple=0;
kdKing=1;
MoveNW=1; {}
MoveNE=2; {}
MoveSW=3; {}
MoveSE=4; {}
DraughtMoves:Array[1..4] Of TMove=((dX:-1; dY:1), (dX:1; dY:1), (dX:-1; dY:-1), (dX:1; dY:-1));
Type
TPossibleMoves=Set Of MoveNW..MoveSE;
PCellPosition=^TCellPosition;
TCellPosition=Record
X, Y:Integer;
End;
TDraught=Class(TObject)
Private
_Side:Integer; {Сторона: Белая/Черная}
_Kind:Integer; {Тип: Простая/Дамка}
PossibleMoves:TPossibleMoves; {Возможные ходы}
Procedure SetSide(Value:Integer);
Procedure SetKind(Value:Integer);
Public
Constructor Create(sd:Integer);
Destructor Destroy; Override;
Property Side:Integer read _Side write SetSide;
Property Kind:Integer read _Kind write SetKind;
End;
TBoardCell=Record
CellType:Integer;
Draught:TDraught;
End;
TChessBoard=Class(TObject)
Private
Cells:Array[0..9, 0..9] Of TBoardCell;
Public
Constructor Create;
Destructor Destroy; Override;
Function AddDraught(x,
y:Integer; Side:Integer; Kind:Integer=kdSimple):
Procedure DeleteDraught(x, y:Integer);
Function GetDraught(x, y:Integer):TDraught;
Function SetDraught(x, y:Integer; Const Draught:TDraught):Boolean;
Procedure Clear;
Procedure Respawn;
Function MoveDraught(FromX, FromY, ToX, ToY:Integer):Boolean;
Procedure FindMoves(x, y:Integer; Var Moves, Strikes, Strickens:TList);
Function FindStrikingDraughts(Side:
Function CountDraughts(Side:Integer):
Function AbleToMove(Side:Integer):
End;
Procedure ClearMoves(Var Moves:TList);
Function CheckPosition(x, y:Integer; Const Positions:TList):Integer;
implementation
Procedure ClearMoves(Var Moves:TList);
Var
i:Integer;
CP:PCellPosition;
Begin
If Moves=nil Then Exit;
For i:=0 To Moves.Count-1 Do
Begin
CP:=Moves.Items[i];
Dispose(CP);
End;
Moves.Free;
Moves:=nil;
End;
Function CheckPosition(x, y:Integer; Const Positions:TList):Integer;
Var
i:Integer;
CP:PCellPosition;
Begin
Result:=-1;
If Positions=nil Then Exit;
For i:=0 To Positions.Count-1 Do
Begin
CP:=Positions.Items[i];
If ((CP^.X=x) And (CP^.Y=y)) Then
Begin
Result:=i;
Exit;
End;
End;
End;
Constructor TDraught.Create(sd:Integer);
Begin
Inherited Create;
Side:=sd;
Kind:=kdSimple;
End;
Destructor TDraught.Destroy;
Begin
Inherited Destroy;
End;
Procedure TDraught.SetSide(Value:
Begin
If Value=sdWhite Then
Begin
_Side:=sdWhite;
PossibleMoves:=[MoveNW, MoveNE]
End
Else Begin
_Side:=sdBlack;
PossibleMoves:=[MoveSW, MoveSE];
End;
If Kind=kdKing Then PossibleMoves:=[MoveNW, MoveNE, MoveSW, MoveSE];
End;
Procedure TDraught.SetKind(Value:
Begin
If Value=kdSimple Then
_Kind:=kdSimple
Else
_Kind:=kdKing;
SetSide(_Side);
End;
Constructor TChessBoard.Create;
Var
x, y:Integer;
Begin
Inherited Create;
For y:=0 To 9 Do
Begin
For x:=0 To 9 Do
Begin
If ((x=0) Or (y=0) Or (x=9) Or (y=9)) Then
Cells[y, x].CellType:=ctNone
Else
If ((Odd(x) And Odd(y)) Or (Not(Odd(x)) And Not(Odd(y)))) Then
Cells[y, x].CellType:=ctBlack
Else
Информация о работе Создание модели игры «Шашки» в среде программирования Delphi