-
Заключение
В результате выполнения данной курсовой работы был получен игровой программный продукт - «Морской бой». Данная игра получилась нетребовательной к системным ресурсам, но с низким искусственным интеллектом. В процессе игры заметно, что прицел оставляет «дыры» в клетках отмеченных крестиком или точкой. Нет возможности начать новую игру, не выходя из программы. Не указывается «убит» корабль или только «ранен».
Большим плюсом можно считать то, что в ходе выполнения этой работы мною более глубоко был изучен язык программирования «Паскаль», его графические возможности, а так же некоторый опыт в создании графического интерфейса.
СПИСОК ЛИТЕРАТУРЫ
-
Зюзьков В.М. Программирование: Курс лекций – Томск, 1999.
-
Грызлов В.И. Грызлова Т.П. Турбо Паскаль 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. {и выходим из программы}