Suche Problemlösung für Punktevergabe bei Memoryspiel



  • Hallo liebe Community,
    Ich habe von meinem geschätzten Lehrer die Aufgabe bekommen ein Memoryspiel in C zu Programmieren. Dieses soll in der cmd Konsole gespielt werden und mit Zahlen gespielt werden.
    Mein Spiel funktioniert soweit recht gut, jedoch funktioniert meine Punktevergabe nicht richtig.
    Die Punktevergabe an Spieler 1 funktioniert wie sie soll, jedoch wenn Spieler 2 einen Punkt macht, springt beim ersten Punkt der Punktestand von Spieler 1 auf 2 und der Punktestand von Spieler 2 auf 1.

    Bei weiteren Punkten von Spieler 2 werden beide Punktestände um jeweils 1 erhöht.
    Über eine baldige Hilfestellung, würde ich mich sehr freuen.

    [/code]#include <stdio.h>
    #include <stdlib.h>
    #include <time.h>
    #ifdef __unix__
    #define clrscr() printf("\x1B[2J")
    #elif __BORLANDC__ && __MSDOS__
    #include <conio.h>
    #elif __WIN32__ || _MSC_VER
    #define clrscr() system("cls")
    #else
    #define clrscr() printf("clrscr() - Fehler!!\n")
    #endif
    #define WEITER 2
    #define GEWINNER 1
    #define GAME_OVER 0

    int memorynumbers [8];
    int spielfeld [16];
    int spielfeld_hidden[16]={00,00,00,00,00,00,00,00,00,00,00,00,00,00,00,00} ;

    int numbers;
    int karte;
    int spieler1=1;
    int spieler2=2;
    int punkte_spieler2[1]={0};
    int punkte_spieler1[1]={0};
    int if_win(void);
    int spielfeld_aufbau(void);
    //Spielfeld Aktualisieren//

    //Spielfeld Anzeigen//
    int spielfeld_aufbau (void){
    printf("| %i || %i || %i || %i |\n",spielfeld_hidden[0],spielfeld_hidden[1],spielfeld_hidden[2],spielfeld_hidden[3]);
    printf("| %i || %i || %i || %i |\n",spielfeld_hidden[4],spielfeld_hidden[5],spielfeld_hidden[6],spielfeld_hidden[7]);
    printf("| %i || %i || %i || %i |\n",spielfeld_hidden[8],spielfeld_hidden[9],spielfeld_hidden[10],spielfeld_hidden[11]);
    printf("| %i || %i || %i || %i |\n",spielfeld_hidden[12],spielfeld_hidden[13],spielfeld_hidden[14],spielfeld_hidden[15]);
    }

    //Punkte Spieler 1 erhöhen//
    void spieler1_pluspunkt (void){
    int i;
    for (i=0;i<=1;i++){
    punkte_spieler1[i]=punkte_spieler1[0]+1;
    }}
    //Punkte Spieler 2 erhöhen//
    void spieler2_pluspunkt2 (void){
    int i;
    for (i=0;i<=1;i++){
    punkte_spieler2[i]=punkte_spieler2[0]+1;
    }}
    //Spielzug//
    int neuer_zug (int spieler){
    int i;
    int feld1;
    int feld2;
    printf("Es ist Spieler %i am Zug",spieler);
    printf("\nWelches Feld soll zu erst aufgedeckt werden?(0-15)\n");
    scanf("%i",&feld1);
    printf("Welches Feld soll als zweites aufgedeckt werden?(0-15)\n");
    scanf("%i",&feld2);
    //Eingabe überprüfen//
    if (feld1==feld2){
    clrscr();
    spielfeld_aufbau ();
    printf("\nDu hast zweimal das selbe Feld gewählt\n");
    return (spieler==spieler1) ?spieler2 :spieler1;
    }
    //Wurde eine oder mehrere Karten bereits Aufgedeckt//
    else if (spieler==spieler1&&(spielfeld_hidden[feld1]==spielfeld[feld1])||(spielfeld_hidden[feld2]==spielfeld[feld2])){
    clrscr();
    printf("Eine oder Zwei dieser Karten wurden bereits aufgedeckt. Bitte erneut wählen\n");
    printf("\nSpieler1= %i:%i =Spieler2\n",punkte_spieler1[0],punkte_spieler2[0]);
    spielfeld_aufbau ();
    return (spieler==spieler2) ?spieler1 :spieler2;
    }
    else if (spieler==spieler2&&(spielfeld_hidden[feld1]==spielfeld[feld1])||(spielfeld_hidden[feld2]==spielfeld[feld2])){
    clrscr();
    printf("Eine oder Zwei dieser Karten wurden bereits aufgedeckt. Bitte erneut wählen\n");
    printf("\nSpieler1= %i:%i =Spieler2\n",punkte_spieler1[0],punkte_spieler2[0]);
    spielfeld_aufbau ();
    return spieler1;}
    //Pluspunkt Spieler 1//
    else if(spieler==spieler1&&(spielfeld[feld1]==spielfeld[feld2])){
    spieler1_pluspunkt ();
    spielfeld_hidden[feld1]=spielfeld[feld1];
    spielfeld_hidden[feld2]=spielfeld[feld1];
    clrscr();
    printf("\nSpieler1= %i:%i =Spieler2\n",punkte_spieler1[0],punkte_spieler2[0]);
    spielfeld_aufbau ();
    if(if_win()==GEWINNER){
    return GAME_OVER;}
    else {
    return (spieler==spieler1) ?spieler2 :spieler1;
    }
    }
    //Spielzugweitergabe an Spieler 2//
    else if(spieler==spieler1&&(spielfeld[feld1]!=spielfeld[feld2])){
    clrscr();
    printf("\nSpieler1= %i:%i =Spieler2\n",punkte_spieler1[0],punkte_spieler2[0]);
    spielfeld_aufbau();
    return spieler1;
    }
    //Pluspunkt Spieler 2//
    else if (spieler==spieler2&&(spielfeld[feld1] ==spielfeld[feld2])){
    spieler2_pluspunkt2 ();
    spielfeld_hidden[feld1]=spielfeld[feld1];
    spielfeld_hidden[feld2]=spielfeld[feld1];
    clrscr();
    printf("\nSpieler1= %i:%i =Spieler2\n",punkte_spieler1[0],punkte_spieler2[0]);
    spielfeld_aufbau();
    if(if_win()==GEWINNER){
    return GAME_OVER;
    }
    else {
    return (spieler==spieler2) ?spieler1 :spieler2;
    }

    }
    //Spielzugweitergabe an Spieler 1//
    else if (spieler==spieler2&&(spielfeld[feld1]!=spielfeld[feld2])){
    clrscr();
    printf("\nSpieler1= %i:%i =Spieler2\n",punkte_spieler1[0],punkte_spieler2[0]);
    spielfeld_aufbau();
    return spieler2;
    }
    }
    //Gewinnüberprüfung//
    int if_win (void){
    if (punkte_spieler1[0]==5){
    printf ("Spieler 1 hat Gewonnen");
    return GEWINNER;
    }
    else if (punkte_spieler2[0]==5){
    printf("Spieler 2 hat Gewonnen");
    return GEWINNER;
    }
    else if ((punkte_spieler1[0]==4)&&(punkte_spieler2[0]==4)){
    printf("Unentschieden");
    return GAME_OVER;
    }
    return WEITER;
    }
    int main (void){
    int i;
    int Zufall;
    int startspieler=spieler2;
    char beginnen;
    int mNumNum []={0,0,0,0,0,0,0,0};
    //Begrüßung und Spielerklärung//
    printf("Herzlich willkommen zum Spiel Memory\n");
    printf("Das Spielfeld ist 4x4 Felder groß wobei es wie folgt aufgebaut ist:\n");
    printf("| 0 || 1 || 2 || 3 |\n| 4 || 5 || 6 || 7 |\n| 8 || 9 || 10 || 11 |\n| 12 || 13 || 14 || 15 |\n");
    printf("Bitte bestimmen sie zu erst wer Spieler 1 ist und wer Spieler 2 ist.\nSpieler 1 wird anschließend beginnen.\n");
    printf("Anschließend wird der Spieler der am Zug ist gefragt, welche zwei Spielfelder aufgedeckt werden sollen.\n");
    printf("Werden zwei gleiche Zahlen aufgedeckt bekommt dieser Spieler einen Punkt und ist erneut am Zug.\n");
    printf("Sind die aufgedeckten Zahlen nicht die gleichen, so ist der nächste Spieler am Zug.\n");
    printf("Es gewinnt der Speler, der insgesammt mehr Paare gefunden hat und es gibt ein Unentschieden bei Gleichstand.\n");
    printf("Spiel beginnen?(j/n): ");
    scanf("%c",&beginnen);
    if (beginnen=='J'||beginnen=='j'){

    clrscr();
    srand ((unsigned) time(NULL));
    for (numbers=0; numbers<=7; numbers++)
    memorynumbers [numbers]=rand()%89+10;
    srand ((unsigned) time(NULL));
    for (karte=0;karte<16;karte++){
    int ind =ind=rand()%8;
    for(;mNumNum[ind]>1;ind=rand()%8);
    mNumNum[ind]=mNumNum[ind]+1;
    spielfeld[karte]=memorynumbers[ind];
    }
    printf("| %i || %i || %i || %i |\n",spielfeld[0],spielfeld[1],spielfeld[2],spielfeld[3]);
    printf("| %i || %i || %i || %i |\n",spielfeld[4],spielfeld[5],spielfeld[6],spielfeld[7]);
    printf("| %i || %i || %i || %i |\n",spielfeld[8],spielfeld[9],spielfeld[10],spielfeld[11]);
    printf("| %i || %i || %i || %i |\n",spielfeld[12],spielfeld[13],spielfeld[14],spielfeld[15]);
    printf("Bitte merken sie sich das Spielfeld und beginnen sie mit der eingabe von J/j: ");
    fflush(stdin);
    scanf("%c",&beginnen);
    if (beginnen=='J'||beginnen=='j'){
    clrscr();
    printf("\nSpieler1= %i:%i =Spieler2\n",punkte_spieler1[0],punkte_spieler2[0]);
    spielfeld_aufbau ();
    } else{return EXIT_SUCCESS;
    }

    }else{return EXIT_SUCCESS;}
    //Spielfeld befüllen//

    //Überprüfen wer am Zug ist//
    do{
    if(startspieler==spieler2){
    startspieler=neuer_zug(spieler1);
    }
    else{
    startspieler=neuer_zug(spieler2);
    }
    }
    while (startspieler!=GAME_OVER);
    return EXIT_SUCCESS;
    }



  • Als erstes schiebe ich jeden fremden Quellcode durch den Compiler mit aktivierten Warnungen (GCC: -Wall). Die Ernte ist reichhaltig...

    a.c:78:5: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
    a.c:86:5: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
    a.c:61:9: warning: unused variable 'i' [-Wunused-variable]
    a.c: In function 'main':
    a.c:171:9: warning: unused variable 'Zufall' [-Wunused-variable]
    a.c:170:9: warning: unused variable 'i' [-Wunused-variable]
    a.c: In function 'neuer_zug':
    a.c:147:1: warning: control reaches end of non-void function [-Wreturn-type]
    a.c: In function 'spielfeld_aufbau':
    a.c:38:1: warning: control reaches end of non-void function [-Wreturn-type]
    a.c: In function 'spieler1_pluspunkt':
    a.c:46:24: warning: array subscript is above array bounds [-Warray-bounds]
    a.c: In function 'spieler2_pluspunkt2':
    a.c:55:24: warning: array subscript is above array bounds [-Warray-bounds]
    a.c: In function 'neuer_zug':
    a.c:46:24: warning: array subscript is above array bounds [-Warray-bounds]
    a.c:55:24: warning: array subscript is above array bounds [-Warray-bounds]
    
    int punkte_spieler2[1]= {0};
    void spieler1_pluspunkt (void)
    {
        int i;
        for (i=0; i<=1; i++)
        {
            punkte_spieler1[i]=punkte_spieler1[0]+1;
        }
    }
    

    WTF?? Ein Array mit einem Element und dann so eine merkwürdige (und falsche - s.o.) Schleife?

    Korrigier erstmal diese Fehler, dann kann man weitersehen.


Log in to reply