IPB
ЛогинПароль:

2 страниц V < 1 2  
 Ответить  Открыть новую тему 
> Игра "Определитель"
сообщение
Сообщение #21


Perl. Just code it!
******

Группа: Пользователи
Сообщений: 4 100
Пол: Мужской
Реальное имя: Андрей

Репутация: -  44  +


да я забыл домножать на элементы первой строки sad.gif( забывать начинаю мат.часть smile.gif

Цитата
        a1 a2 a3
A=    b1 b2 b3
        c1 c2 c3 

detA= a1*(b2*c3-c2*b3)-a2*(b1*c3-c1*b3)+a3*(b1*c2-c1*b2)


Сообщение отредактировано: klem4 -


--------------------
perl -e 'print for (map{chr(hex)}("4861707079204E6577205965617221"=~/(.{2})/g)), "\n";'
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #22


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Извините, пожалуйста, volvo, но не могли бы вы еще раз но чуть по легче сказать то, что вы только что написали. Я не очень поняла как компьютер получает на вход частично заполненную матрицу?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #23


Бывалый
***

Группа: Пользователи
Сообщений: 179
Пол: Мужской

Репутация: -  1  +


Имелось ввиду нечто типа этого:
Type PAIResult=^TItemField
TAIResult=record
I,J : 1..n;
Item: byte;
result: byte;
end;
...
Function AI(X:TField):PAIResult;
Var temp: PAIResult;
i,j:integer;
item:byte;
g :boolean;
y :TField;
begin
y:=X;
new(temp);
If busy(X) then begin {Если массив заполнен, то}
temp.result:=Det(X);
AI^:=temp^; {Возвращаем D}
end;
For i:=1 to n do begin {Проссматриваем все возможные ходы:}
For j:=1 to n do begin
If X[i][i]=0 then
For item:=0 to 255 do begin
y[i][j]:=item;
temp:=AI(y);
If temp^.result=1 then AI^:=temp^;
end;
end;
end;
{Если выигрошного хода не нашлось, то}
AI^.result:=-1; {Эта строчка была доб. позже...}
AI^:=temp^;
end;
{
Здесь компьютер играет либо на золото либо на проигрыш...
Не учитывается ниченая возможность...
}
...


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #24


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Ухты, ну и код. Здесь надо долго разбираться. А можно ведь и без указателей, правда? И busy(x) это функция? Кстати, отсечение обязательно. При том нужно дойти до конца и потом отсекать. С последнего уровня и идти наверх.


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #25


Бывалый
***

Группа: Пользователи
Сообщений: 179
Пол: Мужской

Репутация: -  1  +


Цитата
Кстати, отсечение обязательно. При том нужно дойти до конца и потом отсекать. С последнего уровня и идти наверх.
Ну если я правильно понимаю что ты имеешь ввиду под отсечением, то здесь оно вроде как присутствует- если встречается хороший ход, то остальные ходы не просматриваются...
Цитата
А можно ведь и без указателей, правда?
Да наверно можно и без указателей, например, функция AI будет возвращать результат через глобальную переменную...
Цитата
И busy(x) это функция?
Да это функция, возвращающая true, если в массиве нет ни одного нуля иначе False. Ну, только не спрашивай как ее реализовать, а то тебя в FAQ пошлют...

код кое-как исправлен:
Type PAIResult=^TItemField
TAIResult=record
I,J : 1..n;
Item: byte;
result: byte;
end;
...
Function AI(X:TField):PAIResult;
Var temp: PAIResult;
i,j:integer;
item:byte;
g :boolean;
y :TField;
begin
y:=X;
new(temp);
If busy(X) then begin {Если массив заполнен, то}
temp.result:=Det(X);
AI^:=temp^; {Возвращаем D}
end;
For i:=1 to n do begin {Проссматриваем все возможные ходы:}
For j:=1 to n do begin
If X[i][i]=0 then
For item:=0 to 255 do begin
y[i][j]:=item;
temp:=AI(y);
If temp^.result=1 then AI^:=temp^;
end;
end;
end;
{Если выигрошного хода не нашлось, то}
AI^.result:=-1;
AI^:=temp^;
end;
{
Здесь компьютер играет либо на золото либо на проигрыш...
Не учитывается ниченая возможность...
}
...


--------------------
Доброго времени суток.
:nnn:
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #26


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Ладно не буду. Спасибо. А почему вы написали
Код


For item:=0 to 255 do begin

И почему X[i][i]?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #27


Гость






:no: Дож, это - не мой вариант. Мой вариант - что-то в таком духе:

Type
TResult = Record
Digit: byte; Pos: Byte;
End;
Var
max_D: LongInt;
max_Matrix: String;

{
CurrMatrix - "развернутое" в строку представление матрицы
ToUse - оставшиеся для использования цифры
}
Procedure AI(CurrMatrix, ToUse: String);
Var
D: LongInt;
s_u, s_m: String;
Begin
If ToUse = '' Then Begin { цифр больше не осталось -> матрица заполнена }
D := get_determ(CurrMatrix); { считаем детерминант }
If D > max_D Then Begin { если найденный D больше/меньше всех предыдущих }
{ запоминаеи макс/мин детерминант и саму матрицу, при которой это произошло }
max_D := D; max_matrix := CurrMatrix;
End;
Exit; { и заканчиваем рекурсию }
End;

{ А вот если матрица заполнена не окончательно (ToUse не пустая строка)... }
{
... то генерируем возможные сочетания элементов,
и передаем это опять в AI:
}
For j := 1 To Length(ToUse) Do
For i := 1 To Length(CurrMatrix) Do
If CurrMatrix[i] = '0' Then Begin
s_m := CurrMatrix; s_m[i] := ToUse[j];
s_u := ToUse; Delete(s_u, j, 1);
AI(s_m, s_u); { Рекурсия !!! }
End;
End;

Procedure ComputerMove(CurrMatrix, ToUse: String; Var R: TResult);
Begin
AI(CurrMatrix, ToUse);
{
Когда мы здесь - уже известно, какая матрица из возможных
дает выигрышную комбинацию, и имея CurrMatrix и max_Matrix,
можно выбрать одну из цифр, НЕ присутствующих в CurrMatrix...

Результат (цифра и ее позиция в строке) возвращается через R,
а потом при отрисовке R.Pos легко переведется в строку и столбец матрицы...
}
End;
 К началу страницы 
+ Ответить 
сообщение
Сообщение #28


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Извините за глупый вопрос, но что значит при отрисовке R.pos легко переведется в строку матрицы? И кстати, там , где вы написали выход их рекурсии, до этого рекурсия не использовалась, правильно? Она используется вами уже после, когда touse не равно " "?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #29


Гость






Цитата(setare @ 18.09.2005 19:05)
что значит при отрисовке R.pos легко переведется в строку матрицы?


После того, как компьютер сделал свой ход, матрицу значений надо перерисовать, чтобы второй игрок видел картинку, правда? Но я в процедуре ComputerMove возвращаю НЕ 2 координаты (строку/столбец), а только одну, учитывая то, что при известном размере матрицы из 7-ой, например, позиции "растянутой" матрицы получить 3-ю строку и 1-ый столбец не составит труда...

Цитата(setare @ 18.09.2005 19:05)
И кстати, там , где вы написали выход их рекурсии, до этого рекурсия не использовалась, правильно? Она используется вами уже после, когда touse не равно " "?

Ну да, это же основное правило составления рекурсивных подпрограмм: сначала проверяется условие выхода, и только если оно НЕ выполняется, рекурсивный вызов продолжается. Иначе очень просто получить бесконечную рекурсию, и как результат - переполнение стека и RunTime Error...
 К началу страницы 
+ Ответить 
сообщение
Сообщение #30


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


Спасибо за обьяснение! Если возникнут вопросы, я опять вас побеспокою! :D


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #31


Бывалый
***

Группа: Пользователи
Сообщений: 152
Пол: Женский

Репутация: -  0  +


volvo Здравствуйте, извините, значит в вашей последней программе в последней процедуре уже ничего не надо добовлять?После вызова ai? Или нужно что-то делать с R.pos? Я уже несколько раз перечитывала ваше обьяснение, но никак не могла понять что надо еще что-то добавлять или нет?


--------------------
Ты спрашиваешь, как я переношу длинные бессонные ночи?Как свеча: как только настает утро, я гасну, тем самым, имея возможность заново загореться.

Нима
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #32


Гость






Надо, конечно smile.gif Я просто привел сам способ реализации AI; после вызова
AI(CurrMatrix, ToUse);
будет известна оптимальная матрица, но нужно ведь еще выбрать очередной ход (их же может быть несколько...) Например, у нас на данный момент заполнено 3 элемента:
Цитата(Текущая матрица)
0 0 0
1 2 3
0 0 0
а после вызова AI будет известна оптимальная матрица:
Цитата(max_Matrix)
4 5 6
1 2 3
7 8 9

(это просто пример, так что не надо обращать внимание на конкретные значения... ) Так вот, процедура ComputerMove должна выбрать, какое из чисел, присутствующих во второй матрице, и НЕ присутствующих в первой будет очередным ходом компьютера, то есть, для моего примера, у компьютера есть возможность сделать 6 разных ходов, которые могут привести его к выигрышу: 4 в позицию (1, 1); 5 в позицию (1, 2) и т.д.

Какой именно вариант выбрать и нужно решить сразу после вызова AI...
 К началу страницы 
+ Ответить 

2 страниц V < 1 2
 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.08.2026 2:07
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name