![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Крестики-нолики
SarDoX © (2005-09-02 12:54:00)вот надо бы такую игру написать(игра с компом). как лучше всего осуществить?
читал про всякие там коеффициенты выгодности хода и т.д - слишком замутно. решил сделать комп рандомом, т.к писать искуственный интеллект не представяю как.
на форме 9 кнопок. писал быстро, криво(за 15-30 мин где то)
что поменять. подскажите. можно вообще все переписать. сильно не бейте.
procedure proverka();
begin
if tb[1].Caption = tb[2].Caption then if tb[2].Caption = tb[3].Caption then form1.label1.caption:='Выйграли ' + tb[1].Caption;
if tb[4].Caption = tb[5].Caption then if tb[5].Caption = tb[6].Caption then form1.label1.caption:='Выйграли ' + tb[4].Caption;
if tb[7].Caption = tb[8].Caption then if tb[8].Caption = tb[9].Caption then form1.label1.caption:='Выйграли ' + tb[7].Caption;
if tb[1].Caption = tb[4].Caption then if tb[4].Caption = tb[7].Caption then form1.label1.caption:='Выйграли ' + tb[1].Caption;
if tb[2].Caption = tb[5].Caption then if tb[5].Caption = tb[8].Caption then form1.label1.caption:='Выйграли ' + tb[2].Caption;
if tb[3].Caption = tb[6].Caption then if tb[6].Caption = tb[9].Caption then form1.label1.caption:='Âûéãðàëè ' + tb[3].Caption;
if tb[1].Caption = tb[5].Caption then if tb[5].Caption = tb[9].Caption then form1.label1.caption:='Выйграли ' + tb[1].Caption;
if tb[3].Caption = tb[5].Caption then if tb[5].Caption = tb[7].Caption then form1.label1.caption:='Выйграли ' + tb[3].Caption;
end;
procedure comp();
var a,i:integer;
begin
randomize();
s:=s+1;
if s>2 then begin
proverka();
end;
if s=5 then begin
form1.label1.Caption:='The game is over. ';
exit;
end;
for i:=1 to 1000 do begin
a:=random(9);
if a=0 then a:=random(9);
if tb[a].Enabled = true then begin
tb[a].Caption:='0';
tb[a].Enabled:=false;
if s>2 then begin
proverka();
end;
break;
end;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
button1.Caption:='X';
button1.Enabled := false;
comp();
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
button2.Caption:='X';
button2.Enabled := false;
comp();
end;
procedure TForm1.Button***Click(Sender: TObject);
begin
button***.Caption:='X';
button***.Enabled := false;
comp();
end;
procedure TForm1.FormCreate(Sender: TObject);
var a:integer;
begin
s:=0;
for a:=1 to 9 do begin
tb[a]:= FindComponent('Button' + inttostr(a)) as tbutton;
end;
end;
end.
Brother (2005-09-13 04:34:00) [1]Упс, проглядел
Servelat (2005-09-12 23:20:00) [2]
> мне показалось что говорили про большое крестики нолики
Тебе показалось :). Автор же сказал:
> на форме 9 кнопок
По сабжу:
Код в первом посте такой убогий, что его надо весь переписывать, а потом уже делать интеллект, или что там еще захочется. По поводу интеллекта, интересная статейка была в журнале игромания, можешь на сайте почитать их старые выпуски, может найдешь. Смысл сводился к тому, что в начале для машины все ходы равнозначны. Во время игры она ходит соответственно случайно. Потом, если она выиграла игру, (во время игры комп ведет протокол всех ходов ^^), она увеличивает для каждой игровой ситуации, в которой наше поле за игру побывало, коэффициент удачности хода. То есть вначале, все ходы равнозначны, потом, при следующей игре, комп глядит, "ага, в прошлый раз у меня такая фигня на поле уже была, значит сюда ходить в принципе не так хреново, как в остальные клетки", и ходит по проторенной дорожке с БОЛЬШЕЙ вероятностью, чем по остальным. Таким образом, после миллиона игр, твой комп начинает неплохо сечь, куда ж надо ходить чтоб противнику плохо было. Если лень самому обучать его милилион раз, можно стравить два таких интеллекта, и пущай думают до опупения. Знаю, что описал криво, но за нормальным описанием иди к первоисточнику. Засим прощаюсь.
ЗЫ
> 3*3 - не серьезно
здавая мысль, 5 на 5 инграть интереснее.
__________________
Good luck & Have fun
Antonn (2005-09-12 12:26:00) [3]Brother (12.09.05 4:33) [9]
А варианта тут два: или рандомность или ход в центр первым
мне показалось что говорили про большое крестики нолики, на большом поле, по 5 в ряд. 3*3 - не серьезно
Brother (2005-09-12 04:33:00) [4]Игруха по логике ужо сама себя изжила.
А варианта тут два: или рандомность или ход в центр первым
затем если соперник ходил по горизонтали ход против него а
далее выход на вилку. Это 100% победа.
keal (2005-09-05 13:33:00) [5]когда-то писал эту игру. если комп ходил первым, то никогда не проигрывал. аи написал через таблицу (забыл ка называется, какае-то "... машина" "или Маркова", не помню). комп ходил всегда с угла :)
если найду исходник, скину.
Trimp (2005-09-03 15:12:00) [6]Ах, да, если всё таки ЕХЕ запустится то управление такое: W,A,S,D-перемещение по полю; F-установить крестик; Q-выход.
Trimp (2005-09-03 15:03:00) [7]2 SarDoX
Отправил
SarDoX (2005-09-03 14:37:00) [8]SARDOX собака YANDEX.RU
Trimp (2005-09-03 13:30:00) [9]Однажды, на одной олимпиаде у нас была задача сделать подобную игру на Turbo Pascal'е. Так вот если ты укажешь мыло то я тебе могу выслать эту игру. Уверен код тебе поможет.
SarDoX (2005-09-02 14:25:00) [10]точнее понял, но осуществить не смогу.
по мне так легче с бд работать :)
SarDoX (2005-09-02 14:24:00) [11]спасибо, но ниче не понял.. раза четыре перечитал..
Antonn (2005-09-02 14:17:00) [12]можно все переписать:)
> читал про всякие там коеффициенты выгодности хода и
> т.д - слишком замутно
но так и надо - для примера (все значения в StringGride):
перебираешь в цикле клетки по горизонтали. Там где уже есть крестик или нолик - помечаешь как не нужную(туда ведь не поставишь ничего:)). если в процессе перебора наткнулся на крестик, запоминаешь начальную позицию, идешь дальше, считая при этом кол-во крестиков, пока не выйдешь на НЕ крестик. в эту ячейку ставишь коэф. и в ранее запомненую клетку тоже ставишь. точнее ссумируешь с предыдущим в ней значением. Получаешь 2 точки с неким коэф. выгодности. перебираешь весь массив, и не только по горизонтали, но и по вертикали и по диагоналям. получишь массив с кучей коэф. выбираешь любой из самых больших и ставишь туда:) Также учитываешь близость к соседним точкам (своим и чужим), к краям поля.