IPB

Здравствуйте, гость ( Вход | Регистрация )

9 страниц V  < 1 2 3 4 5 > »   
Reply to this topicStart new topic
> Алгоритмы и формулы
sergroj
сообщение 09 Mar 2008, 19:32
Сообщение #41

В миру GrayFace
Сообщений: 2 529
Спасибо сказали: 817 раз




Д'якон, нифига не понял. Как я понял, речь о чем-то медленном и вряд ли работающем. smile.gif
В любом случае алгоритм должен вначале считать площади, а потом что-либо удалять.

То, про что говорит Гамодел - это, похоже, тот же простой алгоритм, о котором говорил я.

Цитата(Chrono Syndrome @ 08 Mar 2008, 16:41)
Цитата
А простой алгоритм такой: находим первую незакрашенную точку и шуруем от нее чем-то типа FloodFill'а. Т.е. закрашиваем ее, просматриваем соседей и с незкраенными рекуррентно делаем то же самое. Потом так же закрашиваем 2ю часть области, а потом убираем меньшую по кол-ву точек. Скорость уменьшится максимум раз в 10.

1) А если отсечена большая часть поля ?
2) А в случае самопересечения что делать ?

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


--------------------
ДНК банана на 50% состоит из человека.
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 09 Mar 2008, 19:44
Сообщение #42







//Д'якон, нифига не понял. Как я понял, речь о чем-то медленном и вряд ли работающем.

sad.gif
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 09 Mar 2008, 19:46
Сообщение #43

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




ну напиши его чтобы мы могли увидеть код и по коду понять. я ведь для тебя написал
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 09 Mar 2008, 19:46
Сообщение #44







Вполне нормальный и работающий алгоритм на мой взгляд. На счет скорости не знаю, не испытывал sad.gif
Go to the top of the pageAdd Nick
 
+Quote Post
sergroj
сообщение 09 Mar 2008, 19:59
Сообщение #45

В миру GrayFace
Сообщений: 2 529
Спасибо сказали: 817 раз




Кажется, начинаю понимать, но как тут получить результирующие площяди 2 фигур?


--------------------
ДНК банана на 50% состоит из человека.
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 09 Mar 2008, 20:32 (Сообщение отредактировал Д'якон - 09 Mar 2008, 20:36)
Сообщение #46







Игрок идет по полю (размером 100х100) и сохраняет координаты передвежения в масссивах Koordх и Koordy с кол-вом записей n

Pol#x и Pol#y - массивы, в которых сохраняются посчитанные координаты.
kol# - кол-во подсчитанных координат
(можно конечно использовать двухмерные массивы)


1) При пересечении игроком края поля:

Запускаем цикл обработки поля
(может где-то пропустил begin или end. Короче к синтаксису сильно не придерайтесь)

//первый цикл

For y:=1 to 100 do begin
F:=1
For x:=1 to 100 do begin
For i:=1 to n do begin

If Koordx[i] = x then begin

If Koordy[i]=y then
If F=0 then
F:=1 else
F:=0;
end
else
kol1:=kol1+1;
Pol1x[kol1]:=x;
Pol1y[kol1]:=y;
end;
end;
end;

//второй цикл

For x:=1 to 100 do begin
F:=1
For y:=1 to 100 do begin
For i:=1 to n do begin

If Koordx[i] = x then begin

If Koordy[i]=y then
If F=0 then
F:=1 else
F:=0;
end
else
kol2:=kol1+1;
Pol2x[kol2]:=x;
Pol2y[kol2]:=y;
end;
end;

//третий цикл

For x:=1 to 100 do begin
F:=1
For y:=100 to 1 do begin
For i:=1 to n do begin

If Koordx[i] = x then begin

If Koordy[i]=y then
If F=0 then
F:=1 else
F:=0;
end
else
kol3:=kol1+1;
Pol3x[kol3]:=x;
Pol3y[kol3]:=y;
end;
end;

//четвертый цикл

For y:=1 to 100 do begin
F:=1
For x:=100 to 1 do begin
For i:=1 to n do begin

If Koordx[i] = x then begin

If Koordy[i]=y then
If F=0 then
F:=1 else
F:=0;
end
else
kol4:=kol4+1;
Pol4x[kol1]:=x;
Pol4y[kol1]:=y;
end;
end;
end;


Долее сравниваем kol1 kol2 kol3 kol4 и выбрав наименьшее удаляем координаты хранящиесе в массивах Pol#x и Pol#y - соответственно

2) При пересечении игроком своего пути:
Go to the top of the pageAdd Nick
 
+Quote Post
sergroj
сообщение 09 Mar 2008, 21:02
Сообщение #47

В миру GrayFace
Сообщений: 2 529
Спасибо сказали: 817 раз




Если я правильно понял последнюю фразу в 1), то на твоей картинке удалится маленький кусочек справа, являющийся частью одной из областей...
Сам код не читал.


--------------------
ДНК банана на 50% состоит из человека.
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 09 Mar 2008, 21:08
Сообщение #48







нет
Go to the top of the pageAdd Nick
 
+Quote Post
sergroj
сообщение 10 Mar 2008, 23:37
Сообщение #49

В миру GrayFace
Сообщений: 2 529
Спасибо сказали: 817 раз




А, все наоборот - kol1, kol2, kol3 и kol4 - это то, что на картинке заштриховано?
Тогда неправильно отработает случай, когда внешняя часть суммарно больше внутренней.


--------------------
ДНК банана на 50% состоит из человека.
Go to the top of the pageAdd Nick
 
+Quote Post
Гость_Д'якон_*
сообщение 10 Mar 2008, 23:55
Сообщение #50







Почему?
Go to the top of the pageAdd Nick
 
+Quote Post
gamecreator
сообщение 11 Mar 2008, 00:10
Сообщение #51

Яблочный произвол!
Сообщений: 11 080
Спасибо сказали: 3988 раз




по-моему я понял алгоритм Дьякона
Go to the top of the pageAdd Nick
 
+Quote Post
sergroj
сообщение 17 Mar 2008, 12:19
Сообщение #52

В миру GrayFace
Сообщений: 2 529
Спасибо сказали: 817 раз




Цитата(Д'якон @ 11 Mar 2008, 03:55)
Почему?

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


--------------------
ДНК банана на 50% состоит из человека.
Go to the top of the pageAdd Nick
 
+Quote Post
izrukvruki
сообщение 22 Apr 2008, 09:45
Сообщение #53

Князь Бореи
Сообщений: 5 171
Спасибо сказали: 1349 раз




Можете написать алгоритм (код на Паскале и Бейсик) генерации случайной строки (пароля) заданной длины...
Go to the top of the pageAdd Nick
 
+Quote Post
Guevara-chan
сообщение 22 Apr 2008, 10:27 (Сообщение отредактировал Chrono Syndrome - 22 Apr 2008, 10:28)
Сообщение #54

•●Revolucionario●•
Сообщений: 2 467
Спасибо сказали: 5936 раз




Ну, допустим, вот (навскидку):

Код
Procedure.S GeneratePass(Len)
Define I, Pass.S
For I = 1 To Len
Pass + Chr(Random(122 - 97) + 97)
Next I
ProcedureReturn Pass
EndProcedure


--------------------
life MOV.I #life+1, *life
האם יש זמן לעצור ?
Go to the top of the pageAdd Nick
 
+Quote Post
izrukvruki
сообщение 22 Apr 2008, 13:16 (Сообщение отредактировал izrukvruki - 22 Apr 2008, 13:24)
Сообщение #55

Князь Бореи
Сообщений: 5 171
Спасибо сказали: 1349 раз




Это на чем?
пароль желательно чтоб содержал как цифры (большие и маленькие), как и цифры.

а почему такая формула Chr(Random(122 - 97) + 97)???
Go to the top of the pageAdd Nick
 
+Quote Post
Dofur
сообщение 22 Apr 2008, 13:32 (Сообщение отредактировал Dofur - 22 Apr 2008, 13:33)
Сообщение #56

Immortal
Сообщений: 1 664
Спасибо сказали: 30 раз




Большие и маленькие цифры ? smile.gif Может буквы большые и маленькие, а? А то большие цифры страшно...

P.S. Если просто рандом брали - могли бы выпадать коды 0, 1, итд - для которых нет символов. Потом Хрона и сделала чтобы все коды были в нужных пределах - чтобы коду соответствовала буква...


--------------------
Go to the top of the pageAdd Nick
 
+Quote Post
Guevara-chan
сообщение 22 Apr 2008, 13:59 (Сообщение отредактировал Chrono Syndrome - 22 Apr 2008, 14:07)
Сообщение #57

•●Revolucionario●•
Сообщений: 2 467
Спасибо сказали: 5936 раз




Цитата
Это на чем?

PureBASIC v4.0

Цитата
пароль желательно чтоб содержал как цифры (большие и маленькие), как и цифры.

А другие символы допустимы ?

Цитата
а почему такая формула Chr(Random(122 - 97) + 97)???

Подборка по ASCII.

P.S. Так пойдет ?

Код
Procedure.S GeneratePass(Len)
#PassChars = "1234567890abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
Define I, Pass.S
Define PassCharsCount = Len(#PassChars) - 1
For I = 1 To Len
Pass + Mid(#PassChars, Random(PassCharsCount) + 1, 1)
Next I
ProcedureReturn Pass
EndProcedure


--------------------
life MOV.I #life+1, *life
האם יש זמן לעצור ?
Go to the top of the pageAdd Nick
 
+Quote Post
izrukvruki
сообщение 22 Apr 2008, 15:05
Сообщение #58

Князь Бореи
Сообщений: 5 171
Спасибо сказали: 1349 раз




а на Бейсик нельзя никак? нет у меня этого PureBASIC v4.0, да и качать неохото

Я вот так переоформили

Private Sub CommandButton10_Click()
Dim i, pass, n
n = 128
Randomize
For i = 1 To n
pass = pass + Chr(Rnd(255) + 97)
Next i
MsgBox (pass)
End Sub

но у меня пароль получается состоит только из а и b
Go to the top of the pageAdd Nick
 
+Quote Post
Guevara-chan
сообщение 22 Apr 2008, 15:12
Сообщение #59

•●Revolucionario●•
Сообщений: 2 467
Спасибо сказали: 5936 раз




Цитата
а на Бейсик нельзя никак? нет у меня этого PureBASIC v4.0

Раскрой мне, плиз, смысл этой фразы.

Цитата
но у меня пароль получается состоит только из а и b

facepalm.jpg
Да, такое бывает, когда лепишь абы что. Можешь теперь попробовать с моей формулой.


--------------------
life MOV.I #life+1, *life
האם יש זמן לעצור ?
Go to the top of the pageAdd Nick
 
+Quote Post
Diplomat
сообщение 22 Apr 2008, 15:59 (Сообщение отредактировал Diplomat - 22 Apr 2008, 16:01)
Сообщение #60

Newbie
Сообщений: 21
Спасибо сказали: 0 раз




2 izrukvruki :

1. pass - должна быть строковой переменной.

2. Буквы, цифры, знаки препинания и классические спецсимволы в ASC- это символы с 33-го по 126-й. А ты пытаешься использовать символы с номерами 97-352. При том, что их всего 255. Не лучший вариант, не так ли? )

Используй алгоритм, предложенный Хроно. Там используется не таблица кодов, а переменная-банк символов, что удобнее. Это хрестоматийный вариант- гибок и проверен временем.

Вот код для Блиц-Бейсиков, оформленный более понятно и получивший отключаемую фичу: разбиение пароля на блоки-группы символов.
Код
SeedRnd MilliSecs();рандомизатор.

Global Symbols$="ABCDEFGHIJKLMOPQRSTUVWXYZ0123456789";переменная-набор символов, из которых будет строиться пароль

Local NGroups = 5;Кол-во групп символов, на которые будет разбит пароль
Local NSymbols=5;Кол-во символов в каждой группе
Global Separator$="-";Символ-разделитель для групп символов

Global Password$; строковая переменная для хранения пароля

For Group = 1 To NGroups
    For Symbol=1 To NSymbols

 ;строим группу символов, произвольно выбирая их по одному из переменной-набора
     NSymbol=Rnd(Len(Symbols)-1)+1
     Password = Password + Mid( Symbols,NSymbol,1)
 
    Next
;вставляем разделительный символ в конце каждой группы, если после нее будут другие группы
    If Group<NGroups Then Password = Password + Separator
Next

;Выводим сгенерированный пароль на экран и завершаем программу
Print Password
WaitKey()
End
Go to the top of the pageAdd Nick
 
+Quote Post

9 страниц V  < 1 2 3 4 5 > » 
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



Текстовая версия Сейчас: 21 July 2025 - 04:21
Copyright by Алексей Крючков
Strategy Gamez by GrayMage
Programming by Degtyarev Dmitry
  Яндекс.Метрика