Автор работы: Пользователь скрыл имя, 23 Июня 2011 в 00:44, курсовая работа
Цель курсовой работы – разработка приложения , моделирующего игру “Морской бой”.
Для выполнения поставленной задачи использовалась среда программирования ИСР Delphi 7.0.
ИСР Delphi – это среда разработки программ, ориентированных на работу в Windows. В основе идеологии Delphi лежит технология визуального проектирования и методология объектно-ориентированного программирования. Для представления программ в Delphi используется разработанный фирмой Borland язык Object Pascal, в основе которого лежит Turbo Pascal. Слово “Object” особо подчеркивает, что язык поддерживает концепцию объектно-ориентированного программирования.
ОСНОВНЫЕ ДАННЫЕ О РАБОТЕ 1
СОДЕРЖАНИЕ 2
ВВЕДЕНИЕ 3
1. РАЗРАБОТКА ЭСКИЗНОГО И ТЕХНИЧЕСКОГО ПРОЕКТОВ ПРОГРАММЫ 4
1.1. Назначение и область применения 4
1.2. Постановка задачи 4
1.3. Описание алгоритма 4
1.4. Организация входных и выходных данных 12
1.5. Выбор состава технических и программных средств 12
2. РАЗРАБОТКА РАБОЧЕГО ПРОЕКТА 13
2.1. Разработка программы 13
2.2 Спецификация программы 15
2.3 Текст программы 16
2.4 Описание программы 25
2.5 Тестирование программы 25
3. ВНЕДРЕНИЕ 26
ЗАКЛЮЧЕНИЕ 29
ГЛОССАРИЙ 30
СПИСОК ИСПОЛЬЗОВАННЫХ ИСТОЧНИКОВ 32
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, Grids,
Menus, StdCtrls,
ExtCtrls;
type
Arr= Array [1..10,1..10] of byte;
// Массив поля, в который записываются координаты кораблей
TMainform = class(TForm)
Comppole: TDrawGrid;
MainMenu1: TMainMenu;
Menu1: TMenuItem;
Menu2: TMenuItem;
Menu3: TMenuItem;
Manpole: TDrawGrid;
Label1: TLabel;
Label2: TLabel;
procedure Menu3Click(Sender: TObject);
procedure ManpoleClick(Sender: TObject);
procedure Menu2Click(Sender: TObject);
function
Proverka(XStart,YStart:Byte;
procedure Generate;
procedure ComppoleMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ComppoleMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure CompRun;
procedure FormCreate(Sender: TObject);
procedure FormPaint(Sender: TObject);
function Win:Boolean;
function ArRound(Ar:Arr; var Xn,Yn,Xe,Ye:Integer):Boolean;
private
{ Private declarations }
public
{ Public declarations }
end;
var
Mainform: TMainform;
x, y, mx, my, vx, vy: integer;
// X, Y - текущие координаты "удара" компьютера
// mX, mY - случайное направление продолжения удара компьютера
// vX, vY - вспомогательные переменные
Size: byte;
// Size - для определения количества ещё не расставленных кораблей в начале игры
Man, Comp: Arr;
// Массивы полей компьютера и игрока
Boat: array[1..10] of byte;
// Вспомогательный массив,
используется компьютером
при расстановке кораблей
implementation
{$R *.DFM}
procedure TMainform.Menu3Click(Sender: TObject);
// Закрытие главного окна, при выборе в главном меню пункта "Выход"
begin
Mainform.Close;
end;
Procedure Draw(X,Y:Byte;Tr:Boolean;Obj:
// Вывод на компонент DrawGrid состояния ячейки массива Ar
Begin
If (Tr)and(Ar[X,Y]=1) Then
Begin
With Mainform do
If Obj.Name='Comppole' Then Comppole.Tag:=Comppole.Tag-1
Else Manpole.Tag:=Manpole.Tag-1;
End;
If (Tr)And(Ar[X,Y]<2) Then Ar[X,Y]:=Ar[X,Y]+2;
Case Ar[x,y] of
1:If Obj.Name='Comppole' then
Begin
Obj.Canvas.Brush.Color:=
Obj.Canvas.FillRect(Rect(21*(
End;
2:Begin
Obj.Canvas.Pen.Color:=
Obj.Canvas.Pen.Width:=2;
Obj.Canvas.MoveTo(21*(x-1)+2,
Obj.Canvas.LineTo(21*(x-1)+18,
Obj.Canvas.MoveTo(21*(x-1)+18,
Obj.Canvas.LineTo(21*(x-1)+2,
End;
3:Begin
Obj.Canvas.Brush.Color:=ClRed;
Obj.Canvas.FillRect(Rect(21*(
End;
End;
End;
function TMainForm.Proverka(XStart,
// Проверка полного уничтожения корабля и вывод его состояния
var Vx,Vy:byte;
Begin
Vx:=0; Vy:=0;
Proverka:=False;
If (Ar[XStart,YStart] in [0,2]) then exit;
If (XStart>1)And(Ar[XStart-1,
(XStart<10)And(Ar[XStart+1,
If (YStart>1)And(Ar[XStart,
(YStart<10)And(Ar[XStart,
// Проверка по оси X
If Vx=1 then
Begin
Vx:=XStart;
While Ar[Vx,YStart]=3 Do
If Vx<10 Then inc(Vx)
Else break;
If Ar[Vx,YStart]=1 Then Exit;
Vx:=XStart;
While Ar[Vx,YStart]=3 Do
If Vx>1 Then dec(Vx)
Else Break;
If Ar[Vx,YStart]=1 Then Exit;
Vx:=1;
End;
// Проверка по оси Y
If Vy=1 then
Begin
Vy:=YStart;
While Ar[XStart,Vy]=3 Do
If Vy<10 Then inc(Vy)
Else break;
If Ar[XStart,Vy]=1 Then Exit;
Vy:=YStart;
While Ar[XStart,Vy]=3 Do
If Vy>1 Then dec(Vy)
Else Break;
If Ar[XStart,Vy]=1 Then Exit;
Vy:=1;
End;
Proverka:=True;
If (Vx=0)And(Vy=0) Then
Begin
Vx:=1;
Vy:=1;
End;
// Прорисовка корабля по оси X
If Vx=1 then
Begin
Vx:=XStart+1;
Repeat
dec(Vx);
If YStart>1 Then Draw(Vx,YStart-1,True,Target_
If YStart<10 Then Draw(Vx,YStart+1,True,Target_
Until (Ar[Vx,YStart]<>3)or(Vx<2);
If
Vx>0 then Draw(Vx,YStart,True,Target_
Vx:=XStart-1;
Repeat
inc(Vx);
If YStart>1 Then Draw(Vx,YStart-1,True,Target_
If YStart<10 Then Draw(Vx,YStart+1,True,Target_
Until (Ar[Vx,YStart]<>3)or(Vx>9);
If
Vx<11 then Draw(Vx,YStart,True,Target_
End;
// Прорисовка корабля по оси Y
If Vy=1 then
Begin
Vy:=YStart+1;
Repeat
dec(Vy);
If XStart>1 then Draw(XStart-1,Vy,True,Target_
If XStart<10 then Draw(XStart+1,Vy,True,Target_
Until (Ar[XStart,Vy]<>3)or(Vy<2);
If Vy>0
then Draw(XStart,Vy,True,Target_
Vy:=YStart-1;
Repeat
inc(Vy);
If XStart>1 then Draw(XStart-1,Vy,True,Target_
If XStart<10 then Draw(XStart+1,Vy,True,Target_
Until (Ar[XStart,Vy]<>3)or(Vy>9);
If
Vy<11 then Draw(XStart,Vy,True,Target_
End;
End;
function TMainform.Win:Boolean;
// Проверка победы компьютера или игрока
// Возвращает значение True, если значение Tag равно нулю
Begin
Win:=False;
// Проверка победы игрока
If Manpole.Tag=0 then
Begin
Manpole.Enabled:=False;
Win:=True;
if
MessageDlg('Вы выиграли!'+#13+#10+'
MbCancel],0)=1 Then Menu2.Click
Else Mainform.Close;
End;
// Проверка победы компьютера
If Comppole.Tag=0 then
Begin
Manpole.Enabled:=False;
Win:=True;
If MessageDlg('Вы
проиграли!'+#13+#10+'
MbCancel],0)=1 Then Menu2.Click
Else Mainform.Close;
End;
End;
function TMainForm.ArRound(Ar:Arr; var Xn,Yn,Xe,Ye:Integer):Boolean;
// Защита от расстановки кораблей друг на друга
var t1,t2:integer;
// Вспомогательные переменные
cu,cd,cr,cl:byte;
// Направление проверки: cu - вверх, cd - вниз, cr - вправо, cl - влево
Begin
ArRound:=True;
If Xn>Xe Then
Begin
t1:=Xn;
Xn:=Xe;
Xe:=t1;
End;
If Yn>Ye Then
Begin
t1:=Yn;
Yn:=Ye;
Ye:=t1;
End;
cu:=1; cd:=1; cl:=1; cr:=1;
If Yn=1 Then cu:=0;
If Ye=10 Then cd:=0;
If Xn=1 Then cl:=0;
If Xe=10 Then cr:=0;
For t1:=Xn-cl to Xe+cr do
For t2:=Yn-cu to Ye+cd do
If Ar[t1,t2]=1 Then
Begin
ArRound:=False;
Exit;
End;
end;
procedure TMainform.CompRun;
// Процедура хода компьютера
Label 1;
Begin
// Выбор случайной координаты, если они не равны нулю
1:If (mX=0)and(mY=0) then repeat
mX:=random(10)+1;
mY:=random(10)+1;
If Win Then Exit;
until Comp[mX,mY]<2;
Draw(mX,mY,True,Comppole,Comp)