Szachy pilne!!!!!!

0

Cze!
Mam poważny problem.
Piszę szachy. Napisałem już funkcje (w przypadku król/konia/pionka) i procedury (w przypadku gońca/wieży/hetmana) które zwracają możliwe ruchy dla danej bierki.
Z funckjami jest to np. tak :

ruchy_pionek(x,y:byte;ruch:byte) : Tpoint;

x,y to ort! figury, ruch to dany ruch:)

A z procedurami tak :

ruchy_goniec(x,y:byte);
var
ruch : array[1..32] of Tpoint;

W tablicy są zapisywane możliwe ruchy.

Mam też funckje typu czy jest szach, czy w kolumnie są dwa piony, czy król jest osłoniony etc.

Bierki oznaczyłem : 1 do 6 to bierki białe, 7 do 12 to bierki czarne (0 oznacza puste pole).

Zdeklarowałem tablicę : szachownica[1..8,1..8] of byte oraz
szwartosci[1..8,1..8] of word.

szwartości = szachownica tylko, że na szwartości zamiast figur od 1 do 6 czy od 7 do 12
są podane wartości niezależnie od koloru.

A proble jest taki:) : nie wiem jak mam napisać funkcję wartościującą(oceniającą) ruchy.

Myślę, że podałem dość danych. Liczę na konkretną odp. i z góry dziękuję.

[email protected]

P.s. Mile widziany gotowy kod:)))).

0

To jedziemy: :)

<font color="green">ruchy_pionek(x,y:byte;ruch:byte) : Tpoint;</span>

A jak określisz dany ruch, czy nie powinien on być też jako Tpoint?

<font color="green">A z procedurami tak :

ruchy_goniec(x,y:byte);
var
ruch : array[1..32] of Tpoint;</span>
W tablicy są zapisywane możliwe ruchy.

Hmm też chyba lepiej dać TPoint w procedurze co?

<font color="green">Bierki oznaczyłem : 1 do 6 to bierki białe, 7 do 12 to bierki czarne (0 oznacza puste pole).</span>

A nie łatwiej będzie ci operować rekordem ? Wtedy będzie można na przyszłość robić różne zaawansowane jakieś :) rzeczy... tak, aby rozpoznawał zgodność typów pionków przeciwnych kolorów. Można też użyć zbiorów, ale lepiej rekordu.

<font color="green">Zdeklarowałem tablicę : szachownica[1..8,1..8] of byte oraz
szwartosci[1..8,1..8] of word.</span>

nie wiem co to są szwardości.. przypuszczam, że masz na myśli wartości, ale nie rozumiem ich "celu"

<font color="green">szwartości = szachownica tylko, że na szwartości zamiast figur od 1 do 6 czy od 7 do 12
są podane wartości niezależnie od koloru.</span>

Nie rozumiem

<font color="green">A proble jest taki : nie wiem jak mam napisać funkcję wartościującą(oceniającą) ruchy.</span>

No nie wiem, chyba "im" mocniej zagrożony jest król, bo w końcu o to chodzi, gorzej z implementacją tego.. :/

0

Eee, ja bym to rekurencja jechal (szybk chodzic nie bedzie, ale zawsze). No wiec jesli np. masz ruch konia, ktory ma 4 mozliwosci ruchu. No to przesowasz go na 1 mozliwosc i wywolujesz ruch figury przeciwnika. Najlepiej jakby szachownica byla tablica wskaznikow do Klas typu TKon, TKrol itp.
Oto jak w zarysie mogloby to wygladac:

Procedure Ruch(Poz: TPoint);
var ax, ay: Byte;
begin
//W tym miejscu wykonujesz po kolei ruchy wszystkiomi figurami.
For ax:= 1 to Length(Szachownica) do
For ay:= 1 to Length(Szachownica[ax]) do
If Szachownica[Poz.X, Poz.Y] <> nil then //Spr czy jest tu figura
Szachownica[Poz.X, Poz.Y].Ruch; //wykonujesz ruch dana figura
end;

Potem (wewnatrz procedury Szachownica[Poz.X, Poz.Y].Ruch ktora zaleznie od typu obiektu znajdujacego sie na szachownicy moze byc ruchem np. wiezy albo innej figury) zrob petle wykonujaca wszystkie mozliwe ruchy danej figury wraz z odwolaniem sie za kazdym razem do glownej procedury ruch. Oczywiscie trzeba zrobic licznick tych ruchow itd. zeby sie nie zapetlilo. No i na koncu na podstawie wyniku wybierasz ten jeden wazny ruch. Kurde, ciekawe czy ktos ten belkot zrozumie :P

//Popieprzyło? Umieściłeś 7 linii tekstu w [ code ] i rozwaliłeś całą stronę - następnym razem patrz, jak wygląda Twój post i poprawiaj takie rzeczy!! - m.M

0

Nie zgadzam sie...
Aby 7 linii tekst...
Moglo w jakikolwiek sposob...
Rozpieprzyc jakakolwiek...
Nawet najslabsza...
Stronke na swiecie...
Sorry...

//Ludzie! Po co piszecie normalny tekst w [ code ] ??
//RiccoXXX - 1st warning... - m.M
//RiccoXXX alias Ric^22 sie chyba obawia pisac pod swoim nickiem i sie ukrywa.. mL

0

Taka procedura po pierwszejest diabelnie skomplikowana..po drugie trzbea miec troche pojecia o szachach.... :-/ Musisz przelozyc pozycje na konkretne wartosci liczbowe, a przy ocenianiu pozycji kierujesz sie mniej wiecej nastepujacymi zasadami.

Bezpieczenstwo krola, aktywnosc figur, posiadanie wolnych liniii i przekatnych, rozwoj figur, struktura pionowa, slabe punkty twoje i przeciwnika, przewaga przestrzeni, przewaga w centrum oraz
powinienes znac wartosci poszczegolnych figur, czyli np hetman 9 pkt, wieze 5 pkt, goniec 3,2(albo 3 roznie to bywa), skoczek 3, no i pionek jeden.

To by bylo z grubsza na tyle, zycze powodzenia :-D

Pozdrawiam,

Wodzu

0

Dał byśmi kod swojej gry!!! ja oferuje wzamian swoje źródła kólek :-[
[email protected]

2

Uwaga będzie offtop, ale nie mogę się powstrzymać, bo trafiłem na swojego posta po prawie ośmiu latach ;)

Kiedyś to człowiek był ambitny... Z takim poziomem wiedzy się zabierał za pisanie takich rzeczy, nie wiedząc
nawet co to jest rekurencja ;)

Dodam tylko, że szachów nigdy nie napisałem i już chyba było by mi szkoda na to życia ;)

Pozdrawiam,
Paweł.

0

hmm, trochę się pogubiłem - czy chodzi tylko o ocenę ruchu danej osoby w gry w szachy?
Jeśli tak, to czy nie lepiej skorzystać z algorytmu min-max, który się wykorzystuje m.in. do zautomatyzowania gry w szachy?
wówczas ruch najbliższy temu, który postawiłby komputer (zgodnie z algorytmem min-max) byłby najmocniej oceniany a im bardziej by się oddalał od tego ruchu (również zgodnie z powyższym algorytmem) tym ocena byłaby niższa...
Pozdrawiam

0

jeśli chodzi o szachy (ale także inne gry) stosuję się tzn. drzewa gry i na ich podstawie wybiera się scieżkę najlepiej ocenianą, ocena pojedyńczego ruchu nie ma sensu w szachach, bo w danej rundzie może być on najlepszy, ale w konsekwencji prowadzi do porażki
obecne silniki szachowe mają po kilka mega i liczą drzewa do głębokości 15 w ok. 30-50s
chyba najlepiej wymiatającym teraz jest Rybka (nie, nie jest to polski produkt)

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0