<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="de">
	<id>https://wiki.freitagsrunde.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Martin</id>
	<title>FreitagsrundenWiki - Benutzerbeiträge [de]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.freitagsrunde.org/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Martin"/>
	<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/Spezial:Beitr%C3%A4ge/Martin"/>
	<updated>2026-05-08T23:08:51Z</updated>
	<subtitle>Benutzerbeiträge</subtitle>
	<generator>MediaWiki 1.31.16</generator>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=15008</id>
		<title>C-Kurs 2010/Vortrag09</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=15008"/>
		<updated>2010-09-22T21:57:16Z</updated>

		<summary type="html">&lt;p&gt;Martin: SDL-Verzeichnis aus include-Pfad entfernt&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Vortrag 9: Bibliotheken, Häufige Fehler, Literatur =&lt;br /&gt;
&lt;br /&gt;
Vortragender: Martin K. &amp;lt;mkresse cs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Nützliche Bibliotheken&lt;br /&gt;
** Standard C Library&lt;br /&gt;
** Simple DirectMedia Layer&lt;br /&gt;
* Häufige Fehler in C&lt;br /&gt;
* Literatur zum Thema C&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/vortrag9-martin.pdf Folien]&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz Code der Live-Demo]&lt;br /&gt;
&lt;br /&gt;
=== Aufgaben ===&lt;br /&gt;
&lt;br /&gt;
Aufbauend auf diesen Vortrag gibt es die Tic Tac Toe-Aufgabe: [[Ckurs2010/TicTacToe]]&lt;br /&gt;
&lt;br /&gt;
=== Mitschnitt ===&lt;br /&gt;
==== 2010 ====&lt;br /&gt;
Video (all rights reserved): [http://freitagsrunde.org/~jungnickel/MartinMaster.mov HighQuality] 1,66GB&lt;br /&gt;
&lt;br /&gt;
&amp;lt;dhflashplayer&amp;gt;file=LE09.mp4|width=720|height=370|path=http://stan.freitagsrunde.org/c0/|flashvars=&amp;amp;type=lighttpd&amp;amp;streamer=start&amp;lt;/dhflashplayer&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== 2009 ====&lt;br /&gt;
* Audio: http://podcasts.freitagsrunde.org/C-Kurs-2009/ckurs_vl09.mp3&lt;br /&gt;
&lt;br /&gt;
= Einrichtung der SDL =&lt;br /&gt;
&lt;br /&gt;
=== Installation auf presto verwenden ===&lt;br /&gt;
&lt;br /&gt;
Zum Kompilieren von Programmen mit der SDL-Bibliothek muss der Pfad zu den Header-Dateien, den Bibliotheken und natürlich der Name der Bibliothek selbst angegeben werden. Da Bibliothek und Header-Dateien im Moment lediglich auf dem Uni-Server ''presto'' installiert sind, ist es notwendig, euer Programm dort zu kompilieren und auszuführen. Den dazu notwendigen IRB-Account könnt ihr euch unter [https://irb.cs.tu-berlin.de/dienste/cswunder/index.rxcgi] einrichten. Mit dem Kommando&lt;br /&gt;
&lt;br /&gt;
 ssh -X DEIN-IRB-USERNAME@presto &lt;br /&gt;
&lt;br /&gt;
könnt ihr euch auf ''presto'' einloggen. Grafische Ausgaben werden automatisch via X-forwarding auf euren Bildschirm umgeleitet. Vor dem ersten Ausführen des Programms müsst ihr einmalig den Bibliothekspfad hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/csw/lib&lt;br /&gt;
&lt;br /&gt;
Der Aufruf zum Kompilieren der sdldemo lautet dann:&lt;br /&gt;
&lt;br /&gt;
 gcc sdldemo.c -o sdldemo -I /opt/csw/include -L /opt/csw/lib -l SDL&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Selbst kompilieren ===&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr die SDL-Bibliothek in eurem Home-Verzeichnis selbst kompilieren. Führt dazu die folgenden Kommandos aus:&lt;br /&gt;
&lt;br /&gt;
 cd $HOME&lt;br /&gt;
 mkdir sdl&lt;br /&gt;
 cd sdl&lt;br /&gt;
 wget http://www.libsdl.org/release/SDL-1.2.14.tar.gz&lt;br /&gt;
 gunzip SDL-1.2.14.tar.gz&lt;br /&gt;
 tar xvf SDL-1.2.14.tar&lt;br /&gt;
 rm SDL-1.2.14.tar&lt;br /&gt;
 cd SDL-1.2.14&lt;br /&gt;
 ./configure --prefix=$HOME/sdl&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
 &lt;br /&gt;
Jetzt habt ihr alles notwendige unter $HOME/sdl. Vor dem ersten Ausführen des Programms müsst ihr einmalig den Bibliothekspfad hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/sdl/lib&lt;br /&gt;
&lt;br /&gt;
Der Aufruf zum Kompilieren der sdldemo lautet dann:&lt;br /&gt;
&lt;br /&gt;
 gcc sdldemo.c -o sdldemo -I $HOME/sdl/include -L $HOME/sdl/lib -l SDL&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Eigener Rechner ===&lt;br /&gt;
&lt;br /&gt;
Für die Installation der SDL-Bibliothek auf eurem eigenen Rechner unter Linux oder Windows gibt es ein Kapitel im hervorragenden Tutorial von ''Lazy Foo'' unter [http://lazyfoo.net/SDL_tutorials/lesson01/index.php]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe/Musterl%C3%B6sung&amp;diff=15007</id>
		<title>C-Kurs/TicTacToe/Musterlösung</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe/Musterl%C3%B6sung&amp;diff=15007"/>
		<updated>2010-09-22T21:14:00Z</updated>

		<summary type="html">&lt;p&gt;Martin: überarbeitet&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
#include &amp;lt;SDL/SDL.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
#define ROWS    3&lt;br /&gt;
#define COLS    3&lt;br /&gt;
&lt;br /&gt;
#define EMPTY      -1&lt;br /&gt;
#define PLAYER_A    0&lt;br /&gt;
#define PLAYER_B    1&lt;br /&gt;
&lt;br /&gt;
// Spielfeld definieren&lt;br /&gt;
int board[ROWS][COLS];&lt;br /&gt;
&lt;br /&gt;
// Konvertiert Mauskoordinaten in Spielfeldkoordinaten&lt;br /&gt;
void convert_coords(int x, int y, int *row, int *column) {&lt;br /&gt;
    *row = (y-25) / 100;&lt;br /&gt;
    if (*row &amp;lt; 0) *row = 0;&lt;br /&gt;
    if (*row &amp;gt;= ROWS) *row = ROWS-1;&lt;br /&gt;
    *column = (x-25) / 100;&lt;br /&gt;
    if (*column &amp;lt; 0) *column = 0;&lt;br /&gt;
    if (*column &amp;gt;= COLS) *column = COLS-1;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Zeichnet das Spielfeld&lt;br /&gt;
void draw_board(SDL_Surface *back, SDL_Surface *circle, SDL_Surface *cross) {&lt;br /&gt;
    SDL_BlitSurface(back, NULL, SDL_GetVideoSurface(), NULL);&lt;br /&gt;
&lt;br /&gt;
    SDL_Rect offset;&lt;br /&gt;
    int row, col;&lt;br /&gt;
    for (row=0; row&amp;lt;ROWS; row++) {&lt;br /&gt;
        for (col=0; col&amp;lt;COLS; col++) {&lt;br /&gt;
            offset.x = 25+100*col;&lt;br /&gt;
            offset.y = 25+100*row;&lt;br /&gt;
            if (board[row][col] == PLAYER_A) {&lt;br /&gt;
                SDL_BlitSurface(circle, NULL, SDL_GetVideoSurface(), &amp;amp;offset);&lt;br /&gt;
            } else if (board[row][col] == PLAYER_B) {&lt;br /&gt;
                SDL_BlitSurface(cross, NULL, SDL_GetVideoSurface(), &amp;amp;offset);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    SDL_Flip(SDL_GetVideoSurface());&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Gibt 1 zurück, falls der übergebene Spieler gewonnen hat, andernfalls 0&lt;br /&gt;
int check_win(int player) {&lt;br /&gt;
    int row, col;&lt;br /&gt;
    // horizontal&lt;br /&gt;
    for (row=0; row&amp;lt;ROWS; row++) {&lt;br /&gt;
        if ((board[row][0] == player) &amp;amp;&amp;amp; (board[row][1] == player) &amp;amp;&amp;amp; (board[row][2] == player))&lt;br /&gt;
            return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // vertikal&lt;br /&gt;
    for (col=0; col&amp;lt;COLS; col++) {&lt;br /&gt;
        if ((board[0][col] == player) &amp;amp;&amp;amp; (board[1][col] == player) &amp;amp;&amp;amp; (board[2][col] == player))&lt;br /&gt;
            return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // diagonal 1&lt;br /&gt;
    if ((board[0][0] == player) &amp;amp;&amp;amp; (board[1][1] == player) &amp;amp;&amp;amp; (board[2][2] == player)) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // diagonal 2&lt;br /&gt;
    if ((board[0][2] == player) &amp;amp;&amp;amp; (board[1][1] == player) &amp;amp;&amp;amp; (board[2][0] == player)) {&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void reset_board() {&lt;br /&gt;
    int row, col;&lt;br /&gt;
    for (row=0; row&amp;lt;ROWS; row++) {&lt;br /&gt;
        for (col=0; col &amp;lt; COLS; col++) {&lt;br /&gt;
            board[row][col] = EMPTY;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int wait_for_click() {&lt;br /&gt;
    SDL_Event event;&lt;br /&gt;
    while (1) {&lt;br /&gt;
        if (SDL_PollEvent(&amp;amp;event)) {&lt;br /&gt;
            if (event.type == SDL_MOUSEBUTTONDOWN)&lt;br /&gt;
                return 0;&lt;br /&gt;
            else if (event.type == SDL_QUIT)&lt;br /&gt;
                return 1;&lt;br /&gt;
        }&lt;br /&gt;
        SDL_Delay(10);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    // Grafiksubsystem der SDL initialisieren&lt;br /&gt;
    if (SDL_Init(SDL_INIT_VIDEO) &amp;lt; 0) {&lt;br /&gt;
        printf(&amp;quot;SDL konnte nicht initialisiert werden: %s\n&amp;quot;, SDL_GetError());&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // SDL bei Programmende automatisch schließen lassen&lt;br /&gt;
    atexit(SDL_Quit);&lt;br /&gt;
&lt;br /&gt;
    // Hintergrundgrafik laden&lt;br /&gt;
    SDL_Surface *background = SDL_LoadBMP(&amp;quot;images/background.bmp&amp;quot;);&lt;br /&gt;
    if (background == NULL) {&lt;br /&gt;
        printf(&amp;quot;Fehler beim Laden von background.bmp: %s\n&amp;quot;, SDL_GetError());&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Kreisgrafik laden&lt;br /&gt;
    SDL_Surface *circle = SDL_LoadBMP(&amp;quot;images/circle.bmp&amp;quot;);&lt;br /&gt;
    if (circle == NULL) {&lt;br /&gt;
        printf(&amp;quot;Fehler beim Laden von circle.bmp: %s\n&amp;quot;, SDL_GetError());&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // Kreuzgrafik laden&lt;br /&gt;
    SDL_Surface *cross = SDL_LoadBMP(&amp;quot;images/cross.bmp&amp;quot;);&lt;br /&gt;
    if (cross == NULL) {&lt;br /&gt;
        printf(&amp;quot;Fehler beim Laden von cross.bmp: %s\n&amp;quot;, SDL_GetError());&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // grünen Hintergrund transparent machen&lt;br /&gt;
    SDL_SetColorKey(circle, SDL_SRCCOLORKEY, SDL_MapRGB(circle-&amp;gt;format, 0x00,0xFF,0x00));&lt;br /&gt;
    SDL_SetColorKey(cross, SDL_SRCCOLORKEY, SDL_MapRGB(cross-&amp;gt;format, 0x00,0xFF,0x00));&lt;br /&gt;
&lt;br /&gt;
    // Fenster für Grafikausgabe öffnen&lt;br /&gt;
    SDL_Surface *screen = SDL_SetVideoMode(350, 350, 32, SDL_SWSURFACE);&lt;br /&gt;
    if ( screen == NULL ) {&lt;br /&gt;
        printf(&amp;quot;Fehler beim Öffnen des Ausgabefensters: %s\n&amp;quot;, SDL_GetError());&lt;br /&gt;
        return 1;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    SDL_WM_SetCaption(&amp;quot;Freitagsrunde presents: TicTacToe&amp;quot;, NULL);&lt;br /&gt;
    &lt;br /&gt;
    // Spielfeld initialisieren und zeichnen&lt;br /&gt;
    reset_board();&lt;br /&gt;
    draw_board(background, circle, cross);&lt;br /&gt;
    &lt;br /&gt;
    SDL_Event event;&lt;br /&gt;
    int row, col;&lt;br /&gt;
    int quit = 0, turn = 0, player = PLAYER_A;&lt;br /&gt;
    &lt;br /&gt;
    // Event-Loop&lt;br /&gt;
    while (!quit) {&lt;br /&gt;
        if (SDL_PollEvent(&amp;amp;event)) {&lt;br /&gt;
            switch (event.type) {&lt;br /&gt;
&lt;br /&gt;
                case SDL_MOUSEBUTTONDOWN:&lt;br /&gt;
                    // Maus-Koordinaten in Spielfelfkoordinaten umrechnen&lt;br /&gt;
                    convert_coords(event.button.x, event.button.y, &amp;amp;row, &amp;amp;col);&lt;br /&gt;
&lt;br /&gt;
                    // Ist die Zelle noch frei?&lt;br /&gt;
                    if (board[row][col] != EMPTY)&lt;br /&gt;
                        break;&lt;br /&gt;
                        &lt;br /&gt;
                    // Zelle besetzen und zeichnen&lt;br /&gt;
                    board[row][col] = player;&lt;br /&gt;
                    draw_board(background, circle, cross);&lt;br /&gt;
&lt;br /&gt;
                    turn++;&lt;br /&gt;
&lt;br /&gt;
                    if (check_win(player) || (turn == ROWS*COLS)) {&lt;br /&gt;
                        if (check_win(player)) {&lt;br /&gt;
                            // aktueller Spieler hat gewonnen&lt;br /&gt;
                            if (player == PLAYER_A) {&lt;br /&gt;
                                SDL_WM_SetCaption(&amp;quot;Spieler A hat gewonnen!&amp;quot;, NULL);&lt;br /&gt;
                            } else {&lt;br /&gt;
                                SDL_WM_SetCaption(&amp;quot;Spieler B hat gewonnen!&amp;quot;, NULL);&lt;br /&gt;
                            }&lt;br /&gt;
                        } else {&lt;br /&gt;
                            // Unentschieden&lt;br /&gt;
                            SDL_WM_SetCaption(&amp;quot;Unentschieden&amp;quot;, NULL);&lt;br /&gt;
                        }&lt;br /&gt;
                            &lt;br /&gt;
                        quit = wait_for_click();&lt;br /&gt;
                     &lt;br /&gt;
                        // nächste runde vorbereiten&lt;br /&gt;
                        SDL_WM_SetCaption(&amp;quot;Freitagsrunde presents: TicTacToe&amp;quot;, NULL);&lt;br /&gt;
                        reset_board();&lt;br /&gt;
                        draw_board(background, circle, cross);&lt;br /&gt;
                        turn = 0;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    player = 1 - player;&lt;br /&gt;
                    break;&lt;br /&gt;
&lt;br /&gt;
                case SDL_QUIT:&lt;br /&gt;
                    quit = 1;&lt;br /&gt;
                    break;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Fenster schließen&lt;br /&gt;
    SDL_FreeSurface(screen);&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14984</id>
		<title>C-Kurs 2010/Vortrag09</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14984"/>
		<updated>2010-09-21T08:21:17Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Vortrag 9: Bibliotheken, Häufige Fehler, Literatur =&lt;br /&gt;
&lt;br /&gt;
Vortragender: Martin K. &amp;lt;mkresse cs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Nützliche Bibliotheken&lt;br /&gt;
** Standard C Library&lt;br /&gt;
** Simple DirectMedia Layer&lt;br /&gt;
* Häufige Fehler in C&lt;br /&gt;
* Literatur zum Thema C&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/vortrag9-martin.pdf Folien]&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz Code der Live-Demo]&lt;br /&gt;
&lt;br /&gt;
=== Aufgaben ===&lt;br /&gt;
&lt;br /&gt;
Aufbauend auf diesen Vortrag gibt es die Tic Tac Toe-Aufgabe: [[Ckurs2010/TicTacToe]]&lt;br /&gt;
&lt;br /&gt;
=== Mitschnitt ===&lt;br /&gt;
==== 2010 ====&lt;br /&gt;
''coming soon.. ;)''&lt;br /&gt;
==== 2009 ====&lt;br /&gt;
* Audio: http://podcasts.freitagsrunde.org/C-Kurs-2009/ckurs_vl09.mp3&lt;br /&gt;
&lt;br /&gt;
= Einrichtung der SDL =&lt;br /&gt;
&lt;br /&gt;
=== Installation auf presto verwenden ===&lt;br /&gt;
&lt;br /&gt;
Zum Kompilieren von Programmen mit der SDL-Bibliothek muss der Pfad zu den Header-Dateien, den Bibliotheken und natürlich der Name der Bibliothek selbst angegeben werden. Da Bibliothek und Header-Dateien im Moment lediglich auf dem Uni-Server ''presto'' installiert sind, ist es notwendig, euer Programm dort zu kompilieren und auszuführen. Den dazu notwendigen IRB-Account könnt ihr euch unter [https://irb.cs.tu-berlin.de/dienste/cswunder/index.rxcgi] einrichten. Mit dem Kommando&lt;br /&gt;
&lt;br /&gt;
 ssh -X DEIN-IRB-USERNAME@presto &lt;br /&gt;
&lt;br /&gt;
könnt ihr euch auf ''presto'' einloggen. Grafische Ausgaben werden automatisch via X-forwarding auf euren Bildschirm umgeleitet. Der Aufruf zum Kompilieren der sdldemo lautet dann:&lt;br /&gt;
&lt;br /&gt;
 gcc sdldemo.c -o sdldemo -I /opt/csw/include/SDL -L /opt/csw/lib -l SDL&lt;br /&gt;
&lt;br /&gt;
Vor dem 1. Ausführen des Programms müsst ihr einmalig den Bibliothekspfad hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/csw/lib&lt;br /&gt;
&lt;br /&gt;
=== Selbst kompilieren ===&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr die SDL-Bibliothek in eurem Home-Verzeichnis selbst kompilieren. Führt dazu die folgenden Kommandos aus:&lt;br /&gt;
&lt;br /&gt;
 cd $HOME&lt;br /&gt;
 mkdir sdl&lt;br /&gt;
 cd sdl&lt;br /&gt;
 wget http://www.libsdl.org/release/SDL-1.2.14.tar.gz&lt;br /&gt;
 gunzip SDL-1.2.14.tar.gz&lt;br /&gt;
 tar xvf SDL-1.2.14.tar&lt;br /&gt;
 rm SDL-1.2.14.tar&lt;br /&gt;
 cd SDL-1.2.14&lt;br /&gt;
 ./configure --prefix=$HOME/sdl&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
 &lt;br /&gt;
Jetzt habt ihr alles notwendige unter $HOME/sdl. Der Aufruf zum Kompilieren der sdldemo lautet dann:&lt;br /&gt;
&lt;br /&gt;
 gcc sdldemo.c -o sdldemo -I $HOME/sdl/include/SDL -L $HOME/sdl/lib -l SDL&lt;br /&gt;
&lt;br /&gt;
Vor dem 1. Ausführen des Programms müsst ihr einmalig den Bibliothekspfad hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/sdl/lib&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
=== Eigener Rechner ===&lt;br /&gt;
&lt;br /&gt;
Für die Installation der SDL-Bibliothek auf eurem eigenen Rechner unter Linux oder Windows gibt es ein Kapitel im hervorragenden Tutorial von ''Lazy Foo'' unter [http://lazyfoo.net/SDL_tutorials/lesson01/index.php]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14983</id>
		<title>C-Kurs 2010/Vortrag09</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14983"/>
		<updated>2010-09-21T08:19:58Z</updated>

		<summary type="html">&lt;p&gt;Martin: libSDL auf presto&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Vortrag 9: Bibliotheken, Häufige Fehler, Literatur =&lt;br /&gt;
&lt;br /&gt;
Vortragender: Martin K. &amp;lt;mkresse cs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Nützliche Bibliotheken&lt;br /&gt;
** Standard C Library&lt;br /&gt;
** Simple DirectMedia Layer&lt;br /&gt;
* Häufige Fehler in C&lt;br /&gt;
* Literatur zum Thema C&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/vortrag9-martin.pdf Folien]&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz Code der Live-Demo]&lt;br /&gt;
&lt;br /&gt;
=== Aufgaben ===&lt;br /&gt;
&lt;br /&gt;
Aufbauend auf diesen Vortrag gibt es die Tic Tac Toe-Aufgabe: [[Ckurs2010/TicTacToe]]&lt;br /&gt;
&lt;br /&gt;
=== Mitschnitt ===&lt;br /&gt;
==== 2010 ====&lt;br /&gt;
''coming soon.. ;)''&lt;br /&gt;
==== 2009 ====&lt;br /&gt;
* Audio: http://podcasts.freitagsrunde.org/C-Kurs-2009/ckurs_vl09.mp3&lt;br /&gt;
&lt;br /&gt;
= Einrichtung der SDL =&lt;br /&gt;
&lt;br /&gt;
==== Installation auf presto verwenden ====&lt;br /&gt;
&lt;br /&gt;
Zum Kompilieren von Programmen mit der SDL-Bibliothek muss der Pfad zu den Header-Dateien, den Bibliotheken und natürlich der Name der Bibliothek selbst angegeben werden. Da Bibliothek und Header-Dateien im Moment lediglich auf dem Uni-Server ''presto'' installiert sind, ist es notwendig, euer Programm dort zu kompilieren und auszuführen. Den dazu notwendigen IRB-Account könnt ihr euch unter [https://irb.cs.tu-berlin.de/dienste/cswunder/index.rxcgi] einrichten. Mit dem Kommando&lt;br /&gt;
&lt;br /&gt;
 ssh -X DEIN-IRB-USERNAME@presto &lt;br /&gt;
&lt;br /&gt;
könnt ihr euch auf ''presto'' einloggen. Grafische Ausgaben werden automatisch via X-forwarding auf euren Bildschirm umgeleitet. Der Aufruf zum Kompilieren der sdldemo lautet dann:&lt;br /&gt;
&lt;br /&gt;
 gcc sdldemo.c -o sdldemo -I /opt/csw/include/SDL -L /opt/csw/lib -l SDL&lt;br /&gt;
&lt;br /&gt;
Vor dem 1. Ausführen des Programms müsst ihr einmalig den Bibliothekspfad hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/csw/lib&lt;br /&gt;
&lt;br /&gt;
==== Selbst kompilieren ====&lt;br /&gt;
&lt;br /&gt;
Alternativ könnt ihr die SDL-Bibliothek in eurem Home-Verzeichnis selbst kompilieren. Führt dazu die folgenden Kommandos aus:&lt;br /&gt;
&lt;br /&gt;
 cd $HOME&lt;br /&gt;
 mkdir sdl&lt;br /&gt;
 cd sdl&lt;br /&gt;
 wget http://www.libsdl.org/release/SDL-1.2.14.tar.gz&lt;br /&gt;
 gunzip SDL-1.2.14.tar.gz&lt;br /&gt;
 tar xvf SDL-1.2.14.tar&lt;br /&gt;
 rm SDL-1.2.14.tar&lt;br /&gt;
 cd SDL-1.2.14&lt;br /&gt;
 ./configure --prefix=$HOME/sdl&lt;br /&gt;
 make&lt;br /&gt;
 make install&lt;br /&gt;
 &lt;br /&gt;
Jetzt habt ihr alles notwendige unter $HOME/sdl. Der Aufruf zum Kompilieren der sdldemo lautet dann:&lt;br /&gt;
&lt;br /&gt;
 gcc sdldemo.c -o sdldemo -I $HOME/sdl/include/SDL -L $HOME/sdl/lib -l SDL&lt;br /&gt;
&lt;br /&gt;
Vor dem 1. Ausführen des Programms müsst ihr einmalig den Bibliothekspfad hinzufügen:&lt;br /&gt;
&lt;br /&gt;
 export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$HOME/sdl/lib&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==== Eigener Rechner ====&lt;br /&gt;
&lt;br /&gt;
Für die Installation der SDL-Bibliothek auf eurem eigenen Rechner unter Linux oder Windows gibt es ein Kapitel im hervorragenden Tutorial von ''Lazy Foo'' unter [http://lazyfoo.net/SDL_tutorials/lesson01/index.php]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/StringArraySortieren/Musterl%C3%B6sung&amp;diff=14960</id>
		<title>C-Kurs/StringArraySortieren/Musterlösung</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/StringArraySortieren/Musterl%C3%B6sung&amp;diff=14960"/>
		<updated>2010-09-17T18:37:23Z</updated>

		<summary type="html">&lt;p&gt;Martin: ML an neue Aufgabe angepasst&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;pre&amp;gt;&lt;br /&gt;
#include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
#include &amp;lt;stdlib.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
void mem_copy(char *dest, char *src, int len) {&lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;len; i++) {&lt;br /&gt;
        *dest++ = *src++;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int str_compare(char *a, char *b) {&lt;br /&gt;
    int diff;&lt;br /&gt;
    &lt;br /&gt;
    do {&lt;br /&gt;
        char ca = *a++;&lt;br /&gt;
        char cb = *b++;&lt;br /&gt;
&lt;br /&gt;
        if ((ca == '\0') &amp;amp;&amp;amp; (cb = '\0'))&lt;br /&gt;
            return 0;&lt;br /&gt;
&lt;br /&gt;
        diff = ca-cb;&lt;br /&gt;
    } while (diff == 0);&lt;br /&gt;
    &lt;br /&gt;
    return diff;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
void sort(char **list, int length) {&lt;br /&gt;
    int i, j;&lt;br /&gt;
    for (i=0; i&amp;lt;length-1; i++) {&lt;br /&gt;
        for (j=0; j&amp;lt;length-i-1; j++) {&lt;br /&gt;
            if (str_compare(list[j], list[j+1]) &amp;gt; 0) {&lt;br /&gt;
                char *tmp = list[j];&lt;br /&gt;
                list[j] = list[j+1];&lt;br /&gt;
                list[j+1] = tmp;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
int main(int argc, char *argv[]) {&lt;br /&gt;
    char **list = malloc(argc * sizeof(char *));&lt;br /&gt;
    mem_copy((char*)list, (char*)argv, argc * sizeof(char *));&lt;br /&gt;
    sort(list, argc);&lt;br /&gt;
    &lt;br /&gt;
    int i;&lt;br /&gt;
    for (i=0; i&amp;lt;argc; i++) {&lt;br /&gt;
        printf(&amp;quot;%02d: %s\n&amp;quot;, (i+1), list[i]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    return 0;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/StringArraySortieren&amp;diff=14958</id>
		<title>C-Kurs/StringArraySortieren</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/StringArraySortieren&amp;diff=14958"/>
		<updated>2010-09-17T18:07:40Z</updated>

		<summary type="html">&lt;p&gt;Martin: Hinweis auf stdlib-Funktionen dazu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Ziel ==&lt;br /&gt;
&lt;br /&gt;
In dieser Aufgabe sollst du dich mit der Übergabe von Kommandozeilenparametern an C-Programme sowie dem Speicherzugriff mittels Zeigern vertraut machen. Dazu soll ein Programm entwickelt werden, das die übergebenen Kommandozeilenparameter [http://de.wikipedia.org/wiki/Lexikographisch lexikographisch] sortiert ausgibt. Implementiere die notwendigen Hilfsfunktionen ohne Verwendung der entsprechenden Funktionen aus der stdlib ([http://cplusplus.com/reference/clibrary/cstring/memcpy/ memcpy], [http://cplusplus.com/reference/clibrary/cstring/strcmp/ strcmp] und [http://cplusplus.com/reference/clibrary/cstdlib/qsort/ qsort]).&lt;br /&gt;
&lt;br /&gt;
== Array ausgeben ==&lt;br /&gt;
&lt;br /&gt;
Die &amp;lt;tt&amp;gt;main()&amp;lt;/tt&amp;gt;-Funktion eines C-Programms hat zwei Parameter: der erste (&amp;lt;tt&amp;gt;int argc&amp;lt;/tt&amp;gt;) gibt die Anzahl der Kommandozeilenparameter an, der zweite (&amp;lt;tt&amp;gt;char *argv[]&amp;lt;/tt&amp;gt;) zeigt auf ein Array von Strings (also &amp;lt;tt&amp;gt;char&amp;lt;/tt&amp;gt;-Pointer) mit den einzelnen, durch Leerzeichen getrennten Kommandozeilenparametern.&lt;br /&gt;
&lt;br /&gt;
Schreibe ein Programm, das alle angegebenen Kommandozeilenparameter zeilenweise ausgibt. Warum wird immer ein &amp;quot;Parameter&amp;quot; mehr ausgegeben?&lt;br /&gt;
&lt;br /&gt;
== Speicher kopieren ==&lt;br /&gt;
&lt;br /&gt;
Bevor wir das &amp;lt;tt&amp;gt;argv&amp;lt;/tt&amp;gt;-Array sortieren können, müssen wir es kopieren, da auf einigen Systemen der Speicher des Arrays geschützt ist. Schreibe dazu eine Funktion &lt;br /&gt;
&lt;br /&gt;
  void mem_copy(char *destination, char *source, int length) {&lt;br /&gt;
      ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
welche die angegebene Anzahl von Bytes (=Zeichen) von &amp;lt;tt&amp;gt;source&amp;lt;/tt&amp;gt; nach &amp;lt;tt&amp;gt;destination&amp;lt;/tt&amp;gt; kopiert.&lt;br /&gt;
&lt;br /&gt;
Tipp: Mit dem Ausdruck &amp;lt;tt&amp;gt;*ptr++&amp;lt;/tt&amp;gt; kannst du auf das Ziel eines Pointers &amp;lt;tt&amp;gt;ptr&amp;lt;/tt&amp;gt; zugreifen und den Pointer gleich danach erhöhen.&lt;br /&gt;
&lt;br /&gt;
Passe nun dein Programm so an, dass via &amp;lt;tt&amp;gt;malloc()&amp;lt;/tt&amp;gt; ausreichend Speicher für eine Kopie des &amp;lt;tt&amp;gt;argv&amp;lt;/tt&amp;gt;-Arrays angefordert wird, es dann mit &amp;lt;tt&amp;gt;mem_copy()&amp;lt;/tt&amp;gt; dorthin kopiert wird und zuletzt diese Kopie ausgegeben wird.&lt;br /&gt;
&lt;br /&gt;
== Strings vergleichen ==&lt;br /&gt;
&lt;br /&gt;
Bevor wir das ganze Array sortieren können, benötigen wir zuerst eine Funktion zum Vergleich zweier Strings miteinander:&lt;br /&gt;
&lt;br /&gt;
  int str_compare(char *a, char *b) {&lt;br /&gt;
      ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Die Funktion soll den Wert 0 zurückgeben, falls beide Strings gleich sind, einen negativen Wert, wenn &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; lexikographisch kleiner als &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; ist oder einen positiven Wert, falls &amp;lt;tt&amp;gt;a&amp;lt;/tt&amp;gt; lexikographisch größer als &amp;lt;tt&amp;gt;b&amp;lt;/tt&amp;gt; ist.&lt;br /&gt;
&lt;br /&gt;
Tipp: Für einzelne Zeichen entspricht der Rückgabewert genau der Differenz dieser Zeichen.&lt;br /&gt;
&lt;br /&gt;
== Array sortieren ==&lt;br /&gt;
&lt;br /&gt;
Nun kannst du die Funktion zum Sortieren implementieren:&lt;br /&gt;
&lt;br /&gt;
  void sort(char **list, int length) {&lt;br /&gt;
      ...&lt;br /&gt;
  }&lt;br /&gt;
&lt;br /&gt;
Ein einfacher, für unser Beispiel ausreichender Sortieralgorithmus ist [http://de.wikipedia.org/wiki/Bubblesort Bubblesort].&lt;br /&gt;
&lt;br /&gt;
Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
== Kommentare ==&lt;br /&gt;
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf &amp;quot;bearbeiten&amp;quot; und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit &amp;quot;Vorschau zeigen&amp;quot; kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.&lt;br /&gt;
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)&lt;br /&gt;
&lt;br /&gt;
==== Robert ====&lt;br /&gt;
Na mal schauen, ob irgendjemand diese Funktion wirklich benutzt. Ich fände es jedenfalls toll.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;br /&gt;
[[Kategorie:CKurs_Aufgaben]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14902</id>
		<title>C-Kurs/TicTacToe</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14902"/>
		<updated>2010-09-16T12:09:37Z</updated>

		<summary type="html">&lt;p&gt;Martin: link zu einrichtung dazu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:TicTacToe-screenshot.png|miniatur|240px|So in etwa soll dann unser Spiel aussehen]]'''Tic Tac Toe''' (auch Drei Gewinnt genannt) ist ein Spiel, das von zwei Spielern auf einem 3x3-Felder großen Spielfeld gespielt wird. Dazu markieren beide Spieler jeweils abwechselnd ein freies Feld mit dem eigenen Symbol (Kreis oder Kreuz). Wer zuerst drei seiner Symbole horizontal, vertikal oder diagonal in einer Reihe hat, gewinnt das Spiel.&lt;br /&gt;
&lt;br /&gt;
In dieser Aufgabe sollt ihr unter Verwendung der [http://www.libsdl.org/ Simple DirectMedia Layer-Bibliothek] (SDL) eine grafische Version dieses Spiels implementieren. Als Vorgabe dient das aus der Live-Vorführung im 9. Vortrag entstandene Beispielprogramm sdldemo.c.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzung für die Bearbeitung dieser Aufgabe ist die Installation der SDL-Bibliothek. Hinweise dazu findest du hier [[Ckurs2010/Vortrag09]]. Nachdem du die SDL-Bibliothek erfolgreich installiert hast, kannst du die sdldemo unter [http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz dieser Adresse] herunterladen, entpacken und unter Linux mit folgendem Aufruf kompilieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc sdldemo.c -o sdldemo -I /usr/include/SDL -l SDLmain -l SDL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach verwendetem Betriebssystem und Ort der Bibliothek können die Pfade oder notwendigen Parameter etwas abweichen - Details findest du unter [[Ckurs2010/Vortrag09#Einrichtung_der_SDL Einrichtung der SDL]].&lt;br /&gt;
Nun kannst du die Datei sdldemo.c umbenennen in tictactoe.c und als Vorlage für die Lösung dieser Aufgabe verwenden.&lt;br /&gt;
&lt;br /&gt;
== Datenstruktur ==&lt;br /&gt;
&lt;br /&gt;
Das Spielfeld soll intern durch ein zweidimensionales Array der Größe 3x3 repräsentiert werden. Leere Felder sollen den Wert -1, vom ersten Spieler belegte Felder den Wert 0 und vom zweiten Spieler belegte Felder den Wert 1 enthalten. Am besten, du definierst dir mittels &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; Konstanten wie &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;PLAYER_A&amp;lt;/tt&amp;gt; etc. für diese Feld-Werte sowie Konstanten für die Anzahl der Zeilen und Spalten des Spielfelds. Letztere kannst du dann verwenden um anschließend das globale Array &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt; für das Spielfeld zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
Schreibe nun eine Funktion &amp;lt;tt&amp;gt;reset_board()&amp;lt;/tt&amp;gt;, die das Array initialisiert, also alle Felder auf &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt; setzt. Da es sich um ein zweidimensionales Array handelt, benötigst du dazu auch zwei &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grafikausgabe ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:TicTacToe-coords.png|280px|rechts]]&lt;br /&gt;
&lt;br /&gt;
Zunächst muss als Symbol für den zweiten Spieler die Kreuz-Grafik (Datei ''cross.bmp'') geladen werden. Nun wird eine Funktion benötigt, die den im Array gespeicherten Spielstatus, also die Belegung des Spielfelds, grafisch ausgibt. Schreibe dazu die Funktion &amp;lt;tt&amp;gt;draw_board(...)&amp;lt;/tt&amp;gt; mit allen nötigen Parametern. Die Funktion soll &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface SDL_BlitSurface()]&amp;lt;/tt&amp;gt; verwenden, um zuerst den Hintergrund in das Ausgabefenster zeichnen, und dann für jedes Feld überprüfen, ob es schon von einem Spieler belegt ist, und ggf. das jeweilige Symbol an die entsprechende Stelle zeichnen. Vergiss nicht, am Ende &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_Flip SDL_Flip()]&amp;lt;/tt&amp;gt; aufzurufen.&lt;br /&gt;
&lt;br /&gt;
Durch die vorgegebene Hintergrundgrafik ist jedes Feld 100 Pixel hoch und breit. Beachte, dass der Ursprung des Koordinatensystems in der linken, oberen Ecke ist. Darüber hinaus ist das Spielfeld von einem 25 Pixel breitem Rand umgeben, so dass das Feld in der linken oberen Ecke an den Koordinaten (25,25) beginnt, das Feld in der rechten unteren Ecke an den Koordinaten (225,225). (siehe Grafik)&lt;br /&gt;
&lt;br /&gt;
Teste deine Funktion abschließend mit Testaufrufen wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset_board();&lt;br /&gt;
board[0][0] = PLAYER_A;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
board[2][2] = PLAYER_B;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktion mit den Spielern ==&lt;br /&gt;
&lt;br /&gt;
Nun soll der jeweils aktive Spieler mittels Mausklick ein Feld auf dem Spielfeld mit seinem Symbol markieren können. Dazu müssen zunächst die Koordinaten der Maus, die in einem Bereich zwischen (0,0) und (350,350) liegen, in Spielfeldkoordinaten zwischen (0,0) und (2,2) umgerechnet werden. Dazu kannst du die folgende Funktion &amp;lt;tt&amp;gt;convert_coords()&amp;lt;/tt&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Konvertiert Mauskoordinaten in Spielfeldkoordinaten&lt;br /&gt;
void convert_coords(int x, int y, int *row, int *column) {&lt;br /&gt;
    *row = (y-25) / 100;&lt;br /&gt;
    if (*row &amp;lt; 0) *row = 0;&lt;br /&gt;
    if (*row &amp;gt;= ROWS) *row = ROWS-1;&lt;br /&gt;
    *column = (x-25) / 100;&lt;br /&gt;
    if (*column &amp;lt; 0) *column = 0;&lt;br /&gt;
    if (*column &amp;gt;= COLS) *column = COLS-1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Event-Loop muss nun bei jedem Mausklick geprüft werden, ob das entsprechende Feld noch frei ist. Ist das der Fall, muss es vom aktuellen Spieler als belegt markiert werden. Danach muss das komplette Spielfeld via &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; neu gezeichnet und der aktive Spieler gewechselt werden.&lt;br /&gt;
&lt;br /&gt;
Tipp: Um eine Variable x zwischen den Werten 0 und 1 wechseln zu lassen reicht die Anweisung: &amp;lt;pre&amp;gt;x = 1 - x;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spielende ==&lt;br /&gt;
&lt;br /&gt;
Das Spiel endet entweder wenn der Spieler, der den letzten Zug gemacht hat, drei seiner Symbole in einer Reihe angeordnet hat, oder wenn kein freies Feld mehr auf dem Spielfeld übrig ist.&lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen des ersten Falls definierst du am besten eine Hilfsfunktion int &amp;lt;tt&amp;gt;check_win(int player)&amp;lt;/tt&amp;gt; die zurückgibt, ob vom übergebenen Spieler im &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt;-Array drei Felder in einer Reihe belegt sind. Dazu  musst du das Array jeweils auf horizontale und vertikale 3er-Reihen, sowie diagonale Reihen von rechts oben nach links unten sowie von links oben nach rechts unten testen. Diese Funktion kann nun nach dem Belegen eines Feldes im Event-Loop aufgerufen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen auf ein Unentschieden reicht eine einfache &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung. Überlege dir darüber hinaus was jeweils nach Spielende zu tun ist, damit die Spieler danach ein neues Spiel spielen können, ohne das Programm neu starten zu müssen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feinschliff / Erweiterungen ==&lt;br /&gt;
&lt;br /&gt;
Nach dem Spielende sollte den Spielern mitgeteilt werden, wer gewonnen hat oder ob das Spiel unentschieden endete. Am einfachsten kann das durch Anpassung des Fenstertitel via &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_WM_SetCaption SDL_WM_SetCaption()]&amp;lt;/tt&amp;gt; erfolgen. Etwas hübscher wird es, wenn eine separate BMP-Grafik angezeigt wird, welche die gewünschte Nachricht enthält. Eine solche kann z.B. via Gimp oder unter Windows mit Paint erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnten auch die drei Symbole des Gewinners zum Blinken gebracht werden, indem &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; in einer Schleife mit einer kurzen Pause aufgerufen wird, und die jeweiligen Felder bei jedem 2. Aufruf nicht mitgezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Wer die Installation einer weiteren Bibliothek nicht scheut, kann mit der SDL-Erweiterung [http://www.libsdl.org/projects/SDL_ttf/docs/index.html sdl_ttf] TrueType-Fonts verwenden, um beliebigen Text in das Ausgabefenster zu schreiben. Eine Anleitung zur Verwendung dieser Erweiterung findest du in dem Tutorial unter http://lazyfoo.net/SDL_tutorials/lesson07/. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
== Kommentare ==&lt;br /&gt;
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf &amp;quot;bearbeiten&amp;quot; und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit &amp;quot;Vorschau zeigen&amp;quot; kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.&lt;br /&gt;
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)&lt;br /&gt;
&lt;br /&gt;
==== Robert ====&lt;br /&gt;
Na mal schauen, ob irgendjemand diese Funktion wirklich benutzt. Ich fände es jedenfalls toll.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;br /&gt;
[[Kategorie:CKurs_Aufgaben]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14901</id>
		<title>C-Kurs 2010/Vortrag09</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14901"/>
		<updated>2010-09-16T12:00:08Z</updated>

		<summary type="html">&lt;p&gt;Martin: SDL Einrichtung&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Vortrag 9: Bibliotheken, Häufige Fehler, Literatur =&lt;br /&gt;
&lt;br /&gt;
Vortragender: Martin K. &amp;lt;mkresse cs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Nützliche Bibliotheken&lt;br /&gt;
** Standard C Library&lt;br /&gt;
** Simple DirectMedia Layer&lt;br /&gt;
* Häufige Fehler in C&lt;br /&gt;
* Literatur zum Thema C&lt;br /&gt;
&lt;br /&gt;
=== Resourcen ===&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/vortrag9-martin.pdf Folien]&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz Code der Live-Demo]&lt;br /&gt;
&lt;br /&gt;
=== Aufgaben ===&lt;br /&gt;
&lt;br /&gt;
Aufbauend auf diesen Vortrag gibt es die Tic Tac Toe-Aufgabe: [[Ckurs2010/TicTacToe]]&lt;br /&gt;
&lt;br /&gt;
=== Mitschnitt ===&lt;br /&gt;
==== 2010 ====&lt;br /&gt;
''coming soon.. ;)''&lt;br /&gt;
==== 2009 ====&lt;br /&gt;
* Audio: http://podcasts.freitagsrunde.org/C-Kurs-2009/ckurs_vl09.mp3&lt;br /&gt;
&lt;br /&gt;
= Einrichtung der SDL =&lt;br /&gt;
&lt;br /&gt;
Zum Kompilieren von Programmen mit der SDL-Bibliothek muss der Pfad zu den Includes, den Bibliotheken und natürlich der Name der Bibliothek selbst angegeben werden. Da die Bibliothek auf den Uni-servern nicht vorhanden ist, habe ich sie selbst kompiliert und biete sie in meinem Home-Verzeichnis an.&lt;br /&gt;
&lt;br /&gt;
==== IRB (Solaris) ====&lt;br /&gt;
&lt;br /&gt;
Der Aufruf zum kompilieren der sdldemo lautet:&lt;br /&gt;
&lt;br /&gt;
  gcc sdldemo.c -o sdldemo -I/home/mkresse/sdl/include/SDL -L/home/mkresse/sdl/lib -lSDL&lt;br /&gt;
&lt;br /&gt;
Vor dem 1. Ausführen des Programms müsst ihr einmalig den Bibliothekspfad hinzufügen:&lt;br /&gt;
&lt;br /&gt;
  export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/mkresse/sdl/lib&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== IRB (Ubuntu) ====&lt;br /&gt;
&lt;br /&gt;
Der Aufruf zum kompilieren der sdldemo lautet:&lt;br /&gt;
&lt;br /&gt;
  gcc sdldemo.c -o sdldemo -I/home/users/m/mkreseca/sdl/include/SDL -L/home/users/m/mkreseca/sdl/lib -lSDL&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
==== Eigener Rechner ====&lt;br /&gt;
&lt;br /&gt;
Für die Installation der SDL-Bibliothek auf eurem eigenen Rechner unter Linux oder Windows gibt es ein Kapitel im hervorragenden Tutorial von ''Lazy Foo'' unter [http://lazyfoo.net/SDL_tutorials/lesson01/index.php]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/%C3%9Cbungsaufgaben&amp;diff=14879</id>
		<title>C-Kurs/Übungsaufgaben</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/%C3%9Cbungsaufgaben&amp;diff=14879"/>
		<updated>2010-09-15T12:30:04Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* Die Aufgaben */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wir haben jeder Aufgabe eine Einschätzung ihrer Schwierigkeit auf einer Skala von 1 bis 10 vorangestellt. Bei dieser Einschätzung sind wir von einem Gehirn ausgegangen, für welches das jeweilige Themengebiet völlig neu ist, das jedoch schon ein ganz gutes Verständnis dafür hat wie eine Programmiersprache denn so funktioniert. &lt;br /&gt;
Entsprechend kann eine schwer bewertete Aufgabe aus einem frühen Themengebiet für manch einen sehr einfach oder eine leicht bewertete aus einem späten Themengebiet für einen anderen sehr schwer sein. Es ist nur ein Wert, der euch helfen soll eure nächste Aufgabe zu wählen. &lt;br /&gt;
&lt;br /&gt;
Falls ihr Anmerkungen zu den Aufgaben habt, könnt ihr die Diskussionsseiten der jeweiligen Aufgaben nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schwierigkeitsgrade ==&lt;br /&gt;
&lt;br /&gt;
#  Reines Tutorial. Man muss nicht viel selbst denken&lt;br /&gt;
#  ...&lt;br /&gt;
#  Leichte Übungsaufgabe. Studies, die noch eher unsicher sind werden hier gut begleitet.&lt;br /&gt;
#  ...&lt;br /&gt;
#  Typische Aufgabe. Man muss den Kopf benutzen, bekommt an schwierigen Stellen aber Hilfestellungen.&lt;br /&gt;
#  ...&lt;br /&gt;
#  Herausfordernd, eher etwas für Studies die etwas fitter sind.&lt;br /&gt;
#  ...&lt;br /&gt;
#  Auch erfahrene Programmierer werden hier ein bis zwei Übungen beschäftigt sein&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
#  Tja, die Idee war da. Wir finden sie auch gut, aber es könnte wirklich anstrengend werden.&lt;br /&gt;
&lt;br /&gt;
== Die Aufgaben ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;2&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
 |- bgcolor=&amp;quot;#D8D8D8&amp;quot;&lt;br /&gt;
 !Aufgabe&lt;br /&gt;
 !Schwierigkeit&lt;br /&gt;
 !Vorwissen&lt;br /&gt;
 !Lerneffekte&lt;br /&gt;
 !Bearbeiter&lt;br /&gt;
 !Korrektur gelesen&lt;br /&gt;
 !Musterlösung&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Von der Konsole zum HelloWorld | Von der Konsole zum HelloWorld]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Konsole benutzen, Hello World&lt;br /&gt;
 | Sebastian D.&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Fakultät | Fakultät]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Schleifen&lt;br /&gt;
 | Sebastian D.&lt;br /&gt;
 | Daniel (2009), &lt;br /&gt;
 |  &lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/Pythagoras-Triplet | Pythagoras-Triplet]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Schleifen &amp;lt;br&amp;gt; if-Bedingungen&lt;br /&gt;
 | Gabriel P.&lt;br /&gt;
 | seba(2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2010/Pythagoras-Triplet/Musterloesung | Pythagoras-Triplet]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Fibonacci-Folge|Fibonacci-Folge]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Funktionen &amp;lt;br&amp;gt; Rekursion&lt;br /&gt;
 | Paul B.&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2010)&lt;br /&gt;
 | &amp;lt;!--  [[Ckurs2009/Fibonacci-Folge/Musterlösung | Fibonacci-Folge]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/digitalesSchloesserKnacken|digitales Schloesser knacken]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Kontrollstrukturen &amp;lt;br&amp;gt;Bitweise Operatoren&lt;br /&gt;
 | Paul B.&lt;br /&gt;
 | Eugen R. (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/digitalesSchloesserKnacken/Musterlösung | digitales Schloesser knacken]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Rekursives_arbeiten|Rekursives Arbeiten]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3-5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Bekannte Operatoren wie + durch Funktionen succ und neg nachbilden&lt;br /&gt;
 | Eugen R.&lt;br /&gt;
 | Paul B.(2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Rekursives_arbeiten/Musterlösung | Rekursives Arbeiten]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Base64 | Base64]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Operatoren&lt;br /&gt;
 | Sebastian D.&lt;br /&gt;
 | Paul B.(2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Base64/Musterlösung | Base64]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/EingabeAusgabe | Ein- und Ausgabe]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Einlesen von Benutzereingaben&amp;lt;br&amp;gt;Ausgabe derselben&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | nion (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/EingabeAusgabe/Musterlösung | Ein- und Ausgabe]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Taschenrechner | Taschenrechner]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Eingabe+Ausgabe&amp;lt;br&amp;gt;Mathematische Operatoren&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | [[Benutzer:Tkroenert|TKroenert]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Taschenrechner/Musterlösung | Taschenrechner]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/VerschachtelteSchleifen | Verschachtelte Schleifen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Umgang mit mehreren verschachtelten Schleifen&lt;br /&gt;
 | [[Benutzer:Dank|Daniel K.]]&lt;br /&gt;
 | AlexanderK (2009), &lt;br /&gt;
 |&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Glückspiel | Glücksspiel]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Anwenden von Fallunterscheidungen und Einlesen von Werten aus der Konsole&lt;br /&gt;
 | [[Benutzer:Dank|Daniel K.]]&lt;br /&gt;
 | AlexanderK (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Glückspiel/Musterlösung | Glückspiel]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Wochentag | Wochentagsrechnung]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Einlesen von Benutzereingaben&amp;lt;br&amp;gt;Mathematikverständniss&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | nion (Musterlösung noch nicht vorhanden)  (2009), &lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Taschenrechner2.0 | Taschenrechner ''2.0'']]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Knobeln&amp;lt;br&amp;gt;Komplexes Aufgaben lösen&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | Martin K. (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Taschenrechner2.0/Musterlösung | Taschenrechner ''2.0'']] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Call by reference | Call by reference]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Einfache Anwendung von &amp;amp;/*&lt;br /&gt;
 | sping&lt;br /&gt;
 | nion (2009), Alex K. (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Call by reference/Musterlösung | Call by reference]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/String to Double | String to Double]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Original-Dokumentation anwenden (Opengroup, man pages)&amp;lt;br&amp;gt;Pointer auf Pointer&amp;lt;br&amp;gt;Const correctness&amp;lt;br&amp;gt;Strings&lt;br /&gt;
 | sping&lt;br /&gt;
 | Eugen R. (2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Text processing | Text processing]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4, 6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Strings&amp;lt;br&amp;gt;Pointer-Arithmetik&amp;lt;br&amp;gt;Pointer auf Pointer&amp;lt;br&amp;gt;Refactoring&lt;br /&gt;
 | sping&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Text processing/Musterlösung | Text processing]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Palindrome | Palindrome]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Pointer und Strings&lt;br /&gt;
 | [[Benutzer:Dank|Daniel K.]]&lt;br /&gt;
 | nion (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Palindrome/Musterlösung | Palindrome ]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs/Buchstaben_zählen | Buchstaben zählen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Array, Dateien lesen&lt;br /&gt;
 | Alex K.&lt;br /&gt;
 | Gabriel (2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/(Pointer) Swapping | (Pointer) Swapping]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Pointer und Arrays benutzen, generisches swap&lt;br /&gt;
 | Katrin&lt;br /&gt;
 | Katrin (2010, wird nochmal überarbeitet bzw. mit mehr erklärendem Text versehen)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/(Pointer) Swapping/Musterlösung | (Pointer) Swapping]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Matrizenmultiplikation | Matrizenmultiplikation]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Mehrdimensionale Arrays&amp;lt;br&amp;gt;const correctness&lt;br /&gt;
 | sping&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Matrizenmultiplikation/Musterlösung | Matrizenmultiplikation]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/DreiD | 3D mit C]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6-9&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Mathematische Rechenoperationen, Algorithmik&lt;br /&gt;
 | AndreasF&lt;br /&gt;
 | &lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Arrayuebergabe | Arrayuebergabe]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4/5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Einlesen von Benutzereingaben&amp;lt;br&amp;gt;Pointer und Pointerarithmetik&lt;br /&gt;
 | nion&lt;br /&gt;
 | Martin K. (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Arrayuebergabe/Musterlösung | Arrayuebergabe]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Studentendatenbank | Studentendatenbank]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | struct, Pointer, Arrays&lt;br /&gt;
 | AlexanderK&lt;br /&gt;
 | Gabriel (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Studentendatenbank/Musterlösung | Studentendatenbank]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/Punktstrukturen| Punktstrukturen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2-3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Structs, Unions, Pointer&lt;br /&gt;
 | [[Benutzer:Mutax|Florian]] (2010)&lt;br /&gt;
 | Alex K. (2010)&lt;br /&gt;
 |&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Sammelbestellung | Sammelbestellung]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2-5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Listen, Pointer, Speicherverwaltung&lt;br /&gt;
 | [[Benutzer:Mutax|Florian]]&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Sammelbestellung/Musterlösung | Sammelbestellung]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Zahlen_sagen | Zahlen sagen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Umgang mit Zeichenketten&lt;br /&gt;
 | Martin K.&lt;br /&gt;
 | Paul B. (w.i.p.)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Zahlen_sagen/Musterlösung | Zahlen sagen]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Compiler, Präprozessor, Header Files | Compiler, Präprozessor, Header Files]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5. VL&lt;br /&gt;
 | Arbeiten mit mehreren Quellcode-Dateien, Kompilieren und Linken, Header-Dateien und #include, debugging-Makro verwenden&lt;br /&gt;
 | Katrin&lt;br /&gt;
 | AndyF (2010)&lt;br /&gt;
 | &amp;lt;!-- [https://wiki.freitagsrunde.org/Ckurs2009/Vortrag05 siehe Folien] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Bus Error | Bus Error]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5. VL&lt;br /&gt;
 | Pointer, wie entsteht ein bus error&lt;br /&gt;
 | Katrin&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Bus Error/Musterlösung | Bus Error]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/BubbleSortDebug | BubbleSort Debugging]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6. VL&lt;br /&gt;
 | Debuggen eines Programmes mit gdb&lt;br /&gt;
 | aeichner&lt;br /&gt;
 |&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/BubbleSortDebug/Musterlösung | BubbleSort Debugging]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Debug | Debugging]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1-8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6. VL&lt;br /&gt;
 | Debuggen einer Anwendung nach Wahl&lt;br /&gt;
 | aeichner&lt;br /&gt;
 |&lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Code Layout | Code Layout]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7. VL&lt;br /&gt;
 | Kleinere Codeschipsel mit kleinen Unsauberkeiten&lt;br /&gt;
 | Daniel&lt;br /&gt;
 | [[Benutzer:Tkroenert|TKroenert]] (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Code Layout/Musterlösung | Code Layout]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Refactoring | Refactoring]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5-9&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7. VL&lt;br /&gt;
 | Wie verbessere ich den Quellcode eines Programmes.&lt;br /&gt;
 | Daniel&lt;br /&gt;
 | &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Refactoring/Musterlösung | Refactoring]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Cat | Cat]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Arbeiten mit Dateien&amp;lt;br&amp;gt;Kommandozeilenparameter&lt;br /&gt;
 | nion&lt;br /&gt;
 | sping (2009), &lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Pong | Pong]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9.VL (eigentlich 2.VL)&lt;br /&gt;
 | allgemeiner Programmablauf, fortgeschrittene Konsolenausgaben/eingaben&lt;br /&gt;
 | AlexanderK&lt;br /&gt;
 | seba(2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden  --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Buchhaltung | Buchhaltung]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5.VL&lt;br /&gt;
 | Lesen aus Dateien&lt;br /&gt;
 | reiner&lt;br /&gt;
 | AndyF (2010)&lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/StringArraySortieren | StringArraySortieren]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Konsolparameter, Funktionspointer, stdlib&lt;br /&gt;
 | reiner&lt;br /&gt;
 | martin (2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/integral | integral]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Funktionspointer&lt;br /&gt;
 | reiner&lt;br /&gt;
 | [[Benutzer:Tkroenert|TKroenert]] (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs/integral/Musterlösung | Musterloesung]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs/forschleife | forschleife]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6. VL&lt;br /&gt;
 | Bug (zum Knobeln)&lt;br /&gt;
 | reiner&lt;br /&gt;
 | nion (2009), [[Benutzer:Tkroenert|TKroenert]] (2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/libgdsl | GDSL]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5-7&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9. VL&lt;br /&gt;
 | Anwendung der Generic Data Structures Library&lt;br /&gt;
 | martin&lt;br /&gt;
 | &lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/StdLib | Standard C Library]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9. VL&lt;br /&gt;
 | Recherche in der Standard C Bibliothek&lt;br /&gt;
 | martin&lt;br /&gt;
 | &lt;br /&gt;
 |&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/Tron | Tron]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7-9&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | SDL (Simple Directmedia Layer) kennen lernen, graphische Ausgabe&lt;br /&gt;
 | seba&lt;br /&gt;
 |&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/TicTacToe | TicTacToe]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5-7&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9. VL&lt;br /&gt;
 | SDL (Simple Directmedia Layer) kennen lernen, graphische Ausgabe&lt;br /&gt;
 | Martin&lt;br /&gt;
 |&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Kleine und große Probleme ==&lt;br /&gt;
&lt;br /&gt;
* Die Tubit-Accounts haben nicht /bin/bash als shell, so dass die &amp;lt;strong&amp;gt;Cursortasten&amp;lt;/strong&amp;gt; nicht funktionieren. Workaround: als erstes Kommando 'bash' eingeben, man sieht dann auch in welchem Verzeichnis man gerade ist.&lt;br /&gt;
* wenn man nur den Promt 'bash-0.12' oder so erhält, also ohne das Verzeichnis in dem man ist, folgendes Kommando eingeben: &amp;lt;tt&amp;gt;export PS1='\u@\h:\w$ '&amp;lt;/tt&amp;gt; oder zum dauerhaften Speichern: &amp;lt;tt&amp;gt; echo &amp;quot;export PS1='\u@\h:\w$ '&amp;quot; &amp;gt;&amp;gt; ~/.bashrc &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Musterlösungen ==&lt;br /&gt;
Die Lösungen zu den Aufgaben werden nach den jeweiligen Übungen hier veröffentlicht. Falls dies nicht geschieht, bitte den zuständigen Tutor fragen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Ckurs2009/Feedback|Feedback zum Kurs 2009]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;br /&gt;
[[Kategorie:CKurs Aufgaben]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14878</id>
		<title>C-Kurs/TicTacToe</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14878"/>
		<updated>2010-09-15T12:08:37Z</updated>

		<summary type="html">&lt;p&gt;Martin: link zur sdldemo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:TicTacToe-screenshot.png|miniatur|240px|So in etwa soll dann unser Spiel aussehen]]'''Tic Tac Toe''' (auch Drei Gewinnt genannt) ist ein Spiel, das von zwei Spielern auf einem 3x3-Felder großen Spielfeld gespielt wird. Dazu markieren beide Spieler jeweils abwechselnd ein freies Feld mit dem eigenen Symbol (Kreis oder Kreuz). Wer zuerst drei seiner Symbole horizontal, vertikal oder diagonal in einer Reihe hat, gewinnt das Spiel.&lt;br /&gt;
&lt;br /&gt;
In dieser Aufgabe sollt ihr unter Verwendung der [http://www.libsdl.org/ Simple DirectMedia Layer-Bibliothek] (SDL) eine grafische Version dieses Spiels implementieren. Als Vorgabe dient das aus der Live-Vorführung im 9. Vortrag entstandene Beispielprogramm sdldemo.c.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzung für die Bearbeitung dieser Aufgabe ist die Installation der SDL-Bibliothek. Hinweise dazu findest du hier &amp;lt;wiki/v9&amp;gt;. Nachdem du die SDL-Bibliothek erfolgreich installiert hast, kannst du die sdldemo unter [http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz dieser Adresse] herunterladen, entpacken und unter Linux mit folgendem Aufruf kompilieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc sdldemo.c -o sdldemo -I /usr/include/SDL -l SDLmain -l SDL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach verwendetem Betriebssystem und Ort der Bibliothek können die Pfade oder notwendigen Parameter etwas abweichen - Details findest du unter &amp;lt;wiki/v9&amp;gt;.&lt;br /&gt;
Nun kannst du die Datei sdldemo.c umbenennen in tictactoe.c und als Vorlage für die Lösung dieser Aufgabe verwenden.&lt;br /&gt;
&lt;br /&gt;
== Datenstruktur ==&lt;br /&gt;
&lt;br /&gt;
Das Spielfeld soll intern durch ein zweidimensionales Array der Größe 3x3 repräsentiert werden. Leere Felder sollen den Wert -1, vom ersten Spieler belegte Felder den Wert 0 und vom zweiten Spieler belegte Felder den Wert 1 enthalten. Am besten, du definierst dir mittels &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; Konstanten wie &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;PLAYER_A&amp;lt;/tt&amp;gt; etc. für diese Feld-Werte sowie Konstanten für die Anzahl der Zeilen und Spalten des Spielfelds. Letztere kannst du dann verwenden um anschließend das globale Array &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt; für das Spielfeld zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
Schreibe nun eine Funktion &amp;lt;tt&amp;gt;reset_board()&amp;lt;/tt&amp;gt;, die das Array initialisiert, also alle Felder auf &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt; setzt. Da es sich um ein zweidimensionales Array handelt, benötigst du dazu auch zwei &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grafikausgabe ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:TicTacToe-coords.png|280px|rechts]]&lt;br /&gt;
&lt;br /&gt;
Zunächst muss als Symbol für den zweiten Spieler die Kreuz-Grafik (Datei ''cross.bmp'') geladen werden. Nun wird eine Funktion benötigt, die den im Array gespeicherten Spielstatus, also die Belegung des Spielfelds, grafisch ausgibt. Schreibe dazu die Funktion &amp;lt;tt&amp;gt;draw_board(...)&amp;lt;/tt&amp;gt; mit allen nötigen Parametern. Die Funktion soll &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface SDL_BlitSurface()]&amp;lt;/tt&amp;gt; verwenden, um zuerst den Hintergrund in das Ausgabefenster zeichnen, und dann für jedes Feld überprüfen, ob es schon von einem Spieler belegt ist, und ggf. das jeweilige Symbol an die entsprechende Stelle zeichnen. Vergiss nicht, am Ende &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_Flip SDL_Flip()]&amp;lt;/tt&amp;gt; aufzurufen.&lt;br /&gt;
&lt;br /&gt;
Durch die vorgegebene Hintergrundgrafik ist jedes Feld 100 Pixel hoch und breit. Beachte, dass der Ursprung des Koordinatensystems in der linken, oberen Ecke ist. Darüber hinaus ist das Spielfeld von einem 25 Pixel breitem Rand umgeben, so dass das Feld in der linken oberen Ecke an den Koordinaten (25,25) beginnt, das Feld in der rechten unteren Ecke an den Koordinaten (225,225). (siehe Grafik)&lt;br /&gt;
&lt;br /&gt;
Teste deine Funktion abschließend mit Testaufrufen wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset_board();&lt;br /&gt;
board[0][0] = PLAYER_A;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
board[2][2] = PLAYER_B;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktion mit den Spielern ==&lt;br /&gt;
&lt;br /&gt;
Nun soll der jeweils aktive Spieler mittels Mausklick ein Feld auf dem Spielfeld mit seinem Symbol markieren können. Dazu müssen zunächst die Koordinaten der Maus, die in einem Bereich zwischen (0,0) und (350,350) liegen, in Spielfeldkoordinaten zwischen (0,0) und (2,2) umgerechnet werden. Dazu kannst du die folgende Funktion &amp;lt;tt&amp;gt;convert_coords()&amp;lt;/tt&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Konvertiert Mauskoordinaten in Spielfeldkoordinaten&lt;br /&gt;
void convert_coords(int x, int y, int *row, int *column) {&lt;br /&gt;
    *row = (y-25) / 100;&lt;br /&gt;
    if (*row &amp;lt; 0) *row = 0;&lt;br /&gt;
    if (*row &amp;gt;= ROWS) *row = ROWS-1;&lt;br /&gt;
    *column = (x-25) / 100;&lt;br /&gt;
    if (*column &amp;lt; 0) *column = 0;&lt;br /&gt;
    if (*column &amp;gt;= COLS) *column = COLS-1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Event-Loop muss nun bei jedem Mausklick geprüft werden, ob das entsprechende Feld noch frei ist. Ist das der Fall, muss es vom aktuellen Spieler als belegt markiert werden. Danach muss das komplette Spielfeld via &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; neu gezeichnet und der aktive Spieler gewechselt werden.&lt;br /&gt;
&lt;br /&gt;
Tipp: um eine Variable x zwischen den Werten 0 und 1 wechseln zu lassen reicht die Anweisung: &amp;lt;pre&amp;gt;x = 1 - x;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spielende ==&lt;br /&gt;
&lt;br /&gt;
Das Spiel endet entweder wenn der Spieler, der den letzten Zug gemacht hat, drei seiner Symbole in einer Reihe angeordnet hat, oder wenn kein freies Feld mehr auf dem Spielfeld übrig ist.&lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen des ersten Falls definierst du am besten eine Hilfsfunktion int &amp;lt;tt&amp;gt;check_win(int player)&amp;lt;/tt&amp;gt; die zurückgibt, ob vom übergebenen Spieler im &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt;-Array drei Felder in einer Reihe belegt sind. Dazu  musst du das Array jeweils auf horizontale und vertikale 3er-Reihen, sowie diagonale Reihen von rechts oben nach links unten sowie von links oben nach rechts unten testen. Diese Funktion kann nun nach dem Belegen eines Feldes im Event-Loop aufgerufen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen auf ein Unentschieden reicht eine einfache &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung. Überlege dir darüber hinaus was jeweils nach Spielende zu tun ist, damit die Spieler danach ein neues Spiel spielen können, ohne das Programm neu starten zu müssen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feinschliff / Erweiterungen ==&lt;br /&gt;
&lt;br /&gt;
Nach dem Spielende sollte den Spielern mitgeteilt werden, wer gewonnen hat oder ob das Spiel unentschieden endete. Am einfachsten kann das durch Anpassung des Fenstertitel via &amp;lt;tt&amp;gt;SDL_WM_SetCaption()&amp;lt;/tt&amp;gt; erfolgen. Etwas hübscher wird es, wenn eine separate BMP-Grafik angezeigt wird, welche die gewünschte Nachricht enthält. Eine solche kann z.B. via Gimp oder unter Windows mit Paint erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnten auch die drei Symbole des Gewinners zum Blinken gebracht werden, indem &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; in einer Schleife mit einer kurzen Pause aufgerufen wird, und die jeweiligen Felder bei jedem 2. Aufruf nicht mitgezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Wer die Installation einer weiteren Bibliothek nicht scheut, kann mit der SDL-Erweiterung [http://www.libsdl.org/projects/SDL_ttf/docs/index.html sdl_ttf] TrueType-Fonts verwenden, um beliebigen Text in das Ausgabefenster zu schreiben. Eine Anleitung zur Verwendung dieser Erweiterung findest du in dem Tutorial unter http://lazyfoo.net/SDL_tutorials/lesson07/. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
== Kommentare ==&lt;br /&gt;
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf &amp;quot;bearbeiten&amp;quot; und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit &amp;quot;Vorschau zeigen&amp;quot; kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.&lt;br /&gt;
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)&lt;br /&gt;
&lt;br /&gt;
==== Robert ====&lt;br /&gt;
Na mal schauen, ob irgendjemand diese Funktion wirklich benutzt. Ich fände es jedenfalls toll.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;br /&gt;
[[Kategorie:CKurs_Aufgaben]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/%C3%9Cbungsaufgaben&amp;diff=14877</id>
		<title>C-Kurs/Übungsaufgaben</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/%C3%9Cbungsaufgaben&amp;diff=14877"/>
		<updated>2010-09-15T12:04:42Z</updated>

		<summary type="html">&lt;p&gt;Martin: TicTacToe dazu&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Wir haben jeder Aufgabe eine Einschätzung ihrer Schwierigkeit auf einer Skala von 1 bis 10 vorangestellt. Bei dieser Einschätzung sind wir von einem Gehirn ausgegangen, für welches das jeweilige Themengebiet völlig neu ist, das jedoch schon ein ganz gutes Verständnis dafür hat wie eine Programmiersprache denn so funktioniert. &lt;br /&gt;
Entsprechend kann eine schwer bewertete Aufgabe aus einem frühen Themengebiet für manch einen sehr einfach oder eine leicht bewertete aus einem späten Themengebiet für einen anderen sehr schwer sein. Es ist nur ein Wert, der euch helfen soll eure nächste Aufgabe zu wählen. &lt;br /&gt;
&lt;br /&gt;
Falls ihr Anmerkungen zu den Aufgaben habt, könnt ihr die Diskussionsseiten der jeweiligen Aufgaben nutzen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Schwierigkeitsgrade ==&lt;br /&gt;
&lt;br /&gt;
#  Reines Tutorial. Man muss nicht viel selbst denken&lt;br /&gt;
#  ...&lt;br /&gt;
#  Leichte Übungsaufgabe. Studies, die noch eher unsicher sind werden hier gut begleitet.&lt;br /&gt;
#  ...&lt;br /&gt;
#  Typische Aufgabe. Man muss den Kopf benutzen, bekommt an schwierigen Stellen aber Hilfestellungen.&lt;br /&gt;
#  ...&lt;br /&gt;
#  Herausfordernd, eher etwas für Studies die etwas fitter sind.&lt;br /&gt;
#  ...&lt;br /&gt;
#  Auch erfahrene Programmierer werden hier ein bis zwei Übungen beschäftigt sein&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
#  Tja, die Idee war da. Wir finden sie auch gut, aber es könnte wirklich anstrengend werden.&lt;br /&gt;
&lt;br /&gt;
== Die Aufgaben ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; border=&amp;quot;0&amp;quot; cellpadding=&amp;quot;4&amp;quot; cellspacing=&amp;quot;2&amp;quot;}&lt;br /&gt;
&lt;br /&gt;
 |- bgcolor=&amp;quot;#D8D8D8&amp;quot;&lt;br /&gt;
 !Aufgabe&lt;br /&gt;
 !Schwierigkeit&lt;br /&gt;
 !Vorwissen&lt;br /&gt;
 !Lerneffekte&lt;br /&gt;
 !Bearbeiter&lt;br /&gt;
 !Korrektur gelesen&lt;br /&gt;
 !Musterlösung&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Von der Konsole zum HelloWorld | Von der Konsole zum HelloWorld]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Konsole benutzen, Hello World&lt;br /&gt;
 | Sebastian D.&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Fakultät | Fakultät]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Schleifen&lt;br /&gt;
 | Sebastian D.&lt;br /&gt;
 | Daniel (2009), &lt;br /&gt;
 |  &lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/Pythagoras-Triplet | Pythagoras-Triplet]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Schleifen &amp;lt;br&amp;gt; if-Bedingungen&lt;br /&gt;
 | Gabriel P.&lt;br /&gt;
 | seba(2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2010/Pythagoras-Triplet/Musterloesung | Pythagoras-Triplet]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Fibonacci-Folge|Fibonacci-Folge]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Funktionen &amp;lt;br&amp;gt; Rekursion&lt;br /&gt;
 | Paul B.&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2010)&lt;br /&gt;
 | &amp;lt;!--  [[Ckurs2009/Fibonacci-Folge/Musterlösung | Fibonacci-Folge]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/digitalesSchloesserKnacken|digitales Schloesser knacken]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Kontrollstrukturen &amp;lt;br&amp;gt;Bitweise Operatoren&lt;br /&gt;
 | Paul B.&lt;br /&gt;
 | Eugen R. (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/digitalesSchloesserKnacken/Musterlösung | digitales Schloesser knacken]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Rekursives_arbeiten|Rekursives Arbeiten]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3-5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Bekannte Operatoren wie + durch Funktionen succ und neg nachbilden&lt;br /&gt;
 | Eugen R.&lt;br /&gt;
 | Paul B.(2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Rekursives_arbeiten/Musterlösung | Rekursives Arbeiten]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Base64 | Base64]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1. VL&lt;br /&gt;
 | Operatoren&lt;br /&gt;
 | Sebastian D.&lt;br /&gt;
 | Paul B.(2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Base64/Musterlösung | Base64]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/EingabeAusgabe | Ein- und Ausgabe]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Einlesen von Benutzereingaben&amp;lt;br&amp;gt;Ausgabe derselben&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | nion (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/EingabeAusgabe/Musterlösung | Ein- und Ausgabe]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Taschenrechner | Taschenrechner]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Eingabe+Ausgabe&amp;lt;br&amp;gt;Mathematische Operatoren&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | [[Benutzer:Tkroenert|TKroenert]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Taschenrechner/Musterlösung | Taschenrechner]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/VerschachtelteSchleifen | Verschachtelte Schleifen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Umgang mit mehreren verschachtelten Schleifen&lt;br /&gt;
 | [[Benutzer:Dank|Daniel K.]]&lt;br /&gt;
 | AlexanderK (2009), &lt;br /&gt;
 |&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Glückspiel | Glücksspiel]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Anwenden von Fallunterscheidungen und Einlesen von Werten aus der Konsole&lt;br /&gt;
 | [[Benutzer:Dank|Daniel K.]]&lt;br /&gt;
 | AlexanderK (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Glückspiel/Musterlösung | Glückspiel]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Wochentag | Wochentagsrechnung]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Einlesen von Benutzereingaben&amp;lt;br&amp;gt;Mathematikverständniss&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | nion (Musterlösung noch nicht vorhanden)  (2009), &lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Taschenrechner2.0 | Taschenrechner ''2.0'']]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Knobeln&amp;lt;br&amp;gt;Komplexes Aufgaben lösen&lt;br /&gt;
 | [[Benutzer:Mario|Mario]]&lt;br /&gt;
 | Martin K. (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Taschenrechner2.0/Musterlösung | Taschenrechner ''2.0'']] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Call by reference | Call by reference]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Einfache Anwendung von &amp;amp;/*&lt;br /&gt;
 | sping&lt;br /&gt;
 | nion (2009), Alex K. (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Call by reference/Musterlösung | Call by reference]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/String to Double | String to Double]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Original-Dokumentation anwenden (Opengroup, man pages)&amp;lt;br&amp;gt;Pointer auf Pointer&amp;lt;br&amp;gt;Const correctness&amp;lt;br&amp;gt;Strings&lt;br /&gt;
 | sping&lt;br /&gt;
 | Eugen R. (2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Text processing | Text processing]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4, 6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Strings&amp;lt;br&amp;gt;Pointer-Arithmetik&amp;lt;br&amp;gt;Pointer auf Pointer&amp;lt;br&amp;gt;Refactoring&lt;br /&gt;
 | sping&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Text processing/Musterlösung | Text processing]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Palindrome | Palindrome]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Pointer und Strings&lt;br /&gt;
 | [[Benutzer:Dank|Daniel K.]]&lt;br /&gt;
 | nion (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Palindrome/Musterlösung | Palindrome ]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs/Buchstaben_zählen | Buchstaben zählen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Array, Dateien lesen&lt;br /&gt;
 | Alex K.&lt;br /&gt;
 | Gabriel (2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/(Pointer) Swapping | (Pointer) Swapping]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Pointer und Arrays benutzen, generisches swap&lt;br /&gt;
 | Katrin&lt;br /&gt;
 | Katrin (2010, wird nochmal überarbeitet bzw. mit mehr erklärendem Text versehen)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/(Pointer) Swapping/Musterlösung | (Pointer) Swapping]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Matrizenmultiplikation | Matrizenmultiplikation]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Mehrdimensionale Arrays&amp;lt;br&amp;gt;const correctness&lt;br /&gt;
 | sping&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Matrizenmultiplikation/Musterlösung | Matrizenmultiplikation]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/DreiD | 3D mit C]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6-9&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Mathematische Rechenoperationen, Algorithmik&lt;br /&gt;
 | AndreasF&lt;br /&gt;
 | &lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Arrayuebergabe | Arrayuebergabe]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4/5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Einlesen von Benutzereingaben&amp;lt;br&amp;gt;Pointer und Pointerarithmetik&lt;br /&gt;
 | nion&lt;br /&gt;
 | Martin K. (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Arrayuebergabe/Musterlösung | Arrayuebergabe]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Studentendatenbank | Studentendatenbank]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | struct, Pointer, Arrays&lt;br /&gt;
 | AlexanderK&lt;br /&gt;
 | Gabriel (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Studentendatenbank/Musterlösung | Studentendatenbank]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/Punktstrukturen| Punktstrukturen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2-3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Structs, Unions, Pointer&lt;br /&gt;
 | [[Benutzer:Mutax|Florian]] (2010)&lt;br /&gt;
 | Alex K. (2010)&lt;br /&gt;
 |&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Sammelbestellung | Sammelbestellung]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2-5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Listen, Pointer, Speicherverwaltung&lt;br /&gt;
 | [[Benutzer:Mutax|Florian]]&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2009), &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Sammelbestellung/Musterlösung | Sammelbestellung]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Zahlen_sagen | Zahlen sagen]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | Umgang mit Zeichenketten&lt;br /&gt;
 | Martin K.&lt;br /&gt;
 | Paul B. (w.i.p.)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Zahlen_sagen/Musterlösung | Zahlen sagen]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Compiler, Präprozessor, Header Files | Compiler, Präprozessor, Header Files]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5. VL&lt;br /&gt;
 | Arbeiten mit mehreren Quellcode-Dateien, Kompilieren und Linken, Header-Dateien und #include, debugging-Makro verwenden&lt;br /&gt;
 | Katrin&lt;br /&gt;
 | AndyF (2010)&lt;br /&gt;
 | &amp;lt;!-- [https://wiki.freitagsrunde.org/Ckurs2009/Vortrag05 siehe Folien] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Bus Error | Bus Error]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5. VL&lt;br /&gt;
 | Pointer, wie entsteht ein bus error&lt;br /&gt;
 | Katrin&lt;br /&gt;
 | [[Benutzer:Mario|Mario]] (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Bus Error/Musterlösung | Bus Error]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/BubbleSortDebug | BubbleSort Debugging]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6. VL&lt;br /&gt;
 | Debuggen eines Programmes mit gdb&lt;br /&gt;
 | aeichner&lt;br /&gt;
 |&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/BubbleSortDebug/Musterlösung | BubbleSort Debugging]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Debug | Debugging]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |1-8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6. VL&lt;br /&gt;
 | Debuggen einer Anwendung nach Wahl&lt;br /&gt;
 | aeichner&lt;br /&gt;
 |&lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Code Layout | Code Layout]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7. VL&lt;br /&gt;
 | Kleinere Codeschipsel mit kleinen Unsauberkeiten&lt;br /&gt;
 | Daniel&lt;br /&gt;
 | [[Benutzer:Tkroenert|TKroenert]] (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Code Layout/Musterlösung | Code Layout]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Refactoring | Refactoring]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5-9&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7. VL&lt;br /&gt;
 | Wie verbessere ich den Quellcode eines Programmes.&lt;br /&gt;
 | Daniel&lt;br /&gt;
 | &lt;br /&gt;
 | &amp;lt;!-- [[Ckurs2009/Refactoring/Musterlösung | Refactoring]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Cat | Cat]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2. VL&lt;br /&gt;
 | Arbeiten mit Dateien&amp;lt;br&amp;gt;Kommandozeilenparameter&lt;br /&gt;
 | nion&lt;br /&gt;
 | sping (2009), &lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Pong | Pong]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9.VL (eigentlich 2.VL)&lt;br /&gt;
 | allgemeiner Programmablauf, fortgeschrittene Konsolenausgaben/eingaben&lt;br /&gt;
 | AlexanderK&lt;br /&gt;
 | seba(2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden  --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/Buchhaltung | Buchhaltung]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5.VL&lt;br /&gt;
 | Lesen aus Dateien&lt;br /&gt;
 | reiner&lt;br /&gt;
 | AndyF (2010)&lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/StringArraySortieren | StringArraySortieren]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |8&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Konsolparameter, Funktionspointer, stdlib&lt;br /&gt;
 | reiner&lt;br /&gt;
 |&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/integral | integral]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |2&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3. VL&lt;br /&gt;
 | Funktionspointer&lt;br /&gt;
 | reiner&lt;br /&gt;
 | [[Benutzer:Tkroenert|TKroenert]] (2010)&lt;br /&gt;
 | &amp;lt;!-- [[Ckurs/integral/Musterlösung | Musterloesung]] --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs/forschleife | forschleife]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |6. VL&lt;br /&gt;
 | Bug (zum Knobeln)&lt;br /&gt;
 | reiner&lt;br /&gt;
 | nion (2009), [[Benutzer:Tkroenert|TKroenert]] (2010)&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/libgdsl | GDSL]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5-7&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9. VL&lt;br /&gt;
 | Anwendung der Generic Data Structures Library&lt;br /&gt;
 | martin&lt;br /&gt;
 | &lt;br /&gt;
 | &lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2009/StdLib | Standard C Library]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |3&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9. VL&lt;br /&gt;
 | Recherche in der Standard C Bibliothek&lt;br /&gt;
 | martin&lt;br /&gt;
 | &lt;br /&gt;
 |&lt;br /&gt;
 |- bgcolor=&amp;quot;#F5F5F5&amp;quot;&lt;br /&gt;
 | [[Ckurs/Tron | Tron]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |7-9&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |4. VL&lt;br /&gt;
 | SDL (Simple Directmedia Layer) kennen lernen, graphische Ausgabe&lt;br /&gt;
 | seba&lt;br /&gt;
 |&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
 |- bgcolor=&amp;quot;#E8E8E8&amp;quot;&lt;br /&gt;
 | [[Ckurs2010/TicTacToe | TicTacToe]]&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |5-7&lt;br /&gt;
 | align=&amp;quot;center&amp;quot; |9. VL&lt;br /&gt;
 | SDL (Simple Directmedia Layer) kennen lernen, graphische Ausgabe&lt;br /&gt;
 | Martin&lt;br /&gt;
 |&lt;br /&gt;
 | &amp;lt;!-- vorhanden --&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Kleine und große Probleme ==&lt;br /&gt;
&lt;br /&gt;
* Die Tubit-Accounts haben nicht /bin/bash als shell, so dass die &amp;lt;strong&amp;gt;Cursortasten&amp;lt;/strong&amp;gt; nicht funktionieren. Workaround: als erstes Kommando 'bash' eingeben, man sieht dann auch in welchem Verzeichnis man gerade ist.&lt;br /&gt;
* wenn man nur den Promt 'bash-0.12' oder so erhält, also ohne das Verzeichnis in dem man ist, folgendes Kommando eingeben: &amp;lt;tt&amp;gt;export PS1='\u@\h:\w$ '&amp;lt;/tt&amp;gt; oder zum dauerhaften Speichern: &amp;lt;tt&amp;gt; echo &amp;quot;export PS1='\u@\h:\w$ '&amp;quot; &amp;gt;&amp;gt; ~/.bashrc &amp;lt;/tt&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Musterlösungen ==&lt;br /&gt;
Die Lösungen zu den Aufgaben werden nach den jeweiligen Übungen hier veröffentlicht. Falls dies nicht geschieht, bitte den zuständigen Tutor fragen.&lt;br /&gt;
&lt;br /&gt;
== Links ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* [[Ckurs2009/Feedback|Feedback zum Kurs 2009]]&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;br /&gt;
[[Kategorie:CKurs Aufgaben]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/Fakult%C3%A4t&amp;diff=14873</id>
		<title>C-Kurs/Fakultät</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/Fakult%C3%A4t&amp;diff=14873"/>
		<updated>2010-09-15T10:29:24Z</updated>

		<summary type="html">&lt;p&gt;Martin: define -&amp;gt; groß&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Schreibe ein C-Programm fac.c, das die Fakultät einer Zahl berechnet. Da Eingaben noch nicht behandelt wurden, benutze ein Define Makro um eine Zahl vorzugeben, zu der die Fakultät berechnet wird.&lt;br /&gt;
&lt;br /&gt;
Ein Anfang deines Programms könnte so aussehen:&lt;br /&gt;
&lt;br /&gt;
 #include &amp;lt;stdio.h&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 #define INPUT 7&lt;br /&gt;
 &lt;br /&gt;
 int main(void)&lt;br /&gt;
 {&lt;br /&gt;
         /*Hier den Code einfuegen*/&lt;br /&gt;
 &lt;br /&gt;
         printf(&amp;quot;%i! = %i\n&amp;quot;, INPUT, result);&lt;br /&gt;
         return 0;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
Vorrausgesetzt, du nennst deine Ergebnisvariable result, wird das Ergebnis direkt ausgegeben.&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=Diskussion:Ckurs/Fakult%C3%A4t&amp;diff=14871</id>
		<title>Diskussion:Ckurs/Fakultät</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=Diskussion:Ckurs/Fakult%C3%A4t&amp;diff=14871"/>
		<updated>2010-09-15T10:13:58Z</updated>

		<summary type="html">&lt;p&gt;Martin: Die Seite wurde neu angelegt: „Obwohl syntaktisch nicht notwendig, sollten #defines per Konvention GROSS geschrieben werden“&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obwohl syntaktisch nicht notwendig, sollten #defines per Konvention GROSS geschrieben werden&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14870</id>
		<title>C-Kurs/TicTacToe</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14870"/>
		<updated>2010-09-15T09:43:53Z</updated>

		<summary type="html">&lt;p&gt;Martin: Kommentare&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:TicTacToe-screenshot.png|miniatur|240px|So in etwa soll dann unser Spiel aussehen]]'''Tic Tac Toe''' (auch Drei Gewinnt genannt) ist ein Spiel, das von zwei Spielern auf einem 3x3-Felder großen Spielfeld gespielt wird. Dazu markieren beide Spieler jeweils abwechselnd ein freies Feld mit dem eigenen Symbol (Kreis oder Kreuz). Wer zuerst drei seiner Symbole horizontal, vertikal oder diagonal in einer Reihe hat, gewinnt das Spiel.&lt;br /&gt;
&lt;br /&gt;
In dieser Aufgabe sollt ihr unter Verwendung der [http://www.libsdl.org/ Simple DirectMedia Layer-Bibliothek] (SDL) eine grafische Version dieses Spiels implementieren. Als Vorgabe dient das aus der Live-Vorführung im 9. Vortrag entstandene Beispielprogramm sdldemo.c.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzung für die Bearbeitung dieser Aufgabe ist die Installation der SDL-Bibliothek. Hinweise dazu findest du hier &amp;lt;wiki/v9&amp;gt;. Nachdem du die SDL-Bibliothek erfolgreich installiert hast, kannst du die sdldemo unter dieser Adresse herunterladen, entpacken und unter Linux mit folgendem Aufruf kompilieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc sdldemo.c -o sdldemo -I /usr/include/SDL -l SDLmain -l SDL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach verwendetem Betriebssystem und Ort der Bibliothek können die Pfade oder notwendigen Parameter etwas abweichen - Details findest du unter &amp;lt;wiki/v9&amp;gt;.&lt;br /&gt;
Nun kannst du die Datei sdldemo.c umbenennen in tictactoe.c und als Vorlage für die Lösung dieser Aufgabe verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenstruktur ==&lt;br /&gt;
&lt;br /&gt;
Das Spielfeld soll intern durch ein zweidimensionales Array der Größe 3x3 repräsentiert werden. Leere Felder sollen den Wert -1, vom ersten Spieler belegte Felder den Wert 0 und vom zweiten Spieler belegte Felder den Wert 1 enthalten. Am besten, du definierst dir mittels &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; Konstanten wie &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;PLAYER_A&amp;lt;/tt&amp;gt; etc. für diese Feld-Werte sowie Konstanten für die Anzahl der Zeilen und Spalten des Spielfelds. Letztere kannst du dann verwenden um anschließend das globale Array &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt; für das Spielfeld zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
Schreibe nun eine Funktion &amp;lt;tt&amp;gt;reset_board()&amp;lt;/tt&amp;gt;, die das Array initialisiert, also alle Felder auf &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt; setzt. Da es sich um ein zweidimensionales Array handelt, benötigst du dazu auch zwei &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grafikausgabe ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:TicTacToe-coords.png|280px|rechts]]&lt;br /&gt;
&lt;br /&gt;
Zunächst muss als Symbol für den zweiten Spieler die Kreuz-Grafik (Datei ''cross.bmp'') geladen werden. Nun wird eine Funktion benötigt, die den im Array gespeicherten Spielstatus, also die Belegung des Spielfelds, grafisch ausgibt. Schreibe dazu die Funktion &amp;lt;tt&amp;gt;draw_board(...)&amp;lt;/tt&amp;gt; mit allen nötigen Parametern. Die Funktion soll &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface SDL_BlitSurface()]&amp;lt;/tt&amp;gt; verwenden, um zuerst den Hintergrund in das Ausgabefenster zeichnen, und dann für jedes Feld überprüfen, ob es schon von einem Spieler belegt ist, und ggf. das jeweilige Symbol an die entsprechende Stelle zeichnen. Vergiss nicht, am Ende &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_Flip SDL_Flip()]&amp;lt;/tt&amp;gt; aufzurufen.&lt;br /&gt;
&lt;br /&gt;
Durch die vorgegebene Hintergrundgrafik ist jedes Feld 100 Pixel hoch und breit. Beachte, dass der Ursprung des Koordinatensystems in der linken, oberen Ecke ist. Darüber hinaus ist das Spielfeld von einem 25 Pixel breitem Rand umgeben, so dass das Feld in der linken oberen Ecke an den Koordinaten (25,25) beginnt, das Feld in der rechten unteren Ecke an den Koordinaten (225,225). (siehe Grafik)&lt;br /&gt;
&lt;br /&gt;
Teste deine Funktion abschließend mit Testaufrufen wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset_board();&lt;br /&gt;
board[0][0] = PLAYER_A;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
board[2][2] = PLAYER_B;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktion mit den Spielern ==&lt;br /&gt;
&lt;br /&gt;
Nun soll der jeweils aktive Spieler mittels Mausklick ein Feld auf dem Spielfeld mit seinem Symbol markieren können. Dazu müssen zunächst die Koordinaten der Maus, die in einem Bereich zwischen (0,0) und (350,350) liegen, in Spielfeldkoordinaten zwischen (0,0) und (2,2) umgerechnet werden. Dazu kannst du die folgende Funktion &amp;lt;tt&amp;gt;convert_coords()&amp;lt;/tt&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Konvertiert Mauskoordinaten in Spielfeldkoordinaten&lt;br /&gt;
void convert_coords(int x, int y, int *row, int *column) {&lt;br /&gt;
    *row = (y-25) / 100;&lt;br /&gt;
    if (*row &amp;lt; 0) *row = 0;&lt;br /&gt;
    if (*row &amp;gt;= ROWS) *row = ROWS-1;&lt;br /&gt;
    *column = (x-25) / 100;&lt;br /&gt;
    if (*column &amp;lt; 0) *column = 0;&lt;br /&gt;
    if (*column &amp;gt;= COLS) *column = COLS-1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Event-Loop muss nun bei jedem Mausklick geprüft werden, ob das entsprechende Feld noch frei ist. Ist das der Fall, muss es vom aktuellen Spieler als belegt markiert werden. Danach muss das komplette Spielfeld via &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; neu gezeichnet und der aktive Spieler gewechselt werden.&lt;br /&gt;
&lt;br /&gt;
Tipp: um eine Variable x zwischen den Werten 0 und 1 wechseln zu lassen reicht die Anweisung: &amp;lt;pre&amp;gt;x = 1 - x;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spielende ==&lt;br /&gt;
&lt;br /&gt;
Das Spiel endet entweder wenn der Spieler, der den letzten Zug gemacht hat, drei seiner Symbole in einer Reihe angeordnet hat, oder wenn kein freies Feld mehr auf dem Spielfeld übrig ist.&lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen des ersten Falls definierst du am besten eine Hilfsfunktion int &amp;lt;tt&amp;gt;check_win(int player)&amp;lt;/tt&amp;gt; die zurückgibt, ob vom übergebenen Spieler im &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt;-Array drei Felder in einer Reihe belegt sind. Dazu  musst du das Array jeweils auf horizontale und vertikale 3er-Reihen, sowie diagonale Reihen von rechts oben nach links unten sowie von links oben nach rechts unten testen. Diese Funktion kann nun nach dem Belegen eines Feldes im Event-Loop aufgerufen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen auf ein Unentschieden reicht eine einfache &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung. Überlege dir darüber hinaus was jeweils nach Spielende zu tun ist, damit die Spieler danach ein neues Spiel spielen können, ohne das Programm neu starten zu müssen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feinschliff / Erweiterungen ==&lt;br /&gt;
&lt;br /&gt;
Nach dem Spielende sollte den Spielern mitgeteilt werden, wer gewonnen hat oder ob das Spiel unentschieden endete. Am einfachsten kann das durch Anpassung des Fenstertitel via &amp;lt;tt&amp;gt;SDL_WM_SetCaption()&amp;lt;/tt&amp;gt; erfolgen. Etwas hübscher wird es, wenn eine separate BMP-Grafik angezeigt wird, welche die gewünschte Nachricht enthält. Eine solche kann z.B. via Gimp oder unter Windows mit Paint erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnten auch die drei Symbole des Gewinners zum Blinken gebracht werden, indem &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; in einer Schleife mit einer kurzen Pause aufgerufen wird, und die jeweiligen Felder bei jedem 2. Aufruf nicht mitgezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Wer die Installation einer weiteren Bibliothek nicht scheut, kann mit der SDL-Erweiterung [http://www.libsdl.org/projects/SDL_ttf/docs/index.html sdl_ttf] TrueType-Fonts verwenden, um beliebigen Text in das Ausgabefenster zu schreiben. Eine Anleitung zur Verwendung dieser Erweiterung findest du in dem Tutorial unter http://lazyfoo.net/SDL_tutorials/lesson07/. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß!&lt;br /&gt;
&lt;br /&gt;
== Kommentare ==&lt;br /&gt;
Wenn du Anmerkungen zur Aufgabe hast oder Lob und Kritik loswerden möchtest, ist hier die richtige Stelle dafür. Klicke einfach ganz rechts auf &amp;quot;bearbeiten&amp;quot; und schreibe deinen Kommentar direkt ins Wiki. Keine Scheu, es geht nichts kaputt ;)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!--&lt;br /&gt;
Als kleine Starthilfe folgt ein Beispiel, wie so ein Kommentar formatiert sein könnte. Mit &amp;quot;Vorschau zeigen&amp;quot; kannst du dir ansehen, was deine Änderung bewirken würde, ohne wirklich etwas zu ändern.&lt;br /&gt;
Du musst übrigens außerhalb dieses auskommentieren Bereichs schreiben ;)&lt;br /&gt;
&lt;br /&gt;
==== Robert ====&lt;br /&gt;
Na mal schauen, ob irgendjemand diese Funktion wirklich benutzt. Ich fände es jedenfalls toll.&lt;br /&gt;
--&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;br /&gt;
[[Kategorie:CKurs_Aufgaben]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14868</id>
		<title>C-Kurs 2010/Vortrag09</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14868"/>
		<updated>2010-09-15T00:12:40Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bibliotheken, Häufige Fehler, Literatur =&lt;br /&gt;
&lt;br /&gt;
Vortragende: Martin K. &amp;lt;mkresse cs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Nützliche Bibliotheken&lt;br /&gt;
** Standard C Library&lt;br /&gt;
** Simple DirectMedia Layer&lt;br /&gt;
* Häufige Fehler in C&lt;br /&gt;
* Literatur zum Thema C&lt;br /&gt;
&lt;br /&gt;
[http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz Code der Live-Demo]&lt;br /&gt;
&lt;br /&gt;
=== Folien ===&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/vortrag9-martin.pdf Folien]&lt;br /&gt;
&lt;br /&gt;
=== Aufgaben ===&lt;br /&gt;
&lt;br /&gt;
Passend zu diesem Vortrag ist die Tic Tac Toe-Aufgabe: [[Ckurs2010/TicTacToe]]&lt;br /&gt;
&lt;br /&gt;
=== Mitschnitt ===&lt;br /&gt;
==== 2010 ====&lt;br /&gt;
''coming soon.. ;)''&lt;br /&gt;
==== 2009 ====&lt;br /&gt;
* Audio: http://podcasts.freitagsrunde.org/C-Kurs-2009/ckurs_vl09.mp3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14867</id>
		<title>C-Kurs 2010/Vortrag09</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14867"/>
		<updated>2010-09-15T00:09:50Z</updated>

		<summary type="html">&lt;p&gt;Martin: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Bibliotheken, Häufige Fehler, Literatur =&lt;br /&gt;
&lt;br /&gt;
Vortragende: Martin K. &amp;lt;mkresse cs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Nützliche Bibliotheken&lt;br /&gt;
** Standard C Library&lt;br /&gt;
** Simple DirectMedia Layer&lt;br /&gt;
* Häufige Fehler in C&lt;br /&gt;
* Literatur zum Thema C&lt;br /&gt;
&lt;br /&gt;
[http://user.cs.tu-berlin.de/~mkresse/sdldemo.tgz Code der Live-Demo]&lt;br /&gt;
&lt;br /&gt;
=== Folien ===&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/vortrag9-martin.pdf Folien]&lt;br /&gt;
&lt;br /&gt;
=== Mitschnitt ===&lt;br /&gt;
==== 2010 ====&lt;br /&gt;
''coming soon.. ;)''&lt;br /&gt;
==== 2009 ====&lt;br /&gt;
* Audio: http://podcasts.freitagsrunde.org/C-Kurs-2009/ckurs_vl09.mp3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14866</id>
		<title>C-Kurs 2010/Vortrag09</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs_2010/Vortrag09&amp;diff=14866"/>
		<updated>2010-09-15T00:03:52Z</updated>

		<summary type="html">&lt;p&gt;Martin: /* aktuelle Folien */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= stdlib, Bücher, Tutorials =&lt;br /&gt;
&lt;br /&gt;
Vortragende: Martin K. &amp;lt;mkresse cs&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Themen ===&lt;br /&gt;
* Standard C Library&lt;br /&gt;
* Generic Data Structures Library&lt;br /&gt;
* Häufig gemachte Fehler&lt;br /&gt;
* Literatur zum Thema C&lt;br /&gt;
&lt;br /&gt;
=== Folien ===&lt;br /&gt;
* [http://user.cs.tu-berlin.de/~mkresse/vortrag9-martin.pdf Folien]&lt;br /&gt;
&lt;br /&gt;
=== Mitschnitt ===&lt;br /&gt;
==== 2010 ====&lt;br /&gt;
''coming soon.. ;)''&lt;br /&gt;
==== 2009 ====&lt;br /&gt;
* Audio: http://podcasts.freitagsrunde.org/C-Kurs-2009/ckurs_vl09.mp3&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Kategorie:CKurs]]&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14865</id>
		<title>C-Kurs/TicTacToe</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=C-Kurs/TicTacToe&amp;diff=14865"/>
		<updated>2010-09-14T23:52:42Z</updated>

		<summary type="html">&lt;p&gt;Martin: 1. Version&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Datei:TicTacToe-screenshot.png|miniatur|240px|So in etwa soll dann unser Spiel aussehen]]'''Tic Tac Toe''' (auch Drei Gewinnt genannt) ist ein Spiel, das von zwei Spielern auf einem 3x3-Felder großen Spielfeld gespielt wird. Dazu markieren beide Spieler jeweils abwechselnd ein freies Feld mit dem eigenen Symbol (Kreis oder Kreuz). Wer zuerst drei seiner Symbole horizontal, vertikal oder diagonal in einer Reihe hat, gewinnt das Spiel.&lt;br /&gt;
&lt;br /&gt;
In dieser Aufgabe sollt ihr unter Verwendung der [http://www.libsdl.org/ Simple DirectMedia Layer-Bibliothek] (SDL) eine grafische Version dieses Spiels implementieren. Als Vorgabe dient das aus der Live-Vorführung im 9. Vortrag entstandene Beispielprogramm sdldemo.c.&lt;br /&gt;
&lt;br /&gt;
== Vorbereitungen ==&lt;br /&gt;
&lt;br /&gt;
Voraussetzung für die Bearbeitung dieser Aufgabe ist die Installation der SDL-Bibliothek. Hinweise dazu findest du hier &amp;lt;wiki/v9&amp;gt;. Nachdem du die SDL-Bibliothek erfolgreich installiert hast, kannst du die sdldemo unter dieser Adresse herunterladen, entpacken und unter Linux mit folgendem Aufruf kompilieren:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
gcc sdldemo.c -o sdldemo -I /usr/include/SDL -l SDLmain -l SDL&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Je nach verwendetem Betriebssystem und Ort der Bibliothek können die Pfade oder notwendigen Parameter etwas abweichen - Details findest du unter &amp;lt;wiki/v9&amp;gt;.&lt;br /&gt;
Nun kannst du die Datei sdldemo.c umbenennen in tictactoe.c und als Vorlage für die Lösung dieser Aufgabe verwenden.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Datenstruktur ==&lt;br /&gt;
&lt;br /&gt;
Das Spielfeld soll intern durch ein zweidimensionales Array der Größe 3x3 repräsentiert werden. Leere Felder sollen den Wert -1, vom ersten Spieler belegte Felder den Wert 0 und vom zweiten Spieler belegte Felder den Wert 1 enthalten. Am besten, du definierst dir mittels &amp;lt;tt&amp;gt;#define&amp;lt;/tt&amp;gt; Konstanten wie &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt;, &amp;lt;tt&amp;gt;PLAYER_A&amp;lt;/tt&amp;gt; etc. für diese Feld-Werte sowie Konstanten für die Anzahl der Zeilen und Spalten des Spielfelds. Letztere kannst du dann verwenden um anschließend das globale Array &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt; für das Spielfeld zu deklarieren.&lt;br /&gt;
&lt;br /&gt;
Schreibe nun eine Funktion &amp;lt;tt&amp;gt;reset_board()&amp;lt;/tt&amp;gt;, die das Array initialisiert, also alle Felder auf &amp;lt;tt&amp;gt;EMPTY&amp;lt;/tt&amp;gt; setzt. Da es sich um ein zweidimensionales Array handelt, benötigst du dazu auch zwei &amp;lt;tt&amp;gt;for&amp;lt;/tt&amp;gt;-Schleifen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Grafikausgabe ==&lt;br /&gt;
&lt;br /&gt;
[[Datei:TicTacToe-coords.png|280px|rechts]]&lt;br /&gt;
&lt;br /&gt;
Zunächst muss als Symbol für den zweiten Spieler die Kreuz-Grafik (Datei ''cross.bmp'') geladen werden. Nun wird eine Funktion benötigt, die den im Array gespeicherten Spielstatus, also die Belegung des Spielfelds, grafisch ausgibt. Schreibe dazu die Funktion &amp;lt;tt&amp;gt;draw_board(...)&amp;lt;/tt&amp;gt; mit allen nötigen Parametern. Die Funktion soll &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_BlitSurface SDL_BlitSurface()]&amp;lt;/tt&amp;gt; verwenden, um zuerst den Hintergrund in das Ausgabefenster zeichnen, und dann für jedes Feld überprüfen, ob es schon von einem Spieler belegt ist, und ggf. das jeweilige Symbol an die entsprechende Stelle zeichnen. Vergiss nicht, am Ende &amp;lt;tt&amp;gt;[http://www.libsdl.org/cgi/docwiki.cgi/SDL_Flip SDL_Flip()]&amp;lt;/tt&amp;gt; aufzurufen.&lt;br /&gt;
&lt;br /&gt;
Durch die vorgegebene Hintergrundgrafik ist jedes Feld 100 Pixel hoch und breit. Beachte, dass der Ursprung des Koordinatensystems in der linken, oberen Ecke ist. Darüber hinaus ist das Spielfeld von einem 25 Pixel breitem Rand umgeben, so dass das Feld in der linken oberen Ecke an den Koordinaten (25,25) beginnt, das Feld in der rechten unteren Ecke an den Koordinaten (225,225). (siehe Grafik)&lt;br /&gt;
&lt;br /&gt;
Teste deine Funktion abschließend mit Testaufrufen wie:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
reset_board();&lt;br /&gt;
board[0][0] = PLAYER_A;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
board[2][2] = PLAYER_B;&lt;br /&gt;
draw_board(...);&lt;br /&gt;
SDL_Delay(2000);&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Interaktion mit den Spielern ==&lt;br /&gt;
&lt;br /&gt;
Nun soll der jeweils aktive Spieler mittels Mausklick ein Feld auf dem Spielfeld mit seinem Symbol markieren können. Dazu müssen zunächst die Koordinaten der Maus, die in einem Bereich zwischen (0,0) und (350,350) liegen, in Spielfeldkoordinaten zwischen (0,0) und (2,2) umgerechnet werden. Dazu kannst du die folgende Funktion &amp;lt;tt&amp;gt;convert_coords()&amp;lt;/tt&amp;gt; verwenden.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// Konvertiert Mauskoordinaten in Spielfeldkoordinaten&lt;br /&gt;
void convert_coords(int x, int y, int *row, int *column) {&lt;br /&gt;
    *row = (y-25) / 100;&lt;br /&gt;
    if (*row &amp;lt; 0) *row = 0;&lt;br /&gt;
    if (*row &amp;gt;= ROWS) *row = ROWS-1;&lt;br /&gt;
    *column = (x-25) / 100;&lt;br /&gt;
    if (*column &amp;lt; 0) *column = 0;&lt;br /&gt;
    if (*column &amp;gt;= COLS) *column = COLS-1;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Im Event-Loop muss nun bei jedem Mausklick geprüft werden, ob das entsprechende Feld noch frei ist. Ist das der Fall, muss es vom aktuellen Spieler als belegt markiert werden. Danach muss das komplette Spielfeld via &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; neu gezeichnet und der aktive Spieler gewechselt werden.&lt;br /&gt;
&lt;br /&gt;
Tipp: um eine Variable x zwischen den Werten 0 und 1 wechseln zu lassen reicht die Anweisung: &amp;lt;pre&amp;gt;x = 1 - x;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Spielende ==&lt;br /&gt;
&lt;br /&gt;
Das Spiel endet entweder wenn der Spieler, der den letzten Zug gemacht hat, drei seiner Symbole in einer Reihe angeordnet hat, oder wenn kein freies Feld mehr auf dem Spielfeld übrig ist.&lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen des ersten Falls definierst du am besten eine Hilfsfunktion int &amp;lt;tt&amp;gt;check_win(int player)&amp;lt;/tt&amp;gt; die zurückgibt, ob vom übergebenen Spieler im &amp;lt;tt&amp;gt;board&amp;lt;/tt&amp;gt;-Array drei Felder in einer Reihe belegt sind. Dazu  musst du das Array jeweils auf horizontale und vertikale 3er-Reihen, sowie diagonale Reihen von rechts oben nach links unten sowie von links oben nach rechts unten testen. Diese Funktion kann nun nach dem Belegen eines Feldes im Event-Loop aufgerufen werden. &lt;br /&gt;
&lt;br /&gt;
Zum Überprüfen auf ein Unentschieden reicht eine einfache &amp;lt;tt&amp;gt;if&amp;lt;/tt&amp;gt;-Anweisung. Überlege dir darüber hinaus was jeweils nach Spielende zu tun ist, damit die Spieler danach ein neues Spiel spielen können, ohne das Programm neu starten zu müssen.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Feinschliff / Erweiterungen ==&lt;br /&gt;
&lt;br /&gt;
Nach dem Spielende sollte den Spielern mitgeteilt werden, wer gewonnen hat oder ob das Spiel unentschieden endete. Am einfachsten kann das durch Anpassung des Fenstertitel via &amp;lt;tt&amp;gt;SDL_WM_SetCaption()&amp;lt;/tt&amp;gt; erfolgen. Etwas hübscher wird es, wenn eine separate BMP-Grafik angezeigt wird, welche die gewünschte Nachricht enthält. Eine solche kann z.B. via Gimp oder unter Windows mit Paint erzeugt werden.&lt;br /&gt;
&lt;br /&gt;
Alternativ könnten auch die drei Symbole des Gewinners zum Blinken gebracht werden, indem &amp;lt;tt&amp;gt;draw_board()&amp;lt;/tt&amp;gt; in einer Schleife mit einer kurzen Pause aufgerufen wird, und die jeweiligen Felder bei jedem 2. Aufruf nicht mitgezeichnet werden.&lt;br /&gt;
&lt;br /&gt;
Wer die Installation einer weiteren Bibliothek nicht scheut, kann mit der SDL-Erweiterung [http://www.libsdl.org/projects/SDL_ttf/docs/index.html sdl_ttf] TrueType-Fonts verwenden, um beliebigen Text in das Ausgabefenster zu schreiben. Eine Anleitung zur Verwendung dieser Erweiterung findest du in dem Tutorial unter http://lazyfoo.net/SDL_tutorials/lesson07/. &lt;br /&gt;
&lt;br /&gt;
Viel Spaß!&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=Datei:TicTacToe-coords.png&amp;diff=14864</id>
		<title>Datei:TicTacToe-coords.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=Datei:TicTacToe-coords.png&amp;diff=14864"/>
		<updated>2010-09-14T23:24:35Z</updated>

		<summary type="html">&lt;p&gt;Martin: Darstellung der grafischen Aufteilung des Spielfeldes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Darstellung der grafischen Aufteilung des Spielfeldes&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
	<entry>
		<id>https://wiki.freitagsrunde.org/index.php?title=Datei:TicTacToe-screenshot.png&amp;diff=14863</id>
		<title>Datei:TicTacToe-screenshot.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.freitagsrunde.org/index.php?title=Datei:TicTacToe-screenshot.png&amp;diff=14863"/>
		<updated>2010-09-14T22:52:59Z</updated>

		<summary type="html">&lt;p&gt;Martin: So soll unser Tic Tac Toe aussehen&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;So soll unser Tic Tac Toe aussehen&lt;/div&gt;</summary>
		<author><name>Martin</name></author>
		
	</entry>
</feed>