Viigi tuvastamine males

Loetud 133 kasutaja poolt

MeikopVint.ee asutaja 2007-10-16T15:19:35+03:00
Peame implementeerima reegli, mis tuvastaks viigiseisu, kui seis mängulaual ei ole teatud aja jooksul muutunud.
Siinjuures küsiks abi male mängijatelt - millal võiks tuvastada viigi males (peale pati seisu)?

Ise pakun välja järgmise meetodi: Kui laual on nuppe vähem kui 5 ja 30 käigu jooksul ei ole nuppude arv laual muutunud, tuvastatakse viik.

Mida arvate?
TiiT 2007-10-16T16:17:29+03:00
Reeglite järgi on viik näiteks siis kui mõlemad mängijad teevad 3 korda sama käiku. Ehk siis 3 korda edasi-tagasi.

Selline olukord on tegelikult täiesti võimalik, kuna ühel mängijal võib olla vaid 1 käik enda seisu päästmiseks ja teine sunnib teda seni tegema, kuni vastane kaotab.

Selline olukord võib tekkida ka siis kui on veel pooled nupud laual.
TiiT 2007-10-16T16:20:51+03:00
Aga viik võiks olla ka järgmistel olukordadel:

- momentaalselt, kui lauale on jäänud 2 kuningat.
- momentaalselt, kui lauale on jäänud 2 kuningat ja üks ratsu/oda (minu teada ei ole võimalik nii matti teha, aga targemad kommenteerige seda punkti!).
TiiT 2007-10-16T16:21:59+03:00
Aga meikop, su mõte on hea minu arust
lmartinl 2007-10-30T07:42:50+02:00
Malepartii lõpeb viigiga järgmistel juhtudel:

1. Kui vastased niimoodi kokku lepivad
2. Kui on patt
3. Kui sama seis on laual kolmandat korda. (arvestada tuleb ka seda, kelle käik on)
4. Kui 50 käigu jooksul pole löödud ühtegi nuppu ega liigutatud etturit.

Lisaks sellele peaks programm tuvastama viigi, kui lauale on jäänud matistamiseks ebapiisav materjal:
1. paljas kuningas
2. kuningas ja ratsu
3. kuningas ja oda
4. kunigas ja kaks ratsut (teoreetiliselt on matt küll võimalik, aga selle forsseerimine 99,99% juhtudest võimatu)

Viigiks tuleb lugeda ka olukord, kus üks mängijatest ületab mõtlemisaja, aga tema vastasel ei ole sel hetkel enam matistamiseks piisavalt materjali. (Näiteks kui ühel on kuningas ja lipp ja teisel ainult kuningas, aga lipuga mängijal lõpeb mõtlemisaeg enne, kui ta on vastase matistanud, on tulemuseks viik. Aga kui ühel on kuningas ja lipp ja teisel kuningas ja ettur, siis mõtlemisaja ületanu kaotab.)
MeikopVint.ee asutaja 2007-10-30T08:34:03+02:00
Tegemist on väga huvitavate ettepanekutega.

Analüüsiksin neid punkte veidi eraldi:

1) Realiseerimise seisukohalt on kõige keerulisem sama seisu tuvastamine kolmandat korda. Siinkohal küsiks: Terve laua seis peab siis olema identne st. ühtegi nuppu ei ole vahepeal võetud?
*Laua seise tuleb seega seni meeles hoida ja kontrollida, kuni toimub mõne nupu võtmine. Seejärel tuleb laua seisude hulk tühjendada ja uuele ringile minna.
Kas vangerdused / etturi vahetamised ei oma siinjuures mingit mõju? St. pärast vangerdamist võib vist ikka vangerdamiseelne seis laual tekkida? Sama lugu on vist ka etturi vahetamisel.

2) Arusaadav. Tuleb lugeda käike ja kui võetakse mõni nupp või käiakse etturiga, tuleb loendur nulli viia. Kui loendur jõuab 50-ni, tuvastatakse viik.

3) Sama, mida mainis Tiit - Viik tuvastatakse, kui lauale on jäänud kaks kuningat ja oda / ratsu. Anname siis mängijale võimaluse kahe ratsuga matti teha:)

4) Kui mängijal A saab otsa aeg (Siinjuures räägime me siis ikkagi ainult mängupõhisest / malekella ajasüsteemist?!?) ja kui sellel hetkel on kasutajal B üks kuningas / üks kuningas ja oda / üks kuningas ja ratsu, tuvastatakse viik?

Kas sain õigesti aru? Üritan lähinädalate jooksul muudatused sisse viia.

lmartinl 2007-10-30T09:28:23+02:00
pärast vangerdamist võib vist ikka vangerdamiseelne seis laual tekkida? Sama lugu on vist ka etturi vahetamisel.


Ei või. Võimalus vangerdada on üks seisuparameetritest. Ühe mängu jooksul ei saa vangerdada kaks korda.
Etturite vahetamisel lahkub laualt ettur ja seda ei saa enam kunagi tagasi. Järelikult ei saa seis enam korduda.

Üldiselt:

Terve laua seis peab olema täpselt identne. See tähendab:

1. Kõik nupud peavad olema alles
2. Kõik nupud peavad olema samadel kohtadel
3. Vangerdamisvõimalus(ed) peavad olema samad
4. Käigulolija peab olema sama

See tähendab, et seisude hulga võib tühjendada järgmistel juhtudel:
- kui toimub nupu äravõtmine
- kui toimub etturikäik (sest ettur ei saa enam kunagi sattuda ruudule, kust ta on lahkunud)

Lisaks juhtudel:
- kui toimub esimene kuningakäik (s.h. vangerdus)
- kui toimub esimene vankrikäik (s.h. vangerdus)
- kui toimub esimene käik teise vankriga, juhul kui kuningas pole veel käinud ega vangerdanud (vist peaks nii olema:) See on päris paras loogikaülesanne.)

Kui toimub käik, mis loob võimaluse [i]en passant[/i] löömiseks, siis seisude hulk tühjendatakse, (sest tegemist oli etturikäiguga) aga tekkinud seis ise ei tohi veel salvestuda, (sest see seis ei saa enam kunagi korduda, sest [i]passant[/i] võimalust saab kasutada ainult järgmisel käigul.)
lmartinl 2007-10-30T09:33:03+02:00
Aga kas on üldse tarvis seisude hulka teatud juhtudel tühjendada? Ehk oleks lihtsam lugeda vangerdamisvõimalust ja [i]en passant[/i]i üheks parameetriks, mis seisu määrab.

Noh umbes, et iga seis koosneb infost kuuekümne nelja ruudu kohta + info selle kohta, kes on käigul + vangerdamisvõimalused + [i] en passant[/i] võimalused.

Aga ma ei tea programmeerimisest midagi ja võib-olla panen väga mööda:)
lmartinl 2007-10-30T09:38:48+02:00

2) Arusaadav. Tuleb lugeda käike ja kui võetakse mõni nupp või käiakse etturiga, tuleb loendur nulli viia. Kui loendur jõuab 50-ni, tuvastatakse viik.


Märkasin, et süsteem loeb praegu käiguks iga üksiku käigu. Õigupoolest on males üks käik üks valge käik + üks musta käik. Ehk siis viik on siis, kui mõlemad on käinud 50 korda.
Muumi 2007-12-05T10:08:58+02:00
See 3-kordse lisamine võib veidi keeruline olla.

Aga siin ees oli üks formaalne viga : kõik vigurid ei pea olema samadel ruutudel, s.t. nt kaks samavärvi vankrit võivad omavahel kohad vahetada, samuti nt ratsud.

a) Käigul peab olema sama mängija,
b) NB! Kõikvõimalikud käigud peavad olema samad (nt vangerdusõigus, kui enne see oli, peab alles olema; möödaminnes löömine samuti),
c) Samaliiki vigurid peavad asuma samadel ruutudel (nagu mainitud, võivad vankrid omavahel kohad vahetada). Aga programmeerimisel see probleeme ei tohiks valmistada.

Seega löömine [sest sama viguri saab vaid etturimuundamisega, aga siis ei ole etturite arv sama], etturikäik, vangerdus peaksid counteri nullima.

50 käigu reegel kehtib siis ühele poolele, s.t. valgetel v mustadel on vaja teha 50 käiku [päris palju]. Ei tohiks piirata 30-ga, sest nt vanker+oda vankri vastu on üks tuntud seis, mis tuleb aeg-ajalt ette ja realiseerimine võtab palju aega. Samas mõni jahupea võib siis lipp lipu vastu hakata pahatahtlikult venitama ...

50 käigu reegli nullib ära etturikäik või mingi löömine.

Muideks, äkki süsteem ei peaks seda automaatselt otsima ? Äkki võiks lisada ühe nupukese, kus kasutaja saab lasta kontrollida, kas oli v ei olnud ? Aga sel juhul tuleks seda kuidagi piirata, et kasutaja liialt ei klikiks seda. [aga see selline uitmõte, ei tea, kas oleks mõistlik. Päriselus peab ise kindlaks tegema, seisu ei loeta automaatselt viigiks.]

Märkused :

K-kuningas, R-ratsu, O-oda, L-lipp, V-vanker

2R versus K ei ole viik, põhjendus, et reaalelus matti ei panda on absurdne. Siis võiks paljusid seise nii hinnata.

Kindlad viigid on :

a) laual ainult kuningad [edaspidi nimetan ainult, mis lisaks võib olla]
b) O või R
c) samavärvi O versus samavärvi O

Nüüd mõned seisud, mis puudutavad ajaületust tugevamale poolele [s.t. seisud ei ole viigid, aga nõrgem pool ei saa võita] :

a) R versus L ei saa võita,
b) O versus L ei saa võita,
c) O versus V ei saa võita

Kardan, et ei ole võimalik programmeerida "surnud seisu" üldjuhul, kus nt etturid on blokeeritud ja kuningad läbi ei pääse ning muid nuppe ei ole [siis peab lootma ilmselt 50 käigu reeglile v 3-kordsele kordusele v vastase mõistlikkusele, et viik ikka vastu võetakse], siia lisandub nt oma etturite taga kinni olev oda jne

FIDE kohtunik ja EML kohtunikekogu esimees

Lisa vastus

See funktsionaalsus on ainult verifitseeritud või VIP kasutajatele