Давайте всем форумом напишем вот эту игру. Причем так, что бы в ней были режимы как одно пользовательской ( с ИИ ) так и много пользовательской игры, желательно еще и игру по локалке. сделать все вместе согласны такой общий проект?
--------------------
Нам не дано предугадать как наше слово отзовется...
Эта игра в русском варианте называется "Эрудит". Это название мне не очень нравится, слишком претенциозное. Когда-то давно (погодите.. примерно в конце 60-х - начале 70-х) ее напечатали в журнале "Наука и жизнь" под названием "Крестословица" (это мне больше по душе). Нам с сетренкой она так понравилась, что мы сделали ее на толстой фанере, клетки прожгли выжигательным прибором (им же написали ценность снизу), раскрасили маслом, вырезали фишки с буквами из твердого картона - и все это подарили маме на 8 Марта! ) Играли всей семьей вечерами.
ИИ тут не очень сложный. Главное - иметь достаточный словарь. Интерфейс же можно постараться сделать красивенький.. Правда, красивее того, фанерного, уже ничего не будет..
Я согласен поучаствовать в меру сил.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
type tplayer = record hand : array [ 0..6 ] of char; score : integer; put : array [ 0..6 ] of char; puts : integer; end;
tbag = record plates : array [ 0..33, 0..1 ] of integer; inside : integer; end;
type tgame = record field : tfield; player1 : tplayer; player2 : tplayer; bag : tbag; end;
procedure nill_field(var field : tfield); var i, j : integer; begin for i:= 0 to 14 do for j:= 0 to 14 do field[i,j]:='_'; end;
procedure nill_player(var player : tplayer); var i: integer; begin for i:= 0 to 7 do begin player.hand[i]:='_'; player.put[i]:='_'; end; player.score:=0; player.puts:=0; end;
procedure fill_bag(var bag : tbag); var bag_file : text; var i : integer; begin assign(bag_file,'bag.res'); reset(bag_file); for i := 0 to 33 do begin read(bag_file, bag.plates[i,0]); bag.plates[i,1]:=i; end; close(bag_file); end;
procedure bag_move(var bag : tbag ); var i, j : integer; begin for i:= 0 to 32 do if bag.plates[i,0] = 0 then for j:= i+1 to 33 do begin bag.plates[j-1,0]:=bag.plates[j,0]; bag.plates[j-1,1]:=bag.plates[j,1]; end; end;
procedure hand_move(var player : tplayer); var i,j : integer; begin for i:= 0 to 5 do if player.hand[i]= '_' then for j:= i+1 to 6 do player.hand[j-1]:=player.hand[j]; end;
function hand_length(var player : tplayer) : integer; var i : integer; begin hand_move(player); i:=0; while (player.hand[i]<>'_') and not(i>=6) do inc(i); if player.hand[6]<>'_' then inc(i); result:=i; end;
procedure init_game(var game : tgame); begin { fill_bag(game.bag);} nill_field(game.field); nill_player(game.player1); nill_player(game.player2); end;
procedure show_field_in_text_mode( field : tfield ); var i, j : integer; begin write(' '); for i := 0 to 14 do if (i div 10) = 1 then write(1,' ') else write(0,' '); writeln; write(' '); for i := 0 to 14 do write(i mod 10,' '); writeln; writeln; for i := 0 to 14 do begin if (i div 10) = 0 then write('0',i,' ') else write(i,' '); for j := 0 to 14 do write(field[j,i],' '); writeln; end; end;
var game : tgame; begin init_game(game); show_field_in_text_mode(game.field); readln; end.
--------------------
Нам не дано предугадать как наше слово отзовется...
Что касается ИИ, то мне кажется, что особых проблем нет. Если есть словарь, то нужно составить из имеющихся на руках букв всевозможные сочетания, затем приставлять их к буквам на доске и сверять со словарем, что получится. Алгоритм дубовый, и работать он будет долго, но это уже второй вопрос .
Reflex, первое и главное замечание: при совместной работе хорошо было бы иметь словесное описание как данных, так и алгоритмов. Интерфейс не является исключением. Если в лом делать отдельное описание (что я вполне понимаю), то по крайней мере все должно быть прокомментировано, и без этого никак! Хотя, я бы все же предпочел сначала обсудить..
Например, в том коде, что ты привела, в глаза бросается набор констант. Он зачем? Мне кажется, такие вещи, как ценность буквы, нужно иметь отдельно, в файлах ресурсов. Сами же буквы естественно заменить на номера, занеся их реальные значения (типа А, Б ..) в массив (который, кстати, может зависеть от выбранной кодировки). Если следовать такому плану, то игру можно сделать многоязычной: русская, английская, украинская, французская.. - смена языка производится заменой файлов. Тогда мумба-юмбафикация игры могла бы заключатся в простом добавлении файлов (словарь можно позаимствовать у Ильфа с Петровым ).
Затем, давайте договоримся о выборе стандарта языка. Я предлагаю Object Pascal, но можно и сразу на Дельфи. Суть в том, чтобы задействовать объекты - они, как известно, хороши при совместном осуществлении пректа. Чисто процедурный подход я бы не рекомендовал.. Но можно и его, если есть возражения против объектов.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
В написании игр объектный подход очень удомен и многие кто пишут игры не в одиночку используют его. Я предлагаю сразу Delphi взять. А по устройству хранения фишек, то согласен с lapp так будет лучше. Пока про ии не очень представляю как это оссуществить. Предлагаю сначала написать человек-человек а потом уже извращаться типа локалки и ИИ.
Если есть словарь, то нужно составить из имеющихся на руках букв всевозможные сочетания, затем приставлять их к буквам на доске и сверять со словарем, что получится. Алгоритм дубовый, и работать он будет долго, но это уже второй вопрос .
Алгоритм не дубовый, и он будет летать. Только лучше, наверное, сначала смотреть, куда будем ставить, а потом уже ставить.
На поле 15х15 всего 225 клеток. От каждой клетки пытаемся проложить слово вправо, и слово вниз.
Пусть словарь у нас отсортирован лексикографически, и пусть в нем n слов. У нас есть клетка на доске, и мы идем от нее вправо. Хотим получить список всех возможных слов (учитывая, хватит ли у нас фишек, чтоб достроить недостающие буквы).
Рекурсивный перебор такой:
Сначала считаем, что нам подходят все слова: [0; n). Смотрим на первую букву (т.е. на начальную клетку). Если там уже стоит фишка с буквой, скажем, К, то нас уже устраивает не [0; n), а [x; y), где x - первое слово на букву К, а y - первое слово на букву Л. Если же там - пусто, то пытаемся туда поставить одну из букв, имеющихся на руках (всего их 7?). И опять-таки, сужаем интервал соответственно. И теперь рекурсивно переходим ко второй букве. Опять, если там не пусто, сужаем интервал однозначно, если же пусто - перебираем и сужаем, и т.д.
Поскольку на каждом шаге, решения относительно всех предыдущих букв уже приняты, то каждый раз нам всегда нужно рассматривать только слова из текущего интервала (все остальные не подходят под уже построенное).
Используя префиксное дерево, мы будем сужать интервалы за O(1), и перебор будет работать неприлично быстро
Только лучше, наверное, сначала смотреть, куда будем ставить, а потом уже ставить. .. Эту часть могу взять на себя.
Да, так, конечно, лучше, особенно учитывая, что возможно составление слова из нескольких частей, типа: САМОЛЕТ - черные буквы уже стояли, а красные мы поставили. На руках 7 фишек, да (насколько я помню).
Можешь - хорошо. Вполне можно все делать параллельно, только нужно бы договориться о стандарте данных.
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Я тут набросал примерно костяк структуры данных, касающихся доски (игроков можно добавить потом). У Reflex это уже было, но у меня были некоторые замечания, разбирать которые сейчас нету времени, увы. Поэтому я просто показываю свой вариант, а остальные пусть выбирают. Я не стал вводить пока объекты, не зная отношения к ним основных участников проекта и не имея выбранного стандарта языка. Все можно будет исправить и добавить позже.
{Scrabble} {Version Text Object Pascal 0.01} {File Scrabble_TOP-0_01}
var Board:tBoard; M:word; {Dlina alfavita, schityvaem is faila} Rate:tRate; {Schityvaem is faila} Alpha:tAlpha; {Schityvaem is faila}
begin end.
Хочу еще добавить, что для реальной игры нужно обеспечение тайны карточек с буквами на руках. Как это сделать на одном компе (повторяю, в реальной игре), я пока не знаю. Поэтому так или иначе надо делать либо сетевую версию, либо ИИ.
И еще одно замечание про ИИ. Судя по словам Michael_Rybak'а, у человека будет слишком мало шансов выиграть. Кроме того, Игра довольно существенно многосторонняя, то есть рассчитана на 2 и больше игроков, причем по опыту я знаю, что играть втроем интереснее, чем вдвоем, а оптимум, намерное, четыре. Так что центр тяжести следует сместить все же в сторону интерфейса для сетевой игры. Как вы думаете?
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой
Тут у меня есть 2 соображения. Во-первых, понятно, что можно уровни сложности ввести. А во-вторых, можно показывать игроку все возможные слова, чтоб он только выбирал. Тогда комп (с жадным алгоритмом) будет проигрывать, потому что игрок сможет хоть как-то продумывать наперед. А игра получит приципиально другой характер
Цитата
Так что центр тяжести следует сместить все же в сторону интерфейса для сетевой игры.
*Всю* сетевую часть, мне кажется, должен делать один (опытный в этом) человек, и тогда проблем не будет. А интерфейсы, конечно, заренее надо. И без объектов, имо, жутко такое писать. И сетевую часть, и вообще всё.
как - то давно вы мне давали чат по локалке, и я от туда вынес много чего-то умного. Так вот я предлагаю взять сделать чат, потом добавить функцию перебегающего сервера, тоесть тот кто открывает комнату чата у того в тойже проге и работает сервер. И дальше передавать сообщения типа: "Player <1> <22><in>(<0>,<12>)" и их расшифровывать пример означает: игрок 1 поставил букву 22 в клетку 0,12. впринципе я все это могу реализовать, кроме одного я не могу реализовать поиск уже созданных игр
Еще, если уж на то пошло, то давайте кто-то начнет проект на sf, tigris или еще где. И будет принимать главные решения относительно структуры, конвенций, распределения обязанностей. Имо, без version control гиблое дело, собирать по кускам по 100 раз. А так - весело будет.
я предлагаю взять сделать чат, потом добавить функцию перебегающего сервера, ... кроме одного я не могу реализовать поиск уже созданных игр
Мое мнение, не стОит делать самостоятельный сетевой уровень, по крайней мере сейчас. Предлагаю для начала воспользоваться web-сервером. Сделать простейший CGI.. Я готов предоставить страничку на своем сайте ради такого дела . Правда, может возникнуть сложность с исполняемым кодом.. Не помню, Linux там или BSD.. проверю. Если не сложится там - все равно найдем, где.
Цитата(Michael_Rybak @ 2.11.2006 17:50)
давайте кто-то начнет проект на sf, tigris или еще где. ... - весело будет.
Ты слыхал о принципе наказуемости инициативы? Можешь заняться.. Если серьезно, я пока не уверен, что это действительно нужно. Давай дождемся реальной необходимости. Иначе нетрудно утонуть во всем этом, не начав.. А весело и так будет!
Reflex, ты где? что молчишь?
--------------------
я - ветер, я северный холодный ветер я час расставанья, я год возвращенья домой