» »

Igra šah

Igra šah

St753 ::

Nisem našel nobene primerne teme, tako da upam, da ni narobe, da odpiram novo.
Zanima me, če kdo ima (ve kako bi naredil) funkcijo, ki preveri, če je konec igre (šah mat)? Igro sem sprogramiral v JavaScript-u, sicer precej amatersko (kar se od amaterja najbrž tudi pričakuje?), tako da je prišlo približno 5000 vrstic kode. Sicer sedaj nameravam še spremeniti program tako, da ohranim funckionalnost le kodo skrajšam na 1000-2000 vrstic, kar pa bo vse prej kot lahko. Program, preverja:
- ali je premik prvi (če je, lahko kmet gre čez 2 polji)
- ali je poteza dovoljena,
- ali je šah nad belim/črnim kraljem,
- prepove premik npr. belega kralja ali druge bele figure, če bi to povzročilo šah nad belim kraljem.
V bistvu program deluje kot bi moral, v njem so upoštevana vsa pravila šaha (se mi zdi :) ) le ob koncu igre ne bo napisal, da je šah mat, ampak bo za katerikoli premik napisal: "Premik ni mogoč". Ena izmed možnosti bi bila brute force metoda, da stimuliram vse premike in preverim, če kateri izmed možnih premikov prepreči šah, ampak mene zanima, če ima kdo kakšno boljšo rešitev?

KernelPanic ::

Hmm, cisto nasplosno, jaz bi poizkusil z preverjanjem zasedenosti ali kritja nasprotnih figur na vseh poljih okoli kralja.

St753 ::

kako misliš okoli kralja? Misliš tistih 8 polj, ki so sosednja kralju?

KernelPanic ::

tako, in ce je vseh 8 polj okoli kralja zasedenih z figurami ali pa jih nasprotne figure pokrivajo, potem se kralj nima kam umakniti in je sah mat. V tej situaciji je lahko tudi pat pozicija, zato je se zadnji pogoj, da je bila prejsnja poteza sah (napaden kralj). Okoli kralja je lahko tudi manj polj, ce si z kraljem v kotu ali na robu.

St753 ::

Če bi bila rešitev tako lahka, bi zlahka ugotovil, če je šah mat, ampak na žalost ni. Moraš se zavedati, da lahko šah "dobim" iz praktično kjerkoli na šahovnici in od katerekoli figure nasprotne barve (razen kralja). To pa pomeni, da je potrebno upoštevati: način premikanja figure, ki "daje" šah in pa ne samo premik kralja ampak premik katerekoli figure, ki bi preprečila šah. Torej lahko tudi npr. v zgornjem levem kotu stoji kralj, v spodnjem desnem kotu pa kraljica, ki "daje" temu kralju šah. Ta šah lahko prepreči katerakoli figura, ki se bo postavila med kralja in kraljico, tudi npr kmet, ki je le polje oddaljen od kraljice lahko blokira ta šah. Razumeš v čem je problem?

KernelPanic ::

golobich ::

priporočam ti da si napišeš funkcijo lahkoPremaknem(String figura)
nevem točno kakšnega tipa maš figuro.
In vedno se vprašaš če je pogoj izpolnjen jo lahko premaknem drugače ne.
To je moj prvi pomislek. Kdaj se zgodi mat: Mat se zgodi kadar kralja nemoreš premaknit in je nad kraljem izveden napad.

To je čist tako iz glave povedano.

St753 ::

Hvala za link, vendar tam ni ugotovljenega nič novega, edina pametna rešitev, ki je navedena tam je brute force metoda. V bistvu bi lahko uporabil že napisano kodo za šah, ampak vseeno se mi zdi, da bi lahko obstajala boljša rešitev. Dejansko pomeni, da bi virtualno premikal figure in vsakič klical funkcijo šah. To v bistvu niti ni problem programiranja, je bolj problem matematike in algoritma za šah mat.
@golobich kdaj se zgodi mat je meni oz. komu drugemu lahko razložiti, problem je, ker moram jaz to "razložiti" računalniku, ki je v svoji osnovi precej butast in mu moraš vsako, tebi še tako lahko razumljivo stvar, razložiti preko kode, ki jo bo razumel, kar pa včasih ni tako lahko.

St753 ::

Spomnil pa sem se še ene težave. Ni zadosti, da se preveri, če katera figura lahko prepreči šah, ampak je potrebno tudi ugotoviti, če katera figura lahko "poje" figuro, ki "daje" šah in po tem, ko jo "poje", je potrebno ugotoviti še, če je nad kraljem še vedno šah (zaradi katere druge figure).

Spura ::

KernelPanic je izjavil:

tako, in ce je vseh 8 polj okoli kralja zasedenih z figurami ali pa jih nasprotne figure pokrivajo, potem se kralj nima kam umakniti in je sah mat. V tej situaciji je lahko tudi pat pozicija, zato je se zadnji pogoj, da je bila prejsnja poteza sah (napaden kralj). Okoli kralja je lahko tudi manj polj, ce si z kraljem v kotu ali na robu.

Lahko tudi pojem figuro, ki drzi kralja v sahu in lahko tudi postavim mojo figuro med kralja in figuro ki ga drzi v sahu. Seveda je se bolj kompleksno, morda lahko pojem figuro ki sahira kralja a s tem odprem sah od druge figure. V vsakem primeru, brute-force je edini nacin.

St753 ::

pa se da kje dobiti že napisano kodo za preverjanje šaha? šah sem sprogramiral bolj iz veselja in da se morda kaj naučim, ampak sedaj prihajajo izpiti in časa za pisanje funkcije, ki preverja šah mat nimam. Sicer pa bom program dokončal poleti...hvala vsem, vsaj za trud :)

kunigunda ::

Tukaj imas algoritme in teorije okoli saha, mogoce kaj najdes...

http://chessprogramming.wikispaces.com/...
http://www.frayn.net/beowulf/theory.html

technolog ::

Preveriš vse mogoče poteze nasprotnika in pogledaš, če je njegov kralj vedno v šahu. V tem primeru si ga matiral.

Potreben pogoj za mat, da greš sploh to preverjat je, da je kralj v šahu že takoj. Tako da ti ni treba počet tega 2x za vsako potezo.

To je hiter in tud še kar učinkovit način, saj je možnih potez nasprotnika ponavadi samo okoli 20.

Zgodovina sprememb…

St753 ::

technolog je izjavil:

Preveriš vse mogoče poteze nasprotnika in pogledaš, če je njegov kralj vedno v šahu. V tem primeru si ga matiral.

Potreben pogoj za mat, da greš sploh to preverjat je, da je kralj v šahu že takoj. Tako da ti ni treba počet tega 2x za vsako potezo.

To je hiter in tud še kar učinkovit način, saj je možnih potez nasprotnika ponavadi samo okoli 20.


to da je potreben pogoj, da je kralj v šahu mi je jasno in tudi funkcijo, ki mi preveri, če je v šahu že imam.
Glede tega koliko je možnih potez nasprotnika pa je naslednji problem: možno, da pri posamezni postavitvi je okoli 20 možnih potez, ampak ti ne boš pisal različne funkcije za vse možne postavitve in potem preverjal tistih 20 možnih potez, ampak je potrebno napisati neko splošno funkcijo, ki preverja šah mat za katerokoli postavitev figur, kar je absolutno težje preveriti, kot pa šah mat za že dano postavitev.

technolog ::

Ne razumem, kaj blodiš. Napišeš funkcijo mogočePoteze(stanje) in potem naprej.

Ni drugega načina.

Zgodovina sprememb…

Spura ::

technolog je izjavil:

Preveriš vse mogoče poteze nasprotnika in pogledaš, če je njegov kralj vedno v šahu. V tem primeru si ga matiral.

Potreben pogoj za mat, da greš sploh to preverjat je, da je kralj v šahu že takoj. Tako da ti ni treba počet tega 2x za vsako potezo.

V vsakem primeru gres preverjat, ce je stevilo moznih potez nasprotnika 0, zaradi pat pozicije. Ce je stevilo moznih potez 0, potem samo se pogledas, ali je kralj trenutno v sahu, potem je mat namesto pat. Sicer mi tudi ni jasno zakaj bi to dvakrat na potezo preverjal.

Pri tem ne rabis vseh potez racunat. Na zacetku vsake poteze igralca zacnes iskat vsaj eno potezo, po kateri kralj ne bo v sahu. Takoj ko najdes eno lahko zakljucis z iskanjem. Ce ne najdes nobene, pogledas ali je kralj trenutno v sahu in tako dobis pat/mat.

Zgodovina sprememb…

  • spremenil: Spura ()

technolog ::

V vsakem primeru gres preverjat, ce je stevilo moznih potez nasprotnika 0, zaradi pat pozicije. Ce je stevilo moznih potez 0, potem samo se pogledas, ali je kralj trenutno v sahu, potem je mat namesto pat.


Ni pa to edini način, kako se lahko mat zgodi. V vsakem primeru je treba pogledat vse mogoče poteze (in gledat če je še vedno šah), če jih je 0, je to samo poseben primer.

Spura ::

Ni poseben primer. V mat poziciji imas tocno 0 moznih validnih potez.

Glede izvedbe sem narobe rekel, namrec v vsakem primeru moras preverjat vse zivo validnih potez, ker ti bo igralec klikal in hotel premikat figure.
Najboljse, da imas na figure pripete sezname moznih potez, ki jih brises vsako potezo, in jih potem lazy-loadas. To je performancno najboljse. Vsaj tako bi jst naredu.

kunigunda ::

A za rošade si dodal pravila ? Nisem saha ze 20 let igral sam mislim da je ne mores delati, ce je poteza s kraljem ze bila, ce je poteza s trdnjavo s katero ga delas ze bila, in ce je premik kralja pri rosadi blokiran s sahom na kateri koli poziciji vmes.

St753 ::

Ne, sem ravno učeraj ugotovil, da moram dodati še možnost rošade. Sicer sam nisem ravno nek šahist, tako da si moram pravila za rošado še pogledati.
Še eno vprašanje, če morda kdo ve: ali se lahko kmeta, ko pride na drugo stran šahovnice, zamenja samo v tisti potezi, ko pride do konca, ali lahko tudi kasneje?

technolog ::

Pa an passant si tud poglej.

St753 ::

Eno vprašanje glede menjave konja in pa poteze en passant.
-Pri menjavi me zanima, če lahko kmeta zamenjamo z izbrano pobrano figuro samo v potezi, ko je le ta prišel do konca, ali ga lahko tudi kasneje?
-Pri potezi en passant: zanima me, ali lahko po tem, ko se kmet premakne iz začetne pozicije za dve polji, kmeta pobere le drug kmet s to potezo, ali lahko enako storijo druge figure (premik na polje za kmeta, po tem se ta premakne za dve polji)?
Kodo sem spisal popolnoma na novo in jo zmanjšal iz prejšnih 5000 na zdajšnih 700 vrstic, pri čemer sem ohranil vse funkcije (premikanje, pobiranje, preverjanje šaha), še vedno pa se nisem lotil funkcije za preverjanje šah mata. Računam, da bo za to potrebno dodatnih približno 500 vrstic.
Če se kdo ukvarja s šahom, bi prosil, če pove na katere stvari moram biti še pozoren, saj sam različnih potez in pravil šaha ne poznam preveč dobro (kot je npr. poteza en passant)

pijavka ::

Pri menjavi me zanima, če lahko kmeta zamenjamo z izbrano pobrano figuro samo v potezi, ko je le ta prišel do konca, ali ga lahko tudi kasneje?

Samo v trenutku ko napreduje. Kasneje ne.

Pri potezi en passant

Pri klasičnem šahu samo s kmetom poleg in še to lahko samo v trenutku, ko gre kmet zraven, kasneje ni več možno.
Za lažjo predstavo glej še wiki.

technolog ::

Pri menjavi me zanima, če lahko kmeta zamenjamo z izbrano pobrano figuro samo v potezi, ko je le ta prišel do konca, ali ga lahko tudi kasneje?


Ne da smemo, ampak moramo. Ko premaknemo kmeta na zadnjo vrsto, se moramo odločit, da ga zamenjamo z eno figuro (razen kralja in kmeta).

Razen en passant ni nobenih drugih "skrivnih" pravil.

St753 ::

kaj pa v primeru (teoretično seveda), da kmet pride do konca in so med pobranimi figurami sami kmeti oz. ni pobranih figur?

technolog ::

Teoretično: Zamenjaš kmeta z izbrano figuro.

Prakično: Daš zamašek od flaše namesto kmeta na polje in rečeš: tole je top/dama...

Se pravi, ni se ti treba omejevat na to, kaj ti je nasprotnik že pobral. Kmeta lahko promoviraš v karkoli.

St753 ::

To pomeni, da kadarkoli (tudi če so med pobranimi figurami druge figure in ne samo kmeti) lahko kmeta zamenjaš s poljubno figuro? Ker to pomeni, da bi lahko hkrati imel npr. 2 kraljici na šahovnici. Vedno sem mislil, da se kmet zamenja z eno izmed pobranih figur. Najbrž bi si moral malo bolj prebrati navodila za šah :D

technolog ::

Ne samo dveh, tudi 9 lahko.

mallard ::

Kmeta lahko promoviraš v konja, lovca, trdnjavo ali damo, v drugega kmeta (to pač ni ne vem kakšna promocija? :)) ali kralja pa ne.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Šahovski problem - mat v dveh potezah (strani: 1 2 3 4 )

Oddelek: Znanost in tehnologija
19119474 (7917) msjr
»

2 perfektna igralca šaha kdo zmaga (strani: 1 2 3 4 5 )

Oddelek: Znanost in tehnologija
20613378 (10516) GregiB
»

Človek proti Umetni inteligenci (strani: 1 2 3 4 )

Oddelek: Novice / Ostale najave
17214766 (11303) Roadkill
»

Kasparov vs. Fritz 8 (strani: 1 2 3 4 5 6 )

Oddelek: Znanost in tehnologija
27317354 (14268) Thomas
»

Kasparov vs Junior (strani: 1 2 3 4 )

Oddelek: Znanost in tehnologija
18314297 (11158) Thomas

Več podobnih tem