Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 09.05.2013, 15:23   #1
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию Пишу игру "Морской бой"

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

Код:
unit Unit3;

interface

type TMatrix = array[-4..13,-4..13] of integer;

function State1(var x,y:integer):boolean;
function State2(var x, y: Integer):boolean;
function State3(var x,y:integer):boolean;
procedure Start;

var
Pole:TMatrix; Play:TMatrix; Kor:array[1..4] of integer;
State,Len,Pkx,Pky,Px,Py:integer;

implementation

uses Unit1;

procedure Init(var Pole:TMatrix);
var x,y:integer;
begin randomize;
for x:=1 to 10 do
for y:=1 to 10 do
Pole[x,y]:=-1; end;

procedure Start;
var i:integer;
begin
Init(Play);
Init(Pole);
State:=1;
for i:=1 to 4 do Kor[i]:=5-i;
end;

function MaxShip:integer;
var i:integer;
begin
result:=0;
for i:=1 to 4 do
if (Kor[i]>0) then
result:=i else;
end;

function Freedom(x,y:integer; Pole:TMatrix):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,dx,dy:integer;
begin
if (x>0) and (x<11) and (y>0) and (y<11) and (Pole[x,y]=-1) 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]>-1) then
begin
result:=false;
exit;
end else;
end;
result:=true;
end else
result:=false;
end;



function State1(var x,y:integer):boolean;
var k,i,n,m:integer;
b:boolean;
tmp:integer;
begin
repeat
repeat
x:=random(10)+1;
y:=Random (10)+1;
until (Freedom (x, y, Play)); Pkx:=Random(2);
Pky:=Pkx-1;
for m:=1 to 2 do
begin
i:=0;
k:=0;
for n:=1 to 2 do
begin
while (Freedom(x+Pkx*i, y+Pky*i, Play)) do
begin
inc(k);
inc(i);
end;
Pkx:=-Pkx;
Pky:=-Pky;
i:=1;
end;
b:=k>=MaxShip;
if (b) then
break else;
tmp:=Pkx;
Pkx:=Pky;
Pky:=tmp;
end;
until (b);
Result:=Play[x,y]=0;
if (result) then
begin
Px:=x;
Py:=y;
Len:=1;
if (MaxShip>1) then
State:=2 else
dec(Kor[Len]); end;
end;

function State2(var x, y: Integer):boolean;
var Old:ShortInt;
tmp,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 else;
if (Random(2)=0) then
begin
x:=Px+Pkx;
y:=Py+Pky;
end else
begin
x:=Px-Pkx;
y:=Py-Pky;
end;
until (Freedom(x, y, Play));
result:=Play[x,y]=0;
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) else;
if not(Freedom(Px-1, Py, Play)) then dec(k) else;
if not(Freedom(Px, Py+1, Play)) then dec(k) else;
if not(Freedom(Px, Py-1, Play)) then dec(k) else;
if (k<2) then State:=1 else;
end;
Play[Px,Py]:=Old;
end;

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;
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 else;
Pkx:=-Pkx;
Pky:=-Pky;
end;
if (b) then
begin
result:=Play[x,y]=0;
if (result) then
begin
inc(Len);
if (Len=MaxShip) then
begin
dec(Kor[Len]);
State:=1;
end else;
end; end else
begin
dec(Kor[Len]);
State:=1;
result:=State1(x, y);
end;
end;

end.
благо правила прочитал (впервые в жизни), чуть ли файл внешней ссылкой не прикрепил (если оффтоп - прошу прощения, оправдание ниже).

Взял я его от сюда и модифицировал под себя (этим можно объяснить отсутствие некоторых процедур в моём коде).

Моя проблема в том, что: при выполнении функции state1, когда рандом попадает в ячейку матрицы, где есть корабль - весь внешний цикл repeat (функции State1) становиться бесконечным, т.е. его выполнение не завершается.
Что касательно state2 и state3 - до этого я дойти ещё не смог.

Если что то не уточнил - извиняюсь, я с этой проблемой пытаюсь разобраться уже больше суток, прошу понимания - не выспался, так что попрошу не ругаться (пожалуйста).

Помогите пожалуйста разобраться с данной проблемой.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 09.05.2013 в 15:24. Причина: не знал про выделение кода серым, убрал "// конец кода"
OmegaBerkut вне форума Ответить с цитированием
Старый 09.05.2013, 15:24   #2
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Ей богу, я очень извиняюсь за свою тупость.
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 09.05.2013, 17:08   #3
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

вы забыли главное - комментарии к коду.
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2013, 17:22   #4
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Цитата:
Сообщение от Человек_Борща Посмотреть сообщение
вы забыли главное - комментарии к коду.
У меня, как и у источника, комментарии не описаны. Я для правильности работы предоставленного кода не изменял математические операции, поэтому не в курсе, что делает каждый оператор кода, разве что Px,Py - последние координаты попадания по кораблю у компьютера.
Но есть пояснения к каждой процедуре / функции в источнике.
Подпись ? Не, не слышал ...

Последний раз редактировалось OmegaBerkut; 09.05.2013 в 17:23. Причина: Орфографическая ошибка
OmegaBerkut вне форума Ответить с цитированием
Старый 09.05.2013, 19:25   #5
s-andriano
Старожил
 
Аватар для s-andriano
 
Регистрация: 08.04.2012
Сообщений: 3,229
По умолчанию

Неотформатированный код, без единого комментария и с ничего не говорящими названиями переменных...
Писал его явно дилетант.
На мой взгляд, этому коду прямая дорога в мусорную корзину.
Никакой пользы для себя, пытаясь разобраться в этом коде, Вы не получите.
В любом случае - гораздо проще написать с нуля.
s-andriano вне форума Ответить с цитированием
Старый 09.05.2013, 21:25   #6
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Так там можно скачать архив с исходником, который работает.
Arigato вне форума Ответить с цитированием
Старый 09.05.2013, 22:02   #7
Человек_Борща
Старожил
 
Аватар для Человек_Борща
 
Регистрация: 30.12.2009
Сообщений: 11,426
По умолчанию

OmegaBerkut, я к тому, что ваш код вообще не читабелен. Даже имена переменных ничего не говорят из названия, не говоря уже хоть о каком-то описании алгоритма в этой программе.
Человек_Борща вне форума Ответить с цитированием
Старый 09.05.2013, 22:07   #8
Arigato
Высокая репутация
СуперМодератор
 
Аватар для Arigato
 
Регистрация: 27.07.2008
Сообщений: 15,551
По умолчанию

Человек_Борща, описание тут: http://aka-alex.narod.ru/seabattle.htm
Arigato вне форума Ответить с цитированием
Старый 09.05.2013, 23:12   #9
OmegaBerkut
Спокойный псих
Участник клуба
 
Аватар для OmegaBerkut
 
Регистрация: 19.03.2013
Сообщений: 1,538
По умолчанию

Ладно, где тут тему закрывать ?
Придётся самому трассировать...
Подпись ? Не, не слышал ...
OmegaBerkut вне форума Ответить с цитированием
Старый 09.05.2013, 23:15   #10
zarina.serikbulato
Новичок
Джуниор
 
Регистрация: 09.05.2013
Сообщений: 1
По умолчанию

Извините,а что такое TPole?
zarina.serikbulato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
создать в Паскале копию игры "Морской бой" Керкси Фолс Помощь студентам 6 17.11.2013 13:19
доделать игру "Морской бой" nato4ka649 Помощь студентам 2 18.01.2012 09:10
Игра "Морской бой" на Delphi. С чего начать? Cyxarik Помощь студентам 8 16.02.2011 10:26
Расстановка кораблей в игре "Морской бой" [MI_nor] Общие вопросы C/C++ 1 23.05.2009 00:23
"Морской бой" на "Турбе" Cezar Помощь студентам 10 15.05.2007 20:28