Nieuws:

We zijn er weer.

Na lange tijd van afwezigheid zijn we er weer  :laugh:
We hebben alle wachtwoorden gereset, je oude wachtwoord werkt niet meer.Je moet via het "wachtwoord vergeten"-linkje je wachtwoord resetten. Je krijgt hiervoor een mailtje op het adres dat je bij ons geregistreerd hebt.

De komende tijd zijn we nog druk bezig om de rest van de site op te bouwen, dus het kan zijn dat sommige onderdelen (tijdelijk) niet werken.

Welkom, Gast. Alsjeblieft inloggen of registreren.
Heb je de activerings-mail niet ontvangen?

Auteur Topic: Idee voor een programma bij schaken; voor weergave van de opening n.a.v. zetten  (gelezen 1494 keer)

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Voor het schaken zoek ik of wil ik zelf een programma maken om de naam van een opening te weergeven aan de hand van de eerste paar zetten. Welke programmeertaal is geschikt?
Het is de bedoeling om als input de korte notatie te gebruiken of een .pgn bestand via een pipe te gebruiken.
Hoe hou ik in een tabel de openingen bij? Hoe ziet de structuur van zo'n programma eruit?
« Laatst bewerkt op: 2013/10/12, 18:39:11 door bartveurink »

Offline Vistaus

  • Webteam
    • vistaus
  • Steunpunt: Nee
Ik zou dan gewoon simpel Python gebruiken of anders EFL (maar voor EFL moet je wel minimaal C kennen).

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Zijn er bruikbare stukken programmacode die ik kan overnemen?

Iets in de zin van een openingenboek waar de zetten van openingen in staan, vermeld met een naam?
En hoe lees ik een enkele zet uit een hele reeks zetten?

Hoe vind ik deze code waar ik het programma op kan baseren?

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Als er ingevoerd word (voorbeeld):

Als Invoer:
1. e4 e5 2. Pf3 Pf6 3. d3 d6

Dan moet er in het openingenboek worden gekeken:

Zet:                                                                    Output:
1. e4                                                                  Koningspion
1. e4 e5                                                             Open Spel
1. e4 e5 2. Pf3 Pf6                                         Russisch

Enzovoorts tot de laatste zet of tot er geen mogelijkheden in het openingsboek staan.

Offline Paul Matthijsse

  • Lid
  • Steunpunt: Ja
Geen idee! Maar ik zag toevallig net (had je vraag gisteren al gelezen) dat in Synaptic het schaakprogramma Crafty te vinden is. Daar kun je verschillende openingsboeken bij installeren. Kun je daar iets mee wellicht?

Beschrijving:
"Opening books that crafty use to evaluate the position during the game. This is the medium version, occupying 4MB and containing +7500 games computed until the 60th ply."

Offline MKe

  • Lid
  • Steunpunt: Nee
Ziet eruit als een relatief simpel database progje. Je zou die zet-combinaties op een slimme manier in b.v. een sqlite database kunnen zetten en daar queries op draaien.
Het misschien zelfs nog simpeler door slim te zijn met dictionaries in b.v. Python Je zou zelfs zo'n library met pickele kunnen opslaan om her te gebruiken en eventueel later dingen toe te voegen. Ik weet nog niet genoeg af van het probleem om een ontwerp te maken, ik weet namelijk nauwelijks iets van schaken.
Maar ik vrees dat je jezelf wel moeilijk maakt als je zo weinig van programmeren af weet. Andere code overnemen zal je niet helpen, als je niet begrijpt wat er gebeurt. Je kunt ook niet zomaar hier vragen hoe je dit moet doen. Ik kan het je niet eens uitleggen als je de basis beginselen als loops, lists en dictionaries niet begrijpt. Ik zag je andere topic ook en dat doet me vermoeden dat je niets van dit alles weet, of heb ik daar een verkeerde indruk?

Python of wat voor taal is om het even. Je moet een simpel te begrijpen taal nemen met veel documentatie. Python is zeker een goede kandidaat. In python kun je gemakkelijk objecten maken om gegevens op een gestructureerde en begrijpelijke wijze in het geheugen te zetten. Python heeft ook een prima aansturing voor databases als sqlite.

Edit: vond ook een library met een beetje googelen:
Citaat
Additionally, chesstools.book provides an intuitive interface for building opening book databases for use in conjunction with an ai.
https://pypi.python.org/pypi/chesstools/0.1.7
« Laatst bewerkt op: 2013/10/15, 23:02:43 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Programmeren is lang geleden. Alleen klein beetje in pascal geprogrammeerd.

reeks = input()
for letter in reeks
    if letter = '.'
        zet =''
    if letter != ' ' and != '.'
        zet = zet + letter
    if letter = " " and zet != ''
        zetten.append(zet)
        zet = ''
zetten.append(zet)

Hoe krijg ik invoer via de command line in de variabel reeks (string). Klopt de for lus die voor iedere letter in de reeks word uitgevoerd. De variabel zetten moet een list zijn waarin alle zetten op volgorde staan.
Is dit goede code?
« Laatst bewerkt op: 2013/10/16, 16:11:45 door bartveurink »

Offline MKe

  • Lid
  • Steunpunt: Nee
Programmeren is lang geleden. Alleen klein beetje in pascal geprogrammeerd.

reeks = input()
for letter in reeks
    if letter = '.'
        zet =''
    if letter != ' ' and != '.'
        zet = zet + letter
    if letter = " " and zet != ''
        zetten.append(zet)
        zet = ''
zetten.append(zet)

Hoe krijg ik invoer via de command line in de variabel reeks (string). Klopt de for lus die voor iedere letter in de reeks word uitgevoerd. De variabel zetten moet een list zijn waarin alle zetten op volgorde staan.
Is dit goede code?
Ik zou geen input() gebruiken, omdat je het dan als een python variabele moet ingeven, dus als een list of string. M.a.w. de gebruiker moet iets van python af weten. Je vergeet de : in het for statement, een standaard beginnersfout.

Als je het persee op die manier wilt doen, gebruik dan raw_input:
var = raw_input("Geef een lijst van zetten, gescheiden met een comma: ") # var wordt een enkele string
for zet in var.split(','): # splits var op in items, gebruik de , als delimiter
    print "Dit was zet: ", var
edit: Vergeet mijn opmerking over  raw_input als je python3 gebruikt, daar moet het blijkbaar wel input zijn. Ik programmeer in 2.7.

Volgens mij is het beter om de input via de commandline bij het starten van het script te geven. Je kunt hiervoor de sys module gebruiken:
#!/usr/bin/env python

import sys

arg = sys.argv[1:] # lees de parameters van de commandline uit, maar niet het eerste item want dat is de scriptnaam

for a in arg:
    print "Dit was zet: ",a
Stel dat dit scripte opgeslagen is als test.py, dan gebruik je dat als volgt:
$ python test.py a b c d e
Dit was zet: a
Dit was zet: b
Dit was zet: c
Dit was zet: d
Dit was zet: e
Je ziet, hij heeft een list gemaakt van de parameters die je in de shell hebt meegegeven. Het loopje print die een-voor-een.
Parameters in een bashshell kun zijn woorden/tekens, gescheiden met een spatie. Wil je een zin of iets anders dat een spatie bevat als 1 gebruiken, moet je die tussen aanhalingstekens zetten.
Hopelijk helpt dit je.

Verder is een reeks van if -statements over het algemeen een slecht ontwerp idee. Dat moet anders kunnen denk ik. Maar daar mag je eerst zelf over denken ;)
« Laatst bewerkt op: 2013/10/16, 20:14:52 door MKe »
Mijn blokkendoos blog: http://mke21.wordpress.com/

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Probleem is opgelost. Ik moest even verder kijken dan mijn neus lang is. Hieronder een database met openingen.
http://www.smb.nl/opening.asp

Offline MKe

  • Lid
  • Steunpunt: Nee
Opgelost in de zin van, dit werkt met jouw script als achtergrond? Of wil je hier een alternatief voor maken of hoef je het niet meer te maken omdat dit al doet wat je wilt?

Offline bartveurink

  • Lid
  • Steunpunt: Nee
Omdat de site doet wat ik wil.

Offline bartveurink

  • Lid
  • Steunpunt: Nee
x = 0
for zet in arg:
x = x + 1
if x == 2:
zetten.append(zet)
elif x == 3:
zetten.append(zet)
x = 0

Is dit optimale code. Het werkt wel, maar zou een professionele programmeur het ook zo maken?

Uitleg:
De eerste, vierde, zevende, enz. word overgeslagen. Zo worden alleen de zetten zonder de zetnummers in de lijst zetten te staan.