[OOSchaak] MicroSE ChessIt (work in progress)
Echter heb ik de ontwikkeling weer opgepakt. Ik heb besloten dat de Schaakklok in eerste instantie nog niet belangrijk is. Dus ben ik gaan kijken naar:
- Het bewegen van stukken
- Een simpele GUI
- "Speciale" zetten als rokade, en passant slaan en promotie.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
| public override IEnumerable<Move> GetPossibleMoves(Game game) { //Direction multiplier for movement of color specific pawns var multiplier = (Color == GameColor.White ? 1 : -1); //Move one space var field1 = game.GetField(Field.X, Field.Y + 1 * multiplier); if(field1 != null && field1.Piece == null) { yield return new Move(this, field1); } //Move 2 spaces on default position if(DefaultPosition) { var field2 = game.GetField(Field.X, Field.Y + 2 * multiplier); if(field1.Piece == null && field2.Piece == null) { yield return new Move(this, field2) { PawnDoubleStep = true }; } } //Pawn takes piece var fieldD1 = game.GetField(Field.X - 1, Field.Y + 1 * multiplier); if (fieldD1 != null && fieldD1.Piece != null && fieldD1.Piece.Color != Color) yield return new Move(this, fieldD1); var fieldD2 = game.GetField(Field.X + 1, Field.Y + 1 * multiplier); if (fieldD2 != null && fieldD2.Piece != null && fieldD2.Piece.Color != Color) yield return new Move(this, fieldD2); |
Dit geeft alle mogelijke zetten van een Pion. (Muv en passant, maar daar later meer over.
Andere stukken hebben een soortgelijke functie waar de zetten in gedefinieerd worden.
Punt 2. Een simpele schaakgui bestaat uit een schaakbord, met daarop de stukken afgebeeld en de mogelijkheid om een stuk te verzetten.

Op Pion-promotie na kunnen alle zetten gedaan worden.
Punt 3. Schaken kent eigenlijk maar 3 soorten unieke zetten. Rokade, En Passant slaan en Pion promotie. Op de laatste na heb ik ze nu verwerkt in mijn schaakspel. Rokade zie je al in de screenshot hierboven en voor en passant slaan is er de volgende code (vervolg op code voorbeeld 1).
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| //En Passant if(Field.Y == 5 && Color == GameColor.White || Field.Y == 3 && Color == GameColor.Black) { var fieldLeft = game.GetField(Field.X - 1, Field.Y); var fieldRight = game.GetField(Field.X + 1, Field.Y); if(fieldLeft != null && fieldLeft.Piece is Pawn && fieldLeft.Piece.Color != Color && ((Pawn)fieldLeft.Piece).EnPassant && fieldD1.Piece == null) { yield return new Move(this, fieldD1, fieldLeft.Piece); } if(fieldRight != null && fieldRight.Piece is Pawn && fieldRight.Piece.Color != Color && ((Pawn)fieldRight.Piece).EnPassant && fieldD2.Piece == null) { yield return new Move(this, fieldD2, fieldRight.Piece); } } |
Hoe nu verder?
Als eerste wil ik het spel zo maken dat je een standaard potje kan schaken. Dan kom ik met een (gesloten) beta release. Wat is hiervoor nodig?
- Werking van Pion-promotie.
- Werking van de begrippen "Schaak", "Mat" en "Pat".
- Uitbreiding van de UI met weergave van de actieve speler (en misschien nog een paar andere uitbreidingen)
Have fun!
11-'14 [OOSchaak] MicroSE ChessIt Beta Inschrijvingen
09-'14 [18+] Een ongelukkig gedicht
Reacties
Overigens zie ik héél veel if-jes, kun je daar niet effectief case-statements voor inzetten?
Het is al een heel oude regelPathogen schreef op maandag 03 november 2014 @ 14:07:
Wat grappig, ik kende de en passant regel helemaal niet!
Ik denk dat het hier vrij lastig wordt om het tot een select case-statement om te zetten.Overigens zie ik héél veel if-jes, kun je daar niet effectief case-statements voor inzetten?
Desalniettemin leuk programmeerproject
Een Piece staat altijd op 1 Field, maar een Field heeft niet altijd 1 Piece.
Ook is er een zekerheid dat een Game 64 Fields heeft.
Daarbij heeft het alleen al voor de Pat-controle al bestaansrecht.
Pat = de uitkomst van alle mogelijke zetten is schaak voor je eigen koning (Mat), zonder dat je schaak staat (Pat).
Ik geef toe dat ie handig is, maar als ik puristisch mierenneuk zou ik hem weglaten. Alle posities zijn opgeslagen als eigenschappen van de stukken. De velden zijn dan een handige rekenhulp, maar in principe niet nodig.sanderev66 schreef op maandag 03 november 2014 @ 15:06:
Qua relatie wel.
Een Piece staat altijd op 1 Field, maar een Field heeft niet altijd 1 Piece.
Ook is er een zekerheid dat een Game 64 Fields heeft.
Daarbij heeft het alleen al voor de Pat-controle al bestaansrecht.
Pat = de uitkomst van alle mogelijke zetten is schaak voor je eigen koning (Mat), zonder dat je schaak staat (Pat).
Maar goed, dat is puristisch en compleet vanuit modellering gezien. Hulpklassen bewijzigen zich vaak genoeg
iig heb ik voor dit jaar 3 andere "projectjes". Mn schaakspel, mn CSV bewerkingstool en www.sanderevers.nl
[Reactie gewijzigd op maandag 03 november 2014 15:52]
Duurt lang dan.sanderev66 schreef op maandag 16 juni 2014 @ 00:10:
Ik ben begonnen aan mijn eerste "Verhalenhoek"-verhaal. Het wordt een heel ander soort verhaal dan wat ik tot nu toe geschreven heb, en zodra ik Hoofdstuk 1 af heb ga ik 'm posten.
@hieronder: zo'n vermoeden had ik al.
[Reactie gewijzigd op maandag 03 november 2014 17:13]
Als een Pion een dubbele stap zet gaat de EnPassant property op true. De volgende zet worden alle EnPassant properties (die op true staan) eerst op false gezet. De controle zit dus niet in de property zelf. (Hoort daar mi. niet)
[Reactie gewijzigd op maandag 03 november 2014 17:14]
Ik heb nu Pion-promotie werkend
*) Wordt gedetecteerd maar nog niet afgehandeld verder.
Waarom zou je de beta release gesloten maken?!Dan kom ik met een (gesloten) beta release.
Nou een heel stuk is wat ovedreven, 1 extra voorwaarts na je dubbele zet als eerste,sanderev66 schreef op maandag 03 november 2014 @ 14:16:
[...]
Het is al een heel oude regelMaar mensen kennen 'm inderdaad vrij weinig. Het is ook niet altijd een handige zet. Want je moet wel een heel stuk met je pion lopen én je pion is gelijk makkelijk te slaan
Verhaal dat mij verteld is erachter, is dan ook dat die twee vakken voorwaarts bij je eerste beweging met die pion eigenlijk diefstal is van 1 stap, de tegenstander die er een pion goed voor heeft staan (dus ernaast) kan ervoor kiezen (alleen direct na je diefstal) je niet weg te laten komen met de diefstal en slaat in dat geval door de pion te verzetten naar het vakje waar hij zonder defstal had moeten staan.
Wil wel testen hoor
[Reactie gewijzigd op dinsdag 04 november 2014 14:39]
En betreft het testen ga ik een kleine screening doen van de aanmeldingen (ook een beetje afhankelijk van het aantal aanmeldingen). Maar zoals aangegeven, daar binnenkort meer over.
[Reactie gewijzigd op dinsdag 04 november 2014 15:00]
Je doet nu net alsof je software de bom is en er super veel testers zullen zijn, maar dat is niet het geval.sanderev66 schreef op dinsdag 04 november 2014 @ 14:57:
En betreft het testen ga ik een kleine screening doen van de aanmeldingen (ook een beetje afhankelijk van het aantal aanmeldingen). Maar zoals aangegeven, daar binnenkort meer over.
Maak je beta gewoon open, zet je source op Github en gebruik de issue tracker aldaar, krijg je de meeste response mee.
Leuk dat je weer woorden, die ik NOOIT gezegd heb, in mijn mond gaat leggen!kipusoep schreef op dinsdag 04 november 2014 @ 15:57:
[...]
Je doet nu net alsof je software de bom is en er super veel testers zullen zijn, maar dat is niet het geval.
Toch wil ik bepalen wie de beta mag testen. Ik ga een selectie van 10/20 testers maken. Of er moet echt een grote hoeveelheid inschrijvingen zijn.
Dat heb ik vaak genoeg geprobeerd en we kennen allebei de gevolgen daarvan.Maak je beta gewoon open,
Nee, dát ga ik dus nooit doen. Maar dat moet je nu wel weten.zet je source op Github en gebruik de issue tracker aldaar,
Ik wil de beste response hebben, niet de meeste. 80% van de bulk van "de meeste" response is dubbel, reeds bekend of soms zelfs al gefixed in development. Ik wil de 20% die overblijft.krijg je de meeste response mee.
[Reactie gewijzigd op woensdag 05 november 2014 07:30]
Prima, blijf je lekker eigenwijs en koppig doen, je komt jezelf nog wel een keer tegen...sanderev66 schreef op woensdag 05 november 2014 @ 07:26:
[...]
Leuk dat je weer woorden, die ik NOOIT gezegd heb, in mijn mond gaat leggen!
Toch wil ik bepalen wie de beta mag testen. Ik ga een selectie van 10/20 testers maken. Of er moet echt een grote hoeveelheid inschrijvingen zijn.
[...]
Dat heb ik vaak genoeg geprobeerd en we kennen allebei de gevolgen daarvan.
[...]
Nee, dát ga ik dus nooit doen. Maar dat moet je nu wel weten.
[...]
Ik wil de beste response hebben, niet de meeste. 80% van de bulk van "de meeste" response is dubbel, reeds bekend of soms zelfs al gefixed in development. Ik wil de 20% die overblijft.
Dat zal een erg interessante ontmoeting zijn!kipusoep schreef op woensdag 05 november 2014 @ 08:37:
[...]
Prima, blijf je lekker eigenwijs en koppig doen, je komt jezelf nog wel een keer tegen...
En als je nu nog niet wist dat ik eigenwijs en koppig ben, dan moet je eens oudere tweakblogs nalezen. Het is nou eenmaal hoe ik ben, en ik ben er trots op. Dat ik weet wat ik wil en hoe ik het wil.
[Reactie gewijzigd op woensdag 05 november 2014 09:11]
https://chessprogramming.wikispaces.com/Kallisto
Kan je je code voor de rokade ook posten? Die is m.i. vele malen lastiger dan b.v. en-passant.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
| if (DefaultPosition) { //Short castle //King moves 2 > //Rook moves 2 < var rook1 = game.GetField(8, y).Piece as Rook; var rook2 = game.GetField(1, y).Piece as Rook; if (rook1 != null && rook1.DefaultPosition) { var rookCastleField = game.GetField(x + 1, y); var kingCastleField = game.GetField(x + 2, y); if (rookCastleField.Piece == null && kingCastleField.Piece == null) { yield return new CastleMove(this, rook1, kingCastleField, rookCastleField, false); } } //Long castle //King moves 2 < //Rook moves 3 > if (rook2 != null && rook2.DefaultPosition) { var rookCastleField = game.GetField(x - 1, y); var kingCastleField = game.GetField(x - 2, y); var noneCastleField = game.GetField(x - 3, y); if (rookCastleField.Piece == null && kingCastleField.Piece == null && noneCastleField.Piece == null) { yield return new CastleMove(this, rook2, kingCastleField, rookCastleField, true); } } } |
Dit controleert NIET of een rokade mag, enkel of die kan. De controle ofdat hij toegestaan is zit in Game, GameRules.
[Reactie gewijzigd op woensdag 05 november 2014 09:59]
Er gaan ook verhalen dat de regel bedacht is als een mogelijkheid om dichtgeschoven stellingen te kunnen vermijden en zo het spel dynamischer te maken. Lijkt me heel plausibel, in de praktijk werkt het ook zo.Silent7 schreef op dinsdag 04 november 2014 @ 14:37:
[...]
Nou een heel stuk is wat ovedreven, 1 extra voorwaarts na je dubbele zet als eerste,
Verhaal dat mij verteld is erachter, is dan ook dat die twee vakken voorwaarts bij je eerste beweging met die pion eigenlijk diefstal is van 1 stap, de tegenstander die er een pion goed voor heeft staan (dus ernaast) kan ervoor kiezen (alleen direct na je diefstal) je niet weg te laten komen met de diefstal en slaat in dat geval door de pion te verzetten naar het vakje waar hij zonder defstal had moeten staan.
Wil wel testen hoor
Nee, dat is het veld waar de koning naartoe gaat. Wat niet zou kunnen als er bv een loper staatBart2005 schreef op woensdag 05 november 2014 @ 10:53:
kingCastleField.Piece == null... Daar staat de koning, toch?
Is maar ene detail, maakt verder niet zo veel uit.
Dat kan. Y is natuurlijk wel nodig gezien het ook op e8 kan (zwart). En ik heb sowieso y nodig om het veld te kunnen selecteren.Bart2005 schreef op woensdag 05 november 2014 @ 12:48:
Aha, dan is x het veld van de koning? Kan je ook getfield (5 zelfs zonder y) doen, dus absoluut, net als je met de torens doet. Rokade kan toch alleen als de koning op e1 staat.
Is maar ene detail, maakt verder niet zo veel uit.
Daarbij ben ik uitgegaan van de stappen die genomen worden. x is de koning die verplaats 2 stappen naar links of rechts. De toren komt 1 plaats rechts of links van de koning te staan.
En bij lange rokade "springt" de toren nog één veld 3 velden vanaf de koning.
Bovendien kun je dan handig testen of al je spelregel-logica foutloos werkt omdat het aantal legale zetten van veel posities bekend is (zoek maar eens op PERFT als je dat nog niet kent).
Ik ga eerst voor een simpel werkend schaakspelletje. (Heb ik nu)
Deze komt in een gesloten beta. (binnenkort meer info)
Dan ga ik bugjes fixen / refactoren.
Dan komt de eerste versie. (grotendeels volledige UI, etc) Als in een lokaal 2 spelerspel.
Dit zal waarschijnlijk half/eind december zijn.
Daarna heb ik 2 wegen:
1. Netwerk multiplayer.
2. AI, API en SDK.
Ik moet nog gaan kijken naar wat ik als eerste ga doen.
[Reactie gewijzigd op woensdag 05 november 2014 14:29]
Als model is dat handig omdat je het ook voor andere bordspelen kunt gebruiken, dan verandert alleen het ene object wat de legale zettenlijst aanlevert.
Als je geen legale zettenlijst hebt (die je ergens mee kunt vergelijken) kun je volgens mij nooit "bewijzen" (mocht dat noodzakelijk zijn) dat het foutloos werkt. Omdat je nu eenmaal niet alle illegale zetten kunt proberen/testen.
Met een zettenlijst ("de whitelist") is alles wat daar niet in voorkomt per definitie niet legaal.
Misschien zie je dit helemaal niet als een probleem... dan ik ook niet
Wel kan ik inbouwen dat je van een verzameling zetten kan zien welke zetten er toegestaan zijn. Maar dit is ingewikkeld, want je moet tot 2 niveau's diep gaan. Gezien je een zet kan doen waardoor je schaak zal staan, of een zet kan doen terwijl je schaak staat (maar dit niet oplost).
Dit laatste heb ik op de planning voor de AI-tak van de applicatie.
[Reactie gewijzigd op donderdag 06 november 2014 11:56]
Waar ik persoonlijk wel benieuwd naar ben, is omdat je een eigen framework hebt, hoe het qua veiligheid zit. Zijn er programma's die van het framework gebruik maken, die onder admin rechten draaien? En is security iets waarmee je tijdens het ontwikkelen rekening houdt?
Addendum: wel goed dat je inmiddels alle 'overbodige' copyright en registered trademark tekens hebt afgeschaft!
[Reactie gewijzigd op donderdag 06 november 2014 12:13]
Ik vond het leuk om een verhaaltje over ontwikkeling te schrijven. Releases lopen via microse.nl. Niet via dit blog.jurroen schreef op donderdag 06 november 2014 @ 12:10:
Toch weer MicroSE op tweakblogs? Ik moet eerlijk zeggen, soms is het wat lastig volgen, de ene keer neem je afscheid en dan ben je er weer.
Al* mijn applicaties draaien op user-niveau. Daarbij is mijn framework een subframework voor .NET welke standaard veilig is. Het framework zelf heeft verder geen handelingen die een security risico kunnen vormen.Waar ik persoonlijk wel benieuwd naar ben, is omdat je een eigen framework hebt, hoe het qua veiligheid zit. Zijn er programma's die van het framework gebruik maken, die onder admin rechten draaien? En is security iets waarmee je tijdens het ontwikkelen rekening houdt?
*) Alleen Connect vereist admin toegang, omdat deze programma's moet kunnen installeren en installaties van programma's moet controleren. Maw. toegang tot mappen van andere programma's.
Nee hoor, in de beginstelling zijn dat er 20 voor wit.sanderev66 schreef op donderdag 06 november 2014 @ 11:55:
Game & GameRules voeren de volledige controle uit of een zet legitiem is. Er zijn gewoonweg té veel mogelijke opstellingen mogelijk om die állemaal te whitelisten. Er hoeft maar één legitieme zet te zijn die niet in de whitelist staat en je kan je spel niet spelen.
Wel kan ik inbouwen dat je van een verzameling zetten kan zien welke zetten er toegestaan zijn. Maar dit is ingewikkeld, want je moet tot 2 niveau's diep gaan. Gezien je een zet kan doen waardoor je schaak zal staan, of een zet kan doen terwijl je schaak staat (maar dit niet oplost).
Dit laatste heb ik op de planning voor de AI-tak van de applicatie.
Het gaat zo: je scant het bord voor witte stukken (als wit aan zet is) en kom je er 1 tegen dan genereer je voor het soort stuk de (semi-legale) zetten. Dan doe je de test of je na die zet schaak staat of schaak blijft staan (dat doe je nu voor de rokade w.s. ook al) en als dit niet zo is kan de zet aan de lijst van legale zetten toegevoegd worden.
Op deze manier staan alle mogelijke (legale) zetten in de whitelist als je alle stukken gescand hebt.
Ook al handig om, als je b.v. rechts klikt op een stuk om de legale mogelijkheden te displayen.
Nee, je kan nu geen illegale zetten doen.Bart2005 schreef op donderdag 06 november 2014 @ 12:48:
Of moet ik het zo begrijpen dat je nu gewoon illegale zetten kunt doen en dat dat ook gewenst is?
Je kan straks hier jezelf registreren http://chessit.microse.nl.
Reageren is niet meer mogelijk