Schachbrett mit 2-dim. Array umsetzen, Probleme mit Zeigern!



  • Hy!
    Also ich versuche ein 8x8 Schachbrett zu initialisieren mit einem Array. Bezeichnungen gehen von a bis h und 1 bis 8 (bzw 0 bis 7)

    Ich poste hier mal meinen bisherigen Code:

    main.c

    // main.c // uebung 05 mehrdimensionale arrays // wolfgang franz // 906787
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include "schachbrett.h"
    
    char	*pzeiger;
    	figur;
    
    int main(void)
    {
    	printf("\n\n"
    		   " Schachbrett\n"
    		   " ===========\n\n");
    
    	set(a1,T);
    	figur = get(a1);
    
    	printf("Feld a1: = %c",figur);
    
    	return(0);
    }
    

    schachbrett.c

    // schachbrett.c // wolfgang franz
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h>
    #include "schachbrett.h"
    
    char	feld[8][8];
    short	spalte1;
    	spalte2;
    
    void set(const char *pfeld,const char figur)
    {
    
    }
    
    char get(const char *pfeld)
    {
    	char figur;
    	figur = *pfeld;
    	return(figur);
    }
    
    char ziehe(const char *pquelle,const char *pziel)
    {
    	return(0);
    }
    
    int format(char buchstabe,short zahl)
    {
    	if(buchstabe == 'a')
    		spalte1 = 0;
    	else if(buchstabe == 'b')
    		spalte1 = 1;
    	else if(buchstabe == 'c')
    		spalte1 = 2;
    	else if(buchstabe == 'd')
    		spalte1 = 3;
    	else if(buchstabe == 'e')
    		spalte1 = 4;
    	else if(buchstabe == 'f')
    		spalte1 = 5;
    	else if(buchstabe == 'g')
    		spalte1 = 6;
    	else if(buchstabe == 'h')
    		spalte1 = 7;
    	spalte2 = --zahl;
    
    	return(0);
    }
    

    schachbrett.h

    // schachbrett.h // wolfgang franz
    
    #ifndef	SCHACHBRETT_H_
    #define	SCHACHBRETT_H_
    
    void set(const char *pfeld,const char figur);
    char get(const char *pfeld);
    char ziehe(const char *pquelle,const char *pziel);
    
    #endif // SCHACHBRETT_H_
    

    Mein Problem sind die Funktionen in der schachbrett.c. Ich bin noch lutiger Anfänger und habe schon viel über Zeiger und Arrays gelesen, aber ich schaff es einfach nicht. Ich soll mit der Funktion void set(const char *pfeld,const char figur) eine Figur auf ein Feld setzen und mit char get(const char *pfeld) die Figur eines Feldes auslesen. Dazu sollen wir eine Hilfsfunktion schreiben, die aus den beiden Zeichen der Feldadresse die numerische Spalten- und Zeilen-Indizes errechnet.

    Da ich wie gesagt mit den Zeigern noch garnicht klarkomme hier in den Funktionen und Mehrdimensionalen Arrays, peil ich mal garnichts.

    Wenn mir jemand sagen könnte wie diese Hilfsfunktion (bei mir die format Funktion, allerdings könnt ihr die komplett vergessen, das is nur müll) und die beiden set und get Funktionen aussehen müssen, dann wäre das eine Große Hilfe für mein Verständnis und kann die Aufgabe zuende führen.



  • Hi,

    ich habe mir mal deinen Code angesehen und ein paar Verbesserungen
    gemacht, ohne deine Vorgaben zu ändern.

    Die set und get Function finde ich unvorteilhaft definiert:
    Besser fände ich:

    void set (char brett[][8], char spalte, int zeile, char figur);
    

    Hier mal schachbrett.c

    /* schachbrett.c // wolfgang franz */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include "schachbrett.h"
    
    void set(char *pfeld,const char figur)
    {
        *pfeld = figur;
    }
    
    char get(const char *pfeld)
    {
        return *pfeld;
    }
    
    char ziehe(const char *pquelle, const char *pziel)
    {
        return(0);
    }
    
    static int spalte(char b) {
        switch (b) {
        case 'a' : return 0;
        case 'b' : return 1;
        case 'c' : return 2;
        case 'd' : return 3;
        case 'e' : return 4;
        case 'f' : return 5;
        case 'g' : return 6;
        case 'h' : return 7;
        default:
            fprintf(stderr, "invalid input: spalte(%c)\n", b);
            exit(-1);
        }
        return 0;
    }
    
    static int zeile(int input) {
        if (input < 1 || input > 8) {
            fprintf(stderr, "invalid input: zeile(%d)\n", input);
            exit(-1);
        }
        return input-1;
    }
    
    char * get_feld(char brett[][8], char s, int z) {
        if (brett) return &(brett[spalte(s)][zeile(z)]);
        return NULL;
    }
    
    void print_brett(char brett[][8]) {
        int s,z;
        for (z=8; z>0; --z) {
            printf(" %d ", z);
            for (s=0; s<8; ++s) {
                printf(" %c ", brett[s][z-1] ? brett[s][z-1] : ' ');
            }
            printf("\n");
        }
        printf("    a  b  c  d  e  f  g  h\n");
    }
    

    und schachbrett.h:

    /* schachbrett.h // wolfgang franz */
    
    #ifndef    SCHACHBRETT_H_
    #define    SCHACHBRETT_H_
    
    void set(char *pfeld,const char figur);
    char get(const char *pfeld);
    char ziehe(const char *pquelle,const char *pziel);
    
    void print_brett(char brett[][8]);
    char *get_feld(char brett[][8], char s, int z);
    
    #endif
    

    und main.c

    /* main.c // uebung 05 mehrdimensionale arrays // wolfgang franz // 906787 */
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include "schachbrett.h"
    
    int main(void)
    {
        char brett[8][8];
        memset(brett, 0x0, sizeof(brett));
        printf("\n\n"
                " Schachbrett\n"
                " ===========\n\n");
        set(get_feld(brett, 'a', 6), 'T'); /* Setzt ein T auf Feld A6 */
        print_brett(brett);
        return(0);
    }
    

    Ich rate dir davon ab, globale Variablen zu verwenden.

    Gruß mcr



  • Hallo Leute kann mir einer vielt. helfen ein schachbrett mit farben darzustelle in C. hab jetzt vieles probiert funktioniert irgendwie nicht. am besten mit code beispiel. Danke im Voraus.



  • windodws? linux?
    farben geht nicht direkt mit c. musste dich für ein os entscheiden.



  • ich hab windows, und zwar im programm benutze ich conio.h und da kann ich ja hintergrund farbe und text farbe mache, aber das problem was ich hab: wie kann ich jedem einzelnem feld andere farbe zuweisen. Ich probiere die ganze zeit mit einem modulo operator aber das funktioniert irgendwie nicht richtig. danke im voraus



  • Hallo,
    prinzipiell geht das z.B. so:

    enum {width = 8, height = 8};
    int i;
    CHAR_INFO ch;
    	CHAR_INFO Spielfeld [width*height] = {0};
    	WORD a = FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE,
    			b = a;   
    	for ( i = 0; i < width*height; i++ )
    	{		
    		if (!(i%width))
    			b = a = b^BACKGROUND_INTENSITY;
    		ch.Attributes = a;
    		a ^= BACKGROUND_INTENSITY;
    		ch.Char.AsciiChar = BLANK;
    		Spielfeld[i] = ch;
    	}
    

    Dann einfach mit WriteConsoleOutput an der Position (x,y)
    ausgeben.
    Das Spielfeld sich auch direkt initialisieren, ohne den Umweg über ch zu gehen,
    aber so ist es vllt. übersichtlicher.

    Gruß,
    B.B.



  • Vielen Dank


Log in to reply