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 0int 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.