Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовой Алгоритмические языки (Игра " Морской бой ").doc
Скачиваний:
129
Добавлен:
22.06.2014
Размер:
138.75 Кб
Скачать
  1. Заключение

В результате выполнения данной курсовой работы был получен игровой программный продукт - «Морской бой». Данная игра получилась нетребовательной к системным ресурсам, но с низким искусственным интеллектом. В процессе игры заметно, что прицел оставляет «дыры» в клетках отмеченных крестиком или точкой. Нет возможности начать новую игру, не выходя из программы. Не указывается «убит» корабль или только «ранен».

Большим плюсом можно считать то, что в ходе выполнения этой работы мною более глубоко был изучен язык программирования «Паскаль», его графические возможности, а так же некоторый опыт в создании графического интерфейса.

СПИСОК ЛИТЕРАТУРЫ

  1. Зюзьков В.М. Программирование: Курс лекций – Томск, 1999.

  2. Грызлов В.И. Грызлова Т.П. Турбо Паскаль 7.0. – Москва.: 1998. – 400 с., ил.

3. Попов В. Паскаль и Дельфи: Самоучитель – СПб.; Питер, 2003. – 544с.: ил.

ПРИЛОЖЕНИЕ 1

Листинг программы

program SeaBattle;

uses crt, graph; {подключаемые модули }

const step=20; {приращение для установки координат ячеек}

s:array[1..10] of char=('а','б','в','г','д','е','ж','з','и','к'); {обозначение клеток по вертикали }

s1:array[1..10] of string=('1','2','3','4','5','6','7','8','9','10'); { обозначение клеток по горизонтали }

g=220; { координаты левого верхнего угла поля }

v=140; { и соответственно первой клетки}

type kletka=record { тип запи си с информацией о }

x,y: integer; {координатах ячейки }

stat: -1..2; {и ее статусе }

end;

Sea=array[1..10,1..10] of kletka; {массив с информацией о всех клетках поля }

var drive, mode:integer; {переменные для установки графического режима }

cell:kletka;

Pole: Sea;

i,j:integer; { координаты записи в массиве}

count:byte; { счетчик «убитых» кораблей}

key:char; {сохранение нажатых клавиш }

l:integer; {счетчик цикла }

procedure init; { процедура установки графического режима }

var errorcode:integer;

begin

drive:=detect; {определяем драйвер }

initgraph(drive,mode,''); {и видеорежим }

errorcode:=GraphResult;

if errorcode <>grok then {если обнаружена ошибка }

begin

writeln('Graf system error ',GraphErrorMsg(errorcode)); {выводим о ней сообщение }

Halt(1); {и выходим из программы }

end;

end;

procedure image; {процедура выводящая на экран рисунок игрового поля }

var x,y:integer; {рабочие координаты }

begin;

cleardevice; {очищаем экран }

SetBkColor(3); {устанавливаем цвет фона }

SetColor(white); {цвет }

SetLineStyle(0,0,3); {и стиль линий }

rectangle(0,0,getmaxx,getmaxy ); { рисуем прямоугольник по краю экрана}

SetTextStyle(2,0,6); {устанавливаем стиль выводимых на экран букв и цифр }

y:=v; {координаты по вертикали }

x:=g; {и горизонтали }

for i:=1 to 10 do

begin

OutTextXY(x-15,y,s[i]); {выводим буквы от « а » до « к »с левой стороны поля }

y:=y+20; {по вертикали }

end;

y:=v; {возвращаем у начальное значение }

for i:=1 to 10 do

begin

OutTextXY(x+5,y-20,s1[i]); {выводим числа от 1 до 10 }

x:=x+20; {по горизонтали }

end;

x:=g; { возвращаем х начальное значение }

Rectangle(x,y,x+200,y+200); {рисуем границы поля }

SetLineStyle(0,0,1); {стиль линий, которыми будем расчерчивать поле }

for i:=1 to 9 do

begin {расчерчиваем поле}

x:=x+step;

line(x,v,x,v+200);

y:=y+step;

line(g,y,g+200,y);

end;

end; {конец процедуры}

procedure setup(var Pole:Sea); {процедура присваивания координат каждой клетке и ее «обнуление» }

var i,j: integer; {номер записи в массиве }

a,b:integer; { рабочие координаты}

begin

b:=v; {присваиваем b начальные координаты по вертикали }

for i:=1 to 10 do

begin

a:=0;

for j:=1 to 10 do

begin

With Pole[i,j] do {с записью номер i, j делаем }

Begin

x:=g+a; {присваиваем клетке }

y:=b; {координаты }

stat:=0; {указываем что она пуста }

end;

a:=a+step; {увеличиваем координату по горизонтали }

end;

b:=b+step; { увеличиваем координату по вертикали }

end;

end; {конец процедуры setup}

function Freecell (x, y: Integer; Pole: Sea): Boolean; { функция определяющая наличие свободного пространства вокруг корабля}

const d: array[1..8,1..2] of Integer =

((0,1),(1,0),(0,-1),(-1,0),(1,1),(-1,1),(1,-1),(-1,-1)); {массив для определения соседних с кораблем клеток }

var i: Integer; {счетчик цикла }

dx, dy: Integer; {номер проверяемой клетки, стоящей рядом с кораблем}

begin

if (0 < x) and (x < 11) and (0 < y) and (y < 11) and (Pole[x,y].stat = 0) then {если клетка свободна} {и не выходит за пределы поля }

begin

for i := 1 to 8 do

begin

dx := x + d[i,1]; { определяем номер }

dy := y + d[i,2]; {соседней ячейки }

if (dx > 0) and (dx < 11) and (dy > 0) and (dy < 11) and (Pole[dx,dy].stat <> 0) then{и если она занята}

begin

Freecell := False; {возвращаем «ложь» }

Exit; {и выходим из программы }

end; {if}

end; {for}

Freecell := True; {если все ячейки свободны }

end else Freecell := False; {проверяемая ячейка занята }

end; {функция Freecell}

procedure Setup_Ships (var Pole: Sea); {процедура расстановки кораблей на поле }

var N, M, i,stend: Integer; { }

x, y, kx, ky: Integer; { }

B: Boolean; { }

begin

stend:=Random(2); {как будет расположен корабль: по вертикали или горизонтали }

if stend=0 then

begin {4-x ship}

x:=Random(7)+1; {выбираем место для установки }

y:=Random(10)+1; { корабля }

n:=x;

for i:=n to x+3 do { устанавливаем 4-х палубный корабль по горизонтали}

Pole[i,y].stat:=1

end

else begin

x:=Random(10)+1; { устанавливаем 4-х палубный корабль по вертикали}

y:=Random(7)+1;

n:=y;

for i:=n to y+3 do

Pole[x,i].stat:=1

end;

for N := 2 downto 0 do {расставляем остальные корабли начиная с 3-х палубных}

for M := 0 to 3 - N do

repeat

x := Random (10)+1 ; {выбираем случайную ячейку }

y := Random (10)+1 ;

kx := Random (2); {как будет располагаться }

if kx = 0 then ky := 1 {корабль: по вертикали или горизонтали }

else ky := 0;

B := True; {начальное значение флага }

for i := 0 to N do

if not Freecell (x + kx * i, y + ky * i, Pole) then B := False; {если функция Freecell проверив }

if B then {все клетки вокруг корабля не изменяет флаг В (истина) }

for i := 0 to N do {устанавливаем в этом месте корабль }

Pole[x+kx*i,y+ky*i].stat:=1;

until B; {если В (фальшь) возвращаемся к выбору другой клетки }

end; {конец процедуры Setap_Ships}

procedure pricel(n:byte); {процедура, рисующая прицел }

begin

SetColor(n); {устанавливаем цвет прицела }

SetLineStyle(0,0,1); {стиль линий }

with Pole[i,j] do begin {берем координаты клетки из записи с номером i, j }

line(x+10,y+2,x+10,y+18); {рисуем }

line(x+2,y+10,x+18,y+10); {прицел }

Circle(x+10,y+10,4); end;

end; {конец процедуры pricel}

procedure mysound; {процедура, подающая звуковой сигнал }

begin

sound(100);

delay(50000);

nosound

end;

{ --------- ----------------------------------------------------------------}

begin {начало основной программы}

randomize;

init; {инициализируем графический режим }

SetBkColor(1); {устанавливаем цвет фона }

SetColor(white); {устанавливаем цвет выводимого на экран текста }

OutText('выполнил: Кандиусов Олег'); {выводим на экран }

OutTextXY(0,10,'группа: з513-87а '); {информацию }

setTextStyle(0,0,4); {об игре }

outtextxy(150,100,'Морской бой'); {и ее авторе}

SetColor(14);

SettextStyle(0,0,1);

OutTextXY(150,200,'Перемещение прицела – стрелки '); {и клавишах управления}

OutTextXY(150,220,'Выстрел – пробел ');

OutTextXY(150,240,'Расположение кораблей (5 сек) – Enter ');

OutTextXY(150,260,'Выход – Esc ');

SetColor(2);

OutTextXY(150,320,'Для продолжения нажмите любую клавишу');

readkey; {ожидаем нажатия клавиши для начала игры }

image; {рисуем на экране игровое поле }

Setup(Pole); {инициализируем массив Pole }

Setup_Ships(Pole); { расставляем корабли на поле}

count:=0; {обнуляем счетчик подбитых кораблей}

i:=1; {устанавливаем}

j:=1; {прицел}

pricel(14); {в первой клетке поля }

repeat {основной цикл диалога с игрой }

key:=readkey; {считываем нажатую клавишу }

if (key=#77) and (j<>10) then begin {в зависимости }

pricel(3);

j:=j+1;

pricel(14)

end;

if (key=#75) and (j<>1) then begin {от нажатой клавиши }

pricel(3);

j:=j-1;

pricel(14)

end;

if (key=#72) and (i<>1) then begin {проверяем, чтобы прицел }

pricel(3);

i:=i-1;

pricel(14)

end; {не выходил за границы поля}

if (key=#80) and (i<>10) then begin {«стираем» прицел в предыдущей клетке}

pricel(3);

i:=i+1; {и рисуем его в новой клетке по указанному направлению}

pricel(14)

end;

if (key=#32) then {если нажата клавиша «выстрел»}

case Pole[i,j].stat of {проверяем статус клетки}

1: begin for l:=1 to 150 do

begin { клетка занята кораблем}

sound(random(100)); {производим звук взрыва}

delay(500);

end;

nosound;

SetColor(red); {рисуем}

SetLineStyle(0,0,3); {в клетке}

with Pole[i,j] do

begin {крестик}

line(x+2,y+2,x+18,y+18);

line(x+2,y+18,x+18,y+2);

Pole[i,j].stat:=-1; {изменяем статус ячейки на «убит»}

end;

count:=count+1; {увеличиваем счетчик «убитых» кораблей на единицу}

end;

0: begin sound(500); {если клетка пустая}

delay(3000); {производим звук «мимо»}

nosound;

SetColor(8);

SetLineStyle(0,0,3);

with Pole[i,j] do

begin

circle(x+10,y+10,5); {рисуем в клетке точку}

stat:=2; {изменяем статус ячейки «стрелял, но не попал»}

end;

end;

-1: mysound; {в случае, если по клетке производился выстрел}

2: mysound; {подаем определенный звуковой сигнал}

end;

if (key=#13) then {если нажата клавиша показа кораблей}

begin

SetFillStyle(1,14); {устанавливаем цвет кораблей}

for i:=1 to 10 do {последовательно проверяем}

for j:=1 to 10 do

begin {все записи массива, и если в клетке }

with Pole[i,j] do {есть корабль, независимо «убитый» - «живой»}

if (stat=1) or (stat=-1) then Bar(x,y,x+step,y+step) {закрашиваем эту клетку}

end;

for l:=1 to 20 do {показываем расстановку кораблей в течение 5 сек}

delay(50000);

image; {очищаем экран и рисуем новое игровое поле}

for i:=1 to 10 do {последовательно переходя от ячейки к ячейке, проверяем}

for j:=1 to 10 do

with Pole[i,j] do

begin

if (stat=-1) then {если корабль «убит»}

begin

SetColor(red);

SetLineStyle(0,0,3); {рисуем крестик}

line(x+2,y+2,x+18,y+18);

line(x+2,y+18,x+18,y+2);

end;

if (stat=2) then {если промах}

begin

SetColor(8);

SetLineStyle(0,0,3);

circle(x+10,y+10,5); {рисуем точку}

end;

end;

pricel(14); {рисуем прицел в правом нижнем углу игрового поля}

end;

until (count=20) or (key=#27); {заканчиваем игру, если все корабли «убиты» или нажата}

{клавиша Esc}

setcolor(5);

SetTextStyle(0,0,2); {выводим сообщение на экран о завершении игры}

outtextxy(220,50,'Игра закончена ');

readkey; {ожидаем нажатия любой клавиши}

closegraph; {закрываем графический режим}

end. {и выходим из программы}