Давайте всем форумом напишем вот эту игру. Причем так, что бы в ней были режимы как одно пользовательской ( с ИИ ) так и много пользовательской игры, желательно еще и игру по локалке.
сделать все вместе согласны такой общий проект?
Для начала что за игра опиши. Хоть в кратце.
Ура
Появился хоть один заинтересовавшийся
http://erudit-game.net.ru/
Типа кроссворд?
А что делать надо а то я непонял?
С чего начнем?
Нет...
не кроссворд ...
Ну давай сначала обсудим интерфейс
или я не то понисмаю под словом кроссворд
А ты не мог бы рассказать Алгорим ИИ? а то я что-то его не представляю
Готов помочь, предлагаю интерфейс сделать текстовый ( временно)
Так как я в игру не играл, то тоже не знаю алгоритма. Но я надеюсь, что Андрей расскажет.
Ну вот нас уже трое!!!
ну вот что-то такое правдо это только часть.
program scrablet;
{$APPTYPE CONSOLE}
uses
SysUtils;
type
tfield = array [0..14,0..14] of char;
const
letter_A = 1;
letter_B = 3;
letter_V = 2;
letter_G = 3;
letter_D = 2;
letter_E = 1;
letter_ZH = 5;
letter_Z = 5;
letter_I = 1;
letter_Y = 2;
letter_K = 2;
letter_L = 2;
letter_M = 2;
letter_N = 1;
letter_O = 1;
letter_P = 2;
letter_R = 2;
letter_S = 2;
letter_T = 2;
letter_U = 3;
letter_F = 10;
letter_H = 5;
letter_TS = 10;
letter_CH = 5;
letter_SH = 10;
letter_SHSC = 10;
letter_HZ = 10;
letter_II = 5;
letter_LZ = 5;
letter_EZ = 10;
letter_YU = 10;
letter_YA = 3;
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 так будет лучше. Пока про ии не очень представляю как это оссуществить. Предлагаю сначала написать человек-человек а потом уже извращаться типа локалки и ИИ.
Я тут набросал примерно костяк структуры данных, касающихся доски (игроков можно добавить потом).
У Reflex это уже было, но у меня были некоторые замечания, разбирать которые сейчас нету времени, увы. Поэтому я просто показываю свой вариант, а остальные пусть выбирают.
Я не стал вводить пока объекты, не зная отношения к ним основных участников проекта и не имея выбранного стандарта языка. Все можно будет исправить и добавить позже.
{Scrabble}
{Version Text Object Pascal 0.01}
{File Scrabble_TOP-0_01}
const
BoardSize=15; BrdSz=BoardSize; N=BoardSize; {Razmer doski}
MaxAlphaLength=100; MxAL=MaxAlphaLength; {Max dlina alfavita}
type
tLetter=word; {Nomer bukvy po poryadku, nachinaya s 1}
tCell=record {Yacheika doski}
Letter:tLetter; {bukva}
Bonus:integer; {umnozhenie ceny}
end;
tBoard=array[1..BoardSize]of tCell; {Doska}
tRate=array[1..MaxAlphaLength]of integer; {Cena kazhdoi bukvy}
tAlpha=array[1..MaxAlphaLength]of char; {Alfavit, simboly dlya vyvoda}
var
Board:tBoard;
M:word; {Dlina alfavita, schityvaem is faila}
Rate:tRate; {Schityvaem is faila}
Alpha:tAlpha; {Schityvaem is faila}
begin
end.
как - то давно вы мне давали чат по локалке, и я от туда вынес много чего-то умного. Так вот я предлагаю взять сделать чат, потом добавить функцию перебегающего сервера, тоесть тот кто открывает комнату чата у того в тойже проге и работает сервер. И дальше передавать сообщения типа:
"Player <1> <22><in>(<0>,<12>)" и их расшифровывать пример означает: игрок 1 поставил букву 22 в клетку 0,12. впринципе я все это могу реализовать, кроме одного я не могу реализовать поиск уже созданных игр
Еще, если уж на то пошло, то давайте кто-то начнет проект на sf, tigris или еще где. И будет принимать главные решения относительно структуры, конвенций, распределения обязанностей. Имо, без version control гиблое дело, собирать по кускам по 100 раз. А так - весело будет.
Наткнулся на неожиданное препятствие: неизвестно, сколько должно быть каточек с каждой буквой. Поверхностный поиск в Инете пока ничего не дал. Можно, конечно, самим прикинуть приблизительно..
Попутно нашел много электронных вариантов игры - как сетевых, так и локальных. Причем, надо отместить разнообразие досок. Ссылка, приведенная Reflex, довольно странная - там нету ни самой игры, ни контактов. По названию домена я отыскал его держателя (похоже, в Таллине), в принципе можно предложить им положить на сайт тоже.
Еще масса интересной ифы. Вот, например (взято http://lib.proza.com.ua/book/449):
{Scrabble}
{Version T.P.00.02}
{File Scrabble_TOP-0_02}
{Date 061103}
uses
CRT;
const
Version=11002;
FileSign='Scrabble Forum-Pascal Project';
DataFile='Scrabble.dat';
MaxBoardSize=100; MxBS=MaxBoardSize; {Max Razmer doski}
MaxAlphaLength=100; MxAL=MaxAlphaLength; {Max dlina alfavita}
BonusColors:array[0..15]of byte=(0,7,1,2,0,0,0,5,4,0,0,0,0,0,0,0);
type
tLetter=word; {Nomer bukvy po poryadku, nachinaya s 1}
tCell=object {Yacheika doski}
Letter:tLetter; {Nomer bukvy, 0-pusto}
Bonus:integer; {umnozhenie ceny (cvetnye kletki)}
procedure Show;
procedure Hide;
end;
tBoard=object {Doska}
Field:array[1..MxBS,1..MxBS]of tCell; {Kletki - Horizontal,Vertical}
Nx,Ny:integer; {Razmery doski}
x,y:integer; {Koordinaty levogo-vrhnego ugla}
sx,sy:integer; {Shagi po x i y}
constructor Init;
procedure Show;
procedure Hide;
end;
tToken=record
Rate:integer; {Cena bukvy}
Symbol:char; {Symvol dlya pokaza na doske}
Quantity:integer; {Kolichestvo bukv}
end;
tAlpha=array[1..MaxAlphaLength]of tToken; {Alfavit}
var
Board:tBoard;
M:word; {Dlina alfavita, schityvaem is faila}
Alpha:tAlpha; {Schityvaem is faila}
Data:text;
procedure tCell.Show;
begin
TextBackground(BonusColors[Bonus]);
if Letter<>0 then Write(Letter) else Write(' ');
end;
procedure tCell.Hide;
begin
Write(' ')
end;
constructor tBoard.Init;
var
i,j:integer;
begin
x:=3; y:=3;
sx:=1; sy:=1;
for j:=1 to Ny do for i:=1 to Nx do;
end;
procedure tBoard.Show;
var
i,j:integer;
begin
for j:=1 to Ny do for i:=1 to Nx do begin
GoToXY(x+sx*Pred(i),y+sy*Pred(j));
Field[i,j].Show
end
end;
procedure tBoard.Hide;
begin
Write(' ')
end;
var
i,j:integer;
c:char;
begin
Board.Init;
Assign(Data,DataFile);
ReSet(Data);
ReadLn(Data);
ReadLn(Data);
with Board do begin
ReadLn(Data,Nx,Ny);
for j:=1 to Ny do begin
for i:=1 to Nx do with Field[i,j] do begin
Read(Data,c);
if c='.' then Bonus:=1 else Bonus:=Ord©-48
end;
ReadLn(Data)
end
end;
ReadLn(Data);
ReadLn(Data);
ReadLn(Data,M);
for i:=1 to M do with Alpha[i] do repeat Read(Data,Symbol) until Symbol<>' ';
for i:=1 to M do begin
Read(Data,Alpha[i].Rate);
end;
for i:=1 to M do Read(Data,Alpha[i].Quantity);
Close(Data);
ClrScr;
Board.Show;
ReadLn
end.
Scrabble Forum-Pascal Project
11001
15 15
8..2...8...2..8
.7...3...3...7.
..7...2.2...7..
2..7...2...7..2
....3.....3....
.3...2...2...3.
..2.........2..
8..2.......2..8
..2.........2..
.3...2...2...3.
....3.....3....
2..7...2...7..2
..7...2.2...7..
.7...3...3...7.
8..2...8...2..8
russian
win1251
32
А Б В Г Д Е Ж З И Й К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ъ Ы Ь Э Ю Я
1 3 2 3 2 1 5 5 1 3 2 2 2 1 1 2 2 2 2 3 10 5 10 5 10 10 10 5 5 10 10 3
12 7 9 7 9 12 5 5 12 7 9 9 9 12 12 9 9 9 9 7 3 5 3 5 3 3 3 5 5 3 3 7
Привет всем, я просто даувно не была в интернете. а переходить на Graph помоему бессмысленно, тогда уж делать на формах...