2D Ritter Spiel char Funktion



  • Hallo Freunde,
    habe ein Problemchen bei einem Programm. Es ist ein 2D Ritter spiel.Es ist ein spielfeld 6x6 mit 2 Bäumen gekennzeichnet durch O und drei Spielern. Die züge werden durch einen Würfel generiert mit den zahlen 1 oder 2, und funkzionieren nach dem Läuferprinzip wie bei einem Schachspiel. Bei 1 läuft er 2 felder in x richtung und 1 in y richtung und bei würfelzahl 2 1stelle in x und 2 stellen in y. Das Spiel läuft soweit , nur jetzt will ich mein Spielfeld bisschen vergrössern, sprich die Felder. Jetzt erscheint auf dem Bildschirm ein Feld 6x6 durch X gekennzeichnet, will es aber schöner machen und Grösser:). Könnt ihr mir dabei helfen??Vielleicht noch ein paar Verbesserungsvorschläge zu dem ganzen Programm geben. Ich meine könnte man das ganze evnt. einfacher machen? Ich danke euch schon mal im Vorraus. Hier ist der Programmcode:
    #include <stdio.h>
    #include <math.h>
    #include <time.h>
    #include <stdlib.h>

    typedef struct spieler{
    double nr;
    char name [30], symbol;
    int status,x,y;
    }SPIELER;

    /*Spielfeld, Spieler und Bäume-Ausgabe*/

    void spielplatz(int *ptrsp0x, int *ptrsp0y, int *ptrsp1x, int *ptrsp1y, int *ptrsp2x, int *ptrsp2y, int b1x, int b1y, int b2x, int b2y,char *ptr1symbol,char *ptr2symbol,char *ptr3symbol)
    { int i; int j; char spielfeld[6][6];
    SPIELER sp[4];
    for (i=0;i<6;i++){
    printf("\n");
    for (j=0;j<6;j++){
    spielfeld[i][j]= '|';

    if(b1y==i&&b1x==j||b2y==i&&b2x==j){
    spielfeld[b1y][b1x]='O';
    spielfeld[b2y][b2x]='O';
    }

    if(*ptrsp0y==i&&*ptrsp0x==j||*ptrsp1y==i&&*ptrsp1x==j||*ptrsp2y==i||*ptrsp2x==j){
    spielfeld[*ptrsp0y][*ptrsp0x]=*ptr1symbol;
    spielfeld[*ptrsp1y][*ptrsp1x]=*ptr2symbol;
    spielfeld[*ptrsp2y][*ptrsp2x]=*ptr3symbol;
    }
    printf("%c",spielfeld[i][j]);

    }}

    }
    /*Wuerfel*/
    void wuerfel(void)
    { int wuerfel_zahl;
    srand ( time(NULL) );
    wuerfel_zahl= 1+rand() %2;
    printf("\n\nEs wurde folgende Zahl gewuerfelt:\t%d\n\n",wuerfel_zahl);
    }

    int main(void)
    {

    /*Prototypen*/
    SPIELER sp[4];

    char *ptr1symbol;
    char *ptr2symbol;
    char *ptr3symbol;
    int *ptrsp0x=&sp[0].x;
    int *ptrsp0y=&sp[0].y;
    int *ptrsp1x=&sp[1].x;
    int *ptrsp1y=&sp[1].y;
    int *ptrsp2x=&sp[2].x;
    int *ptrsp2y=&sp[2].y;
    int i,j,p,n,b1x,b1y,b2x,b2y,z;
    int wuerfel_zahl;
    int bew1;
    char spielfeld [6][6];

    /*Spieler-Identifikation*/

    for(p=1;p<=3;p++){
    printf("Bitte geben Sie den Namen des %d.Spielers ein?\n",p);
    scanf("%s",&sp[p].name);getchar();
    printf("\nBitte geben Sie das Spielersymbol fuer %s ein\n",sp[p].name);
    scanf("%c",&sp[p].symbol);getchar();
    }
    ptr1symbol=&sp[1].symbol;
    ptr2symbol=&sp[2].symbol;
    ptr3symbol=&sp[3].symbol;

    /*Spielfeld und Bäume*/

    do{
    srand ( time(NULL) );
    b1x= 1+rand() % 5;
    b1y= 1+rand() % 5;
    b2x= 1+rand() % 5;
    b2y= 1+rand() % 5;
    /*Spieler*/

    sp[0].x= 1+rand() % 5;
    sp[0].y= 1+rand() % 5;
    sp[1].x= 1+rand() % 5;
    sp[1].y= 1+rand() % 5;
    sp[2].x= 1+rand() % 5;
    sp[2].y= 1+rand() % 5;
    }while(sp[0].x-sp[1].x<2&&sp[0].y-sp[1].y<2&&sp[0].x-sp[2].x<2&&sp[0].y-sp[2].y<2&&sp[1].x-sp[2].x<2&&sp[1].y-sp[2].y<2&&b1x-sp[0].x<2&&b1y-sp[0].y<2&&b2x-sp[0].x<2&&b2y-sp[1].y<2&&b1x-sp[1].x<2&&b2x-sp[1].x<2&&b2y-sp[1].y<2&&b1x-sp[2].x<2&&b1y-sp[2].y<2&&b2x-sp[2].x<2&&b2y-sp[2].y<2);
    //}while(b1x==b2x||b1y==b2y||sp[1].x==sp[2].x||sp[1].x==sp[3].x||sp[2].x==sp[3].x||sp[1].y==sp[2].y||sp[1].y==sp[3].y||sp[2].y==sp[3].y||b1x==sp[1].x||b1x==sp[2].x||b1x==sp[3].x||b1y==sp[1].y||b1y==sp[2].y||b1y==sp[3].y||b2x==sp[1].x||b2x==sp[2].x||b2x==sp[3].x||b2y==sp[1].y||b2y==sp[2].y||b2y==sp[3].y);
    ptrsp0x=&sp[0].x;
    ptrsp0y=&sp[0].y;
    ptrsp1x=&sp[1].x;
    ptrsp1y=&sp[1].y;
    ptrsp2x=&sp[2].x;
    ptrsp2y=&sp[2].y;
    /*Spielfeld, Spieler und Bäume-Ausgabe*/

    spielplatz(ptrsp0x,ptrsp0y,ptrsp1x,ptrsp1y,ptrsp2x,ptrsp2y,b1x,b1y,b2x,b2y,ptr1symbol,ptr2symbol,ptr3symbol);

    sp[0].status=1;
    sp[1].status=1;
    sp[2].status=1;

    printf("\nEs sind folgende Spielzuege moeglich: \n [R]: 6 \n [L]: 4 \n [U]: 2 \n [O]: 8 \n");

    /*Spielzeuge*/
    do {
    for(z=0;z<3;z++){

    wuerfel();
    printf("\nBitte geben Sie beide Spielzuege ein!\n");
    scanf("%d", &bew1);
    printf("\nSpielzug=%d\n",bew1);

    if(sp[0].status==0&&z==0)
    z++;
    if(sp[1].status==0&&z==1)
    z++;
    if(sp[2].status==0&&z==2)
    z=z-2;
    printf("Status0=%d\n",sp[0].status);
    printf("Status1=%d\n",sp[1].status);
    printf("Status2=%d\n",sp[2].status);

    switch(bew1)
    {

    case 26 ://unten,rechts

    if(wuerfel_zahl==1)
    {sp[z].y++;sp[z].x=sp[z].x+2;}
    if(wuerfel_zahl==2)
    {sp[z].y=sp[z].y+2;sp[z].x++;}
    if(sp[z].y>5&&wuerfel_zahl==1||sp[z].x>5&&wuerfel_zahl==1)
    {sp[z].y--;sp[z].x=sp[z].x-2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].y<5&&wuerfel_zahl==2||sp[z].x<5&&wuerfel_zahl==2)
    {sp[z].y=sp[z].y-2;sp[z].x--;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].y--;sp[z].x=sp[z].x-2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].y--;sp[z].x=sp[z].x-2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}

    break;
    case 24 ://unten, links

    if(wuerfel_zahl==1)
    {sp[z].y++;sp[z].x=sp[z].x-2;}
    if(wuerfel_zahl==2)
    {sp[z].y=sp[z].y+2;sp[z].x--;}
    if(sp[z].y>5&&wuerfel_zahl==1||sp[z].x>5&&wuerfel_zahl==1)
    {sp[z].y--;sp[z].x=sp[z].x+2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].y>5&&wuerfel_zahl==2||sp[z].x>5&&wuerfel_zahl==2)
    {sp[z].y=sp[z].y-2;sp[z].x++;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].y--;sp[z].x=sp[z].x+2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].y=sp[z].y-2;sp[z].x++;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    break;

    case 42 ://links, unten

    if(wuerfel_zahl==1)
    {sp[z].x--;sp[z].y=sp[z].y+2;}
    if(wuerfel_zahl==2)
    {sp[z].x=sp[z].x-2;sp[z].y++;}
    if(sp[z].x<0&&wuerfel_zahl==1||sp[z].y>5&&wuerfel_zahl==1)
    {sp[z].x++;sp[z].y=sp[z].y-2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].y>5&&wuerfel_zahl==2||sp[z].x<0&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x+2;sp[z].y--;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].x++;sp[z].y=sp[z].y-2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x+2;sp[z].y--;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    break;

    case 48 ://links, oben

    if(wuerfel_zahl==1)
    {sp[z].x--;sp[z].y=sp[z].y-2;}
    if(wuerfel_zahl==2)
    {sp[z].x=sp[z].x-2;sp[z].y--;}
    if(sp[z].x<0&&wuerfel_zahl==1||sp[z].y<0&&wuerfel_zahl==1)
    {sp[z].x++;sp[z].y=sp[z].y+2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].y<0&&wuerfel_zahl==2||sp[z].x<0&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x+2;sp[z].y++;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].x++;sp[z].y=sp[z].y+2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x+2;sp[z].y++;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    break;

    case 84 ://oben,links

    if(wuerfel_zahl==1)
    {sp[z].y--;sp[z].x=sp[z].x-2;}
    if(wuerfel_zahl==2)
    {sp[z].y=sp[z].y-2;sp[z].x--;}
    if(sp[z].x<0&&wuerfel_zahl==1||sp[z].y<0&&wuerfel_zahl==1)
    {sp[z].y++;sp[z].x=sp[z].x+2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].y<0&&wuerfel_zahl==2||sp[z].x<0&&wuerfel_zahl==2)
    {sp[z].y=sp[z].y+2;sp[z].x++;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].y++;sp[z].x=sp[z].x+2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].y=sp[z].y+2;sp[z].x++;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    break;

    case 86 ://oben,rechts

    if(wuerfel_zahl==1)
    {sp[z].y--;sp[z].x=sp[z].x+2;}
    if(wuerfel_zahl==2)
    {sp[z].y=sp[z].y-2;sp[z].x++;}
    if(sp[z].x>5&&wuerfel_zahl==1||sp[z].y<0&&wuerfel_zahl==1)
    {sp[z].y++;sp[z].x=sp[z].x-2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x>5&&wuerfel_zahl==2||sp[z].y<0&&wuerfel_zahl==2)
    {sp[z].y=sp[z].y+2;sp[z].x--;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].y++;sp[z].x=sp[z].x-2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].y++;sp[z].x=sp[z].x-2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    break;

    case 68 ://rechts, oben

    if(wuerfel_zahl==1)
    {sp[z].x++;sp[z].y=sp[z].y-2;}
    if(wuerfel_zahl==2)
    {sp[z].x=sp[z].x+2;sp[z].y--;}
    if(sp[z].x>5&&wuerfel_zahl==1||sp[z].y<0&&wuerfel_zahl==1)
    {sp[z].x--;sp[z].y=sp[z].y+2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x>5&&wuerfel_zahl==2||sp[z].y<0&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x-2;sp[z].y++;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].x--;sp[z].y=sp[z].y+2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x-2;sp[z].y++;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    break;

    case 62 ://rechts, unten

    if(wuerfel_zahl==1)
    {sp[z].x++;sp[z].y=sp[z].y+2;}
    if(wuerfel_zahl==2)
    {sp[z].x=sp[z].x+2;sp[z].y++;}
    if(sp[z].x>5&&wuerfel_zahl==1||sp[z].y>5&&wuerfel_zahl==1)
    {sp[z].x--;sp[z].y=sp[z].y-2;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x>5&&wuerfel_zahl==2||sp[z].y>5&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x-2;sp[z].y--;z--;
    printf("\nDieser Spielzug liegt ausserhalb des Spielfeldes");
    }
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==1||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==1)
    {sp[z].x--;sp[z].y=sp[z].y-2;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    if(sp[z].x==b1x&&sp[z].y==b1y&&wuerfel_zahl==2||sp[z].x==b2x&&sp[z].y==b2y&&wuerfel_zahl==2)
    {sp[z].x=sp[z].x-2;sp[z].y--;z--;
    printf("Die Spielregeln erlauben keine Spruenge ueber oder auf Baeume");}
    break;
    default: printf("Sie haben einen falschen Spielzug eingegeben. Bitte wiederholen Sie den Spielzug");z--;
    }

    //Spielerausfall//

    if(z==0&&sp[0].x==sp[1].x&&sp[0].y==sp[1].y)
    {printf("\nDer Spieler %c ist gefallen\n",*ptr2symbol);
    *ptrsp1x='-'; *ptrsp1y='-';sp[1].status=0;}
    if(z==0&&sp[0].x==sp[2].x&&sp[0].y==sp[2].y)
    {printf("\nDer Spieler %c ist gefallen\n",*ptr3symbol);
    *ptrsp2x='-'; *ptrsp2y='-';sp[2].status=0;}
    if(z==1&&sp[1].x==sp[0].x&&sp[1].y==sp[0].y)
    {printf("\nDer Spieler %c ist gefallen\n",*ptr1symbol);
    *ptrsp0x='-'; *ptrsp0y='-';sp[0].status=0;}
    if(z==1&&sp[1].x==sp[2].x&&sp[1].y==sp[2].y)
    {printf("\nDer Spieler %c ist gefallen\n",*ptr3symbol);
    *ptrsp2x='-'; *ptrsp2y='-';sp[2].status=0;}
    if(z==2&&sp[2].x==sp[1].x&&sp[2].y==sp[1].y)
    {printf("\nDer Spieler %c ist gefallen\n",*ptr2symbol);
    *ptrsp1x='-'; *ptrsp1y='-';sp[1].status=0;}
    if(z==2&&sp[2].x==sp[0].x&&sp[2].y==sp[0].y)
    {printf("\nDer Spieler %c ist gefallen\n",*ptr1symbol);
    *ptrsp0x='-'; *ptrsp0y='-';sp[0].status=0;}
    printf("\n");
    spielplatz(ptrsp0x,ptrsp0y,ptrsp1x,ptrsp1y,ptrsp2x,ptrsp2y,b1x,b1y,b2x,b2y,ptr1symbol,ptr2symbol,ptr3symbol);

    if(sp[0].status==0&&sp[1].status==0||sp[0].status==0&&sp[2].status==0||sp[1].status==0&&sp[2].status==0)
    {goto RAUS;}
    }
    //}while (sp[0].x!=sp[1].x&&sp[0].y!=sp[1].y||sp[0].x!=sp[2].x&&sp[0].y!=sp[2].y||sp[1].x!=sp[2].x&&sp[1].y!=sp[2].y);
    }while (sp[0].status!=0&&sp[1].status!=0||sp[0].status!=0&&sp[2].status!=0||sp[1].status!=0&&sp[2].status!=0);

    // Spielger x hat gewonnen //
    RAUS:
    if(sp[0].status==1)
    printf("Spieler %s hat gewonnen",sp[0].name);
    if(sp[1].status==1)
    printf("Spieler %s hat gewonnen",sp[1].name);
    if(sp[2].status==1)
    printf("Spieler %s hat gewonnen",sp[2].name);
    }



  • Solche Sachen:

    sp[0].x= 1+rand() % 5;
    sp[0].y= 1+rand() % 5;
    sp[1].x= 1+rand() % 5;
    sp[1].y= 1+rand() % 5;
    sp[2].x= 1+rand() % 5;
    sp[2].y= 1+rand() % 5;
    

    und

    if(sp[0].status==1)
    printf("Spieler %s hat gewonnen",sp[0].name);
    if(sp[1].status==1)
    printf("Spieler %s hat gewonnen",sp[1].name);
    if(sp[2].status==1)
    printf("Spieler %s hat gewonnen",sp[2].name);
    

    kann man gut in Schleifen unterbringen 🙂 Und: Bitte sieh zu, dass du irgendwie die 'goto's rauskriegst, ordentliche Schleifen oder Bedingungen ziehen da oft besser (abgesehen von Lesbarkeit und Sauberkeit).
    Ach, und die cpp-Codetags könntest du verwenden, dann funktionieren Einrückung und Syntax-Highlighting hier im Forum auch 😉



  • Aber wie würdest du das mit dem Spielfeld machen??Also schöner und grösser:). Danke dir!!!



  • juri.mellit schrieb:

    Aber wie würdest du das mit dem Spielfeld machen??Also schöner und grösser:). Danke dir!!!

    Sorry, aber ohne Code-Tags gucke ich mir deinen Code nicht näher an (kannst ja den Post editieren)! Hätte aber grad auch keine Zeit, das zu testen oder mich rein-zuvertiefen, erst wieder heut (spät-)Nachmittag 🙂



  • Größer? Die Grenzen erhöhen... Benutze Konstanten da, wo du dich auf die Spielfeldgröße beziehst und das erweitern der Grenze geht auch später noch in Sekunden.

    Schöner? Wenn du keine Grafik nutzen willst/kannst, dann schau dir die verfügbaren ASCII-Zeichen an und nutze Sonderzeichen für zB den Spielfeldrand, die Bäume etc.



  • Du solltest dir vielleicht ein GUI-Toolkit anschauen (z.B. WxWidgets).



  • Außerdem sieht mir der Code nach reinem C aus, d.h. falsches Sub-Forum -)


Log in to reply