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

Anonymous

unregistriert

1

02.09.2006, 00:46

TicTacToe für die Konsole [Teil 1]

Es gibt doch genug, die endlich mal ein Spiel programmieren wollen,
aber nicht genau wissen wie das geht. Ich hoffe denjenigen kann ich mit
diesem Tutorial ein wenig weiterhelfen. Es wird natürlich nicht funktionieren,
wenn ihr den Code einfach nur abtippt, geschweige denn kopiert. Naja
ich kanns ja nicht ändern, ich kann euch nur wieder daran erinnern. =)
So, nun aber zum eigentlichen Thema:

Fangen wir doch damit an ein Projekt einzurichten. Ist eigentlich kein
Problem, deshalb fass ichs mal kurz zusammen:

File->New->Project->Win32 Console Application->Namen eingeben->
Next->Empty Project->Finish

Dann erstellen wir eine .cpp Datei, nennen wir sie mal main.cpp.

Rechtsklick auf "Source Files"->Add->New Item->Code->C++ File->
Namen eingeben->Add

Und damit wäre das Projekt schon eingerichtet.
Dann fangen wir doch mal mit dem Code an. =) Ich werde es so machen,
dass ich einfach einen Code poste, der ausreichend kommentiert ist. Ok
los gehts:

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
// Nötige Header einbinden

#include <iostream>
#include <windows.h> 

int main (void) // Die Main Funktion, sollte jedem bekannt sein ;)

{
    SetConsoleTitleW (L"Tic Tac Toe"); // Einen Konsolen Titel setzen, spätestens, 

                                       // wenn ihr das Programm startet, werdet ihr wissen, 

                                       // was es damit auf sich hat ;)


    char input = ' '; // Eine Variable, damit wir die Eingaben des

                       // Benutzer's abfragen können


    while (input != 'q') // Solange der Benutzer nicht "q" eingibt, tue folgendes:

    {
        std::cin >> input; // Eingabe des Benutzer's abfragen

        std::cin.sync ();  // Eingabe Buffer des Benutzer's leeren und synchronisieren

                           // d.h. Alles, was eingegeben wurde wird wieder gelöscht

                           // Dies ist notwendig, damit "cin" auch weiterhin so toll funktioniert ;)

    }

    return 0; // 0 zurückgeben / Programm beenden

}


So, das sollte jetzt klar sein. Mit diesem Programm sieht man jetzt
als Titel "Tic Tac Toe" in der Konsole und wenn man "q" eingibt und "Enter"
drückt, wird das Programm beendet.

Nun schreiben wir uns erstmal eine Funktion, um das Spielfeld zu zeichnen.
Wir benutzen hier eine Funktion, damit das Programm übersichtlich bleibt.

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void draw_field (void) // Die Funktion gibt nichts zurück, deshalb ist die Funktion vom Typ "void", 

                        // und da wir keine Parameter übergeben wollen, bekommt die Parameterliste auch ein "void"

{
    system ("cls"); // Alles was man in der Konsole sehen kann -> löschen! 

                    // Ansonsten entsteht eine kilometerlange Liste von Spielfeldern...


    std::cout << std::endl << std::endl << std::endl // 3 leere Zeilen


              // Ich denke mal hier kann man nicht viel zu sagen...

              << "       |   |   " << std::endl
              << "    ---|---|---" << std::endl
              << "       |   |   " << std::endl
              << "    ---|---|---" << std::endl
              << "       |   |   " << std::endl;
}


Und fertig ist unsere Spielfeld Zeichen Funktion. =) Keine Angst,
falls ihr nicht wisst, wie ihr das einbaut sollt -> Am Ende gibt es noch
einmal den gesamten kompilierbaren Quellcode.

Bevor wir uns jetzt daran machen die Main Funktion zu überarbeiten,
schreiben wir uns noch eine Funktion für die Tastaturabfrage:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
char key_input (void) // Diese Funktion ist vom Typ "char", 

                      // weil wir die input Variable zurückgeben wollen

{
    char input = ' '; // Variable für den Eingabe Buffer


    std::cin >> input; // Eingabe abfragen


    switch (input) // Abfragen, was sich in "input" befindet

    {
        case '1': break; // Wenn "1" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '2': break; // Wenn "2" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '3': break; // Wenn "3" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '4': break; // Wenn "4" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '5': break;  // Wenn "5" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '6': break; // Wenn "6" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '7': break; // Wenn "7" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '8': break; // Wenn "8" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case '9': break; // Wenn "9" eingegeben wurde, tue dies: 

                         // (noch nicht implementiert, folgt im nächsten Teil)


        case 'q': // Wenn q gedrückt wurde, nichts tun, außer aus der Switch Abfrage springen ohne 

                  // das zu tun, was in dem "default:" Fall ausgeführt wird.

            break;

        default:
        {
            std::cin.sync (); // Nochmal leeren, Ihr könnte jetzt mal testen, was passiert, wenn Ihr

                              // diese Zeile auslasst ;)

            std::cout << std::endl << "Falsche Eingabe!"; // "Falsche Eingabe!" ausgeben

            std::cin.get (); // Darauf warten, dass "Enter" gedrückt wurde

            break; // Und aus der Abfrage springen.

        }
    }

    return input; // "input" Variable zurückgeben, damit wir in der 

                  // Main aus der While Schleife springen können, falls "q" gedrückt wurde

}


Das sieht jetzt vielleicht ein wenig viel aus, aber das liegt nur an den
vielen Kommentaren. :lol:

Okay, jetzt sollten wir noch die Main Funktion anpassen:

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
24
int main (void)
{
    SetConsoleTitleW (L"Tic Tac Toe"); // Sollte jetzt klar sein


    char input = ' '; // Das auch


    while (input != 'q') // Das auch

    {
        draw_field (); // Die Feld zeichen Funktion aufrufen


        // Danach wird eine kleine Beschreibung ausgegeben:

        std::cout << std::endl << std::endl
                  << "Geben Sie eine Zahl zwischen 1 und 9 ein, um ein Feld auszuwählen" << std::endl
                  << "oder geben Sie \"q\" ein, um das Programm zu beenden: ";

        input = key_input (); // Tastaturabfrage und den zurückgelieferten Wert in der "input" 

                              // Variable der Main Funktion speichern, damit wir, in dem Falle, dass

                              // "q" gedrückt wurde das Programm beenden können. Man beachte die While Schleife...


        std::cin.sync (); // Sollte klar sein ;)

    }

    return 0; // Das auch =)

}


Okay und zu guter Letzt kommt noch mal der gesamte Quellcode dieses
Teiles ohne Kommentare:

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
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#include <iostream>
#include <windows.h> 

void draw_field (void)
{
    system ("cls");

    std::cout << std::endl << std::endl << std::endl
              << "       |   |   " << std::endl
              << "    ---|---|---" << std::endl
              << "       |   |   " << std::endl
              << "    ---|---|---" << std::endl
              << "       |   |   " << std::endl;
}

char key_input (void)
{
    char input = ' ';

    std::cin >> input;

    switch (input)
    {
        case '1': break;
        case '2': break;
        case '3': break;
        case '4': break;
        case '5': break;
        case '6': break; 
        case '7': break;
        case '8': break; 
        case '9': break; 
        case 'q': break;

        default:
        {
            std::cin.sync ();
            std::cout << std::endl << "Falsche Eingabe!";
            std::cin.get ();
            break;
        }
    }

    return input;
}

int main (void)
{
    SetConsoleTitleW (L"Tic Tac Toe");

    char input = ' ';

    while (input != 'q')
    {
        draw_field ();
        std::cout << std::endl << std::endl
                  << "Geben Sie eine Zahl zwischen 1 und 9 ein, um ein Feld auszuwählen" << std::endl
                  << "oder geben Sie \"q\" ein, um das Programm zu beenden: ";

        input = key_input ();
        std::cin.sync ();
    }

    return 0;
}


Ist doch gar nicht so lang oder? ;)

Gut, das wars erstmal für diesen Teil. Ich liste jetzt nochmal auf, was
im nächsten Teil dran kommt und dann verabschiede ich mich auch und
hoffe, dass ich einigen helfen konnte und warte natürlich auf Feedback! ;)

- Tastaturabfrage vervollständigen
- Verhindern, dass Zahlen doppelt eingegeben werden, damit ein Feld nicht
2 Mal belegt wird

Weiterführende Links:

Teil 2
Teil 3

goldfisch007

Alter Hase

Beiträge: 446

Wohnort: Süden von Berlin

  • Private Nachricht senden

2

26.05.2009, 16:24

is gut gemacht ;)
kannte den großteil zwar schon, aba das mit

"SetConsoleTitleW()" war mir neu und wissenswert =)

aber why schreibst du std:: ima vor cout etc??? reicht da nicht auch nen normales cout?
Wir bauen auf und reißen nieder, so ham wir Arbeit ima wieder...
--------------------
http://www.piratenpartei.de/tmp/images/Slogans_5_0.png
--------------------
Sei stets geduldig gegenüber Leuten, die nicht mit dir übereinstimmen. Sie haben ein Recht auf ihren Standpunkt - trotz ihrer lächerlichen Meinung. (F. Hollaender, geklaut von Helmut xD)

3

26.05.2009, 16:45

Du schon wieder goldfisch007, alter Totengräber...:shock:

Riddick ist hier kein Mitglied mehr... ;)
fka tm

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

4

26.05.2009, 20:03

Zitat von »"goldfisch007"«

aber why schreibst du std:: ima vor cout etc??? reicht da nicht auch nen normales cout?


cout etc. liegt im namespace std. das std kannst du nur weglassen wenn du selber in dem namespace bist oder du dir die entsprechenden namen mit using in deinen namespace holst...

Werbeanzeige