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

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


Бывалый
***

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

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


Здравствуйте! Мне очень сильно нужно помощь! Нам задали написать тгру определитель, предварительно даже не рассмотрев хотя бы одну программу по написанию игр на Паскале. Я тоже не могу найти никакую литературу по теории игр и реализации их на Паскале. Суть игры состоит в следующем: Есть матрица 3 на 3. 2 Игрока ходят поочередно и ставят цифры в любое место матрицы, при том цифры не должны повторяться. Когда вся матрица заполнена, мы считаем ее детерминант. Если Д больше 0, то выиграет первый, если меньше, то второй, если равно, то ничья. Моя проблема в том, что откуда приступить в задаче. С чего вообще начать? Понятно какими методами нужно пользовться: перебором, отсечением альфа-бета, рекурсией. Но откуда приступить к написанию кода? Как сделать так, чтобы пользователь вписал цифру в таблицу и компьютер отвечал?

Пожалуйста, обьясните мне и не закрывайте тему! Спасибо большое!!!!


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

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


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

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

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


Игрой это назвать конечно можно с натяжкой smile.gif Но теме не менее, графики тут никакой нету на соклько я понял smile.gif))) Собственно куда ее тут пихать smile.gif Пишется за 5 минут smile.gif в чем конкретно проблема ? Надо ппочередно игрокам ввести матрицу, а потом посчитаь детерминант и все !


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


Гость






Цитата(klem4 @ 18.09.2005 11:12)
Пишется за 5 минут smile.gif

klem4, время пошло !!! Через 15 минут ты выкладываешь готовую игру, ОК?

Цитата(klem4 @ 18.09.2005 11:12)
Надо ппочередно игрокам ввести матрицу, а потом посчитаь детерминант и все !
Внимательно читаем задание !!!
Цитата(Задание)
Как сделать так, чтобы пользователь вписал цифру в таблицу и компьютер отвечал?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Бывалый
***

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

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


Извините, но матрица же одна. Как поочередно каждому вести матрицу?Всю матрицу?Каждый должен ввести одно число после хода другого.


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

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


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

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

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


Ну это я образно выразился, а вообще сейчас попробую smile.gif


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


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

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

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


Вот на скорую руку ...
Потестил, но могут быть ошибки.
uses crt;

const n=3;

type

TField = array[1..n,1..n] of byte;

var

field : TField;

procedure WriteField(x : TField);
var
i,j : integer;
begin
for i := 1 to n do begin
writeln;
for j := 1 to n do
write(x[i,j]:2, ' ');
end;
end;


procedure Fill(var x : TField);
var
i,j : integer;

count,t : byte;

bool : boolean;

s : set of byte;

begin

count := 0;

bool := TRUE;

s := [];

repeat

case bool of
TRUE : begin

writeln;
write('Player1 I : '); readln(i);
write('Player1 J : '); readln(j);
write('Player1 x[i,j] : '); readln(t);

if (x[i,j]=0)and(not (t in s)) then begin
x[i,j] := t;
s := s + [t];
inc(count);
bool := not(bool);
end
else clrscr;
end;

FALSE : begin

writeln;
write('Player2 I : '); readln(i);
write('Player2 J : '); readln(j);
write('Player2 x[i,j] : '); readln(t);

if (x[i,j]=0)and(not(t in s)) then begin
x[i,j] := t;
inc(count);
bool := not(bool);
end
else clrscr;
end;
end;

clrscr;

WriteField(x);

until count =9 ;

end;

function Det(x : TField) : integer;
var
i,j : integer;

d : integer;

begin

d := (x[2,2]*x[3,3]-x[3,2]*x[2,3])

-
(x[2,1]*x[3,3]-x[3,1]*x[2,3])

+
(x[2,1]*x[3,2]-x[3,1]*x[2,2]);

case d>0 of
TRUE : Det := 1;
False : Det := -1;
else
Det := 0;
end;

end;


Begin

clrscr;

FillChar(Field, sizeof(Field), 0);

WriteField(Field); writeln;

Fill(Field);

writeln;

write('Winner : ');

Case Det(Field) of
1 : write('Player1');
-1 : write('Player2');
0 : write('Nobody');
end;

readln;


End.


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


Гость






klem4, а компьютер как играть будет? AI его ты сделал?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


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

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

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


Цитата
2 Игрока ходят поочередно


я подумал что 2 человека, ну можно и компа сделать

ща сделаю, нашел ошибку :


Код
case d>0 of
     TRUE  :  Det := 1;
     False :  Det := -1;
  else
   Det := 0;
  end;


заменить на

Код
if d>0 then
   Det := 1
  else
   if d<0 then
    Det := -1
  else
   Det := 0;


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


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


Гость






Можно, конечно. smile.gif Только учти, что задача компьютера - выиграть у игрока, а не просто так весело провести время ;)

Кстати, а почему ты после хода второго игрока не делаешь
s := s + [t];
? unsure.gif И зачем вообще делать
Case bool of
True: ...
False: ...
End;
, если производятся одни и те же действия? Только чтобы написать "Player 1" или "Player 2"???
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


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

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

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


ага, это я зря sad.gif(

да уж, если он еще и думать должен, то это не на пять минут точно будет smile.gif)))

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


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


Гость






Ага, и сразу
if d>0 then
Det := 1
else
if d<0 then
Det := -1
else
Det := 0;
заменить на
If d = 0 Then Det := 0
Else Det := (d div Abs(d));
:yes:
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


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

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

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


Цитата(volvo @ 18.09.2005 13:18)
Ага, и сразу
if d>0 then
Det := 1
else
if d<0 then
Det := -1
else
Det := 0;
заменить на
If d = 0 Then Det := 0
Else Det := (d div Abs(d));
:yes:


вот это здорово придумал smile.gif


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


Бывалый
***

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

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


Извините, а здесь рекурсия используется? И еще альфа-бета отсечение?


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

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


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

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

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


Вопрос : Играть с компютером надо ? Если да, то надо писать AI sad.gif


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


Бывалый
***

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

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


Да!


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

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


Бывалый
***

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

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


Извините, но вы не могли бы подсказать как написать ai? Как раз самое сложное именно в этом. И именно это я и не понимаю!!!!


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

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


Бывалый
***

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

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


klem4, а правильно ли твоя прога считает детерминант? Я не знаю что это, но в функции Det не используется первый столбец матрицы... <_<


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


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

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

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


Все конечно может быть ... в торопях писал, но вообще не очень понимаю о чем ты, а считал определитель по первой строке ...


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


Бывалый
***

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

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


Цитата(klem4)
вообще не очень понимаю о чем ты, а считал определитель по первой строке ...


Код

d := (x[2,2]*x[3,3]-x[3,2]*x[2,3])
                  -
       (x[2,1]*x[3,3]-x[3,1]*x[2,3])
                  +
       (x[2,1]*x[3,2]-x[3,1]*x[2,2]);


Здесь вроде бы один и тот же результат будет при любом состоянии чисел
x[1,2],x[1,1],x[1,3]... А детерминант скорее всего должен считатся с помощью всех эл-в матрицы.


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


Гость






setare, а обязательно надо использовать "альфа - бета отсечение"? Просто в задаче такого рода это не имеет особого смысла, ведь при размере матрицы (3 х 3) имеется всего 9! вариантов взаимного расположения чисел, то есть 362880... Причем после того, как первый ход сделан, количество оставшихся вариантов сокращается уже до 8! = 40320, и т.д. => быстродействие может быть приемлемым без отсечения вариантов...

Я бы попробовал сделать так: процедура AI компьютера получает на вход частично заполненную матрицу, генерирует (рекурсивно) для нее все возможные варианты продолжения, и выбирает из них тот (само число и его расположение), при котором окончательный детерминант будет максимальным/минимальным (в зависимости от очередности хода компьютера). Если представлять матрицу как строку из 9-ти символов (развернуть матрицу построчно), то памяти в "куче" должно хватить.

P.S. klem4, на самом деле подозрительно. У меня например D считается вот так:
function get_determ(mx: tmatrix): integer;
begin
result :=
mx[1, 1]*mx[2, 2]*mx[3, 3] +
mx[1, 2]*mx[2, 3]*mx[3, 1] +
mx[1, 3]*mx[2, 1]*mx[3, 2] -

mx[1, 3]*mx[2, 2]*mx[3, 1] -
mx[1, 1]*mx[2, 3]*mx[3, 2] -
mx[1, 2]*mx[2, 1]*mx[3, 3];
end;

т.е. используются все элементы...
 К началу страницы 
+ Ответить 

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

 





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