Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Крестики-нолики


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 точки с неким коэф. выгодности. перебираешь весь массив, и не только по горизонтали, но и по вертикали и по диагоналям. получишь массив с кучей коэф. выбираешь любой из самых больших и ставишь туда:) Также учитываешь  близость к соседним точкам (своим и чужим), к краям поля.


Наверх

Титульная страница Поиск, карта сайта Написать письмо