Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

31

11.01.2010, 21:38

Hört sich echt verdammt schwierig an, genauso wie die anderen contests.

Ich werd wohl noch einige konsolen vollschreiben, bis ich die leiseste ahnung davon hab :(

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

32

11.01.2010, 23:35

Es war gar nicht so einfach den überhaupt dazu zu bringen mal endlich ein paar richtige Schachzüge im Wechsel durchzuführen. Hat bei mir ne Weile gebraucht, bis ich den Dreh raus hatte.

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

33

11.01.2010, 23:57

Wer Visual Studio hat, und das ganze *während* die engine
von xboard verwendet wird, debuggen will, kann folgenden nützlichen
Trick verwenden:

am anfang des codes kommt ein:

C-/C++-Quelltext

1
2
while (!IsDebuggerPresent())
    Sleep(100);


Sinn: solange der Debugger nicht da ist, hält das programm an.
das gibt uns genug zeit, den debugger auch einzuklinken.

als erstes starten wir xboard mit unserer engine. aufgrund dieser
zeilen wartet xboard auf unser programm.

jetzt klicken wir im visual-studio auf debuggen->an den prozess anhängen,
und suchen unser programm aus der liste.
danach sollten breakpoints ganz normal funktionieren ;)
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

34

12.01.2010, 15:29

Ja super! Klappt! Der Trick war mir unbekannt. Das an den Prozess hängen alleine ging nicht. So macht das ganze deutlich mehr Spaß. Thx!

35

12.01.2010, 19:00

Ein kleines Beispielprogramm, in dem du die Kommunikation zwischen Engine und Winboard erläuterst, sollte schon drin sein.
(wenn ich mich recht erinnere, war bei den bisherigen Contests immer eine Beispielimplementierung dabei)
Scheint einigen Leutchen hier Probleme zu bereiten. ;)

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

36

13.01.2010, 01:56

Das Beispiel ganz oben ist schon vollkommen ausreichend. Die Kommunikation ist an sich auch kein Problem, man darf eben nicht versuchen die Befehle ohne Newline zu verschicken (rein kommen sie ohne). Ein paar Dinge wie das mit dem go/force usw. ist etwas verwirrend, aber bei mir klappts immerhin schon, daß ich ein paar Züge gegen eine andere Engine von selbst laufen lassen kann.

37

13.01.2010, 09:12

Anscheinend ist es nicht ausreichend, da mich schon ein paar Leute darauf angesprochen haben (die gerne mitmachen würden, aber an dieser Hürde verzweifeln).
Was ziert ihr euch denn so, mal ein "richtiges" Beispiel zu posten?

Crush

Alter Hase

Beiträge: 383

Wohnort: Stuttgart

Beruf: Softwareentwickler

  • Private Nachricht senden

38

13.01.2010, 15:48

Ich sag mal wie ich das mache.

Der erste Befehl ist bei mir:
cout.setf(ios::unitbuf);

Eigentlich kann man das ganze über eine Schleife mit Sleep() oder ähnliches realisieren, aber ich mache das etwas komfortabler über einen Timerinterrupt.

In diesem habe ich eine Schleife, die so aussieht: while (cin>>in) { if (in=="funktion") ...; } da steht immer drin, was ich vom anderen Programm an Nachrichten zugeschickt bekomme.
Die Antworten werden genauso einfach rausgeschickt: printf("Nachricht\n"); oder cout<<... geht genauso;

Wenn ein "quit"-Befehl an mich geleitet wird mach ich einen PostQuitMessage(0); weil sonst die Engine auch ohne Winboard weiter läuft.

Zu den Nachrichten sieht´s bei mir derzeit so aus: Wenn ein Zug vom Gegenspieler kommt oder ein "force" oder "go" an mich geschickt wird, erzeuge ich einen Gegenzug. Dieser wird Augenblicklich durchgeführt, sobald ich einen Zugbefehl wie "move a2a4" abschicke. Andere Befehle zum Übermitteln der Zeit müssen vorger geschickt werden.

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

39

13.01.2010, 18:56

Sorry für meine Fragerei, aber das ist einfach Neuland für mich.
Bin eben noch kein Programmierprofi! :)

Hab die Engine mal eingebunden, wie es in dem Tutorial erklärt wurde.
Dann start ich das Programm und dann steht dort "Starting chess programm". Und es hängt. Liegt wohl daran, dass ich die Nachrichten noch nicht verarbeitet habe und auch keine abgeschickt habe.

Hab mal so begonnen. Vielleicht könnt ihr mir weiterhelfen, bzw. Tipps geben, bis ich das mal zum Laufen gebracht habe. Wär euch sehr dankebar! :)


#include <iostream>
#include <string>
#include <fstream>


int main()
{
std::cout.setf(std::ios::unitbuf);
//std::cin.setf(std::ios::unitbuf); Brauch ich das auch?

std::string Input;

std::ofstream Datei("Debug.txt", std::ios::out);
Datei << "Debug Ausgaben:" << std::endl;

while(true)
{
if(std::cin >> Input && Input.length())
{
Datei << Input.c_str()<< std::endl;
}
}
}

Wollte einfach mal die empfangen Nachrichten in eine Datei schreiben, aber nicht mal das klappt...

Vielen Dank im Voraus.

Käsekönig

1x Contest-Sieger

  • Private Nachricht senden

40

13.01.2010, 18:57

Sorry für meine Fragerei, aber das ist einfach Neuland für mich.
Bin eben noch kein Programmierprofi! :)

Hab die Engine mal eingebunden, wie es in dem Tutorial erklärt wurde.
Dann start ich das Programm und dann steht dort "Starting chess programm". Und es hängt. Liegt wohl daran, dass ich die Nachrichten noch nicht verarbeitet habe und auch keine abgeschickt habe.

Hab mal so begonnen. Vielleicht könnt ihr mir weiterhelfen, bzw. Tipps geben, bis ich das mal zum Laufen gebracht habe. Wär euch sehr dankebar! :)


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <iostream>
#include <string>
#include <fstream>


int main()
{
    std::cout.setf(std::ios::unitbuf);
    //std::cin.setf(std::ios::unitbuf);  Brauch ich das auch?


    std::string Input;

    std::ofstream Datei("Debug.txt", std::ios::out);
    Datei << "Debug Ausgaben:" << std::endl;

    while(true)
    {
        if(std::cin >> Input && Input.length())
        {
            Datei << Input.c_str()<< std::endl;
        }
    }
}


Wollte einfach mal die empfangen Nachrichten in eine Datei schreiben, aber nicht mal das klappt...

Vielen Dank im Voraus.


EDIG: Sorry, für den Doppelpost, hab statt editieren (wollte Codetags hinzufügen) auf zitieren geklickt. Tut mir leid.

Werbeanzeige