Автор работы: Пользователь скрыл имя, 25 Мая 2011 в 14:00, курсовая работа
В данной курсовой работе речь пойдет о создании несложной игровой программы «Морской бой», которая и будет являться объектом исследования.
Введение………………………………………………………………………..3
1. Разработка эскизного и технического проектов программы.....................5
1.1 Назначение и область применения.............................................................4
1.2 Постановка задачи........................................................................................4
1.3 Описание алгоритма.....................................................................................5
2. Разработка рабочего проекта.......................................................................12
2.1 Разработка программы...............................................................................12
2.2 Текст программы........................................................................................14
Заключение.......................................................................................................26
Список использованных источников.............................................................27
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)
If Proverka(mX,mY,Comppole,Comp) then
Begin
mX:=0;
mY:=0;
Goto 1;
End;
If Comp[mX,mY]=2 then
Begin
mX:=0;
mY:=0;
vX:=0;
vY:=0;
Exit;
End;
If (vX=0)and(vY=0) then Repeat
Case random(4) of
0:vY:=-1;
1:vX:=-1;
2:vX:=1;
3:vY:=1;
End;
If (Comp[mX+vX,mY+vY]>1)or(mX+vX=
or(mY+vY=11) Then
Begin
vX:=0;
vY:=0;
End;
Until Comp[mX+vX,mY+vY]<2;
Repeat
mX:=mX+vX;
mY:=mY+vY;
Draw(mX,mY,True,Comppole,Comp)
If Proverka(mX,mY,Comppole,Comp) then
Begin
mX:=0;
mY:=0;
vX:=0;
vY:=0;
Goto 1;
End
else
If ((mX+vX=0)or(mX+vX=11)or(mY+
Begin
vX:=-vX;
vY:=-vY;
Goto 1;
End;
Until Comp[mX,mY]=2;
If (mX>0)or(mY>0) then
Begin
vX:=-vX;
vY:=-vY;
mX:=mX+vX;
mY:=mY+vY;
If (Comp[mX+vX,mY+vY]=2)or(mX+vX<
Begin
vX:=0;
vY:=0;
End;
End
Else
Begin
vX:=0;
vY:=0;
End;
End;
procedure TMainform.ManpoleClick(Sender: TObject);
// Процедура хода игрока
Begin
// Определение координат щелчка мыши
X:=Manpole.Selection.Right+1;
Y:=Manpole.Selection.Bottom+1;
// Если ячейка открыта, то выходим
If Man[X,Y] in [2,3] Then Exit;
Draw(X,Y,True,Manpole,Man);
Proverka(X,Y,Manpole,Man);
// Проверка на победу одной из сторон
If Win Then Exit;
// Если в ячейке ничего нет, то - ход компьютера
If Man[X,Y]=2 then CompRun;
end;
procedure TMainForm.Generate;
// Процедура
расстановки кораблей
Label 1,2;
var napr:array [0..3] of byte;
// Сохраняет направления, которые были испробованы при постановке корабля на поле
t1:integer;
// Вспомогательная переменная
Begin
For x:=4 downto 1 do
For y:=x to 4 do
Begin
// Обнуления направлений
1:For Size:=0 to 3 do
Napr[Size]:=0;
// Случайный выбор координат
Repeat
mX:=random(10)+1;
mY:=random(10)+1;
Until Man[mX,mY]=0;
2:t1:=0;
// Проверка направлений
For Size:=0 to 3 do
t1:=t1+Napr[Size];
// Если все перебраны, то заново определяем координаты
If t1=4 then Goto 1;
Repeat
vY:=0; vX:=0;
// Случайное определение направления
Size:=random(4);
Case Size of
0:vX:=1;
1:vX:=-1;
2:vY:=-1;
3:vY:=1;
end;
Until Napr[Size]=0;
Napr[Size]:=1;
// Если направление выбрано по оси X, то...
If vX<>0 Then
Begin
If vX=1 Then vX:=mX+X-1
Else vX:=mX-X+1;
// Проверка преемственности
If (vX<1)or(vX>10) Then Goto 2;
If not ArRound(Man,mX,mY,vX,mY) Then Goto 2;
// Регистрация корабля в массиве
For mX:=mX To vX Do
Man[mX,mY]:=1;
End;
// Если направление выбрано по оси Y, то...
If vY<>0 Then
Begin
If vY=1 Then vY:=mY+X-1
Else vY:=mY-X+1;
// Проверка преемственности
If (vY<1)or(vY>10) Then Goto 2;
If not ArRound(Man,mX,mY,mX,vY) Then Goto 2;
// Размещение корабля в массиве
For mY:=mY To vY Do
Man[mX,mY]:=1;
End;
End;
End;
procedure TMainform.Menu2Click(Sender: TObject);
// Выбор
из главного меню пункта "Начать
новую"
procedure Clear(Obj:TDrawGrid; var AR:Arr);
// Очистка
графического поля и
Begin
Obj.Canvas.Brush.Color:=
For x:=1 To 10 Do
For y:=1 To 10 do
Begin
Ar[x,y]:=0;
Obj.Canvas.FillRect(Rect(21*(
End;
End;
Begin
Clear(Comppole,Comp);
Clear(Manpole,Man);
Manpole.Enabled:=False;
Label1.Font.Color:=ClBlack;
Label1.Caption:='Корабль: 4-палубный';
Size:=1;
For x:=4 downto 1 do
For y:=x to 4 do
Begin
Boat[Size]:=x;
Inc(Size);
End;
Size:=1;
Comppole.Enabled:=True;
End;
procedure TMainform.ComppoleMouseDown(
Shift: TShiftState; X, Y: Integer);
// Координаты, при нажатии клавиши мыши (при расстановке кораблей игроком)
Begin
If Button<>MbLeft Then Exit;
mX:=Comppole.Selection.Right+
mY:=Comppole.Selection.Top+1;
End;
procedure TMainform.ComppoleMouseUp(
Shift: TShiftState; X, Y: Integer);
// Координаты при отпускании клавиши мыши (при расстановке кораблей игроком)
Begin
If Button<>MbLeft Then Exit;
X:=Comppole.Selection.Right+1;
Y:=Comppole.Selection.Top+1;
// Если направление установки корабля горизонтальное
If X=mx then
Begin
// Если количество выбранных клеток отлично от количества палуб корабля, то выход
If Boat[Size]<>abs(Y-my)+1 then exit;
// Проверка на пустоту соседних клеток
If not ArRound(Comp,X,mY,X,Y) Then Exit;
// Регистрация корабля в массиве и отображение его на игровом поле
For mY:=mY to Y do
Begin
Comp[X,mY]:=1;
Draw(X,mY,False,Comppole,Comp)
End;
End
// Если направление установки корабля вертикальное
Else If Y=my Then
Begin
// Если количество выбранных клеток отлично от количества палуб корабля, то выход
If Boat[Size]<>abs(X-mx)+1 then exit;
// Проверка на пустоту соседних клеток
If not ArRound(Comp,mX,Y,X,Y) Then exit;
// Запись корабля в массив и отображение его на игровом поле
For mX:=mX to X do
Begin
Comp[mX,Y]:=1;