![]() |
Здравствуйте, гость ( Вход | Регистрация )
![]() |
![]()
Сообщение
#1
|
|
Member ![]() ![]() Группа: Members Сообщений: 53 Регистрация: 25.11.2006 Пользователь №: 26681 ![]() |
Вопщем нужна помощь с алгоритмом. Никак не могу найти подходящего. Нужен алгоритм для реализации бота для игры крестики-нолики на Delphi. Поле 40х40, пять в ряд (IMG:http://forum.iseekyou.im/style_emoticons/default/smile.gif) Кто-нить может помочь? =)
|
|
|
![]() |
![]()
Сообщение
#2
|
|
Member ![]() ![]() Группа: Members Сообщений: 53 Регистрация: 25.11.2006 Пользователь №: 26681 ![]() |
Код unit anatoly;
uses gamer; interface procedure anatoly_step (field : matrix; who : byte; var x, y : byte); implementation procedure anatoly_step; var i, j : byte; n : array [1..8] of byte; m : array [1..8] of byte; s, e : integer; max : real; t, h : byte; begin randomize; for j := 1 to 40 do begin for i := 1 to 40 do begin if field[i, j] = 2 then begin //**************Оценка собственной выгоды**************** n[1] := 1; while (field[i+n[1],j-n[1]] = who) and (i+n[1]<=40) and (j-n[1]>0) do n[1]:=n[1]+1; n[2] := 1; while (field[i-n[2],j+n[2]] = who) and (i-n[2]>0) and (j+n[2]<=40) do n[2]:=n[2]+1; n[3] := 1; while (field[i-n[3],j-n[3]] = who) and (i-n[3]>0) and (j-n[3]>0) do n[3]:=n[3]+1; n[4] := 1; while (field[i+n[4],j+n[4]] = who) and (i+n[4]<=40) and (j+n[4]<=40) do n[4]:=n[4]+1; n[5] := 1; while (field[i-n[5],j] = who) and (i-n[5]>0) do n[5]:=n[5]+1; n[6] := 1; while (field[i+n[6],j] = who) and (i+n[6]<=40) do n[6]:=n[6]+1; n[7] := 1; while (field[i,j-n[7]] = who) and (j-n[7]>0) do n[7]:=n[7]+1; n[8] := 1; while (field[i,j+n[8]] = who) and (j+n[8]<=40) do n[8]:=n[8]+1; n[1]:=n[1]+n[2]-1; n[3]:=n[3]+n[4]-1; n[5]:=n[5]+n[6]-1; n[7]:=n[7]+n[8]-1; if (n[1] >= 5) or (n[3] >= 5) or (n[5] >= 5) or (n[7] >= 5) then begin max := 1000; x := i; y := j; end; s := n[1]*n[1] + n[3]*n[3]+ n[5]*n[5]+ n[7]*n[7]; //**************Оценка выгоды противника**************** m[1] := 1; while (field[i+m[1],j-m[1]] <> 2)and(field[i+m[1],j-m[1]] <> who) and (i+m[1]<=40) and (j-m[1]>0) do m[1]:=m[1]+1; m[2] := 1; while (field[i-m[2],j+m[2]] <> 2)and(field[i-m[2],j+m[2]] <> who) and (i-m[2]>0) and (j+m[2]<=40) do m[2]:=m[2]+1; m[3] := 1; while (field[i-m[3],j-m[3]] <> 2)and(field[i-m[3],j-m[3]] <> who) and (i-m[3]>0) and (j-m[3]>0) do m[3]:=m[3]+1; m[4] := 1; while (field[i+m[4],j+m[4]] <> 2)and(field[i+m[4],j+m[4]] <> who) and (i+m[4]<=40) and (j+m[4]<=40) do m[4]:=m[4]+1; m[5] := 1; while (field[i-m[5],j] <> 2)and(field[i-m[5],j] <> who) and (i-m[5]>0) do m[5]:=m[5]+1; m[6] := 1; while (field[i+m[6],j] <> 2)and(field[i+m[6],j] <> who) and (i+m[6]<=40) do m[6]:=m[6]+1; m[7] := 1; while (field[i,j-m[7]] <> 2)and(field[i,j-m[7]] <> who) and (j-m[7]>0) do m[7]:=m[7]+1; m[8] := 1; while (field[i,j+m[8]] <> 2)and(field[i,j+m[8]] <> who) and (j+m[8]<=40) do m[8]:=m[8]+1; m[1]:=m[1]+m[2]-1; m[3]:=m[3]+m[4]-1; m[5]:=m[5]+m[6]-1; m[7]:=m[7]+m[8]-1; if ((m[1] >= 4) or (m[3] >= 4) or (m[5] >= 4) or (m[7] >= 4))and (max<>1000) then begin max := 500; x := i; y := j; end; e := m[1]*m[1] + m[3]*m[3]+ m[5]*m[5]+ m[7]*m[7]; //****************************************************** if max < s + 0.8 * e then begin x := i; y := j; max := s + 0.8*e; end; end; s := 0; e := 0; n[1]:=0; n[2]:=0; n[3]:=0; n[4]:=0; n[5]:=0; n[6]:=0; n[7]:=0; n[8]:=0; end; // for i := 1 end; // for j := 1 if max < 8 then begin repeat x := random(39)+1; y := random(39)+1; until field[x, y] = 2; end; end; //anatoly_step end. Вот что от меня требовалось ))) Примерную идею взял отсюда. Просто для каждой клетки считал сумму квадратов длин рядов, которые получатся, если сюда ставим и крестик, и нолик, и выбирал клетку с наибольшим значением. Вот ))) А учусь я (не сочтите за понты (IMG:http://forum.iseekyou.im/style_emoticons/default/smile.gif) ) в лучшей физико-технической школе Питера (м.б. даже и России)))) ЗЫ Еще раз всем спасибо (IMG:http://forum.iseekyou.im/style_emoticons/default/smile.gif) |
|
|
![]() ![]() |
Текстовая версия | Сейчас: 7th July 2025 - 05:07 |