Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > алгоритм хода компютера в крестиках-ноликах


Автор: americanets 6.6.2008, 16:49
задача простая, крестики нолики 3 х 3 , человек - компьютер

никак не могу придумать как ходить компьютеру (он не должен проигрывать) 



Автор: Rennigth 6.6.2008, 17:33
americanets, Тебе алгоритм или код? 

Автор: americanets 6.6.2008, 17:37
код, вобщем-то все сделать смог, а вот как научить компьютер ходить и выбирать правильный по ситуации ход я не знаю

Автор: pseud 6.6.2008, 17:54
а поискать
http://forum.vingrad.ru/act-Search/CODE/show/searchid-fa5e24284fa55282bb79f3745ff6ee8f/search_in-posts/result_type/topics/flag/search/highlite/%25D0%25BA%25D1%2580%25D0%25B5%25D1%2581%25D1%2582%25D0%25B8%25D0%25BA%25D0%25B8+%25D0%25BD%25D0%25BE%25D0%25BB%25D0%25B8%25D0%25BA%25D0%25B8/index.html

Автор: americanets 6.6.2008, 18:08
у меня ссылка не открывается

Добавлено через 8 минут и 10 секунд
поискал , но реализации не нашел

Автор: americanets 6.6.2008, 18:31
для вывода использую Panel(1,2,3...)

Как можно программно задать номер panel попробую через цыкл, просто с Delphi 2 день, задали на завтра сделать игру, вот мучаюсь как сделать 
Код

PanelX.caption:= 
чтоб х можно было задавать, а то пока все ошибки, что нет такого панел

Автор: americanets 6.6.2008, 19:24
делаю топорно , но как могу

сначала
Код


if(Panel1.Caption='') then begin Panel1.Caption:=val end
else if(Panel2.Caption='') then Panel2.Caption:=val
else if(Panel3.Caption='') then Panel3.Caption:=val
else if(Panel4.Caption='') then Panel4.Caption:=val
else if(Panel5.Caption='') then Panel5.Caption:=val
else if(Panel6.Caption='') then Panel6.Caption:=val
else if(Panel7.Caption='') then Panel7.Caption:=val
else if(Panel8.Caption='') then Panel8.Caption:=val
else if(Panel9.Caption='') then Panel9.Caption:=val;


потом просчитаю ситуации когда юзер ставит нолики или крестики рядом

Автор: THandle 6.6.2008, 19:34
americanets, а не лучше ли тут что то такое:

Код

var
  i : integer;
begin
  for i := 0 to ComponentCount - 1 do
    if Components[i] is TPanel then
      if TPanel(Components[i]).Caption = '' then
        begin
          TPanel(Components[i]).Caption := Val;
          break;
        end;
end;


???

Автор: mr.Anderson 6.6.2008, 19:53
Я рисовал в свое время крестики-нолики на делфях. Делал анализом всех возможных игровых ситуаций на поле и в зависимости от этого делал ход. При поле 3х3 этих ситуаций не так уж и много.

Автор: americanets 6.6.2008, 20:48
THandle, да, так конечно рациональней, но тогда "компьютер" легко проигрывает? цикл заменяет только простой перебор, а как в нево включить ситуации когда юзер ставит крестики рядом, 



mr.Anderson, 

просчитываю вручную

Код

// просчитаем все по диагноли  
if(Panel1.Caption<>'')and(Panel3.Caption<>'')and(Panel1.Caption<>val)and(Panel2.Caption='') then Panel2.Caption:=val 
else if(Panel4.Caption<>'')and(Panel6.Caption<>'')and(Panel4.Caption<>val)and(Panel5.Caption='') then Panel5.Caption:=val
else if(Panel7.Caption<>'')and(Panel9.Caption<>'')and(Panel7.Caption<>val)and(Panel8.Caption='') then Panel8.Caption:=val

else if(Panel1.Caption<>'')and(Panel2.Caption<>'')and(Panel1.Caption<>val)and(Panel3.Caption='') then Panel3.Caption:=val 
else if(Panel4.Caption<>'')and(Panel5.Caption<>'')and(Panel4.Caption<>val)and(Panel6.Caption='') then Panel6.Caption:=val
else if(Panel7.Caption<>'')and(Panel8.Caption<>'')and(Panel7.Caption<>val)and(Panel9.Caption='') then Panel9.Caption:=val

else if(Panel3.Caption<>'')and(Panel2.Caption<>'')and(Panel3.Caption<>val)and(Panel1.Caption='') then Panel1.Caption:=val 
else if(Panel6.Caption<>'')and(Panel5.Caption<>'')and(Panel6.Caption<>val)and(Panel4.Caption='') then Panel4.Caption:=val
else if(Panel9.Caption<>'')and(Panel8.Caption<>'')and(Panel9.Caption<>val)and(Panel7.Caption='') then Panel7.Caption:=val

// расчитаем все по вертикали
else if(Panel1.Caption<>'')and(Panel7.Caption<>'')and(Panel1.Caption<>val)and(Panel4.Caption='') then Panel4.Caption:=val

else if(Panel2.Caption<>'')and(Panel8.Caption<>'')and(Panel2.Caption<>val)and(Panel5.Caption='') then Panel5.Caption:=val
else if(Panel3.Caption<>'')and(Panel9.Caption<>'')and(Panel3.Caption<>val)and(Panel6.Caption='') then Panel6.Caption:=val

else if(Panel1.Caption<>'')and(Panel4.Caption<>'')and(Panel1.Caption<>val)and(Panel7.Caption='') then Panel7.Caption:=val
else if(Panel2.Caption<>'')and(Panel5.Caption<>'')and(Panel2.Caption<>val)and(Panel8.Caption='') then Panel8.Caption:=val
else if(Panel3.Caption<>'')and(Panel6.Caption<>'')and(Panel3.Caption<>val)and(Panel9.Caption='') then Panel9.Caption:=val

else if(Panel7.Caption<>'')and(Panel4.Caption<>'')and(Panel7.Caption<>val)and(Panel4.Caption='') then Panel4.Caption:=val
else if(Panel8.Caption<>'')and(Panel5.Caption<>'')and(Panel8.Caption<>val)and(Panel2.Caption='') then Panel2.Caption:=val
else if(Panel9.Caption<>'')and(Panel6.Caption<>'')and(Panel9.Caption<>val)and(Panel3.Caption='') then Panel3.Caption:=val

// проверим все по иксам

else if(Panel1.Caption<>'')and(Panel9.Caption<>'')and(Panel1.Caption<>val)and(Panel5.Caption='') then Panel5.Caption:=val
else if(Panel1.Caption<>'')and(Panel5.Caption<>'')and(Panel1.Caption<>val)and(Panel9.Caption='') then Panel9.Caption:=val
else if(Panel5.Caption<>'')and(Panel9.Caption<>'')and(Panel5.Caption<>val)and(Panel1.Caption='') then Panel1.Caption:=val


else if(Panel3.Caption<>'')and(Panel7.Caption<>'')and(Panel3.Caption<>val)and(Panel5.Caption='') then Panel5.Caption:=val
else if(Panel3.Caption<>'')and(Panel5.Caption<>'')and(Panel3.Caption<>val)and(Panel7.Caption='') then Panel7.Caption:=val
else if(Panel5.Caption<>'')and(Panel7.Caption<>'')and(Panel5.Caption<>val)and(Panel3.Caption='') then Panel3.Caption:=val





// простой перебор
//else
//begin
 else if(Panel1.Caption='') then Panel1.Caption:=val
else if(Panel2.Caption='') then Panel2.Caption:=val
else if(Panel3.Caption='') then Panel3.Caption:=val
else if(Panel4.Caption='') then Panel4.Caption:=val
else if(Panel5.Caption='') then Panel5.Caption:=val
else if(Panel6.Caption='') then Panel6.Caption:=val
else if(Panel7.Caption='') then Panel7.Caption:=val
else if(Panel8.Caption='') then Panel8.Caption:=val
else if(Panel9.Caption='') then Panel9.Caption:=val;
//end



все нормально, но почемуто плохо работает с первой графой Panel (1 4 7) и диагональю 1 4 9

Автор: krwlr 6.6.2008, 21:01
тему не читал, топы не читал, тока название темы читал...
думаю: 
почему не сделать массив A, типа

X X X
X X X
X X X

и перемещаться по нему a[i+1] и т.д?


хотя простите меня дурика...

Автор: americanets 6.6.2008, 21:04
krwlr, ну просто приткнуть ход робота уже придумали как, а вот как просчитать ситуации когда юзер стремится к выигрышу ?

Автор: Данкинг 6.6.2008, 22:44
Вот вам всем! smile  smile  smile 

Автор: americanets 7.6.2008, 02:37
Спасибо, попробую разобраться что а как

Автор: THandle 7.6.2008, 09:41
Данкинг, шо это за скины там? Без них нельзя делать что ли? smile 

Кода 1000 строк, можно раза в 2 сократить. Не запускал. По первой причине.

Кстати, там шахматы или что то другое? smile 

Автор: Данкинг 7.6.2008, 10:44
Крестики-нолики 10х10 там!

Цитата(THandle @  7.6.2008,  10:41 Найти цитируемый пост)
шо это за скины там? Без них нельзя делать что ли?

Если ты не запускал, как скины увидел - просто по файлу .skn понял, что ли? smile Это BusinessSkin. Без него можно, но с ним красивее. smile Да и компоненты у него интересные есть.

Цитата(THandle @  7.6.2008,  10:41 Найти цитируемый пост)
Кода 1000 строк, можно раза в 2 сократить. 

Я согласен, что код там далёк от идеального, но мне неохота было что-то более красивое придумывать для хода компьютера. smile 

Автор: americanets 9.6.2008, 23:03
Всем спасибо, вроде разобрался

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)