Создание игровой программы "Морской бой"

Курсовой проект - Компьютеры, программирование

Другие курсовые по предмету Компьютеры, программирование

y + Pky * i, Play) do begin Inc (k); Inc (i); end; {while} Pkx := -Pkx; Pky := -Pky; i := 1; end; {for} B := k >= MaxShip; if B then Break; tmp := Pkx; Pkx := Pky; Pky := tmp; end; {for} until B; Result := Killed (x, y); if Result then begin Px := x; Py := y; Len := 1; if MaxShip > 1 then State := 2 else Dec (Kor[Len]); end; {if} end; {func State1}

Ее результатом служат координаты выстрела и показатель попадания.

Обстрел

На этом шаге задача заключается в определении направления пойманного корабля. Для этого надо обстрелять четыре ячейки (если они свободны), которые могут служить продолжением. В случае, когда все четыре клетки обстреляны, а попадания не произошло (однопалубный корабль), надо перейти к первому состоянию. Если в какой-то момент удалось подбить еще одну палубу противника, то можно переходит к расстрелу данного корабля, т.к. его направление стало известно. Аналогично первому состоянию, если у игрока остались корабли не более двух палуб, то этим попаданием корабль уничтожен полностью и надо вернуться к прострелу. Посмотрим, как все это выглядит:

 

function State2 (var x, y: Integer): Boolean; var Old: ShortInt; tmp: Integer; k: Integer; begin Old := Play[Px,Py]; Play[Px,Py] := -1; repeat if not Freedom (Px + Pkx, Py + Pky, Play) and not Freedom (Px - Pkx, Py - Pky, Play) then begin tmp := Pkx; Pkx := Pky; Pky := tmp; end; {if} if Random (2) = 0 then begin x := Px + Pkx; y := Py + Pky; end else begin x := Px - Pkx; y := Py - Pky; end; {if} until Freedom (x, y, Play); Result := Killed (x, y); if Result then begin Len := 2; State := 1; if MaxShip > 2 then State := 3 else Dec (Kor[Len]); end else begin k := 4; if not Freedom (Px + 1, Py, Play) then Dec (k); if not Freedom (Px - 1, Py, Play) then Dec (k); if not Freedom (Px, Py + 1, Play) then Dec (k); if not Freedom (Px, Py - 1, Play) then Dec (k); if k < 2 then State := 1; end; {if} Play[Px,Py] := Old; end; {func State2}

Расстрел

На предыдущем шаге удалось установить в каком направлении размещен пойманный корабль. Теперь задача заключается в его полном уничтожении. Для этого надо стрелять справа или слева (сверху или снизу) подбитых палуб, пока не добьем его целиком, после чего вернемся в состояние прострела. При этом следует учитывать максимально возможный корабль и стараться попасть по четвертой палубе, когда четырех палубный корабль уничтожен, нет никакого смысла. Все достаточно просто:

 

function State3 (var x, y: Integer): Boolean; var Old: ShortInt; i: Integer; B: Boolean; begin for i := 1 to 2 do begin x := Px; y := Py; while Play[x,y] = 1 do begin Inc (x, Pkx); Inc (y, Pky); end; {while} Old := Play[x-Pkx,y-Pky]; Play[x-Pkx,y-Pky] := -1; B := Freedom (x, y, Play); Play[x-Pkx,y-Pky] := Old; if B then Break; Pkx := -Pkx; Pky := -Pky; end; {for} if B then begin Result := Killed (x, y); if Result then begin Inc (Len); if Len = MaxShip then begin Dec (Kor[Len]); State := 1; end; {if} end; end else begin Dec (Kor[Len]); State := 1; Result := State1 (x, y); end; {if} end; {func State3}

Осталось собрать все это в одной процедуре, которая будет контролировать результат выстрела и обеспечивать повторный ход при попадании:

 

procedure Comput; var x, y: Integer; Kill: Boolean; begin repeat case State of 1: Kill := State1 (x, y); 2: Kill := State2 (x, y); 3: Kill := State3 (x, y); end; {case} if Kill then Play[x,y] := 1 else Play[x,y] := -2; until not Kill or GameOver; end; {proc Comput}

Можно заметить, что функция Killed вызывается ровно один раз при каждом ходе компьютера. От сюда следует, что компьютер не подглядывает расположение кораблей игрока, т.к. другой возможности узнать о состоянии какой-либо ячейки поля юзера у него нет. В этом можно убедиться на практике, собрав все эти части кода вместе и сделав консольное приложение, в котором функция Killed спрашивала бы у игрока, попал компьютер или промазал. Все это легко с минимальными изменениями реализовать на Turbo Pascal 7.0

3. БЛОК - СХЕМА

 

 

ЗАКЛЮЧЕНИЕ

 

В результате выполнения данной курсовой работы был получен игровой программный продукт, названный Морской бой. Было проведено исследование компонентов программной среды Turbo Pascal 7.0, которые использовались при создании игры.

В результате исследования были выявлены следующие недостатки полученного программного продукта:

  1. Низкий исскуственный интеллект, т.е. ход компьютера осуществляется случайным образом, что делает маловероятным победу компьютера;
  2. При полном потоплении корабля это никак не отражается;
  3. Невозможность возврата на несколько ходов назад;
  4. Работоспособность приложения только в среде Windows;

Однако, помимо недостатков, есть и достоинства у этого программного продукта:

  1. Автоматическая расстановка кораблей ;
  2. Программный продукт малотребователен к системным ресурсам компьютера. Минимальная конфигурация: процессор не ниже Pentium, оперативная память не ниже 16 Mb, операционная система Windows 95 / 98/ Me / NT / 2000 / XP.

В результате учета всех сделанных выше замечаний возможно улучшение созданного программного продукта, на которое потребуется минимум изменений исходного кода программы.

 

СПИСОК ИСПОЛЬЗУЕМОЙ ЛИТЕРАТУРЫ

 

  1. Немнюгин С. Turbo Pascal / Учебный курс. СПб: Питер, 2001.
  2. Сухарев М. Turbo Pascal 7.0. Теория и практика программирования.- СПб.: Наука и техника. 2004.
  3. Фаронов В.В. Турбо Паскаль 7.0. Начальный курс. Учебное пособие М.: Издательство ООО ОМД Групп, 2002.
  4. Федоренко Ю. Алгоритмы и программы на Turbo Pascal / Учебный курс. СПб: Питер, 2001.